First release
authorThierry Florac <thierry.florac@onf.fr>
Thu, 18 May 2017 17:23:48 +0200
changeset 0 c73bb834ccbe
child 1 bf796b698a98
First release
src/pyams_gis/__init__.py
src/pyams_gis/area.py
src/pyams_gis/configuration.py
src/pyams_gis/doctests/README.txt
src/pyams_gis/include.py
src/pyams_gis/interfaces/__init__.py
src/pyams_gis/interfaces/configuration.py
src/pyams_gis/interfaces/layer.py
src/pyams_gis/interfaces/utility.py
src/pyams_gis/interfaces/widget.py
src/pyams_gis/layer.py
src/pyams_gis/locales/fr/LC_MESSAGES/pyams_gis.mo
src/pyams_gis/locales/fr/LC_MESSAGES/pyams_gis.po
src/pyams_gis/locales/pyams_gis.pot
src/pyams_gis/point.py
src/pyams_gis/resources/css/leaflet-1.0.3.css
src/pyams_gis/resources/css/leaflet-1.0.3.min.css
src/pyams_gis/resources/css/leaflet-draw.css
src/pyams_gis/resources/css/leaflet-draw.min.css
src/pyams_gis/resources/css/leaflet-esri-geocoder.css
src/pyams_gis/resources/css/leaflet-esri-geocoder.min.css
src/pyams_gis/resources/css/leaflet-gp-3.0.2.css
src/pyams_gis/resources/css/leaflet-gp-3.0.2.min.css
src/pyams_gis/resources/img/esri/loading.gif
src/pyams_gis/resources/img/esri/loading@2x.gif
src/pyams_gis/resources/img/esri/search-disabled.png
src/pyams_gis/resources/img/esri/search.png
src/pyams_gis/resources/img/esri/search@2x-disabled.png
src/pyams_gis/resources/img/esri/search@2x.png
src/pyams_gis/resources/img/gp/GPisochronCheck.png
src/pyams_gis/resources/img/gp/GPisochronOpen.png
src/pyams_gis/resources/img/gp/GPisochronOptions.png
src/pyams_gis/resources/img/gp/GPlayerInfo.png
src/pyams_gis/resources/img/gp/GPlayerInfoClose.png
src/pyams_gis/resources/img/gp/GPlayerTools.png
src/pyams_gis/resources/img/gp/GPlocationOptions.png
src/pyams_gis/resources/img/gp/GPmapCenter.png
src/pyams_gis/resources/img/gp/GPmousePositionOpen.png
src/pyams_gis/resources/img/gp/GPopacitySlider.png
src/pyams_gis/resources/img/gp/GPreturn.png
src/pyams_gis/resources/img/gp/GPreverseGeocodingOpen.png
src/pyams_gis/resources/img/gp/GProuteCheck.png
src/pyams_gis/resources/img/gp/GProuteOpen.png
src/pyams_gis/resources/img/gp/GProuteOptions.png
src/pyams_gis/resources/img/gp/GPsearchEngineClose.png
src/pyams_gis/resources/img/gp/GPsearchEngineOpen.png
src/pyams_gis/resources/img/gp/GPshowElevationPath.png
src/pyams_gis/resources/img/gp/GPshowLayersList.png
src/pyams_gis/resources/img/gp/GPshowMoreOptions.png
src/pyams_gis/resources/img/gp/spritesheet-2x.png
src/pyams_gis/resources/img/gp/spritesheet.png
src/pyams_gis/resources/img/gp/waiting.gif
src/pyams_gis/resources/img/layers-2x.png
src/pyams_gis/resources/img/layers.png
src/pyams_gis/resources/img/marker-icon.png
src/pyams_gis/resources/js/Edit.Circle.js
src/pyams_gis/resources/js/Edit.Circle.min.js
src/pyams_gis/resources/js/Edit.Marker.js
src/pyams_gis/resources/js/Edit.Marker.min.js
src/pyams_gis/resources/js/Edit.Poly.js
src/pyams_gis/resources/js/Edit.Poly.min.js
src/pyams_gis/resources/js/Edit.Rectangle.js
src/pyams_gis/resources/js/Edit.Rectangle.min.js
src/pyams_gis/resources/js/Edit.SimpleShape.js
src/pyams_gis/resources/js/Edit.SimpleShape.min.js
src/pyams_gis/resources/js/TouchEvents.js
src/pyams_gis/resources/js/TouchEvents.min.js
src/pyams_gis/resources/js/leaflet-1.0.3.js
src/pyams_gis/resources/js/leaflet-1.0.3.min.js
src/pyams_gis/resources/js/leaflet-esri-2.0.8.js
src/pyams_gis/resources/js/leaflet-esri-cluster-2.0.0.js
src/pyams_gis/resources/js/leaflet-esri-geocoder-2.2.4.js
src/pyams_gis/resources/js/leaflet-esri-gp-2.0.1.js
src/pyams_gis/resources/js/leaflet-esri-heatmap-2.0.0.js
src/pyams_gis/resources/js/leaflet-esri-renderers-2.0.2.js
src/pyams_gis/resources/js/leaflet-esri-vector-1.0.6.js
src/pyams_gis/resources/js/leaflet-google-mutant.js
src/pyams_gis/resources/js/leaflet-gp-3.0.2.js
src/pyams_gis/resources/js/leaflet-gp-3.0.2.min.js
src/pyams_gis/resources/js/leaflet.Control.Draw.js
src/pyams_gis/resources/js/leaflet.Control.Draw.min.js
src/pyams_gis/resources/js/leaflet.Draw.Event.js
src/pyams_gis/resources/js/leaflet.Draw.Event.min.js
src/pyams_gis/resources/js/leaflet.Draw.js
src/pyams_gis/resources/js/leaflet.Draw.min.js
src/pyams_gis/resources/js/leaflet.DrawToolbar.js
src/pyams_gis/resources/js/leaflet.DrawToolbar.min.js
src/pyams_gis/resources/js/pyams_gis.js
src/pyams_gis/resources/js/pyams_gis.min.js
src/pyams_gis/rpc/__init__.py
src/pyams_gis/rpc/json/__init__.py
src/pyams_gis/schema.py
src/pyams_gis/site.py
src/pyams_gis/tests/__init__.py
src/pyams_gis/tests/test_utilsdocs.py
src/pyams_gis/tests/test_utilsdocstrings.py
src/pyams_gis/utility.py
src/pyams_gis/widget/__init__.py
src/pyams_gis/widget/area.py
src/pyams_gis/widget/point.py
src/pyams_gis/widget/templates/geoarea-input.pt
src/pyams_gis/widget/templates/geopoint-input.pt
src/pyams_gis/zmi/__init__.py
src/pyams_gis/zmi/interfaces.py
src/pyams_gis/zmi/layer.py
src/pyams_gis/zmi/utility.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/__init__.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,62 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+from fanstatic import Library, Resource
+from pyams_utils.fanstatic import ExternalResource
+
+
+from pyramid.i18n import TranslationStringFactory
+_ = TranslationStringFactory('pyams_gis')
+
+
+library = Library('pyams_gis', 'resources')
+
+leaflet_css = Resource(library, 'css/leaflet-1.0.3.css',
+                       minified='css/leaflet-1.0.3.min.css')
+
+leaflet = Resource(library, 'js/leaflet-1.0.3.js',
+                   minified='js/leaflet-1.0.3.min.js',
+                   depends=[leaflet_css, ],
+                   bottom=True)
+
+leaflet_gp = Resource(library, 'js/leaflet-gp-3.0.2.js',
+                      minified='js/leaflet-gp-3.0.2.min.js',
+                      depends=[leaflet, ],
+                      bottom=True)
+
+leaflet_esri = Resource(library, 'js/leaflet-esri-2.0.8.js',
+                        minified='js/leaflet-esri-2.0.8.min.js',
+                        depends=[leaflet, ],
+                        bottom=True)
+
+leaflet_google = ExternalResource(library, 'https://maps.googleapis.com/maps/api/js',
+                                  bottom=True)
+
+leaflet_google_mutant = Resource(library, 'js/leaflet-google-mutant.js',
+                                 minified='js/leaflet-google-mutant.min.js',
+                                 depends=[leaflet, ],
+                                 bottom=True)
+
+pyams_gis = Resource(library, 'js/pyams_gis.js',
+                     minified='js/pyams_gis.min.js',
+                     depends=[leaflet, ],
+                     bottom=True)
+
+
+def includeme(config):
+    """Pyramid include"""
+
+    from .include import include_package
+    include_package(config)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/area.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,60 @@
+#
+# Copyright (c) 2008-2017 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+try:
+    from osgeo.osr import SpatialReference, CoordinateTransformation
+    have_gdal = True
+except ImportError:
+    have_gdal = False
+from persistent import Persistent
+
+# import interfaces
+from pyams_gis.interfaces import WGS84, IGeoArea
+
+# import packages
+from zope.interface import implementer
+from zope.schema.fieldproperty import FieldProperty
+
+
+@implementer(IGeoArea)
+class GeoArea(Persistent):
+    """GeoArea attribute object"""
+
+    x1 = FieldProperty(IGeoArea['x1'])
+    y1 = FieldProperty(IGeoArea['y1'])
+    x2 = FieldProperty(IGeoArea['x2'])
+    y2 = FieldProperty(IGeoArea['y2'])
+    projection = FieldProperty(IGeoArea['projection'])
+
+    def __bool__(self):
+        return bool(self.x1 and self.y1 and self.x2 and self.y2)
+
+    def get_coordinates(self, projection=WGS84):
+        if projection == self.projection:
+            return (self.x1, self.y1), (self.x2, self.y2)
+        if (not have_gdal) or not self:
+            return None, None
+        source = SpatialReference()
+        source.ImportFromEPSG(self.projection)
+        destination = SpatialReference()
+        destination.ImportFromEPSG(projection)
+        transformation = CoordinateTransformation(source, destination)
+        return transformation.TransformPoint(float(self.x1), float(self.y1))[0:2], \
+               transformation.TransformPoint(float(self.x2), float(self.y2))[0:2]
+
+    @property
+    def wgs_coordinates(self):
+        return self.get_coordinates(WGS84)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/configuration.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,95 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_gis.interfaces.configuration import IMapConfiguration, IMapConfigurationTarget
+from zope.annotation.interfaces import IAnnotations
+
+# import packages
+from persistent import Persistent
+from pyams_utils.adapter import adapter_config
+from pyramid.threadlocal import get_current_registry
+from zope.container.contained import Contained
+from zope.interface import implementer
+from zope.lifecycleevent import ObjectCreatedEvent
+from zope.location import locate
+from zope.schema.fieldproperty import FieldProperty
+
+
+@implementer(IMapConfiguration)
+class MapConfiguration(Persistent, Contained):
+    """Map configuration persistent class"""
+
+    crs = FieldProperty(IMapConfiguration['crs'])
+    layers = FieldProperty(IMapConfiguration['layers'])
+    attribution_control = FieldProperty(IMapConfiguration['attribution_control'])
+    zoom_control = FieldProperty(IMapConfiguration['zoom_control'])
+    layer_control = FieldProperty(IMapConfiguration['layer_control'])
+    initial_center = FieldProperty(IMapConfiguration['initial_center'])
+    zoom_level = FieldProperty(IMapConfiguration['zoom_level'])
+    initial_bounds = FieldProperty(IMapConfiguration['initial_bounds'])
+    keyboard = FieldProperty(IMapConfiguration['keyboard'])
+    scroll_wheel_zoom = FieldProperty(IMapConfiguration['scroll_wheel_zoom'])
+
+    def get_configuration(self):
+        result = {
+            'crs': self.crs,
+            'attributionControl': self.attribution_control,
+            'zoomControl': self.zoom_control,
+            'layerControl': self.layer_control,
+            'keyboard': self.keyboard,
+            'scrollWheelZoom': self.scroll_wheel_zoom
+        }
+        if self.initial_center:
+            gps_location = self.initial_center.wgs_coordinates
+            result['center'] = {'lat': float(gps_location[1]),
+                                'lon': float(gps_location[0])}
+            result['zoom'] = self.zoom_level
+        elif self.initial_bounds:
+            point1, point2 = self.initial_bounds.wgs_coordinates
+            result['bounds'] = [{'lat': float(point1[1]),
+                                 'lon': float(point1[0])},
+                                {'lat': float(point2[1]),
+                                 'lon': float(point2[0])}]
+        else:
+            # Near center default location
+            result['center'] = {'lat': 45,
+                                'lon': 5.0}
+            result['zoom'] = 2
+        if self.layers:
+            layers = []
+            for name in self.layers:
+                layer = self.__parent__.get(name)
+                if layer is not None:
+                    layers.append(layer.get_configuration())
+            result['layers'] = layers
+        return result
+
+
+MAP_CONFIGURATION_KEY = 'pyams_gis.map.configuration'
+
+
+@adapter_config(context=IMapConfigurationTarget, provides=IMapConfiguration)
+def MapConfigurationFactory(context):
+    """Map configuration factory"""
+    annotations = IAnnotations(context)
+    configuration = annotations.get(MAP_CONFIGURATION_KEY)
+    if configuration is None:
+        configuration = annotations[MAP_CONFIGURATION_KEY] = MapConfiguration()
+        get_current_registry().notify(ObjectCreatedEvent(configuration))
+        locate(configuration, context)
+    return configuration
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/doctests/README.txt	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,3 @@
+=================
+pyams_gis package
+=================
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/include.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+
+# import packages
+
+
+def include_package(config):
+    """Pyramid include"""
+
+    # add translations
+    config.add_translation_dirs('pyams_gis:locales')
+
+    # define JSON-RPC endpoint
+    config.add_jsonrpc_endpoint('gis', '/api/gis/json')
+
+    # load registry components
+    try:
+        import pyams_zmi
+    except ImportError:
+        config.scan(ignore='pyams_gis.zmi')
+    else:
+        config.scan()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/interfaces/__init__.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,126 @@
+#
+# Copyright (c) 2008-2017 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+
+# import packages
+from pyams_utils.schema import DottedDecimalField
+from zope.interface import invariant, Interface, Invalid, Attribute
+from zope.schema import Choice
+from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
+
+from pyams_gis import _
+
+
+WGS84 = 4326
+WGS84WM = 3857
+RGF93 = 2154
+LAMBERT_IIE = 27572
+UTM_20N = 4559
+UTM_22N = 2972
+UTM_38S = 4471
+UTM_40S = 2975
+
+COORDINATES_PROJECTIONS = {WGS84: _("WGS84 (GPS)"),
+                           WGS84WM: _("WGS84 Web Mercator"),
+                           RGF93: _("Lambert 93 (Metropolitan France)"),
+                           LAMBERT_IIE: _("Extended Lambert II (Metropolitan France)"),
+                           UTM_20N: _("UTM Zone 20N (Martinique, Guadeloupe)"),
+                           UTM_22N: _("UTM Zone 22N (Guyane)"),
+                           UTM_38S: _("UTM Zone 38S (Mayotte)"),
+                           UTM_40S: _("UTM Zone 40S (La Réunion)")}
+
+COORDINATES_PROJECTION_VOCABULARY = SimpleVocabulary(sorted([SimpleTerm(v, title=t)
+                                                             for v, t in COORDINATES_PROJECTIONS.items()],
+                                                            key=lambda x: x.title))
+
+LAYER_CRS = {WGS84: 'L.CRS.EPSG4326',
+             WGS84WM: 'L.CRS.EPSG3857',
+             RGF93: 'L.geoportalCRS.EPSG2154',
+             LAMBERT_IIE: 'L.geoportalCRS.EPSG27572'}
+
+LAYER_CRS_VOCABULARY = SimpleVocabulary([SimpleTerm(t, title=COORDINATES_PROJECTIONS[v])
+                                         for v, t in LAYER_CRS.items()])
+
+
+class IGeoPoint(Interface):
+    """GeoPoint attribute interface"""
+
+    longitude = DottedDecimalField(title=_("Longitude"),
+                                   required=False)
+
+    latitude = DottedDecimalField(title=_("Latitude"),
+                                  required=False)
+
+    projection = Choice(title=_("Projection system"),
+                        vocabulary=COORDINATES_PROJECTION_VOCABULARY,
+                        default=WGS84,
+                        required=False)
+
+    @invariant
+    def check_coordinates(self):
+        data = set(map(bool, (self.longitude, self.latitude)))
+        if len(data) == 2:
+            raise Invalid(_("You must set longitude and latitude, or None!"))
+        if self.longitude and not self.projection:
+            raise Invalid(_("You can't set coordinates without setting projection!"))
+
+    def get_coordinates(self, projection=WGS84):
+        """Get coordinates translated to given projection"""
+
+    wgs_coordinates = Attribute("Coordinates tuple in WGS84 projection")
+
+
+class IGeoPointZ(IGeoPoint):
+    """GeoPointZ attribute interface"""
+
+    altitude = DottedDecimalField(title=_("Altitude"),
+                                  required=False)
+
+
+class IGeoArea(Interface):
+    """Geographic area defined by a rectangle"""
+
+    x1 = DottedDecimalField(title=_("West limit"),
+                            required=False)
+
+    y1 = DottedDecimalField(title=_("South limit"),
+                            required=False)
+
+    x2 = DottedDecimalField(title=_("East limit"),
+                            required=False)
+
+    y2 = DottedDecimalField(title=_("North limit"),
+                            required=False)
+
+    projection = Choice(title=_("Projection system"),
+                        vocabulary=COORDINATES_PROJECTION_VOCABULARY,
+                        default=WGS84,
+                        required=False)
+
+    @invariant
+    def check_coordinates(self):
+        data = set(map(bool, (self.x1, self.x2, self.y1, self.y2)))
+        if len(data) == 2:
+            raise Invalid(_("You must set all coordinates or None!"))
+        if self.x1 and not self.projection:
+            raise Invalid(_("You can't set coordinates without setting projection!"))
+
+    def get_coordinates(self, projection=WGS84):
+        """Get coordinates translated to given projection"""
+
+    wgs_coordinates = Attribute("Coordinates in WGS84 projection")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/interfaces/configuration.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,88 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_gis.interfaces import LAYER_CRS, LAYER_CRS_VOCABULARY, WGS84WM
+
+# import packages
+from pyams_gis.schema import GeoPointField, GeoAreaField
+from zope.interface import Interface
+from zope.schema import Choice, Bool, Int, List
+
+from pyams_gis import _
+
+
+class IMapConfiguration(Interface):
+    """Map configuration interface"""
+
+    crs = Choice(title=_("CRS"),
+                 description=_("Coordinates reference system to use for the map"),
+                 vocabulary=LAYER_CRS_VOCABULARY,
+                 default=LAYER_CRS[WGS84WM],
+                 required=True)
+
+    layers = List(title=_("Layers list"),
+                  description=_("List of available layers displayed into this map"),
+                  value_type=Choice(vocabulary='PyAMS map layers'),
+                  required=False)
+
+    attribution_control = Bool(title=_("Attribution control?"),
+                               description=_("If 'yes', an attribution control is added to map"),
+                               required=True,
+                               default=True)
+
+    zoom_control = Bool(title=_("Zoom control?"),
+                        description=_("If 'yes', a zoom control is added to map"),
+                        required=True,
+                        default=True)
+
+    layer_control = Bool(title=_("Layers control?"),
+                         description=_("If 'yes', a layer selection control is added to map"),
+                         required=True,
+                         default=False)
+
+    initial_center = GeoPointField(title=_("Initial center"),
+                                   description=_("Initial map location center"),
+                                   required=False)
+
+    zoom_level = Int(title=_("Initial zoom level"),
+                     description=_("Zoom level at which to display map"),
+                     min=0,
+                     max=18,
+                     required=False)
+
+    initial_bounds = GeoAreaField(title=_("Initial bounds"),
+                                  description=_("Initial map location bounds"),
+                                  required=False)
+
+    keyboard = Bool(title=_("Keyboard navigation?"),
+                    description=_("If 'yes', makes the map focusable and allows users to navigate with "
+                                  "keyboard arrows and +/- keys"),
+                    required=True,
+                    default=True)
+
+    scroll_wheel_zoom = Bool(title=_("Scroll wheel zoom?"),
+                             description=_("If 'yes', the map can be zoomed using the mouse wheel"),
+                             required=True,
+                             default=True)
+
+    def get_configuration(self):
+        """Get map layers configuration"""
+
+
+class IMapConfigurationTarget(Interface):
+    """Map configuration target marker interface"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/interfaces/layer.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,181 @@
+#
+# Copyright (c) 2008-2017 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_gis.interfaces import LAYER_CRS_VOCABULARY
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.location.interfaces import IContained
+
+# import packages
+from pyams_gis.schema import GeoAreaField
+from pyams_i18n.schema import I18nTextLineField
+from zope.interface import Attribute
+from zope.schema import Bool, Choice, Int, TextLine
+from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
+
+from pyams_gis import _
+
+
+#
+# Leaflet map layers interfaces
+#
+
+class IMapLayer(IContained, IAttributeAnnotatable):
+    """Base map layer interface"""
+
+    factory = Attribute(_("Layer factory name"))
+
+    depends = Attribute(_("List of layer factory dependent objects"))
+
+    name = TextLine(title=_("Layer name"),
+                    required=True)
+
+    layer_type = Attribute(_("Layer type"))
+
+    title = I18nTextLineField(title=_("Layer title"),
+                              description=_("Full layer title"),
+                              required=True)
+
+    min_zoom = Int(title=_("Minimum zoom level"),
+                   description=_("Minimum zoom level at which layer is displayed"),
+                   default=0,
+                   required=True)
+
+    max_zoom = Int(title=_("Maximum zoom level"),
+                   description=_("Maximum zoom level at which layer is displayed"),
+                   default=18,
+                   required=True)
+
+    def get_configuration(self):
+        """Get layer configuration mapping"""
+
+
+class IBaseTileMapLayer(IMapLayer):
+    """Base tile map layer interface"""
+
+    attribution = TextLine(title=_("Layer attribution"),
+                           description=_("String used by the attribution control"),
+                           required=False)
+
+    bounds = GeoAreaField(title=_("Layer bounds"),
+                          description=_("Geographical bounds into which layer tiles are displayed"),
+                          required=False)
+
+
+class ITileMapLayer(IBaseTileMapLayer):
+    """Tile map layer interface"""
+
+    url = TextLine(title=_("URL template"),
+                   description=_("URL template used to get layer tiles (see leaflet.js docs)"),
+                   default='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
+                   required=True)
+
+
+class IWMSMapLayer(ITileMapLayer):
+    """WMS map layer interface"""
+
+    crs = Choice(title=_("CRS"),
+                 description=_("Coordinates reference system to use for map requests; defaults to map request"),
+                 vocabulary=LAYER_CRS_VOCABULARY,
+                 required=False)
+
+    layers = TextLine(title=_("Layers"),
+                      description=_("Comma-separated list of WMS layers to show"),
+                      required=False)
+
+    styles = TextLine(title=_("Styles"),
+                      description=_("Comma-separated list of WMS styles"),
+                      required=False)
+
+    format = TextLine(title=_("Layer format"),
+                      description=_("WMS image format; use 'image/png' for layers with transparency"),
+                      required=True,
+                      default='image/png')
+
+    transparent = Bool(title=_("Transparent?"),
+                       description=_("If 'yes', the WMS services will return images with transparency"),
+                       required=True,
+                       default=False)
+
+    version = TextLine(title=_("Version"),
+                       description=_("Version of the WMS service to use"),
+                       required=True,
+                       default='1.1.1')
+
+    uppercase = Bool(title=_("Uppercase?"),
+                     description=_("If 'yes', WMS request parameters keys will be uppercase"),
+                     required=True,
+                     default=False)
+
+
+class IGeoportalMapLayer(IBaseTileMapLayer):
+    """French IGN map layer interface"""
+
+    api_key = TextLine(title=_("API key"),
+                       description=_("Key used to access layer data"),
+                       required=True)
+
+    layer_name = TextLine(title=_("IGN layer name"),
+                          description=_("Name of layer in IGN format"),
+                          required=True)
+
+    crs = Choice(title=_("CRS"),
+                 description=_("Coordinates reference system to use for map requests; defaults to map request"),
+                 vocabulary=LAYER_CRS_VOCABULARY,
+                 required=False)
+
+
+class IEsriBaseMapLayer(ITileMapLayer):
+    """ESRI map layer interface"""
+
+
+class IEsriFeatureMapLayer(IMapLayer):
+    """ESRI feature layer interface"""
+
+    url = TextLine(title=_("Layer URL"),
+                   description=_("URL used to get the feature layer"),
+                   required=True)
+
+    token = TextLine(title=_("Token"),
+                     description=_("Token used in all service requests"),
+                     required=False)
+
+    where = TextLine(title=_("Where condition"),
+                     description=_("Optional expression used to filter features"),
+                     required=False)
+
+
+GOOGLE_MAP_TYPES = {'roadmap': _("Roads map"),
+                    'satellite': _("Satellite"),
+                    'hybrid': _("Hybrid"),
+                    'terrain': _("Terrain")}
+
+GOOGLE_MAP_TYPES_VOCABULARY = SimpleVocabulary([SimpleTerm(v, title=t) for v, t in GOOGLE_MAP_TYPES.items()])
+
+
+class IGoogleMapLayer(IMapLayer):
+    """Google Maps layer"""
+
+    api_key = TextLine(title=_("API key"),
+                       description=_("Google API key used to access maps data"),
+                       required=True)
+
+    type = Choice(title=_("Map type"),
+                  description=_("Type of GoogleMaps layer type"),
+                  vocabulary=GOOGLE_MAP_TYPES_VOCABULARY,
+                  default='roadmap',
+                  required=True)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/interfaces/utility.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_gis.interfaces.layer import IMapLayer
+from zope.annotation import IAttributeAnnotatable
+from zope.container.interfaces import IContainer
+
+# import packages
+from zope.container.constraints import contains
+
+
+class IMapManager(IContainer, IAttributeAnnotatable):
+    """Map manager interface"""
+
+    contains(IMapLayer)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/interfaces/widget.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,34 @@
+#
+# Copyright (c) 2008-2017 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from z3c.form.interfaces import IObjectWidget
+
+
+# import packages
+
+
+class IGeoPointWidget(IObjectWidget):
+    """GeoPoint widget interface"""
+
+
+class IGeoPointZWidget(IObjectWidget):
+    """GeoPointZ widget interface"""
+
+
+class IGeoAreaWidget(IObjectWidget):
+    """GeoArea widget interface"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/layer.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,177 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_gis.interfaces.layer import IMapLayer, IBaseTileMapLayer, ITileMapLayer, IWMSMapLayer, IGeoportalMapLayer, \
+    IEsriFeatureMapLayer, IGoogleMapLayer
+from pyams_i18n.interfaces import II18n
+
+# import packages
+from persistent import Persistent
+from pyams_gis import leaflet_gp, leaflet_esri, leaflet_google_mutant
+from pyams_utils.dict import update_dict
+from pyams_utils.fanstatic import get_resource_path
+from zope.container.contained import Contained
+from zope.interface import implementer
+from zope.schema.fieldproperty import FieldProperty
+
+from pyams_gis import _
+
+
+class MapLayer(Persistent, Contained):
+    """Base tile map layer persistent class"""
+
+    factory = None
+    depends = {}
+    layer_type = None
+
+    name = FieldProperty(IMapLayer['name'])
+    title = FieldProperty(IMapLayer['title'])
+    min_zoom = FieldProperty(IMapLayer['min_zoom'])
+    max_zoom = FieldProperty(IMapLayer['max_zoom'])
+
+    def get_configuration(self):
+        """Get configuration mapping"""
+        result = {'name': self.name,
+                  'title': II18n(self).query_attribute('title')}
+        update_dict(result, 'factory', self.factory)
+        update_dict(result, 'minZoom', self.min_zoom)
+        update_dict(result, 'maxZoom', self.max_zoom)
+        if self.depends:
+            depends = {}
+            for name, resource in self.depends.items():
+                depends[name] = get_resource_path(resource)
+            update_dict(result, 'dependsOn', depends)
+        return result
+
+
+class BaseTileMapLayer(MapLayer):
+    """Base tile map layer"""
+
+    attribution = FieldProperty(IBaseTileMapLayer['attribution'])
+    bounds = FieldProperty(IBaseTileMapLayer['bounds'])
+
+    def get_configuration(self):
+        result = super(BaseTileMapLayer, self).get_configuration()
+        update_dict(result, 'attribution', self.attribution)
+        if self.bounds:
+            point1, point2 = self.bounds.wgs_coordinates
+            result['bounds'] = [{'lat': float(point1[1]),
+                                 'lon': float(point1[0])},
+                                {'lat': float(point2[1]),
+                                 'lon': float(point2[0])}]
+        return result
+
+
+@implementer(ITileMapLayer)
+class TileMapLayer(BaseTileMapLayer):
+    """Base tile map layer persistent class"""
+
+    factory = 'PyAMS_GIS.factory.TileLayer'
+    layer_type = _("Tile")
+
+    url = FieldProperty(ITileMapLayer['url'])
+
+    def get_configuration(self):
+        result = super(TileMapLayer, self).get_configuration()
+        update_dict(result, 'url', self.url)
+        return result
+
+
+@implementer(IWMSMapLayer)
+class WMSMapLayer(TileMapLayer):
+    """WMS map mayer persistent class"""
+
+    factory = 'PyAMS_GIS.factory.WMS'
+    layer_type = _("WMS")
+
+    crs = FieldProperty(IWMSMapLayer['crs'])
+    layers = FieldProperty(IWMSMapLayer['layers'])
+    styles = FieldProperty(IWMSMapLayer['styles'])
+    format = FieldProperty(IWMSMapLayer['format'])
+    transparent = FieldProperty(IWMSMapLayer['transparent'])
+    version = FieldProperty(IWMSMapLayer['version'])
+    uppercase = FieldProperty(IWMSMapLayer['uppercase'])
+
+    def get_configuration(self):
+        result = super(WMSMapLayer, self).get_configuration()
+        update_dict(result, 'crs', self.crs)
+        update_dict(result, 'layers', self.layers)
+        update_dict(result, 'styles', self.styles)
+        update_dict(result, 'format', self.format)
+        update_dict(result, 'transparent', self.transparent)
+        update_dict(result, 'version', self.version)
+        update_dict(result, 'uppercase', self.uppercase)
+        return result
+
+
+@implementer(IGeoportalMapLayer)
+class GeoportalMapLayer(BaseTileMapLayer):
+    """Geoportal map layer persistent class"""
+
+    factory = 'PyAMS_GIS.factory.Geoportal.WMS'
+    depends = {'L.geoportalLayer.WMS': leaflet_gp}
+    layer_type = _("Geoportal")
+
+    api_key = FieldProperty(IGeoportalMapLayer['api_key'])
+    layer_name = FieldProperty(IGeoportalMapLayer['layer_name'])
+    crs = FieldProperty(IGeoportalMapLayer['crs'])
+
+    def get_configuration(self):
+        result = super(GeoportalMapLayer, self).get_configuration()
+        update_dict(result, 'apiKey', self.api_key)
+        update_dict(result, 'layer', self.layer_name)
+        update_dict(result, 'crs', self.crs)
+        return result
+
+
+@implementer(IEsriFeatureMapLayer)
+class EsriFeatureMapLayer(MapLayer):
+    """ESRI feature map layer"""
+
+    factory = 'PyAMS_GIS.factory.ESRI.Feature'
+    depends = {'L.esri.featureLayer': leaflet_esri}
+    layer_type = _("ESRI Features")
+
+    url = FieldProperty(IEsriFeatureMapLayer['url'])
+    token = FieldProperty(IEsriFeatureMapLayer['token'])
+    where = FieldProperty(IEsriFeatureMapLayer['where'])
+
+    def get_configuration(self):
+        result = super(EsriFeatureMapLayer, self).get_configuration()
+        update_dict(result, 'url', self.url)
+        update_dict(result, 'token', self.token)
+        update_dict(result, 'where', self.where)
+        return result
+
+
+@implementer(IGoogleMapLayer)
+class GoogleMapLayer(MapLayer):
+    """Google maps layer"""
+
+    factory = 'PyAMS_GIS.factory.Google'
+    depends = {'L.gridLayer.googleMutant': leaflet_google_mutant}
+    layer_type = _("Google")
+
+    api_key = FieldProperty(IGoogleMapLayer['api_key'])
+    type = FieldProperty(IGoogleMapLayer['type'])
+
+    def get_configuration(self):
+        result = super(GoogleMapLayer, self).get_configuration()
+        update_dict(result, 'apiKey', self.api_key)
+        update_dict(result, 'type', self.type)
+        return result
Binary file src/pyams_gis/locales/fr/LC_MESSAGES/pyams_gis.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/locales/fr/LC_MESSAGES/pyams_gis.po	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,516 @@
+#
+# French translations for PACKAGE package
+# This file is distributed under the same license as the PACKAGE package.
+# Thierry Florac <tflorac@ulthar.net>, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE 1.0\n"
+"POT-Creation-Date: 2017-05-18 15:57+0200\n"
+"PO-Revision-Date: 2017-05-18 14:39+0200\n"
+"Last-Translator: Thierry Florac <tflorac@ulthar.net>\n"
+"Language-Team: French\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Lingua 3.8\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: src/pyams_gis/layer.py:85
+msgid "Tile"
+msgstr "Tuiles"
+
+#: src/pyams_gis/layer.py:100
+msgid "WMS"
+msgstr "WMS"
+
+#: src/pyams_gis/layer.py:128
+msgid "Geoportal"
+msgstr "Géoportail"
+
+#: src/pyams_gis/layer.py:148
+msgid "ESRI Features"
+msgstr "Feature ESRI"
+
+#: src/pyams_gis/layer.py:172
+msgid "Google"
+msgstr "Google"
+
+#: src/pyams_gis/widget/templates/geoarea-input.pt:7
+msgid "Remove area settings"
+msgstr "Supprimer l'emprise"
+
+#: src/pyams_gis/widget/templates/geoarea-input.pt:13
+msgid "Select area from map"
+msgstr "Sélectionner l'emprise à partir d'une carte"
+
+#: src/pyams_gis/widget/templates/geoarea-input.pt:33
+msgid "Select map area"
+msgstr "Sélection d'une emprise cartographique"
+
+#: src/pyams_gis/widget/templates/geopoint-input.pt:7
+msgid "Remove position settings"
+msgstr "Supprimer la position"
+
+#: src/pyams_gis/widget/templates/geopoint-input.pt:13
+msgid "Select location from map"
+msgstr "Sélectionner la position à partir d'une carte"
+
+#: src/pyams_gis/widget/templates/geopoint-input.pt:33
+msgid "Select marker position"
+msgstr "Sélection d'une position"
+
+#: src/pyams_gis/zmi/layer.py:68
+msgid "Add tile layer..."
+msgstr "Ajouter une couche tuilée..."
+
+#: src/pyams_gis/zmi/layer.py:80 src/pyams_gis/zmi/layer.py:157
+#: src/pyams_gis/zmi/layer.py:234 src/pyams_gis/zmi/layer.py:311
+#: src/pyams_gis/zmi/layer.py:388 src/pyams_gis/zmi/utility.py:76
+#: src/pyams_gis/zmi/utility.py:165 src/pyams_gis/zmi/utility.py:186
+msgid "Maps manager"
+msgstr "Gestionnaire de cartes"
+
+#: src/pyams_gis/zmi/layer.py:81
+msgid "Add tile layer"
+msgstr "Ajout d'une couche tuilée"
+
+#: src/pyams_gis/zmi/layer.py:115 src/pyams_gis/zmi/layer.py:192
+#: src/pyams_gis/zmi/layer.py:269 src/pyams_gis/zmi/layer.py:346
+#: src/pyams_gis/zmi/layer.py:423
+msgid "Edit layer properties"
+msgstr "Propriétés d'une couche"
+
+#: src/pyams_gis/zmi/layer.py:145
+msgid "Add WMS layer..."
+msgstr "Ajouter une couche WMS..."
+
+#: src/pyams_gis/zmi/layer.py:158
+msgid "Add WMS layer"
+msgstr "Ajout d'une couche WMS"
+
+#: src/pyams_gis/zmi/layer.py:222
+msgid "Add Geoportal WMS layer..."
+msgstr "Ajouter une couche WMS du Géoportail..."
+
+#: src/pyams_gis/zmi/layer.py:235
+msgid "Add IGN Geoportal layer"
+msgstr "Ajout d'une couche WMS du Géoportail"
+
+#: src/pyams_gis/zmi/layer.py:299
+msgid "Add ESRI feature layer..."
+msgstr "Ajouter une FeatureLayer ESRI..."
+
+#: src/pyams_gis/zmi/layer.py:312
+msgid "Add ESRI feature layer"
+msgstr "Ajout d'une FeatureLayer ESRI"
+
+#: src/pyams_gis/zmi/layer.py:376
+msgid "Add Google Maps layer..."
+msgstr "Ajouter une couche Google Maps..."
+
+#: src/pyams_gis/zmi/layer.py:389
+msgid "Add Google Maps layer"
+msgstr "Ajout d'une couche Google Maps"
+
+#: src/pyams_gis/zmi/layer.py:55
+msgid "Specified layer name already exists!"
+msgstr "Le nom indiqué pour cette couche existe déjà !"
+
+#: src/pyams_gis/zmi/utility.py:85
+msgid "Map manager layers"
+msgstr "Couches du gestionnaire de cartes"
+
+#: src/pyams_gis/zmi/utility.py:104
+msgid "Name"
+msgstr "Nom"
+
+#: src/pyams_gis/zmi/utility.py:113
+msgid "Type"
+msgstr "Type"
+
+#: src/pyams_gis/zmi/utility.py:125
+msgid "Title"
+msgstr "Titre"
+
+#: src/pyams_gis/zmi/utility.py:135
+msgid "Delete layer"
+msgstr "Supprimer la couche"
+
+#: src/pyams_gis/zmi/utility.py:164
+msgid "Control panel"
+msgstr "Panneau de configuration"
+
+#: src/pyams_gis/zmi/utility.py:173
+msgid "Configuration..."
+msgstr "Configuration..."
+
+#: src/pyams_gis/zmi/utility.py:187
+msgid "Default map configuration"
+msgstr "Configuration des cartes par défaut"
+
+#: src/pyams_gis/zmi/utility.py:215
+msgid "No provided object_name argument!"
+msgstr "L'argument 'object_name' n'a pas été fourni !"
+
+#: src/pyams_gis/zmi/utility.py:219
+msgid "Given layer name doesn't exist!"
+msgstr "Le nom de couche indiqué n'existe pas !"
+
+#: src/pyams_gis/interfaces/configuration.py:32
+#: src/pyams_gis/interfaces/layer.py:91 src/pyams_gis/interfaces/layer.py:136
+msgid "CRS"
+msgstr "CRS"
+
+#: src/pyams_gis/interfaces/configuration.py:33
+msgid "Coordinates reference system to use for the map"
+msgstr "Système de coordonnées de référence à utiliser pour cette carte"
+
+#: src/pyams_gis/interfaces/configuration.py:38
+msgid "Layers list"
+msgstr "Liste des couches"
+
+#: src/pyams_gis/interfaces/configuration.py:39
+msgid "List of available layers displayed into this map"
+msgstr "Liste des couches dispopnibles à intégrer dans cette carte"
+
+#: src/pyams_gis/interfaces/configuration.py:43
+msgid "Attribution control?"
+msgstr "Attribution ?"
+
+#: src/pyams_gis/interfaces/configuration.py:44
+msgid "If 'yes', an attribution control is added to map"
+msgstr "Si 'oui', un contrôle d'attribution sera ajouté à la carte"
+
+#: src/pyams_gis/interfaces/configuration.py:48
+msgid "Zoom control?"
+msgstr "Contrôle de zoom ?"
+
+#: src/pyams_gis/interfaces/configuration.py:49
+msgid "If 'yes', a zoom control is added to map"
+msgstr "Si 'oui', un contrôle de zoom sera ajouté à la carte"
+
+#: src/pyams_gis/interfaces/configuration.py:53
+msgid "Layers control?"
+msgstr "Sélecteur de couches ?"
+
+#: src/pyams_gis/interfaces/configuration.py:54
+msgid "If 'yes', a layer selection control is added to map"
+msgstr "Si 'oui', un sélecteur de couches sera ajouté à la carte"
+
+#: src/pyams_gis/interfaces/configuration.py:58
+msgid "Initial center"
+msgstr "Position initiale"
+
+#: src/pyams_gis/interfaces/configuration.py:59
+msgid "Initial map location center"
+msgstr "Localisation initiale du centre de la carte"
+
+#: src/pyams_gis/interfaces/configuration.py:62
+msgid "Initial zoom level"
+msgstr "Niveau de zoom"
+
+#: src/pyams_gis/interfaces/configuration.py:63
+msgid "Zoom level at which to display map"
+msgstr "Niveau de zoom initial auquel sera affichée la carte"
+
+#: src/pyams_gis/interfaces/configuration.py:68
+msgid "Initial bounds"
+msgstr "Emprise initiale"
+
+#: src/pyams_gis/interfaces/configuration.py:69
+msgid "Initial map location bounds"
+msgstr "Emprise initiale de la carte"
+
+#: src/pyams_gis/interfaces/configuration.py:72
+msgid "Keyboard navigation?"
+msgstr "Navigation au clavier ?"
+
+#: src/pyams_gis/interfaces/configuration.py:73
+msgid ""
+"If 'yes', makes the map focusable and allows users to navigate with keyboard "
+"arrows and +/- keys"
+msgstr ""
+"Si 'oui', la carte peut prendre le focus et l'utilisateur peut naviguer dans "
+"la carte au clavier à l'aide des flèches de direction et des touches +/-"
+
+#: src/pyams_gis/interfaces/configuration.py:78
+msgid "Scroll wheel zoom?"
+msgstr "Zoom à la molette ?"
+
+#: src/pyams_gis/interfaces/configuration.py:79
+msgid "If 'yes', the map can be zoomed using the mouse wheel"
+msgstr ""
+"Si 'oui', le niveau de zoom de la carte peut être modifié en utilisant la "
+"molette de la souris"
+
+#: src/pyams_gis/interfaces/layer.py:172
+msgid "Roads map"
+msgstr "Carte des routes"
+
+#: src/pyams_gis/interfaces/layer.py:173
+msgid "Satellite"
+msgstr "Image satellite"
+
+#: src/pyams_gis/interfaces/layer.py:174
+msgid "Hybrid"
+msgstr "Vue hybride"
+
+#: src/pyams_gis/interfaces/layer.py:175
+msgid "Terrain"
+msgstr "Vue topographique"
+
+#: src/pyams_gis/interfaces/layer.py:40
+msgid "Layer factory name"
+msgstr "Nom de la fabrique de la couche"
+
+#: src/pyams_gis/interfaces/layer.py:42
+msgid "List of layer factory dependent objects"
+msgstr "Liste des ressources dont dépend la couche"
+
+#: src/pyams_gis/interfaces/layer.py:47
+msgid "Layer type"
+msgstr "Type de couche"
+
+#: src/pyams_gis/interfaces/layer.py:44
+msgid "Layer name"
+msgstr "Nom de la couche"
+
+#: src/pyams_gis/interfaces/layer.py:49
+msgid "Layer title"
+msgstr "Libellé de la couche"
+
+#: src/pyams_gis/interfaces/layer.py:50
+msgid "Full layer title"
+msgstr "Désignation complète de la couche"
+
+#: src/pyams_gis/interfaces/layer.py:60
+msgid "Layer attribution"
+msgstr "Attribution de la couche"
+
+#: src/pyams_gis/interfaces/layer.py:61
+msgid "String used by the attribution control"
+msgstr "Texte affiché par le contrôle d'attribution de la carte"
+
+#: src/pyams_gis/interfaces/layer.py:64 src/pyams_gis/interfaces/layer.py:161
+msgid "Minimum zoom level"
+msgstr "Zoom minimum"
+
+#: src/pyams_gis/interfaces/layer.py:65 src/pyams_gis/interfaces/layer.py:162
+msgid "Minimum zoom level at which layer is displayed"
+msgstr "Niveau de zoom minimum auquel la carte est affichée"
+
+#: src/pyams_gis/interfaces/layer.py:69 src/pyams_gis/interfaces/layer.py:166
+msgid "Maximum zoom level"
+msgstr "Zoom maximum"
+
+#: src/pyams_gis/interfaces/layer.py:70 src/pyams_gis/interfaces/layer.py:167
+msgid "Maximum zoom level at which layer is displayed"
+msgstr "Niveau de zoom maximum auquel la carte est affichée"
+
+#: src/pyams_gis/interfaces/layer.py:74
+msgid "Layer bounds"
+msgstr "Emprise de la couche"
+
+#: src/pyams_gis/interfaces/layer.py:75
+msgid "Geographical bounds into which layer tiles are displayed"
+msgstr ""
+"Emprise géographique au sein de laquelle les tuiles de la couche sont "
+"affichées"
+
+#: src/pyams_gis/interfaces/layer.py:82
+msgid "URL template"
+msgstr "Modèle d'URL"
+
+#: src/pyams_gis/interfaces/layer.py:83
+msgid "URL template used to get layer tiles (see leaflet.js docs)"
+msgstr ""
+"Modèle d'URL utilisée pour accéder aux tuiles (voir la documentation de "
+"Leaflet)"
+
+#: src/pyams_gis/interfaces/layer.py:92 src/pyams_gis/interfaces/layer.py:137
+msgid ""
+"Coordinates reference system to use for map requests; defaults to map request"
+msgstr ""
+"Système de coordonnées de référence à utiliser pour les requêtes effectuées "
+"sur cette couche ; par défaut le même que celui de la carte"
+
+#: src/pyams_gis/interfaces/layer.py:96
+msgid "Layers"
+msgstr "Couches"
+
+#: src/pyams_gis/interfaces/layer.py:97
+msgid "Comma-separated list of WMS layers to show"
+msgstr "Liste des couches WMS à afficher, séparées par des points-virgules"
+
+#: src/pyams_gis/interfaces/layer.py:100
+msgid "Styles"
+msgstr "Styles"
+
+#: src/pyams_gis/interfaces/layer.py:101
+msgid "Comma-separated list of WMS styles"
+msgstr "Liste des styles WMS, séparés par des points-virgules"
+
+#: src/pyams_gis/interfaces/layer.py:104
+msgid "Layer format"
+msgstr "Format d'image"
+
+#: src/pyams_gis/interfaces/layer.py:105
+msgid "WMS image format; use 'image/png' for layers with transparency"
+msgstr ""
+"Format d'image WMS ; utiliser 'image/png' pour les couches avec transparence"
+
+#: src/pyams_gis/interfaces/layer.py:109
+msgid "Transparent?"
+msgstr "Transparence ?"
+
+#: src/pyams_gis/interfaces/layer.py:110
+msgid "If 'yes', the WMS services will return images with transparency"
+msgstr "Si 'oui', le service WMS fournira des images avec transparence"
+
+#: src/pyams_gis/interfaces/layer.py:114
+msgid "Version"
+msgstr "Version"
+
+#: src/pyams_gis/interfaces/layer.py:115
+msgid "Version of the WMS service to use"
+msgstr "Version du service WMS à utiliser"
+
+#: src/pyams_gis/interfaces/layer.py:119
+msgid "Uppercase?"
+msgstr "Majuscules ?"
+
+#: src/pyams_gis/interfaces/layer.py:120
+msgid "If 'yes', WMS request parameters keys will be uppercase"
+msgstr "Si 'oui', les paramètres des requêtes WMS seront fournis en majuscules"
+
+#: src/pyams_gis/interfaces/layer.py:128 src/pyams_gis/interfaces/layer.py:183
+msgid "API key"
+msgstr "Clé d'API"
+
+#: src/pyams_gis/interfaces/layer.py:129
+msgid "Key used to access layer data"
+msgstr "Clé utilisée pour accéder aux données de la couche"
+
+#: src/pyams_gis/interfaces/layer.py:132
+msgid "IGN layer name"
+msgstr "Nom IGN"
+
+#: src/pyams_gis/interfaces/layer.py:133
+msgid "Name of layer in IGN format"
+msgstr "Nom de la couche au format IGN"
+
+#: src/pyams_gis/interfaces/layer.py:149
+msgid "Layer URL"
+msgstr "URL"
+
+#: src/pyams_gis/interfaces/layer.py:150
+msgid "URL used to get the feature layer"
+msgstr "URL utilisée pour accéder à la couche"
+
+#: src/pyams_gis/interfaces/layer.py:153
+msgid "Token"
+msgstr "Jeton"
+
+#: src/pyams_gis/interfaces/layer.py:154
+msgid "Token used in all service requests"
+msgstr "Jeton d'authentification utilisé pour tous les accès au service"
+
+#: src/pyams_gis/interfaces/layer.py:157
+msgid "Where condition"
+msgstr "Condition SQL"
+
+#: src/pyams_gis/interfaces/layer.py:158
+msgid "Optional expression used to filter features"
+msgstr "Expression SQL facultative utilisée pour filtrer les éléments affichés"
+
+#: src/pyams_gis/interfaces/layer.py:184
+msgid "Google API key used to access maps data"
+msgstr "Clé d'API Google utilisée pour accéder aux données de la carte"
+
+#: src/pyams_gis/interfaces/layer.py:187
+msgid "Map type"
+msgstr "Type de couche"
+
+#: src/pyams_gis/interfaces/layer.py:188
+msgid "Type of GoogleMaps layer type"
+msgstr "Type de couche Google Maps"
+
+#: src/pyams_gis/interfaces/__init__.py:38
+msgid "WGS84 (GPS)"
+msgstr "WGS84 (GPS)"
+
+#: src/pyams_gis/interfaces/__init__.py:39
+msgid "WGS84 Web Mercator"
+msgstr "WGS84 Web Mercator"
+
+#: src/pyams_gis/interfaces/__init__.py:40
+msgid "Lambert 93 (Metropolitan France)"
+msgstr "Lambert 93 (France métropolitaine)"
+
+#: src/pyams_gis/interfaces/__init__.py:41
+msgid "Extended Lambert II (Metropolitan France)"
+msgstr "Lambret II étendu (France métropolitaine)"
+
+#: src/pyams_gis/interfaces/__init__.py:42
+msgid "UTM Zone 20N (Martinique, Guadeloupe)"
+msgstr "UTM Zone 20N (Martinique, Guadeloupe)"
+
+#: src/pyams_gis/interfaces/__init__.py:43
+msgid "UTM Zone 22N (Guyane)"
+msgstr "UTM ZOne 22N (Guyane)"
+
+#: src/pyams_gis/interfaces/__init__.py:44
+msgid "UTM Zone 38S (Mayotte)"
+msgstr "UTM Zone 38S (Mayotte)"
+
+#: src/pyams_gis/interfaces/__init__.py:45
+msgid "UTM Zone 40S (La Réunion)"
+msgstr "UTM Zone 40S (La Réunion)"
+
+#: src/pyams_gis/interfaces/__init__.py:63
+msgid "Longitude"
+msgstr "Longitude"
+
+#: src/pyams_gis/interfaces/__init__.py:66
+msgid "Latitude"
+msgstr "Latitude"
+
+#: src/pyams_gis/interfaces/__init__.py:69
+#: src/pyams_gis/interfaces/__init__.py:110
+msgid "Projection system"
+msgstr "Système de projection"
+
+#: src/pyams_gis/interfaces/__init__.py:91
+msgid "Altitude"
+msgstr "Altitude"
+
+#: src/pyams_gis/interfaces/__init__.py:98
+msgid "West limit"
+msgstr "Limite ouest"
+
+#: src/pyams_gis/interfaces/__init__.py:101
+msgid "South limit"
+msgstr "Limite sud"
+
+#: src/pyams_gis/interfaces/__init__.py:104
+msgid "East limit"
+msgstr "Limite est"
+
+#: src/pyams_gis/interfaces/__init__.py:107
+msgid "North limit"
+msgstr "Limite nord"
+
+#: src/pyams_gis/interfaces/__init__.py:78
+msgid "You must set longitude and latitude, or None!"
+msgstr "Vous devez indiquer la longitude ET la latitude, ou aucun des deux !"
+
+#: src/pyams_gis/interfaces/__init__.py:80
+#: src/pyams_gis/interfaces/__init__.py:121
+msgid "You can't set coordinates without setting projection!"
+msgstr ""
+"Vous ne pouvez pas spécifier de coordonnées sans indiquer la projection !"
+
+#: src/pyams_gis/interfaces/__init__.py:119
+msgid "You must set all coordinates or None!"
+msgstr "Vous devez indiquer toutes les coordonnées, ou aucune !"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/locales/pyams_gis.pot	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,511 @@
+# 
+# SOME DESCRIPTIVE TITLE
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE 1.0\n"
+"POT-Creation-Date: 2017-05-18 15:57+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Lingua 3.8\n"
+
+#: ./src/pyams_gis/layer.py:85
+msgid "Tile"
+msgstr ""
+
+#: ./src/pyams_gis/layer.py:100
+msgid "WMS"
+msgstr ""
+
+#: ./src/pyams_gis/layer.py:128
+msgid "Geoportal"
+msgstr ""
+
+#: ./src/pyams_gis/layer.py:148
+msgid "ESRI Features"
+msgstr ""
+
+#: ./src/pyams_gis/layer.py:172
+msgid "Google"
+msgstr ""
+
+#: ./src/pyams_gis/widget/templates/geoarea-input.pt:7
+msgid "Remove area settings"
+msgstr ""
+
+#: ./src/pyams_gis/widget/templates/geoarea-input.pt:13
+msgid "Select area from map"
+msgstr ""
+
+#: ./src/pyams_gis/widget/templates/geoarea-input.pt:33
+msgid "Select map area"
+msgstr ""
+
+#: ./src/pyams_gis/widget/templates/geopoint-input.pt:7
+msgid "Remove position settings"
+msgstr ""
+
+#: ./src/pyams_gis/widget/templates/geopoint-input.pt:13
+msgid "Select location from map"
+msgstr ""
+
+#: ./src/pyams_gis/widget/templates/geopoint-input.pt:33
+msgid "Select marker position"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/layer.py:68
+msgid "Add tile layer..."
+msgstr ""
+
+#: ./src/pyams_gis/zmi/layer.py:80 ./src/pyams_gis/zmi/layer.py:157
+#: ./src/pyams_gis/zmi/layer.py:234 ./src/pyams_gis/zmi/layer.py:311
+#: ./src/pyams_gis/zmi/layer.py:388 ./src/pyams_gis/zmi/utility.py:76
+#: ./src/pyams_gis/zmi/utility.py:165 ./src/pyams_gis/zmi/utility.py:186
+msgid "Maps manager"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/layer.py:81
+msgid "Add tile layer"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/layer.py:115 ./src/pyams_gis/zmi/layer.py:192
+#: ./src/pyams_gis/zmi/layer.py:269 ./src/pyams_gis/zmi/layer.py:346
+#: ./src/pyams_gis/zmi/layer.py:423
+msgid "Edit layer properties"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/layer.py:145
+msgid "Add WMS layer..."
+msgstr ""
+
+#: ./src/pyams_gis/zmi/layer.py:158
+msgid "Add WMS layer"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/layer.py:222
+msgid "Add Geoportal WMS layer..."
+msgstr ""
+
+#: ./src/pyams_gis/zmi/layer.py:235
+msgid "Add IGN Geoportal layer"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/layer.py:299
+msgid "Add ESRI feature layer..."
+msgstr ""
+
+#: ./src/pyams_gis/zmi/layer.py:312
+msgid "Add ESRI feature layer"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/layer.py:376
+msgid "Add Google Maps layer..."
+msgstr ""
+
+#: ./src/pyams_gis/zmi/layer.py:389
+msgid "Add Google Maps layer"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/layer.py:55
+msgid "Specified layer name already exists!"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/utility.py:85
+msgid "Map manager layers"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/utility.py:104
+msgid "Name"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/utility.py:113
+msgid "Type"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/utility.py:125
+msgid "Title"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/utility.py:135
+msgid "Delete layer"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/utility.py:164
+msgid "Control panel"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/utility.py:173
+msgid "Configuration..."
+msgstr ""
+
+#: ./src/pyams_gis/zmi/utility.py:187
+msgid "Default map configuration"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/utility.py:215
+msgid "No provided object_name argument!"
+msgstr ""
+
+#: ./src/pyams_gis/zmi/utility.py:219
+msgid "Given layer name doesn't exist!"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:32
+#: ./src/pyams_gis/interfaces/layer.py:91
+#: ./src/pyams_gis/interfaces/layer.py:136
+msgid "CRS"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:33
+msgid "Coordinates reference system to use for the map"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:38
+msgid "Layers list"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:39
+msgid "List of available layers displayed into this map"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:43
+msgid "Attribution control?"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:44
+msgid "If 'yes', an attribution control is added to map"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:48
+msgid "Zoom control?"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:49
+msgid "If 'yes', a zoom control is added to map"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:53
+msgid "Layers control?"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:54
+msgid "If 'yes', a layer selection control is added to map"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:58
+msgid "Initial center"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:59
+msgid "Initial map location center"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:62
+msgid "Initial zoom level"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:63
+msgid "Zoom level at which to display map"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:68
+msgid "Initial bounds"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:69
+msgid "Initial map location bounds"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:72
+msgid "Keyboard navigation?"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:73
+msgid ""
+"If 'yes', makes the map focusable and allows users to navigate with keyboard "
+"arrows and +/- keys"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:78
+msgid "Scroll wheel zoom?"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/configuration.py:79
+msgid "If 'yes', the map can be zoomed using the mouse wheel"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:172
+msgid "Roads map"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:173
+msgid "Satellite"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:174
+msgid "Hybrid"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:175
+msgid "Terrain"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:40
+msgid "Layer factory name"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:42
+msgid "List of layer factory dependent objects"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:47
+msgid "Layer type"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:44
+msgid "Layer name"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:49
+msgid "Layer title"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:50
+msgid "Full layer title"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:60
+msgid "Layer attribution"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:61
+msgid "String used by the attribution control"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:64
+#: ./src/pyams_gis/interfaces/layer.py:161
+msgid "Minimum zoom level"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:65
+#: ./src/pyams_gis/interfaces/layer.py:162
+msgid "Minimum zoom level at which layer is displayed"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:69
+#: ./src/pyams_gis/interfaces/layer.py:166
+msgid "Maximum zoom level"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:70
+#: ./src/pyams_gis/interfaces/layer.py:167
+msgid "Maximum zoom level at which layer is displayed"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:74
+msgid "Layer bounds"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:75
+msgid "Geographical bounds into which layer tiles are displayed"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:82
+msgid "URL template"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:83
+msgid "URL template used to get layer tiles (see leaflet.js docs)"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:92
+#: ./src/pyams_gis/interfaces/layer.py:137
+msgid ""
+"Coordinates reference system to use for map requests; defaults to map request"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:96
+msgid "Layers"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:97
+msgid "Comma-separated list of WMS layers to show"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:100
+msgid "Styles"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:101
+msgid "Comma-separated list of WMS styles"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:104
+msgid "Layer format"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:105
+msgid "WMS image format; use 'image/png' for layers with transparency"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:109
+msgid "Transparent?"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:110
+msgid "If 'yes', the WMS services will return images with transparency"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:114
+msgid "Version"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:115
+msgid "Version of the WMS service to use"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:119
+msgid "Uppercase?"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:120
+msgid "If 'yes', WMS request parameters keys will be uppercase"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:128
+#: ./src/pyams_gis/interfaces/layer.py:183
+msgid "API key"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:129
+msgid "Key used to access layer data"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:132
+msgid "IGN layer name"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:133
+msgid "Name of layer in IGN format"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:149
+msgid "Layer URL"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:150
+msgid "URL used to get the feature layer"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:153
+msgid "Token"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:154
+msgid "Token used in all service requests"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:157
+msgid "Where condition"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:158
+msgid "Optional expression used to filter features"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:184
+msgid "Google API key used to access maps data"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:187
+msgid "Map type"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/layer.py:188
+msgid "Type of GoogleMaps layer type"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:38
+msgid "WGS84 (GPS)"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:39
+msgid "WGS84 Web Mercator"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:40
+msgid "Lambert 93 (Metropolitan France)"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:41
+msgid "Extended Lambert II (Metropolitan France)"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:42
+msgid "UTM Zone 20N (Martinique, Guadeloupe)"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:43
+msgid "UTM Zone 22N (Guyane)"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:44
+msgid "UTM Zone 38S (Mayotte)"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:45
+msgid "UTM Zone 40S (La Réunion)"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:63
+msgid "Longitude"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:66
+msgid "Latitude"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:69
+#: ./src/pyams_gis/interfaces/__init__.py:110
+msgid "Projection system"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:91
+msgid "Altitude"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:98
+msgid "West limit"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:101
+msgid "South limit"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:104
+msgid "East limit"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:107
+msgid "North limit"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:78
+msgid "You must set longitude and latitude, or None!"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:80
+#: ./src/pyams_gis/interfaces/__init__.py:121
+msgid "You can't set coordinates without setting projection!"
+msgstr ""
+
+#: ./src/pyams_gis/interfaces/__init__.py:119
+msgid "You must set all coordinates or None!"
+msgstr ""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/point.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2008-2017 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+try:
+    from osgeo.osr import SpatialReference, CoordinateTransformation
+    have_gdal = True
+except ImportError:
+    have_gdal = False
+from persistent import Persistent
+
+# import interfaces
+from pyams_gis.interfaces import IGeoPoint, IGeoPointZ, WGS84
+
+# import packages
+from zope.interface import implementer
+from zope.schema.fieldproperty import FieldProperty
+
+
+@implementer(IGeoPoint)
+class GeoPoint(Persistent):
+    """GeoPoint attribute object"""
+
+    longitude = FieldProperty(IGeoPoint['longitude'])
+    latitude = FieldProperty(IGeoPoint['latitude'])
+    projection = FieldProperty(IGeoPoint['projection'])
+
+    def __bool__(self):
+        return bool(self.longitude and self.latitude)
+
+    def get_coordinates(self, projection=WGS84):
+        if projection == self.projection:
+            return self.longitude, self.latitude
+        if (not have_gdal) or not self:
+            return None, None
+        source = SpatialReference()
+        source.ImportFromEPSG(self.projection)
+        destination = SpatialReference()
+        destination.ImportFromEPSG(projection)
+        transformation = CoordinateTransformation(source, destination)
+        return transformation.TransformPoint(float(self.longitude), float(self.latitude))[0:2]
+
+    @property
+    def wgs_coordinates(self):
+        return self.get_coordinates(WGS84)
+
+
+@implementer(IGeoPointZ)
+class GeoPointZ(GeoPoint):
+    """GeoPointZ attribute object"""
+
+    altitude = FieldProperty(IGeoPointZ['altitude'])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-1.0.3.css	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,624 @@
+/* required styles */
+
+.leaflet-pane,
+.leaflet-tile,
+.leaflet-marker-icon,
+.leaflet-marker-shadow,
+.leaflet-tile-container,
+.leaflet-pane > svg,
+.leaflet-pane > canvas,
+.leaflet-zoom-box,
+.leaflet-image-layer,
+.leaflet-layer {
+	position: absolute;
+	left: 0;
+	top: 0;
+	}
+.leaflet-container {
+	overflow: hidden;
+	}
+.leaflet-tile,
+.leaflet-marker-icon,
+.leaflet-marker-shadow {
+	-webkit-user-select: none;
+	   -moz-user-select: none;
+	        user-select: none;
+	  -webkit-user-drag: none;
+	}
+/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
+.leaflet-safari .leaflet-tile {
+	image-rendering: -webkit-optimize-contrast;
+	}
+/* hack that prevents hw layers "stretching" when loading new tiles */
+.leaflet-safari .leaflet-tile-container {
+	width: 1600px;
+	height: 1600px;
+	-webkit-transform-origin: 0 0;
+	}
+.leaflet-marker-icon,
+.leaflet-marker-shadow {
+	display: block;
+	}
+/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
+/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
+.leaflet-container .leaflet-overlay-pane svg,
+.leaflet-container .leaflet-marker-pane img,
+.leaflet-container .leaflet-shadow-pane img,
+.leaflet-container .leaflet-tile-pane img,
+.leaflet-container img.leaflet-image-layer {
+	max-width: none !important;
+	}
+
+.leaflet-container.leaflet-touch-zoom {
+	-ms-touch-action: pan-x pan-y;
+	touch-action: pan-x pan-y;
+	}
+.leaflet-container.leaflet-touch-drag {
+	-ms-touch-action: pinch-zoom;
+	}
+.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.leaflet-tile {
+	filter: inherit;
+	visibility: hidden;
+	}
+.leaflet-tile-loaded {
+	visibility: inherit;
+	}
+.leaflet-zoom-box {
+	width: 0;
+	height: 0;
+	-moz-box-sizing: border-box;
+	     box-sizing: border-box;
+	z-index: 800;
+	}
+/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
+.leaflet-overlay-pane svg {
+	-moz-user-select: none;
+	}
+
+.leaflet-pane         { z-index: 400; }
+
+.leaflet-tile-pane    { z-index: 200; }
+.leaflet-overlay-pane { z-index: 400; }
+.leaflet-shadow-pane  { z-index: 500; }
+.leaflet-marker-pane  { z-index: 600; }
+.leaflet-tooltip-pane   { z-index: 650; }
+.leaflet-popup-pane   { z-index: 700; }
+
+.leaflet-map-pane canvas { z-index: 100; }
+.leaflet-map-pane svg    { z-index: 200; }
+
+.leaflet-vml-shape {
+	width: 1px;
+	height: 1px;
+	}
+.lvml {
+	behavior: url(#default#VML);
+	display: inline-block;
+	position: absolute;
+	}
+
+
+/* control positioning */
+
+.leaflet-control {
+	position: relative;
+	z-index: 800;
+	pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
+	pointer-events: auto;
+	}
+.leaflet-top,
+.leaflet-bottom {
+	position: absolute;
+	z-index: 1000;
+	pointer-events: none;
+	}
+.leaflet-top {
+	top: 0;
+	}
+.leaflet-right {
+	right: 0;
+	}
+.leaflet-bottom {
+	bottom: 0;
+	}
+.leaflet-left {
+	left: 0;
+	}
+.leaflet-control {
+	float: left;
+	clear: both;
+	}
+.leaflet-right .leaflet-control {
+	float: right;
+	}
+.leaflet-top .leaflet-control {
+	margin-top: 10px;
+	}
+.leaflet-bottom .leaflet-control {
+	margin-bottom: 10px;
+	}
+.leaflet-left .leaflet-control {
+	margin-left: 10px;
+	}
+.leaflet-right .leaflet-control {
+	margin-right: 10px;
+	}
+
+
+/* zoom and fade animations */
+
+.leaflet-fade-anim .leaflet-tile {
+	will-change: opacity;
+	}
+.leaflet-fade-anim .leaflet-popup {
+	opacity: 0;
+	-webkit-transition: opacity 0.2s linear;
+	   -moz-transition: opacity 0.2s linear;
+	     -o-transition: opacity 0.2s linear;
+	        transition: opacity 0.2s linear;
+	}
+.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
+	opacity: 1;
+	}
+.leaflet-zoom-animated {
+	-webkit-transform-origin: 0 0;
+	    -ms-transform-origin: 0 0;
+	        transform-origin: 0 0;
+	}
+.leaflet-zoom-anim .leaflet-zoom-animated {
+	will-change: transform;
+	}
+.leaflet-zoom-anim .leaflet-zoom-animated {
+	-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
+	   -moz-transition:    -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
+	     -o-transition:      -o-transform 0.25s cubic-bezier(0,0,0.25,1);
+	        transition:         transform 0.25s cubic-bezier(0,0,0.25,1);
+	}
+.leaflet-zoom-anim .leaflet-tile,
+.leaflet-pan-anim .leaflet-tile {
+	-webkit-transition: none;
+	   -moz-transition: none;
+	     -o-transition: none;
+	        transition: none;
+	}
+
+.leaflet-zoom-anim .leaflet-zoom-hide {
+	visibility: hidden;
+	}
+
+
+/* cursors */
+
+.leaflet-interactive {
+	cursor: pointer;
+	}
+.leaflet-grab {
+	cursor: -webkit-grab;
+	cursor:    -moz-grab;
+	}
+.leaflet-crosshair,
+.leaflet-crosshair .leaflet-interactive {
+	cursor: crosshair;
+	}
+.leaflet-popup-pane,
+.leaflet-control {
+	cursor: auto;
+	}
+.leaflet-dragging .leaflet-grab,
+.leaflet-dragging .leaflet-grab .leaflet-interactive,
+.leaflet-dragging .leaflet-marker-draggable {
+	cursor: move;
+	cursor: -webkit-grabbing;
+	cursor:    -moz-grabbing;
+	}
+
+/* marker & overlays interactivity */
+.leaflet-marker-icon,
+.leaflet-marker-shadow,
+.leaflet-image-layer,
+.leaflet-pane > svg path,
+.leaflet-tile-container {
+	pointer-events: none;
+	}
+
+.leaflet-marker-icon.leaflet-interactive,
+.leaflet-image-layer.leaflet-interactive,
+.leaflet-pane > svg path.leaflet-interactive {
+	pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
+	pointer-events: auto;
+	}
+
+/* visual tweaks */
+
+.leaflet-container {
+	background: #ddd;
+	outline: 0;
+	}
+.leaflet-container a {
+	color: #0078A8;
+	}
+.leaflet-container a.leaflet-active {
+	outline: 2px solid orange;
+	}
+.leaflet-zoom-box {
+	border: 2px dotted #38f;
+	background: rgba(255,255,255,0.5);
+	}
+
+
+/* general typography */
+.leaflet-container {
+	font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
+	}
+
+
+/* general toolbar styles */
+
+.leaflet-bar {
+	box-shadow: 0 1px 5px rgba(0,0,0,0.65);
+	border-radius: 4px;
+	}
+.leaflet-bar a,
+.leaflet-bar a:hover {
+	background-color: #fff;
+	border-bottom: 1px solid #ccc;
+	width: 26px;
+	height: 26px;
+	line-height: 26px;
+	display: block;
+	text-align: center;
+	text-decoration: none;
+	color: black;
+	}
+.leaflet-bar a,
+.leaflet-control-layers-toggle {
+	background-position: 50% 50%;
+	background-repeat: no-repeat;
+	display: block;
+	}
+.leaflet-bar a:hover {
+	background-color: #f4f4f4;
+	}
+.leaflet-bar a:first-child {
+	border-top-left-radius: 4px;
+	border-top-right-radius: 4px;
+	}
+.leaflet-bar a:last-child {
+	border-bottom-left-radius: 4px;
+	border-bottom-right-radius: 4px;
+	border-bottom: none;
+	}
+.leaflet-bar a.leaflet-disabled {
+	cursor: default;
+	background-color: #f4f4f4;
+	color: #bbb;
+	}
+
+.leaflet-touch .leaflet-bar a {
+	width: 30px;
+	height: 30px;
+	line-height: 30px;
+	}
+
+
+/* zoom control */
+
+.leaflet-control-zoom-in,
+.leaflet-control-zoom-out {
+	font: bold 18px 'Lucida Console', Monaco, monospace;
+	text-indent: 1px;
+	}
+.leaflet-control-zoom-out {
+	font-size: 20px;
+	}
+
+.leaflet-touch .leaflet-control-zoom-in {
+	font-size: 22px;
+	}
+.leaflet-touch .leaflet-control-zoom-out {
+	font-size: 24px;
+	}
+
+
+/* layers control */
+
+.leaflet-control-layers {
+	box-shadow: 0 1px 5px rgba(0,0,0,0.4);
+	background: #fff;
+	border-radius: 5px;
+	}
+.leaflet-control-layers-toggle {
+	background-image: url(/--static--/pyams_gis/img/layers.png);
+	width: 36px;
+	height: 36px;
+	}
+.leaflet-retina .leaflet-control-layers-toggle {
+	background-image: url(/--static--/pyams_gis/img/layers-2x.png);
+	background-size: 26px 26px;
+	}
+.leaflet-touch .leaflet-control-layers-toggle {
+	width: 44px;
+	height: 44px;
+	}
+.leaflet-control-layers .leaflet-control-layers-list,
+.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
+	display: none;
+	}
+.leaflet-control-layers-expanded .leaflet-control-layers-list {
+	display: block;
+	position: relative;
+	}
+.leaflet-control-layers-expanded {
+	padding: 6px 10px 6px 6px;
+	color: #333;
+	background: #fff;
+	}
+.leaflet-control-layers-scrollbar {
+	overflow-y: scroll;
+	padding-right: 5px;
+	}
+.leaflet-control-layers-selector {
+	margin-top: 2px;
+	position: relative;
+	top: 1px;
+	}
+.leaflet-control-layers label {
+	display: block;
+	}
+.leaflet-control-layers-separator {
+	height: 0;
+	border-top: 1px solid #ddd;
+	margin: 5px -10px 5px -6px;
+	}
+
+/* Default icon URLs */
+.leaflet-default-icon-path {
+	background-image: url(images/marker-icon.png);
+	}
+
+
+/* attribution and scale controls */
+
+.leaflet-container .leaflet-control-attribution {
+	background: #fff;
+	background: rgba(255, 255, 255, 0.7);
+	margin: 0;
+	}
+.leaflet-control-attribution,
+.leaflet-control-scale-line {
+	padding: 0 5px;
+	color: #333;
+	}
+.leaflet-control-attribution a {
+	text-decoration: none;
+	}
+.leaflet-control-attribution a:hover {
+	text-decoration: underline;
+	}
+.leaflet-container .leaflet-control-attribution,
+.leaflet-container .leaflet-control-scale {
+	font-size: 11px;
+	}
+.leaflet-left .leaflet-control-scale {
+	margin-left: 5px;
+	}
+.leaflet-bottom .leaflet-control-scale {
+	margin-bottom: 5px;
+	}
+.leaflet-control-scale-line {
+	border: 2px solid #777;
+	border-top: none;
+	line-height: 1.1;
+	padding: 2px 5px 1px;
+	font-size: 11px;
+	white-space: nowrap;
+	overflow: hidden;
+	-moz-box-sizing: border-box;
+	     box-sizing: border-box;
+
+	background: #fff;
+	background: rgba(255, 255, 255, 0.5);
+	}
+.leaflet-control-scale-line:not(:first-child) {
+	border-top: 2px solid #777;
+	border-bottom: none;
+	margin-top: -2px;
+	}
+.leaflet-control-scale-line:not(:first-child):not(:last-child) {
+	border-bottom: 2px solid #777;
+	}
+
+.leaflet-touch .leaflet-control-attribution,
+.leaflet-touch .leaflet-control-layers,
+.leaflet-touch .leaflet-bar {
+	box-shadow: none;
+	}
+.leaflet-touch .leaflet-control-layers,
+.leaflet-touch .leaflet-bar {
+	border: 2px solid rgba(0,0,0,0.2);
+	background-clip: padding-box;
+	}
+
+
+/* popup */
+
+.leaflet-popup {
+	position: absolute;
+	text-align: center;
+	margin-bottom: 20px;
+	}
+.leaflet-popup-content-wrapper {
+	padding: 1px;
+	text-align: left;
+	border-radius: 12px;
+	}
+.leaflet-popup-content {
+	margin: 13px 19px;
+	line-height: 1.4;
+	}
+.leaflet-popup-content p {
+	margin: 18px 0;
+	}
+.leaflet-popup-tip-container {
+	width: 40px;
+	height: 20px;
+	position: absolute;
+	left: 50%;
+	margin-left: -20px;
+	overflow: hidden;
+	pointer-events: none;
+	}
+.leaflet-popup-tip {
+	width: 17px;
+	height: 17px;
+	padding: 1px;
+
+	margin: -10px auto 0;
+
+	-webkit-transform: rotate(45deg);
+	   -moz-transform: rotate(45deg);
+	    -ms-transform: rotate(45deg);
+	     -o-transform: rotate(45deg);
+	        transform: rotate(45deg);
+	}
+.leaflet-popup-content-wrapper,
+.leaflet-popup-tip {
+	background: white;
+	color: #333;
+	box-shadow: 0 3px 14px rgba(0,0,0,0.4);
+	}
+.leaflet-container a.leaflet-popup-close-button {
+	position: absolute;
+	top: 0;
+	right: 0;
+	padding: 4px 4px 0 0;
+	border: none;
+	text-align: center;
+	width: 18px;
+	height: 14px;
+	font: 16px/14px Tahoma, Verdana, sans-serif;
+	color: #c3c3c3;
+	text-decoration: none;
+	font-weight: bold;
+	background: transparent;
+	}
+.leaflet-container a.leaflet-popup-close-button:hover {
+	color: #999;
+	}
+.leaflet-popup-scrolled {
+	overflow: auto;
+	border-bottom: 1px solid #ddd;
+	border-top: 1px solid #ddd;
+	}
+
+.leaflet-oldie .leaflet-popup-content-wrapper {
+	zoom: 1;
+	}
+.leaflet-oldie .leaflet-popup-tip {
+	width: 24px;
+	margin: 0 auto;
+
+	-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
+	filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
+	}
+.leaflet-oldie .leaflet-popup-tip-container {
+	margin-top: -1px;
+	}
+
+.leaflet-oldie .leaflet-control-zoom,
+.leaflet-oldie .leaflet-control-layers,
+.leaflet-oldie .leaflet-popup-content-wrapper,
+.leaflet-oldie .leaflet-popup-tip {
+	border: 1px solid #999;
+	}
+
+
+/* div icon */
+
+.leaflet-div-icon {
+	background: #fff;
+	border: 1px solid #666;
+	}
+
+
+/* Tooltip */
+/* Base styles for the element that has a tooltip */
+.leaflet-tooltip {
+	position: absolute;
+	padding: 6px;
+	background-color: #fff;
+	border: 1px solid #fff;
+	border-radius: 3px;
+	color: #222;
+	white-space: nowrap;
+	-webkit-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+	pointer-events: none;
+	box-shadow: 0 1px 3px rgba(0,0,0,0.4);
+	}
+.leaflet-tooltip.leaflet-clickable {
+	cursor: pointer;
+	pointer-events: auto;
+	}
+.leaflet-tooltip-top:before,
+.leaflet-tooltip-bottom:before,
+.leaflet-tooltip-left:before,
+.leaflet-tooltip-right:before {
+	position: absolute;
+	pointer-events: none;
+	border: 6px solid transparent;
+	background: transparent;
+	content: "";
+	}
+
+/* Directions */
+
+.leaflet-tooltip-bottom {
+	margin-top: 6px;
+}
+.leaflet-tooltip-top {
+	margin-top: -6px;
+}
+.leaflet-tooltip-bottom:before,
+.leaflet-tooltip-top:before {
+	left: 50%;
+	margin-left: -6px;
+	}
+.leaflet-tooltip-top:before {
+	bottom: 0;
+	margin-bottom: -12px;
+	border-top-color: #fff;
+	}
+.leaflet-tooltip-bottom:before {
+	top: 0;
+	margin-top: -12px;
+	margin-left: -6px;
+	border-bottom-color: #fff;
+	}
+.leaflet-tooltip-left {
+	margin-left: -6px;
+}
+.leaflet-tooltip-right {
+	margin-left: 6px;
+}
+.leaflet-tooltip-left:before,
+.leaflet-tooltip-right:before {
+	top: 50%;
+	margin-top: -6px;
+	}
+.leaflet-tooltip-left:before {
+	right: 0;
+	margin-right: -12px;
+	border-left-color: #fff;
+	}
+.leaflet-tooltip-right:before {
+	left: 0;
+	margin-left: -12px;
+	border-right-color: #fff;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-1.0.3.min.css	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+.leaflet-pane,.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile-container,.leaflet-pane>svg,.leaflet-pane>canvas,.leaflet-zoom-box,.leaflet-image-layer,.leaflet-layer{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-overlay-pane svg,.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer{max-width:none!important}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-top,.leaflet-bottom{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-tile{will-change:opacity}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;-o-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.leaflet-zoom-anim .leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,0.25,1);-moz-transition:-moz-transform .25s cubic-bezier(0,0,0.25,1);-o-transition:-o-transform .25s cubic-bezier(0,0,0.25,1);transition:transform .25s cubic-bezier(0,0,0.25,1)}.leaflet-zoom-anim .leaflet-tile,.leaflet-pan-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-popup-pane,.leaflet-control{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-image-layer,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-marker-icon.leaflet-interactive,.leaflet-image-layer.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline:0}.leaflet-container a{color:#0078a8}.leaflet-container a.leaflet-active{outline:2px solid orange}.leaflet-zoom-box{border:2px dotted #38f;background:rgba(255,255,255,0.5)}.leaflet-container{font:12px/1.5 "Helvetica Neue",Arial,Helvetica,sans-serif}.leaflet-bar{box-shadow:0 1px 5px rgba(0,0,0,0.65);border-radius:4px}.leaflet-bar a,.leaflet-bar a:hover{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:black}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:0}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:bold 18px 'Lucida Console',Monaco,monospace;text-indent:1px}.leaflet-control-zoom-out{font-size:20px}.leaflet-touch .leaflet-control-zoom-in{font-size:22px}.leaflet-touch .leaflet-control-zoom-out{font-size:24px}.leaflet-control-layers{box-shadow:0 1px 5px rgba(0,0,0,0.4);background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(/--static--/pyams_gis/img/layers.png);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(/--static--/pyams_gis/img/layers-2x.png);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(images/marker-icon.png)}.leaflet-container .leaflet-control-attribution{background:#fff;background:rgba(255,255,255,0.7);margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover{text-decoration:underline}.leaflet-container .leaflet-control-attribution,.leaflet-container .leaflet-control-scale{font-size:11px}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:0;line-height:1.1;padding:2px 5px 1px;font-size:11px;white-space:nowrap;overflow:hidden;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;background:rgba(255,255,255,0.5)}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:0;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{box-shadow:none}.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{border:2px solid rgba(0,0,0,0.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 19px;line-height:1.4}.leaflet-popup-content p{margin:18px 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:white;color:#333;box-shadow:0 3px 14px rgba(0,0,0,0.4)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;padding:4px 4px 0 0;border:0;text-align:center;width:18px;height:14px;font:16px/14px Tahoma,Verdana,sans-serif;color:#c3c3c3;text-decoration:none;font-weight:bold;background:transparent}.leaflet-container a.leaflet-popup-close-button:hover{color:#999}.leaflet-popup-scrolled{overflow:auto;border-bottom:1px solid #ddd;border-top:1px solid #ddd}.leaflet-oldie .leaflet-popup-content-wrapper{zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";filter:progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678,M12=0.70710678,M21=-0.70710678,M22=0.70710678)}.leaflet-oldie .leaflet-popup-tip-container{margin-top:-1px}.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,0.4)}.leaflet-tooltip.leaflet-clickable{cursor:pointer;pointer-events:auto}.leaflet-tooltip-top:before,.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{position:absolute;pointer-events:none;border:6px solid transparent;background:transparent;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-draw.css	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,317 @@
+/* ================================================================== */
+/* Toolbars
+/* ================================================================== */
+
+.leaflet-draw-section {
+    position: relative;
+}
+
+.leaflet-draw-toolbar {
+    margin-top: 12px;
+}
+
+.leaflet-draw-toolbar-top {
+    margin-top: 0;
+}
+
+.leaflet-draw-toolbar-notop a:first-child {
+    border-top-right-radius: 0;
+}
+
+.leaflet-draw-toolbar-nobottom a:last-child {
+    border-bottom-right-radius: 0;
+}
+
+.leaflet-draw-toolbar a {
+    background-image: url('images/spritesheet.png');
+    background-image: linear-gradient(transparent, transparent), url('images/spritesheet.svg');
+    background-repeat: no-repeat;
+    background-size: 270px 30px;
+    background-clip: padding-box;
+}
+
+.leaflet-retina .leaflet-draw-toolbar a {
+    background-image: url('images/spritesheet-2x.png');
+    background-image: linear-gradient(transparent, transparent), url('images/spritesheet.svg');
+}
+
+.leaflet-draw a {
+    display: block;
+    text-align: center;
+    text-decoration: none;
+}
+
+.leaflet-draw a .sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0,0,0,0);
+  border: 0;
+}
+
+/* ================================================================== */
+/* Toolbar actions menu
+/* ================================================================== */
+
+.leaflet-draw-actions {
+    display: none;
+    list-style: none;
+    margin: 0;
+    padding: 0;
+    position: absolute;
+    left: 26px; /* leaflet-draw-toolbar.left + leaflet-draw-toolbar.width */
+    top: 0;
+    white-space: nowrap;
+}
+
+.leaflet-touch .leaflet-draw-actions {
+    left: 32px;
+}
+
+.leaflet-right .leaflet-draw-actions {
+    right: 26px;
+    left: auto;
+}
+
+.leaflet-touch .leaflet-right .leaflet-draw-actions {
+    right: 32px;
+    left: auto;
+}
+
+.leaflet-draw-actions li {
+    display: inline-block;
+}
+
+.leaflet-draw-actions li:first-child a {
+    border-left: none;
+}
+
+.leaflet-draw-actions li:last-child a {
+    -webkit-border-radius: 0 4px 4px 0;
+    border-radius: 0 4px 4px 0;
+}
+
+.leaflet-right .leaflet-draw-actions li:last-child a {
+    -webkit-border-radius: 0;
+    border-radius: 0;
+}
+
+.leaflet-right .leaflet-draw-actions li:first-child a {
+    -webkit-border-radius: 4px 0 0 4px;
+    border-radius: 4px 0 0 4px;
+}
+
+.leaflet-draw-actions a {
+    background-color: #919187;
+    border-left: 1px solid #AAA;
+    color: #FFF;
+    font: 11px/19px "Helvetica Neue", Arial, Helvetica, sans-serif;
+    line-height: 28px;
+    text-decoration: none;
+    padding-left: 10px;
+    padding-right: 10px;
+    height: 28px;
+}
+
+.leaflet-touch .leaflet-draw-actions a {
+    font-size: 12px;
+    line-height: 30px;
+    height: 30px;
+}
+
+.leaflet-draw-actions-bottom {
+    margin-top: 0;
+}
+
+.leaflet-draw-actions-top {
+    margin-top: 1px;
+}
+
+.leaflet-draw-actions-top a,
+.leaflet-draw-actions-bottom a {
+    height: 27px;
+    line-height: 27px;
+}
+
+.leaflet-draw-actions a:hover {
+    background-color: #A0A098;
+}
+
+.leaflet-draw-actions-top.leaflet-draw-actions-bottom a {
+    height: 26px;
+    line-height: 26px;
+}
+
+/* ================================================================== */
+/* Draw toolbar
+/* ================================================================== */
+
+.leaflet-draw-toolbar .leaflet-draw-draw-polyline {
+    background-position: -2px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline {
+    background-position: 0 -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-draw-polygon {
+    background-position: -31px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon {
+    background-position: -29px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-draw-rectangle {
+    background-position: -62px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle {
+    background-position: -60px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-draw-circle {
+    background-position: -92px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle {
+    background-position: -90px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-draw-marker {
+    background-position: -122px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker {
+    background-position: -120px -1px;
+}
+
+/* ================================================================== */
+/* Edit toolbar
+/* ================================================================== */
+
+.leaflet-draw-toolbar .leaflet-draw-edit-edit {
+    background-position: -152px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit {
+    background-position: -150px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-edit-remove {
+    background-position: -182px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove {
+    background-position: -180px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled {
+    background-position: -212px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled {
+    background-position: -210px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled {
+    background-position: -242px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled {
+    background-position: -240px -2px;
+}
+
+/* ================================================================== */
+/* Drawing styles
+/* ================================================================== */
+
+.leaflet-mouse-marker {
+    background-color: #fff;
+    cursor: crosshair;
+}
+
+.leaflet-draw-tooltip {
+    background: rgb(54, 54, 54);
+    background: rgba(0, 0, 0, 0.5);
+    border: 1px solid transparent;
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    color: #fff;
+    font: 12px/18px "Helvetica Neue", Arial, Helvetica, sans-serif;
+    margin-left: 20px;
+    margin-top: -21px;
+    padding: 4px 8px;
+    position: absolute;
+    visibility: hidden;
+    white-space: nowrap;
+    z-index: 6;
+}
+
+.leaflet-draw-tooltip:before {
+    border-right: 6px solid black;
+    border-right-color: rgba(0, 0, 0, 0.5);
+    border-top: 6px solid transparent;
+    border-bottom: 6px solid transparent;
+    content: "";
+    position: absolute;
+    top: 7px;
+    left: -7px;
+}
+
+.leaflet-error-draw-tooltip {
+    background-color: #F2DEDE;
+    border: 1px solid #E6B6BD;
+    color: #B94A48;
+}
+
+.leaflet-error-draw-tooltip:before {
+    border-right-color: #E6B6BD;
+}
+
+.leaflet-draw-tooltip-single {
+    margin-top: -12px
+}
+
+.leaflet-draw-tooltip-subtext {
+    color: #f8d5e4;
+}
+
+.leaflet-draw-guide-dash {
+    font-size: 1%;
+    opacity: 0.6;
+    position: absolute;
+    width: 5px;
+    height: 5px;
+}
+
+/* ================================================================== */
+/* Edit styles
+/* ================================================================== */
+
+.leaflet-edit-marker-selected {
+    background-color: rgba(254, 87, 161, 0.1);
+    border: 4px dashed rgba(254, 87, 161, 0.6);
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    box-sizing: content-box;
+}
+
+.leaflet-edit-move {
+    cursor: move;
+}
+
+.leaflet-edit-resize {
+    cursor: pointer;
+}
+
+/* ================================================================== */
+/* Old IE styles
+/* ================================================================== */
+
+.leaflet-oldie .leaflet-draw-toolbar {
+    border: 1px solid #999;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-draw.min.css	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+.leaflet-draw-section{position:relative}.leaflet-draw-toolbar{margin-top:12px}.leaflet-draw-toolbar-top{margin-top:0}.leaflet-draw-toolbar-notop a:first-child{border-top-right-radius:0}.leaflet-draw-toolbar-nobottom a:last-child{border-bottom-right-radius:0}.leaflet-draw-toolbar a{background-image:url('images/spritesheet.png');background-image:linear-gradient(transparent,transparent),url('images/spritesheet.svg');background-repeat:no-repeat;background-size:270px 30px;background-clip:padding-box}.leaflet-retina .leaflet-draw-toolbar a{background-image:url('images/spritesheet-2x.png');background-image:linear-gradient(transparent,transparent),url('images/spritesheet.svg')}.leaflet-draw a{display:block;text-align:center;text-decoration:none}.leaflet-draw a .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.leaflet-draw-actions{display:none;list-style:none;margin:0;padding:0;position:absolute;left:26px;top:0;white-space:nowrap}.leaflet-touch .leaflet-draw-actions{left:32px}.leaflet-right .leaflet-draw-actions{right:26px;left:auto}.leaflet-touch .leaflet-right .leaflet-draw-actions{right:32px;left:auto}.leaflet-draw-actions li{display:inline-block}.leaflet-draw-actions li:first-child a{border-left:none}.leaflet-draw-actions li:last-child a{-webkit-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.leaflet-right .leaflet-draw-actions li:last-child a{-webkit-border-radius:0;border-radius:0}.leaflet-right .leaflet-draw-actions li:first-child a{-webkit-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.leaflet-draw-actions a{background-color:#919187;border-left:1px solid #AAA;color:#FFF;font:11px/19px "Helvetica Neue",Arial,Helvetica,sans-serif;line-height:28px;text-decoration:none;padding-left:10px;padding-right:10px;height:28px}.leaflet-touch .leaflet-draw-actions a{font-size:12px;line-height:30px;height:30px}.leaflet-draw-actions-bottom{margin-top:0}.leaflet-draw-actions-top{margin-top:1px}.leaflet-draw-actions-top a,.leaflet-draw-actions-bottom a{height:27px;line-height:27px}.leaflet-draw-actions a:hover{background-color:#a0a098}.leaflet-draw-actions-top.leaflet-draw-actions-bottom a{height:26px;line-height:26px}.leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:-2px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:0 -1px}.leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-31px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-29px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-62px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-60px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-92px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-90px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-122px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-120px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-152px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-150px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-182px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-180px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-212px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-210px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-242px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-240px -2px}.leaflet-mouse-marker{background-color:#fff;cursor:crosshair}.leaflet-draw-tooltip{background:#363636;background:rgba(0,0,0,0.5);border:1px solid transparent;-webkit-border-radius:4px;border-radius:4px;color:#fff;font:12px/18px "Helvetica Neue",Arial,Helvetica,sans-serif;margin-left:20px;margin-top:-21px;padding:4px 8px;position:absolute;visibility:hidden;white-space:nowrap;z-index:6}.leaflet-draw-tooltip:before{border-right:6px solid black;border-right-color:rgba(0,0,0,0.5);border-top:6px solid transparent;border-bottom:6px solid transparent;content:"";position:absolute;top:7px;left:-7px}.leaflet-error-draw-tooltip{background-color:#f2dede;border:1px solid #e6b6bd;color:#b94a48}.leaflet-error-draw-tooltip:before{border-right-color:#e6b6bd}.leaflet-draw-tooltip-single{margin-top:-12px}.leaflet-draw-tooltip-subtext{color:#f8d5e4}.leaflet-draw-guide-dash{font-size:1%;opacity:.6;position:absolute;width:5px;height:5px}.leaflet-edit-marker-selected{background-color:rgba(254,87,161,0.1);border:4px dashed rgba(254,87,161,0.6);-webkit-border-radius:4px;border-radius:4px;box-sizing:content-box}.leaflet-edit-move{cursor:move}.leaflet-edit-resize{cursor:pointer}.leaflet-oldie .leaflet-draw-toolbar{border:1px solid #999}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-esri-geocoder.css	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,162 @@
+.geocoder-control-input {
+	position: absolute;
+	left: 0;
+	top: 0;
+	background-color: white;
+	background-repeat: no-repeat;
+	background-image: url("../esri/search.png");
+	background-size: 26px;
+	border: none;
+	padding: 0;
+	text-indent: 6px;
+	font-size: 13px;
+	line-height: normal;
+	height: auto;
+	padding-top: 5px;
+	padding-bottom: 5px;
+	width: 100%;
+	background-position: right center;
+	cursor: pointer;
+	box-sizing: border-box
+}
+
+.geocoder-control-input-disabled {
+	background-color: #f4f4f4;
+	background-image: url("../img/esri/search-disabled.png")
+}
+
+.geocoder-control {
+	width: 26px;
+	height: 26px;
+	-webkit-transition: width .175s ease-in;
+	-moz-transition: width .175s ease-in;
+	-ms-transition: width .175s ease-in;
+	-o-transition: width .175s ease-in;
+	transition: width .175s ease-in
+}
+
+.geocoder-control-expanded, .leaflet-touch .geocoder-control-expanded {
+	width: 275px
+}
+
+.geocoder-control-input.geocoder-control-loading {
+	background-image: url("../img/esri/loading.gif");
+	background-size: 26px
+}
+
+@media only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2 / 1), only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2) {
+	.geocoder-control-input {
+		background-image: url("../img/esri/search@2x.png")
+	}
+
+	.geocoder-control-input-disabled {
+		background-image: url("../img/esri/search@2x-disabled.png")
+	}
+
+	.geocoder-control-input.geocoder-control-loading {
+		background-image: url("../img/esri/loading@2x.gif")
+	}
+}
+
+.geocoder-control-input:focus {
+	outline: none;
+	cursor: text
+}
+
+.geocoder-control-input::-ms-clear {
+	display: none
+}
+
+.geocoder-control-suggestions {
+	width: 100%;
+	position: absolute;
+	top: 26px;
+	left: 0;
+	margin-top: 10px;
+	overflow: auto;
+	display: none
+}
+
+.geocoder-control-list + .geocoder-control-header {
+	border-top: 1px solid #d5d5d5
+}
+
+.geocoder-control-header {
+	font-size: 10px;
+	font-weight: 700;
+	text-transform: uppercase;
+	letter-spacing: 0.05em;
+	color: #444;
+	background: #F2F2F2;
+	border-bottom: 1px solid #d5d5d5;
+	display: block;
+	padding: .5em
+}
+
+.geocoder-control-list {
+	list-style: none;
+	margin: 0;
+	padding: 0
+}
+
+.geocoder-control-suggestions .geocoder-control-suggestion {
+	font-size: 13px;
+	padding: 7px;
+	background: white;
+	border-top: 1px solid #f1f1f1;
+	white-space: nowrap;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	cursor: pointer
+}
+
+.geocoder-control-suggestions .geocoder-control-suggestion:first-child {
+	border: none
+}
+
+.geocoder-control-suggestions .geocoder-control-suggestion.geocoder-control-selected, .geocoder-control-suggestions .geocoder-control-suggestion:hover {
+	background: #7FDFFF;
+	border-color: #7FDFFF
+}
+
+.leaflet-right .geocoder-control-suggestions {
+	left: auto;
+	right: 0
+}
+
+.leaflet-right .geocoder-control-input {
+	left: auto;
+	right: 0
+}
+
+.leaflet-touch .geocoder-control {
+	width: 34px
+}
+
+.leaflet-touch .geocoder-control.geocoder-control-expanded {
+	width: 275px
+}
+
+.leaflet-touch .geocoder-control-input {
+	height: 34px;
+	line-height: 30px;
+	background-size: 30px
+}
+
+.leaflet-touch .geocoder-control-suggestions {
+	top: 30px;
+	width: 271px
+}
+
+.leaflet-oldie .geocoder-control-input {
+	width: 28px;
+	height: 28px
+}
+
+.leaflet-oldie .geocoder-control-expanded .geocoder-control-input {
+	width: auto
+}
+
+.leaflet-oldie .geocoder-control-input, .leaflet-oldie .geocoder-control-suggestions {
+	border: 1px solid #999
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-esri-geocoder.min.css	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+.geocoder-control-input{position:absolute;left:0;top:0;background-color:white;background-repeat:no-repeat;background-image:url("../esri/search.png");background-size:26px;border:0;padding:0;text-indent:6px;font-size:13px;line-height:normal;height:auto;padding-top:5px;padding-bottom:5px;width:100%;background-position:right center;cursor:pointer;box-sizing:border-box}.geocoder-control-input-disabled{background-color:#f4f4f4;background-image:url("../img/esri/search-disabled.png")}.geocoder-control{width:26px;height:26px;-webkit-transition:width .175s ease-in;-moz-transition:width .175s ease-in;-ms-transition:width .175s ease-in;-o-transition:width .175s ease-in;transition:width .175s ease-in}.geocoder-control-expanded,.leaflet-touch .geocoder-control-expanded{width:275px}.geocoder-control-input.geocoder-control-loading{background-image:url("../img/esri/loading.gif");background-size:26px}@media only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2 / 1),only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.geocoder-control-input{background-image:url("../img/esri/search@2x.png")}.geocoder-control-input-disabled{background-image:url("../img/esri/search@2x-disabled.png")}.geocoder-control-input.geocoder-control-loading{background-image:url("../img/esri/loading@2x.gif")}}.geocoder-control-input:focus{outline:0;cursor:text}.geocoder-control-input::-ms-clear{display:none}.geocoder-control-suggestions{width:100%;position:absolute;top:26px;left:0;margin-top:10px;overflow:auto;display:none}.geocoder-control-list+.geocoder-control-header{border-top:1px solid #d5d5d5}.geocoder-control-header{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#444;background:#f2f2f2;border-bottom:1px solid #d5d5d5;display:block;padding:.5em}.geocoder-control-list{list-style:none;margin:0;padding:0}.geocoder-control-suggestions .geocoder-control-suggestion{font-size:13px;padding:7px;background:white;border-top:1px solid #f1f1f1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.geocoder-control-suggestions .geocoder-control-suggestion:first-child{border:0}.geocoder-control-suggestions .geocoder-control-suggestion.geocoder-control-selected,.geocoder-control-suggestions .geocoder-control-suggestion:hover{background:#7fdfff;border-color:#7fdfff}.leaflet-right .geocoder-control-suggestions{left:auto;right:0}.leaflet-right .geocoder-control-input{left:auto;right:0}.leaflet-touch .geocoder-control{width:34px}.leaflet-touch .geocoder-control.geocoder-control-expanded{width:275px}.leaflet-touch .geocoder-control-input{height:34px;line-height:30px;background-size:30px}.leaflet-touch .geocoder-control-suggestions{top:30px;width:271px}.leaflet-oldie .geocoder-control-input{width:28px;height:28px}.leaflet-oldie .geocoder-control-expanded .geocoder-control-input{width:auto}.leaflet-oldie .geocoder-control-input,.leaflet-oldie .geocoder-control-suggestions{border:1px solid #999}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-gp-3.0.2.css	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,3190 @@
+/*!
+ * @brief Geoportal Extension for Leaflet
+ *
+ * This software is released under the licence CeCILL-B (Free BSD compatible)
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
+ * @see http://www.cecill.info/
+ *
+ * copyright CeCILL-B
+ * copyright IGN
+ * @author IGN
+ * @version 0.8.1
+ * @date 2016-12-02
+ *
+ */
+/* MOUSE POSITION */
+
+/* Showing/hiding drawing panel */
+
+label[id^=GPshowDrawingPicto-] {
+  display: inline-block;
+}
+
+input[id^=GPshowDrawing-] + label {
+  display: block;
+}
+
+input[id^=GPshowDrawing-]:checked + label {
+  display: none;
+}
+
+input[id^=GPshowDrawing-] + label + div {
+  display: none;
+}
+
+input[id^=GPshowDrawing-]:checked + label + div {
+  display: block;
+}
+
+/* General panels */
+
+div[^=GPdrawingPanel-] {
+  width: 240px;
+  overflow: hidden;
+}
+
+/* Basic infos */
+
+div[^=GPdrawingBasicPanel-] {
+  padding: 10px 15px;
+}
+
+.GPdrawingLabel,
+.GPdrawingCoords {
+  display: inline-block;
+  line-height: 20px;
+}
+
+.GPdrawingLabel {
+  width: 80px;
+  font-weight: bold;
+}
+
+.GPdrawingCoords {
+  width: 110px;
+}
+
+/* markers selector */
+.marker-input-radio {
+  display : none ;
+}
+
+input.marker-input-radio:checked + label {
+  border: 1px solid red;
+}
+
+
+/* Calc waiting */
+
+.GPelevationPathCalcWaitingContainerVisible,
+.GPelevationPathCalcWaitingContainerHidden {
+  position: absolute;
+  top: 32px;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background-color: rgba(255,255,255,0.9);
+  font-size: 1.5em;
+  font-weight: bold;
+  overflow: hidden;
+}
+
+.GPelevationPathCalcWaitingContainerVisible {
+  display: -webkit-flex;
+  display: flex;
+}
+
+.GPelevationPathCalcWaitingContainerHidden {
+  display: none;
+}
+
+.GPelevationPathCalcWaiting {
+  margin: auto;
+}
+
+.GPelevationPathCalcWaitingContainerVisible,
+.GPelevationPathCalcWaitingContainerHidden {
+  border-radius: 5px;
+}
+
+/* CSS : Raw */
+
+#profileElevationRaw {
+  resize: none;
+  padding: unset;
+}
+
+/* CSS : default */
+
+/* suppression des puces sur les listes */
+div#profileElevationByDefault {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+  flex-direction: column;
+  /*flex-flow: row wrap;*/
+  height: inherit;
+  width: inherit;
+}
+
+div#profileElevationByDefault > * {
+  -webkit-flex: 1;
+  -webkit-box-flex: 1;
+      -ms-flex: 1;
+          flex: 1 100%;
+}
+
+ul#data-default {
+    list-style: none;
+    box-sizing: border-box;
+    padding: 0px;
+    position : relative;
+    margin : 10px;
+    margin-top: auto;
+    margin-bottom: auto;
+    height: 100px;
+    /*width: 100%*/
+}
+
+.z-title-vertical {
+  align-self: flex-start;
+  padding-left: 10px;
+  /*position: absolute;*/
+  /*transform: rotate(-90deg);*/
+}
+
+.x-title-horizontal {
+  align-self: flex-end;
+  padding-right: 10px;
+  /*position: absolute;*/
+  /*transform: translate(120px, -30px);*/
+}
+
+.z-axis {
+    border-right: none;
+    border-left: solid 2px;
+    cursor: default;
+}
+
+.x-axis {
+    border-top: none;
+    border-bottom: solid 2px;
+    cursor: default;
+}
+
+ul#data-default li.percent {
+    display: inline-block;
+    vertical-align: bottom;
+    background-color: #C77A04;
+    opacity : 0.3;
+    border-top: solid 1px;
+    border-radius: 2px;
+    cursor: pointer;
+}
+
+li.axe span.bottom-axis {
+    vertical-align: bottom;
+}
+
+ul#data-default .percent:hover {
+    display: inline-block;
+    /*vertical-align: bottom;*/
+    background-color: #f00;
+}
+
+.v0 { height: 0%; }
+.v1 { height: 1%; }
+.v2 { height: 2%; }
+.v3 { height: 3%; }
+.v4 { height: 4%; }
+.v5 { height: 5%; }
+.v6 { height: 6%; }
+.v7 { height: 7%; }
+.v8 { height: 8%; }
+.v9 { height: 9%; }
+.v10 { height: 10%; }
+.v11 { height: 11%; }
+.v12 { height: 12%; }
+.v13 { height: 13%; }
+.v14 { height: 14%; }
+.v15 { height: 15%; }
+.v16 { height: 16%; }
+.v17 { height: 17%; }
+.v18 { height: 18%; }
+.v19 { height: 19%; }
+.v20 { height: 20%; }
+.v21 { height: 21%; }
+.v22 { height: 22%; }
+.v23 { height: 23%; }
+.v24 { height: 24%; }
+.v25 { height: 25%; }
+.v26 { height: 26%; }
+.v27 { height: 27%; }
+.v28 { height: 28%; }
+.v29 { height: 29%; }
+.v30 { height: 30%; }
+.v31 { height: 31%; }
+.v32 { height: 32%; }
+.v33 { height: 33%; }
+.v34 { height: 34%; }
+.v35 { height: 35%; }
+.v36 { height: 36%; }
+.v37 { height: 37%; }
+.v38 { height: 38%; }
+.v39 { height: 39%; }
+.v40 { height: 40%; }
+.v41 { height: 41%; }
+.v42 { height: 42%; }
+.v43 { height: 43%; }
+.v44 { height: 44%; }
+.v45 { height: 45%; }
+.v46 { height: 46%; }
+.v47 { height: 47%; }
+.v48 { height: 48%; }
+.v49 { height: 49%; }
+.v50 { height: 50%; }
+.v51 { height: 51%; }
+.v52 { height: 52%; }
+.v53 { height: 53%; }
+.v54 { height: 54%; }
+.v55 { height: 55%; }
+.v56 { height: 56%; }
+.v57 { height: 57%; }
+.v58 { height: 58%; }
+.v59 { height: 59%; }
+.v60 { height: 60%; }
+.v61 { height: 61%; }
+.v62 { height: 62%; }
+.v63 { height: 63%; }
+.v64 { height: 64%; }
+.v65 { height: 65%; }
+.v66 { height: 66%; }
+.v67 { height: 67%; }
+.v68 { height: 68%; }
+.v69 { height: 69%; }
+.v70 { height: 70%; }
+.v71 { height: 71%; }
+.v72 { height: 72%; }
+.v73 { height: 73%; }
+.v74 { height: 74%; }
+.v75 { height: 75%; }
+.v76 { height: 76%; }
+.v77 { height: 77%; }
+.v78 { height: 78%; }
+.v79 { height: 79%; }
+.v80 { height: 80%; }
+.v81 { height: 81%; }
+.v82 { height: 82%; }
+.v83 { height: 83%; }
+.v84 { height: 84%; }
+.v85 { height: 85%; }
+.v86 { height: 86%; }
+.v87 { height: 87%; }
+.v88 { height: 88%; }
+.v89 { height: 89%; }
+.v90 { height: 90%; }
+.v91 { height: 91%; }
+.v92 { height: 92%; }
+.v93 { height: 93%; }
+.v94 { height: 94%; }
+.v95 { height: 95%; }
+.v96 { height: 96%; }
+.v97 { height: 97%; }
+.v98 { height: 98%; }
+.v99 { height: 99%; }
+.v100 { height: 100%; }
+
+/* CSS : D3 */
+
+text {
+  fill: rgb(94, 94, 94);
+  font-family: Verdana;
+  font-size: 10px;
+  opacity: 1;
+  text-anchor: end;
+}
+
+.axis-d3 {
+  fill: none;
+  stroke: #5E5E5E;
+  stroke-width: 1;
+  shape-rendering: crispEdges;
+}
+
+.area-d3 {
+  fill: #C77A04;
+  stroke: #5E5E5E;
+  stroke-width: 0;
+  fill-opacity: 0.4;
+}
+
+.line-d3 {
+  fill: none;
+  stroke: #C77A04;
+  stroke-width: 1px;
+}
+
+.grid-d3 .tick {
+  stroke: lightgrey;
+  opacity: 0.7;
+}
+
+.grid-d3 path {
+  stroke-width: 0;
+}
+
+.grid-d3 .tick {
+  stroke: lightgrey;
+  opacity: 0.7;
+}
+
+.grid-d3 path {
+  stroke-width: 0;
+}
+
+.overlay-d3 {
+  fill: none;
+  pointer-events: all;
+}
+
+.focusLine-d3 {
+  fill: none;
+  stroke: #C77A04;
+  stroke-width: 0.5px;
+}
+
+.focusCircle-d3 {
+  fill: #C77A04;
+}
+
+div.tooltip-d3 {
+    position: inherit;;
+    text-align: left;
+    width: 80px;
+    height: 35px;
+    padding: 2px;
+    font: 8px sans-serif;
+    background: lightsteelblue;
+    border: 0px;
+    border-radius: 8px;
+    pointer-events: none;
+}
+
+/* Widgets : general */
+
+.GPwidget {
+  position: absolute;
+  font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;
+  font-size: 13px;
+  color: #333;
+}
+
+.GPwidget input[type='text'],
+.GPwidget input[type='button'] {
+  -webkit-appearance: none;
+  color: #333333;
+}
+
+.GPwidget input[type="checkbox"] {
+  display: none;
+}
+
+.GPwidget select {
+  padding-left: 3px;
+  border-radius: 3px;
+}
+
+.GPwidget form {
+  margin-bottom: 0;
+}
+
+.GPwidget * {
+  box-sizing: border-box;
+  background-repeat: no-repeat;
+}
+
+/* waiting */
+
+.GPwaiting {
+    background-image : url("../img/gp/waiting.gif");
+    background-position : center center;
+    background-repeat : no-repeat;
+}
+
+/* General panels */
+
+.GPpanel {
+  background-color: #FFF;
+}
+
+.GPpanelHeader {
+  position: relative;
+  width: 100%;
+}
+
+.GPpanelTitle {
+  width: 100%;
+  height: 100%;
+  text-align: center;
+  font-weight: bold;
+}
+
+.GPpanelClose, .GPpanelReduce {
+  position: absolute;
+  cursor: pointer;
+}
+
+/* Showing/hiding advanced panels */
+
+.GPshowAdvancedToolPicto {
+  position: relative;
+  box-sizing: border-box;
+  cursor: pointer;
+}
+
+.GPshowAdvancedToolOpen {
+  position: absolute;
+  display: block;
+  box-sizing: border-box;
+}
+
+/* Flex inputs */
+
+.GPflexInput {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+  transition: max-height 0.3s ease-out, opacity 0.3s ease-out;
+}
+
+.GPflexInput > * {
+  display: block;
+  height: 28px;
+  line-height: 26px;
+  border: 1px solid #999;
+  border-radius: 0;
+}
+
+.GPflexInput *:not(:last-child) {
+  border-right:none;
+}
+
+.GPflexInput *:first-child {
+  border-radius: 3px 0 0 3px;
+}
+
+.GPflexInput *:last-child {
+  border-radius: 0 3px 3px 0;
+}
+
+.GPflexInput > *:not(input) {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+.GPflexInput > input {
+  -webkit-flex: 1;
+  -webkit-box-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  padding: 0 5px;
+  min-width: 0;
+}
+
+.GPflexInput > select {
+  -webkit-flex: 1;
+  -webkit-box-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  padding-right: 7px;
+}
+
+.GPflexInput > label {
+  background-color:  #F2F2F2;
+  color: #666;
+  padding-left: 7px;
+  padding-right: 9px;
+  cursor: pointer;
+}
+
+/* Particular inputs */
+
+.GPinputSelect {
+  display: block;
+  height: 28px;
+  line-height: 26px;
+  margin: auto;
+  border: 1px solid #999;
+  color: #333;
+  cursor: pointer;
+}
+
+input.GPinputSubmit {
+  display: block;
+  width: 80px;
+  margin: auto;
+  height: 28px;
+  line-height: 26px;
+  padding: 0;
+  background: none;
+  border: none;
+  border-radius: 3px;
+  font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;
+  color: #FFF;
+  font-weight: bold;
+  opacity: 0.8;
+  transition: opacity 0.2s ease-out;
+  cursor: pointer;
+}
+
+input.GPinputSubmit:hover {
+  opacity: 1;
+}
+
+/* Autocomplete/geocode results */
+
+.GPautoCompleteList,
+.GPadvancedAutoCompleteList {
+  z-index: 2;
+  display: none;
+  position: absolute;
+  max-height: 140px;
+  background-color: #FFF;
+  border: 1px solid #999;
+  overflow-y: hidden;
+}
+
+.GPadvancedAutoCompleteList {
+  width: calc(100% - 28px);
+  border-top: none;
+  font-size: 0.9em;
+}
+
+.GPautoCompleteProposal {
+  width: 100%;
+  height: 28px;
+  line-height: 16px;
+  padding: 6px 10px;
+  color: #5E5E5E;
+  font-size: 1.0em;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow:ellipsis;
+  cursor: pointer;
+}
+
+.GPautoCompleteProposal:hover {
+  color: #000000;
+  background-color: #CEDBEF
+}
+
+/* Showing additional hidden options */
+
+.GPshowMoreOptions {
+  display: block;
+  position: absolute;
+  width: 28px;
+  height: 28px;
+  cursor: pointer;
+  transition: all 0.5s ease-out 0s;
+}
+
+input[type="checkbox"]:checked + .GPshowMoreOptions {
+  -webkit-transform: rotateX(180deg);
+  transform: rotateX(180deg);
+}
+
+/* ISOCHRON */
+
+div[id^=GPisochron-] {
+  top: 140px;
+}
+
+/* Showing/hiding mouse position panel */
+
+label[id^=GPshowIsochronPicto] {
+  display: inline-block;
+}
+
+input[id^=GPshowIsochron-] + label {
+  display: block;
+}
+
+input[id^=GPshowIsochron-]:checked + label {
+  display: none;
+}
+
+input[id^=GPshowIsochron-] + label + div {
+  display: none;
+}
+
+input[id^=GPshowIsochron-]:checked + label + div {
+  display: block;
+}
+
+/* General panels */
+
+div[id^=GPisochronPanel-] {
+  width: 280px;
+}
+
+/* Calc waiting */
+
+.GPisochronCalcWaitingContainerVisible,
+.GPisochronCalcWaitingContainerHidden {
+  position: absolute;
+  top: 32px;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background-color: rgba(255,255,255,0.9);
+  font-size: 1.5em;
+  font-weight: bold;
+  overflow: hidden;
+}
+
+.GPisochronCalcWaitingContainerVisible {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+}
+
+.GPisochronCalcWaitingContainerHidden {
+  display: none;
+}
+
+.GPisochronCalcWaiting {
+  margin: auto;
+}
+
+/* Isochron form */
+
+form[id^=GPisochronForm] {
+  padding: 15px;
+}
+
+.GPisochronFormMini {
+  max-height: 58px;
+  overflow: hidden;
+}
+
+.GPisochronFormMini div[id^="GPisochronReset-"],
+.GPisochronFormMini label[id^="GPshowIsoExclusionsPicto-"] {
+    display: none;
+}
+
+.GPisochronOriginVisible {
+  display: block;
+}
+
+.GPisochronOriginHidden {
+  display: none;
+}
+
+.GPisochronOriginPointerImg {
+  width: 28px;
+  background-color: #F2F2F2;
+  cursor: pointer;
+}
+
+input[id^="GPisochronOriginPointer"] + .GPisochronOriginPointerImg {
+  background-position: -1px -1px;
+}
+
+input[id^="GPisochronOriginPointer"]:checked + .GPisochronOriginPointerImg {
+  background-position: -29px -1px;
+}
+
+input[id^=GPisochronSubmit] {
+  margin-top: 5px;
+}
+
+/* Alternative choice */
+
+div[id^=GPisochronChoice] {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+  width: 160px;
+  -webkit-justify-content: space-between;
+  -webkit-box-pack: justify;
+      -ms-flex-pack: justify;
+          justify-content: space-between;
+  margin: auto;
+  margin-top: 15px;
+  margin-bottom: 5px;
+}
+
+.GPisochronChoiceAlt input {
+  display: none;
+}
+
+.GPisochronChoiceAltImg {
+  display: block;
+  width: 28px;
+  height: 28px;
+  margin: auto;
+  cursor: pointer;
+}
+
+input[id^=GPisochronChoiceAltChron] + .GPisochronChoiceAltImg {
+  background-position: -56px 0;
+}
+
+input[id^=GPisochronChoiceAltChron]:checked + .GPisochronChoiceAltImg {
+  background-position: -84px 0;
+}
+
+input[id^=GPisochronChoiceAltDist] + .GPisochronChoiceAltImg {
+  background-position: -112px 0;
+}
+
+input[id^=GPisochronChoiceAltDist]:checked + .GPisochronChoiceAltImg {
+  background-position: -140px 0;
+}
+
+.GPisochronChoiceAlt span {
+  cursor: pointer;
+  display:block;
+  color: #999;
+}
+
+.GPisochronValueHidden {
+  display: none;
+}
+
+div[id^=GPisochronValueChron],
+div[id^=GPisochronValueDist] {
+  width: 220px;
+  margin: auto;
+}
+
+/* Mode choice */
+
+div[id^=GPisochronModeChoice] {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+  -webkit-justify-content: space-between;
+  -webkit-box-pack: justify;
+      -ms-flex-pack: justify;
+          justify-content: space-between;
+  margin: 15px 0;
+}
+
+.GPisochronModeLabel {
+  display: block;
+  text-align: center;
+  margin-bottom: 5px;
+}
+
+div[id^=GPisochronTransportChoice] input {
+  display: none;
+}
+
+.GPisochronTransportImg {
+  display: inline-block;
+  width: 28px;
+  height: 28px;
+  cursor: pointer;
+}
+
+.GPisochronTransportImg:first-of-type {
+    margin-left: 18px;
+    margin-right: 10px;
+}
+
+input[id^=GPisochronTransportCar] + .GPisochronTransportImg {
+  background-position: -168px 0;
+}
+
+input[id^=GPisochronTransportCar]:checked + .GPisochronTransportImg {
+  background-position: -196px 0;
+}
+
+input[id^=GPisochronTransportPedestrian] + .GPisochronTransportImg {
+  background-position: -224px 0;
+}
+
+input[id^=GPisochronTransportPedestrian]:checked + .GPisochronTransportImg {
+  background-position: -252px 0;
+}
+
+select[id^=GPisochronDirectionSelect] {
+  width: 80px;
+}
+
+/* Showing/hiding exclusions */
+
+input[id^=GPshowIsoExclusions] {
+  display: none;
+}
+
+.GPshowIsoExclusionsPicto {
+  top: 250px;
+  right: 0;
+  transition: all 0.5s ease-out 0s;
+}
+
+input[id^=GPshowIsoExclusions] + label + div[id^=GPisoExclusions] {
+  max-height: 0;
+  opacity: 0;
+  margin-bottom: 0;
+}
+
+input[id^=GPshowIsoExclusions]:checked + label + div[id^=GPisoExclusions] {
+  display: block;
+  max-height: 60px;
+  opacity: 1;
+  margin-bottom: 15px;
+}
+
+/* Exclusions */
+
+div[id^=GPisoExclusions] {
+  transition: max-height 0.5s ease-in-out 0.25s, opacity 0.5s ease-in-out 0.25s, margin 0.3s ease-in-out 0.25s;
+  overflow: hidden;
+}
+
+.GPisoExclusionsLabel {
+  display: block;
+  text-align: center;
+  margin-bottom: 10px;
+  font-weight: bold;
+  line-height: 16px;
+}
+
+.GPisoExclusionsOptions {
+  display: -webkit-flex;
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-justify-content: space-around;
+  -ms-flex-pack: distribute;
+  justify-content: space-around;
+}
+
+.GPisoExclusionsOption {
+  display: block;
+  height: 28px;
+  line-height: 26px;
+  color: #A77;
+  background-color: #FEE;
+  padding-left: 28px;
+  padding-right: 5px;
+  border: 1px solid #A77;
+  border-radius: 3px;
+  cursor: pointer;
+}
+
+input:checked + .GPisoExclusionsOption {
+  background-color: #EFE;
+  background-position: 0 -28px;
+  color: #797;
+  border: 1px solid #797;
+}
+
+/* Reset picto */
+div[id^=GPisochronReset] {
+  position: absolute;
+  margin-top: 5px;
+  width: 28px;
+  height: 28px;
+  border-radius: 3px;
+  opacity: 0.8;
+  background-position: -281px 0;
+  transition: opacity 0.2s ease-out;
+  cursor: pointer;
+}
+
+div[id^=GPisochronReset]:hover {
+  opacity: 1;
+}
+
+/* LAYER SWITCHER */
+
+#GPlayerSwitcher {
+  font-size: 11px;
+}
+
+#GPlayerSwitcher [draggable] {
+  -moz-user-select: none;
+  -khtml-user-select: none;
+  -webkit-user-select: none;
+  user-select: none;
+  /* Required to make elements draggable in old WebKit */
+  -khtml-user-drag: element;
+  -webkit-user-drag: element;
+}
+
+/* Manage opening of the components through hiden checkboxes */
+
+#GPlayerSwitcher input[type="checkbox"] + div,
+#GPlayerSwitcher input[type="checkbox"] + label + div {
+  max-height: 0px;
+}
+
+#GPlayerSwitcher label {
+  display: block;
+}
+
+/* Showing/hiding layers list */
+
+#GPshowLayersListPicto {
+  position: relative;
+  float: right;
+  display: block;
+  opacity: 1;
+  transition: opacity 0.5s ease-out 0s, box-shadow  0.5s ease-out 0s, border  0.5s ease-out 0s, border-radius  0.5s ease-out 0s;
+  cursor: pointer;
+}
+
+#GPshowLayersListOpen,
+#GPshowLayersListClose {
+  position: absolute;
+  display: block;
+  transition: border-radius 0.5s ease-out 0s, opacity 0.5s ease-out 0s;
+}
+
+#GPshowLayersListOpen {
+  background-position: 0 0;
+  opacity: 1;
+}
+
+#GPshowLayersListClose {
+  opacity: 0;
+}
+
+#GPlayerSwitcher input[type="checkbox"]:checked + div + #GPshowLayersListPicto {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+
+#GPlayerSwitcher input[type="checkbox"]:checked + div + #GPshowLayersListPicto #GPshowLayersListClose {
+  opacity: 1;
+}
+
+/* Layers list */
+
+#GPlayersList {
+  position: relative;
+  width: 180px;
+  border-bottom-right-radius: 0;
+  opacity: 0;
+  overflow: auto;
+  transition: max-height 0.5s ease-out 0s, opacity 0.5s ease-out 0.25s;
+}
+
+#GPlayerSwitcher input[type="checkbox"]:checked + #GPlayersList {
+  max-height: 232px;
+  opacity: 1;
+  transition: max-height 0.5s ease-in 0s, opacity 0.25s ease-in 0s;
+}
+
+/* Layer : general */
+
+.GPlayerSwitcher_layer {
+  position: relative;
+  top: 0;
+  background-color: #FFF;
+  border-bottom: 1px dotted #CCC;
+  overflow: hidden;
+}
+
+#GPlayersList .GPlayerSwitcher_layer:last-child {
+  border-bottom: none;
+}
+
+.GPlayerBasicTools,
+.GPlayerAdvancedTools {
+  position: relative;
+  width: 100%;
+  height: 28px;
+}
+
+.GPlayerVisibility,
+.GPlayerInfo,
+.GPlayerInfoOpened,
+.GPlayerRemove {
+  width: 28px;
+  height: 28px;
+  cursor: pointer;
+}
+
+.GPlayerVisibility,
+.GPlayerName,
+.GPlayerInfo,
+.GPlayerInfoOpened,
+.GPlayerRemove,
+.GPlayerOpacity,
+.GPlayerOpacityValue {
+  position: absolute;
+  top: 0;
+}
+
+.GPghostLayer {
+  opacity: 0;
+}
+
+/* Layer basic tools */
+
+.GPlayerBasicTools {
+  background-color: #FFF;
+}
+
+.GPlayerVisibility {
+  left: 0;
+  background-position: -28px 0;
+}
+
+input[type="checkbox"]:checked + .GPlayerVisibility {
+  background-position: 0 0;
+}
+
+.GPlayerName {
+  left: 28px;
+  width: calc(100% - 56px);
+  line-height: 28px;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  padding-left: 4px;
+  cursor: move;
+}
+
+.outOfRange .GPlayerName {
+  color: #AAA;
+}
+
+/* Showing layer advanced tools */
+
+.GPshowLayerAdvancedTools {
+  top: 0;
+  right: 0;
+  background-position: -112px 0;
+}
+
+.GPlayerAdvancedTools {
+  display: block;
+  max-height: 0;
+  opacity: 0;
+  transition: max-height 0.5s ease-out 0s, opacity 0.5s ease-out 0s;
+}
+
+#GPlayerSwitcher input[type="checkbox"]:checked + label + .GPlayerAdvancedTools {
+  max-height: 28px;
+  opacity: 1;
+}
+
+/* Layer advanced tools */
+
+.GPlayerInfo {
+  left: 0;
+  background-position: -55px 0;
+}
+
+.GPlayerInfoOpened {
+  left: 0;
+  background-position: -83px 0;
+}
+
+.GPlayerOpacity {
+  left: 28px;
+  width: calc(100% - 100px);
+  height: 28px;
+  padding-left: 8px;
+}
+
+.GPlayerOpacityValue {
+  width: 32px;
+  left: calc(100% - 60px);
+  line-height: 28px;
+  font-size: 10px;
+  font-style: italic;
+  cursor: default;
+}
+
+.GPlayerRemove {
+  right: 0;
+  background-position: -140px 0;
+}
+
+/* Opacity slider : general */
+
+.GPlayerOpacity input {
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  background: none;
+  display: block;
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  overflow: hidden;
+  cursor: pointer;
+}
+
+.GPlayerOpacity input[type="range"]:focus {
+  box-shadow: none;
+  outline: none;
+}
+
+/* Opacity slider : Chrome, Safari, Opera */
+
+.GPlayerOpacity input[type="range"]::-webkit-slider-runnable-track {
+  -webkit-appearance: none;
+  height: 3px;
+}
+
+.GPlayerOpacity input[type="range"]::-webkit-slider-thumb:before {
+  position: absolute;
+  top: 0;
+  right: 50%;
+  left: -200px;
+  height: 3px;
+  pointer-events: none;
+}
+
+.GPlayerOpacity input[type="range"]::-webkit-slider-thumb {
+  width: 9px;
+  height: 17px;
+  -webkit-appearance: none;
+  border: 2px solid #FFF;
+  background-color: #505050;
+  position: relative;
+  top: -7px;
+}
+
+/* Opacity slider : Firefox */
+
+.GPlayerOpacity input[type="range"]::-moz-range-track {
+  width: 80px;
+  height: 3px;
+}
+
+.GPlayerOpacity input[type="range"]::-moz-range-thumb {
+  width: 5px;
+  height: 13px;
+  border: 2px solid #FFF;
+  border-radius: 0;
+  box-shadow: 0;
+  background-color: #505050;
+  position: relative;
+}
+
+/* Opacity slider : IE */
+
+.GPlayerOpacity input[type="range"]::-ms-track {
+  border: 0;
+  border-color: transparent;
+  border-radius: 0;
+  border-width: 0;
+  color: transparent;
+  height: 3px;
+  width: 80px;
+}
+
+.GPlayerOpacity input[type="range"]::-ms-fill-lower,
+.GPlayerOpacity input[type="range"]::-ms-fill-upper {
+  background: transparent;
+  border-radius: 0;
+}
+
+.GPlayerOpacity input[type="range"]::-ms-thumb {
+  width: 5px;
+  height: 13px;
+  border: 2px solid #FFF;
+  background-color: #505050;
+}
+
+.GPlayerOpacity input[type="range"]::-ms-tooltip {
+  display: none;
+}
+
+/* Layer info panel */
+
+#GPlayerInfoPanel {
+  position: absolute;
+  top: 0;
+  overflow-y: hidden;
+  padding-top: 10px;
+  padding-bottom: 10px;
+}
+
+.GPlayerInfoPanelOpened {
+  display: block;
+}
+
+.GPlayerInfoPanelClosed {
+  display: none;
+}
+
+#GPlayerInfoContent {
+  position: relative;
+  width: 280px;
+  max-height: 200px;
+  overflow-y: auto;
+  padding-left: 10px;
+  padding-right: 10px;
+}
+
+#GPlayerInfoTitle {
+  width: calc(100% - 52px);
+  margin: auto;
+  margin-bottom: 10px;
+  padding-bottom: 5px;
+  text-align: center;
+  font-size: 1.1em;
+  font-weight: bold;
+}
+
+#GPlayerInfoQuicklook {
+  position: absolute;
+  top: -2px;
+  left: 10px;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+}
+
+#GPlayerInfoClose {
+  position: absolute;
+  top: -8px;
+  right: 10px;
+  width: 28px;
+  height: 28px;
+  cursor: pointer;
+}
+
+#GPlayerInfoDescription {
+  font-size: 0.9em;
+}
+
+.GPlayerInfoSubtitle {
+  padding-left: 35px;
+  font-weight: bold;
+  margin-top: 10px;
+  margin-bottom: 4px;
+}
+
+.GPlayerInfoLink,
+.GPlayerInfoPopup {
+  line-height: 20px;
+  padding-left: 23px;
+  white-space: nowrap;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  color: #999999;
+  background-repeat: no-repeat;
+  cursor: pointer;
+}
+
+.GPlayerInfoLink {
+  background-position: 0 -20px;
+}
+
+.GPlayerInfoLink:hover,
+.GPlayerInfoPopup:hover {
+  color: #333;
+}
+
+.GPlayerInfoLink a,
+.GPlayerInfoLink a:visited
+.GPlayerInfoLink a:focus
+.GPlayerInfoLink a:hover {
+  text-decoration: none;
+  color: inherit;
+}
+/* Location */
+
+/* Location form */
+
+.GPlocationStageFlexInput {
+  max-height: 28px;
+  opacity: 1;
+}
+
+.GPlocationStageFlexInputHidden {
+  max-height: 0;
+  opacity: 0;
+  overflow: hidden;
+}
+
+.GPlocationOriginVisible {
+  display: block;
+}
+
+.GPlocationOriginHidden {
+  display: none;
+}
+
+label.GPlocationOriginPointerImg[id*="GPlocationOriginPointerImg"] {
+  width: 28px;
+  border-top-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+  border-right: 1px solid #999;
+}
+
+input[id*="GPlocationOriginPointer"] + .GPlocationOriginPointerImg {
+  background-position: -1px -1px;
+}
+
+input[id*="GPlocationOriginPointer"]:checked + .GPlocationOriginPointerImg {
+  background-position: -29px -1px;
+}
+
+.GPlocationStageRemove,
+div[id^=GPlocationStageAdd] {
+  width: 28px;
+  border: none;
+  cursor: pointer;
+}
+
+.GPlocationStageRemove {
+  background-position: -84px 0;
+}
+
+div[id^=GPlocationStageAdd] {
+  background-position: -56px 0;
+}
+
+/* Showing/hiding drawing panel */
+
+label[id^=GPshowMeasureAreaPicto-] {
+  display: inline-block;
+}
+
+input[id^=GPshowMeasureArea-] + label {
+  display: block;
+}
+
+input[id^=GPshowMeasureArea-]:checked + label {
+  display: block;
+  background-color: rgba(0,60,136,0.5);
+}
+
+input[id^=GPshowMeasureArea-] + label + div {
+  display: block;
+}
+
+input[id^=GPshowMeasureArea-]:checked + label + div {
+  display: block;
+}
+
+/* Showing/hiding drawing panel */
+
+label[id^=GPshowMeasureAzimuthPicto-] {
+  display: inline-block;
+}
+
+input[id^=GPshowMeasureAzimuth-] + label {
+  display: block;
+}
+
+input[id^=GPshowMeasureAzimuth-]:checked + label {
+  display: block;
+  background-color: rgba(0,60,136,0.5);
+}
+
+input[id^=GPshowMeasureAzimuth-] + label + div {
+  display: block;
+}
+
+input[id^=GPshowMeasureAzimuth-]:checked + label + div {
+  display: block;
+}
+
+/* Showing/hiding drawing panel */
+
+label[id^=GPshowMeasureLengthPicto-] {
+  display: inline-block;
+}
+
+input[id^=GPshowMeasureLength-] + label {
+  display: block;
+}
+
+input[id^=GPshowMeasureLength-]:checked + label {
+  display: block;
+  background-color: rgba(0,60,136,0.5);
+}
+
+input[id^=GPshowMeasureLength-] + label + div {
+  display: block;
+}
+
+input[id^=GPshowMeasureLength-]:checked + label + div {
+  display: block;
+}
+
+/* MEASURE TOOL */
+
+.tooltip {
+  position: relative;
+  background: rgba(0, 0, 0, 0.5);
+  border-radius: 4px;
+  color: white;
+  padding: 4px 8px;
+  white-space: nowrap;
+}
+
+.tooltip-measure {
+  font-weight: bold;
+}
+
+.tooltip-info {
+  font-size: 0.75em;
+  text-align: center;
+}
+
+.tooltip-static {
+  background-color: #ffcc33;
+  color: black;
+  border: 1px solid white;
+}
+
+.tooltip-hidden {
+  display: none;
+}
+
+.tooltip-measure::before,
+.tooltip-info::before,
+.tooltip-static::before {
+  border-top: 6px solid rgba(0, 0, 0, 0.5);
+  border-right: 6px solid transparent;
+  border-left: 6px solid transparent;
+  content: "";
+  position: absolute;
+  bottom: -6px;
+  margin-left: -7px;
+  left: 50%;
+}
+
+.tooltip-static::before {
+  border-top-color: #ffcc33;
+}
+
+/* MOUSE POSITION */
+
+/* Showing/hiding mouse position panel */
+
+label[id^=GPshowMousePositionPicto] {
+  display: inline-block;
+}
+
+input[id^=GPshowMousePosition-] + label {
+  display: block;
+}
+
+input[id^=GPshowMousePosition-]:checked + label {
+  display: none;
+}
+
+input[id^=GPshowMousePosition-] + label + div {
+  display: none;
+}
+
+input[id^=GPshowMousePosition-]:checked + label + div {
+  display: block;
+}
+
+/* General panels */
+
+div[id^=GPmousePositionPanel-] {
+  width: 240px;
+  overflow: hidden;
+}
+
+/* Basic infos */
+
+div[id^=GPmousePositionBasicPanel] {
+  padding: 10px 15px;
+}
+
+.GPmousePositionLabel,
+.GPmousePositionCoords {
+  display: inline-block;
+  line-height: 20px;
+}
+
+.GPmousePositionLabel {
+  width: 80px;
+  font-weight: bold;
+}
+
+.GPmousePositionCoords {
+  width: 110px;
+}
+
+/* Showing settings */
+
+.GPshowMousePositionSettingsPicto {
+  bottom: 5px;
+  right: 0;
+  transition: all 0.5s ease-out 0s;
+}
+
+div[id^=GPmousePosition-] input[type="checkbox"]:checked + .GPshowMousePositionSettingsPicto {
+  bottom: 100px;
+}
+
+div[id^=GPmousePositionSettings-] {
+  display: block;
+  max-height: 0;
+  opacity: 0;
+  transition: max-height 0.5s ease-out 0s, opacity 0.5s ease-out 0s;
+}
+
+div[id^=GPmousePosition-] input[type="checkbox"]:checked + label + div[id^=GPmousePositionSettings-] {
+  max-height: 95px;
+  opacity: 1;
+}
+
+/* Settings */
+
+div[id^=GPmousePositionSettings-] {
+  height: 95px;
+  padding-left: 0 15px;
+  overflow: hidden;
+}
+
+.GPmousePositionSettingsLabel {
+  display: block;
+  margin: auto;
+  text-align: center;
+  font-weight: bold;
+  line-height: 16px;
+}
+
+.GPmousePositionSettingsSelect {
+  width: 180px;
+  margin-top: 5px;
+}
+
+/* Map center localisation */
+
+#GPmapCenter {
+  display: none;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 50px;
+  height: 50px;
+  margin-top: -25px;
+  margin-left: -25px;
+}
+
+#GPmapCenter.GPmapCenterVisible {
+  display: block;
+}
+
+/* REVERSE GEOCODING */
+
+[id^="GPreverseGeocoding-"] {
+  top: 180px;
+}
+
+/* Showing/hiding reverse geocoding panel */
+
+[id^="GPshowReverseGeocodingPicto-"] {
+  display: inline-block;
+}
+
+[id^="GPshowReverseGeocoding-"] + label {
+  display: block;
+}
+
+[id^="GPshowReverseGeocoding-"]:checked + label {
+  display: none;
+}
+
+[id^="GPshowReverseGeocoding-"] + label + div {
+  display: none;
+}
+
+[id^="GPshowReverseGeocoding-"]:checked + label + div {
+  display: block;
+}
+
+/* General panels */
+
+div[id^=GPreverseGeocodingResultsClose] {
+  top: 0;
+  right: 0;
+  width: 30px;
+  height: 32px;
+  /*background-position: -26px 0;*/
+}
+
+[id^="GPreverseGeocodingPanel-"] {
+  width: 280px;
+}
+
+.GPreverseGeocodingComponentHidden {
+  display: none;
+}
+
+div[id^="GPreverseGeocodingReturnPicto-"] {
+  position: absolute;
+  width: 26px;
+  height: 26px;
+  border-radius: 3px;
+  opacity: 1;
+  background-position: 0 0;
+  cursor: pointer;
+}
+
+.GPreverseGeocodingReturnPictoHidden {
+    display: none;
+}
+
+/* Calc waiting */
+
+.GPreverseGeocodingCalcWaitingContainerVisible,
+.GPreverseGeocodingCalcWaitingContainerHidden {
+  position: absolute;
+  top: 32px;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background-color: rgba(255,255,255,0.9);
+  font-size: 1.5em;
+  font-weight: bold;
+  overflow: hidden;
+}
+
+.GPreverseGeocodingCalcWaitingContainerVisible {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+}
+
+.GPreverseGeocodingCalcWaitingContainerHidden {
+  display: none;
+}
+
+.GPreverseGeocodingCalcWaiting {
+  margin: auto;
+}
+
+/* Search panel */
+
+[id^="GPreverseGeocodingForm-"] {
+  position: relative;
+  max-height: 270px;
+  overflow-y: auto;
+  padding-left: 15px;
+  padding-right: 15px;
+  padding-top: 10px;
+}
+
+.GPreverseGeocodingCodeLabel,
+.GPreverseGeocodingFilterLabel {
+  max-width: 105px;
+}
+
+.GPreverseGeocodingCodeLabel,
+.GPreverseGeocodingCode {
+  margin-top: 5px;
+  margin-bottom: 0;
+}
+
+.GPreverseGeocodingFilterLabel,
+.GPreverseGeocodingFilterInput {
+  margin-bottom: 5px;
+}
+
+input[id^="GPreverseGeocodingSubmit-"] {
+  margin-top: 5px;
+  margin-bottom: 15px;
+  width: 100px;
+}
+
+/* Calc waiting */
+
+.GPreverseGeocodingCalcWaitingContainerVisible,
+.GPreverseGeocodingCalcWaitingContainerHidden {
+  position: absolute;
+  top: 32px;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background-color: rgba(255,255,255,0.9);
+  font-size: 1.5em;
+  font-weight: bold;
+  overflow: hidden;
+}
+
+.GPreverseGeocodingCalcWaitingContainerVisible {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+}
+
+.GPreverseGeocodingCalcWaitingContainerHidden {
+  display: none;
+}
+
+.GPreverseGeocodingCalcWaiting {
+  margin: auto;
+}
+
+/* Result panel */
+
+div[id^=GPreverseGeocodingResultsList-] {
+  position: relative;
+  max-height: 210px;
+  overflow-y: auto;
+}
+
+/* ROUTE */
+
+div[id^=GProute-] {
+   top: 100px;
+}
+
+/* Showing/hiding route panel */
+
+label[id^=GPshowRoutePicto] {
+  display: inline-block;
+}
+
+input[id^=GPshowRoute-] + label {
+  display: block;
+}
+
+input[id^=GPshowRoute-]:checked + label {
+  display: none;
+}
+
+input[id^=GPshowRoute-] + label + div {
+  display: none;
+}
+
+input[id^=GPshowRoute-]:checked + label + div {
+  display: block;
+}
+
+/* General panels */
+
+div[id^=GProutePanel-] {
+  width: 320px;
+}
+
+.GProuteComponentHidden {
+  display: none;
+}
+
+/* Calc waiting */
+
+.GProuteCalcWaitingContainerVisible,
+.GProuteCalcWaitingContainerHidden {
+  position: absolute;
+  top: 32px;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background-color: rgba(255,255,255,0.9);
+  font-size: 1.5em;
+  font-weight: bold;
+  overflow: hidden;
+}
+
+.GProuteCalcWaitingContainerVisible {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+}
+
+.GProuteCalcWaitingContainerHidden {
+  display: none;
+}
+
+.GProuteCalcWaiting {
+  margin: auto;
+}
+
+/* Route form */
+
+form[id^=GProuteForm] {
+  padding: 15px;
+}
+
+.GProuteFormMini {
+  max-height: 58px;
+  overflow: hidden;
+  -webkit-transform: translateY(-5px);
+  transform: translateY(-5px);
+}
+
+.GProuteStageFlexInput {
+  max-height: 28px;
+  opacity: 1;
+}
+
+.GProuteStageFlexInputHidden {
+  max-height: 0;
+  opacity: 0;
+  overflow: hidden;
+}
+
+form[id^=GProuteForm] > .GPlocationStageFlexInput {
+  margin-top: 5px;
+}
+
+form[id^=GProuteForm] > .GPlocationStageFlexInputHidden {
+  margin-top: 0;
+}
+
+form[id^=GProuteForm].GProuteFormMini .GPlocationStageFlexInput:first-child {
+  margin-top: 5px;
+}
+
+.GProuteOriginVisible {
+  display: block;
+}
+
+.GProuteOriginHidden {
+  display: none;
+}
+
+label.GProuteOriginPointerImg[id*="GProuteOriginPointerImg"] {
+  width: 28px;
+  border-top-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+  border-right: 1px solid #999;
+}
+
+input[id*="GProuteOriginPointer"] + .GProuteOriginPointerImg {
+  background-position: -1px -1px;
+}
+
+input[id*="GProuteOriginPointer"]:checked + .GProuteOriginPointerImg {
+  background-position: -29px -1px;
+}
+
+.GProuteStageRemove,
+div[id^=GProuteStageAdd] {
+  width: 28px;
+  border: none;
+  cursor: pointer;
+}
+
+.GProuteFormMini .GProuteStageRemove,
+.GProuteFormMini div[id^=GProuteStageAdd] {
+  display: none;
+}
+
+.GProuteStageRemove {
+  background-position: -84px 0;
+}
+
+div[id^=GProuteStageAdd] {
+  background-position: -56px 0;
+}
+
+/* Mode choice */
+
+div[id^=GProuteModeChoice] {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+  -webkit-justify-content: space-around;
+  -ms-flex-pack: distribute;
+  justify-content: space-around;
+  margin: 15px 0;
+}
+
+.GProuteModeLabel {
+  display: block;
+  text-align: center;
+  margin-bottom: 5px;
+}
+
+div[id^=GProuteTransportChoice] input {
+  display: none;
+}
+
+.GProuteTransportImg {
+  display: inline-block;
+  width: 28px;
+  height: 28px;
+  cursor: pointer;
+}
+
+.GProuteTransportImg:first-of-type {
+    margin-left: 18px;
+    margin-right: 10px;
+}
+
+input[id^=GProuteTransportCar] + .GProuteTransportImg {
+  background-position: -112px 0;
+}
+
+input[id^=GProuteTransportCar]:checked + .GProuteTransportImg {
+  background-position: -140px 0;
+}
+
+input[id^=GProuteTransportPedestrian] + .GProuteTransportImg {
+  background-position: -168px 0;
+}
+
+input[id^=GProuteTransportPedestrian]:checked + .GProuteTransportImg {
+  background-position: -196px 0;
+}
+
+select[id^=GProuteComputationSelect] {
+  width: 100px;
+}
+
+/* Showing/hiding exclusions */
+
+input[id^=GPshowRouteExclusions] {
+  display: none;
+}
+
+.GPshowRouteExclusionsPicto {
+  top: 185px;
+  right: 0;
+  transition: all 0.3s ease-out 0s;
+}
+
+input[id^=GPshowRouteExclusions] + label + div[id^=GProuteExclusions] {
+  max-height: 0;
+  opacity: 0;
+  margin-bottom: 0;
+}
+
+input[id^=GPshowRouteExclusions]:checked + label + div[id^=GProuteExclusions] {
+  display: block;
+  max-height: 60px;
+  opacity: 1;
+  margin-bottom: 15px;
+}
+
+/* Exclusions */
+
+div[id^=GProuteExclusions] {
+  transition: max-height 0.5s ease-in-out 0.25s, opacity 0.5s ease-in-out 0.25s, margin 0.3s ease-in-out 0.25s;
+  overflow: hidden;
+}
+
+.GProuteExclusionsLabel {
+  display: block;
+  text-align: center;
+  margin-bottom: 10px;
+  font-weight: bold;
+  line-height: 16px;
+}
+
+.GProuteExclusionsOptions {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+  -webkit-justify-content: space-around;
+  -ms-flex-pack: distribute;
+  justify-content: space-around;
+}
+
+.GProuteExclusionsOption {
+  display: block;
+  height: 28px;
+  line-height: 26px;
+  color: #A77;
+  background-color: #FEE;
+  padding-left: 28px;
+  padding-right: 5px;
+  border: 1px solid #A77;
+  border-radius: 3px;
+  cursor: pointer;
+}
+
+input:checked + .GProuteExclusionsOption {
+  background-color: #EFE;
+  background-position: 0 -28px;
+  color: #797;
+  border: 1px solid #797;
+}
+
+/* Reset picto */
+div[id^=GProuteReset] {
+  position: absolute;
+  width: 28px;
+  height: 28px;
+  border-radius: 3px;
+  opacity: 0.8;
+  background-position: -224px 0;
+  transition: opacity 0.2s ease-out;
+  cursor: pointer;
+}
+
+div[id^=GProuteReset]:hover {
+  opacity: 1;
+}
+
+/* Result panel */
+
+div[id^=GProuteResultsPanel] {
+  padding: 15px;
+}
+
+.GProuteResultStage {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+}
+
+div[id^=GProuteResultsStages] {
+  margin-bottom: 15px;
+}
+
+.GProuteResultStageLabel,
+.GProuteResultStageValue,
+.GProuteResultsValueLabel,
+div[id^=GProuteResultsValueDist],
+div[id^=GProuteResultsValueTime] {
+  display: inline-block;
+  line-height: 18px;
+}
+
+.GProuteResultStageLabel,
+.GProuteResultsValueLabel {
+  color: #666;
+}
+
+.GProuteResultStageLabel {
+  width: 60px;
+}
+
+.GProuteResultsValueLabel {
+  width: 65px;
+}
+
+.GProuteResultStageValue {
+  -webkit-flex: 1;
+  -webkit-box-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  overflow-x: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+div[id^=GProuteResultsValueDist],
+div[id^=GProuteResultsValueTime] {
+  width: 80px;
+  font-weight: bold;
+}
+
+div[id^=GProuteResults-] {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+  -webkit-justify-content: space-between;
+  -webkit-box-pack: justify;
+      -ms-flex-pack: justify;
+          justify-content: space-between;
+  -webkit-align-items: center;
+  -webkit-box-align: center;
+      -ms-flex-align: center;
+          align-items: center;
+  margin-bottom: 10px;
+}
+
+select[id^=GProuteResultsComputationSelect] {
+  width: 100px;
+}
+
+div[id^=GProuteResultsNew] {
+  width: 28px;
+  height: 28px;
+  border-radius: 3px;
+  opacity: 0.8;
+  background-position: -224px 0;
+  transition: opacity 0.2s ease-out;
+  cursor: pointer;
+}
+
+div[id^=GProuteResultsNew]:hover {
+  opacity: 1;
+}
+
+/* Results details header */
+
+.GPfakeBorder {
+  display: inline-block;
+  height: 14px;
+  width: 60px;
+  border-bottom: 1px solid #999;
+}
+
+.GPfakeBorderLeft {
+  margin-left:15px;
+}
+
+input[id^=GProuteResultsShowDetails] + label,
+input[id^=GProuteResultsShowDetails] + label + label {
+  width: 130px;
+  line-height: 28px;
+  vertical-align: top;
+  text-align: center;
+  font-weight: bold;
+  cursor: pointer;
+  transition: color 0.2s ease-out;
+}
+
+input[id^=GProuteResultsShowDetails] + label,
+input[id^=GProuteResultsShowDetails]:checked + label + label {
+  display: inline-block;
+}
+
+input[id^=GProuteResultsShowDetails]:checked + label,
+input[id^=GProuteResultsShowDetails] + label + label {
+  display: none;
+}
+
+input[id^=GProuteResultsShowDetails] + label + label + div + div[id^=GProuteResultsDetails] {
+  max-height: 0;
+  opacity: 0;
+}
+
+input[id^=GProuteResultsShowDetails]:checked + label + label + div + div[id^=GProuteResultsDetails] {
+  max-height: 200px;
+  opacity: 1;
+}
+
+div[id^=GProuteResultsDetails] {
+  overflow-y: auto;
+  transition: max-height 0.5s ease-in-out 0.25s, opacity 0.5s ease-in-out 0.25s;
+}
+
+.GProuteResultsDetailsNumber,
+.GProuteResultsDetailsInstruction {
+  display: inline-block;
+  margin-top: 4px;
+  line-height: 16px;
+  color: #666;
+}
+
+.GProuteResultsDetailsNumber {
+  font-weight: bold;
+  width: 22px;
+  text-align: right;
+  vertical-align: top;
+}
+
+.GProuteResultsDetailsInstruction {
+  width: calc(100% - 30px);
+  padding-left: 5px;
+}
+
+/* SEARCH ENGINE */
+
+input[id^=GPshowSearchEngine-] + label + form[id^=GPsearchInput-] {
+  max-width: 0px;
+}
+
+#GPlayerSwitcher label { /* FIXME !? */
+  display: block;
+}
+
+/* Showing/hiding search engine input */
+
+input[id^=GPshowSearchEngine-] {
+  display: none;
+}
+
+label[id^=GPshowSearchEnginePicto] {
+  display: inline-block;
+  transition: border-radius 0s ease-out 0s;
+  transition-delay: 0.5s;
+}
+
+input[id^=GPshowSearchEngine-]:checked + label {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+  transition-delay: 0s;
+}
+
+input[id^=GPshowSearchEngine-] + label + form[id^=GPsearchInput-] {
+  max-width: 0px;
+  border: none;
+  transition: max-width 0.5s ease-out 0s;
+}
+
+input[id^=GPshowSearchEngine-]:checked + label + form[id^=GPsearchInput-] {
+  max-width: 280px;
+}
+
+input[id^=GPshowSearchEngine-] + label + form[id^=GPsearchInput-] + div[id^=GPshowAdvancedSearch] {
+  display: none;
+}
+
+input[id^=GPshowSearchEngine-]:checked + label + form[id^=GPsearchInput-] + div[id^=GPshowAdvancedSearch] {
+  display: inline-block;
+}
+
+div[id^=GPautoCompleteList] {
+  display: none;
+}
+
+input[id^=GPshowSearchEngine-]:checked + label + form[id^=GPsearchInput-] + div[id^=GPautoCompleteList] {
+  display: block;
+}
+
+/* Simple search input */
+
+form[id^=GPsearchInput-] {
+  display: inline-block;
+  position: relative;
+  left: -3px;
+  width: 280px;
+  overflow: hidden;
+}
+
+form[id^=GPsearchInput-] input {
+  display: block;
+  width: 100%;
+  height: 100%;
+  border: 1px solid #999;
+  border-top-right-radius: 5px;
+  border-bottom-right-radius: 5px;
+  padding: 0;
+  padding-right: 30px;
+  padding-left: 5px;
+  color: #333;
+  font-size: 1.0em;
+}
+
+form[id^=GPsearchInput-] input:disabled {
+  background-color: #DDD;
+  color: #999;
+}
+
+div[id^=GPsearchInputReset] {
+  position: absolute;
+  top: 0;
+  right: 0;
+  width: 30px;
+  height: 32px;
+  background-position: -30px 0;
+  cursor: pointer;
+}
+
+/* General panels */
+
+div[id^=GPgeocodeResultsClose],
+div[id^=GPadvancedSearchClose] {
+  top: 0;
+  right: 0;
+  width: 30px;
+  height: 32px;
+}
+
+div[id^=GPgeocodeResultsClose] {
+  background-position: 0 0;
+}
+
+div[id^=GPadvancedSearchClose] {
+  background-repeat: no-repeat;
+}
+
+/* Advanced search picto */
+
+div[id^=GPshowAdvancedSearch] {
+  transition: border-radius 0s ease-out 0s;
+  transition-delay: 0.5s;
+}
+
+/* Advanced search panel */
+
+div[id^=GPadvancedSearchPanel] {
+  display: none;
+  width: 280px;
+  vertical-align: top;
+  overflow: hidden;
+}
+
+form[id^=GPadvancedSearchForm] {
+  max-height: 220px;
+  overflow-y: auto;
+  padding-left: 15px;
+  padding-right: 15px;
+}
+
+.GPadvancedSearchCodeLabel,
+.GPadvancedSearchFilterLabel {
+  max-width: 105px;
+}
+
+.GPadvancedSearchCodeLabel,
+.GPadvancedSearchCode,
+ div[id^=GPadvancedSearchFilters] {
+  margin-top: 15px;
+}
+
+.GPadvancedSearchFilterLabel,
+.GPadvancedSearchFilterInput {
+  margin-bottom: 5px;
+}
+
+input[id^=GPadvancedSearchSubmit] {
+  margin-top: 10px;
+  margin-bottom: 15px;
+}
+
+/* Autocomplete list / geocode results */
+
+div[id^=GPautoCompleteList],
+div[id^=GPgeocodeResultsList] {
+  width: 280px;
+}
+
+div[id^=GPautoCompleteList] {
+  top: 35px;
+}
+
+div[id^=GPgeocodeResultsList] {
+  display: none;
+  position: absolute;
+  top: 40px;
+  border-radius: 4px;
+  overflow: hidden;
+}
+
+div[id^=GPgeocodeResults-] {
+  background-color: #FFF;
+  max-height: 140px;
+  overflow-y: auto;
+}
+
+
+.GPwidget {
+  position: relative; /* overwritten */
+}
+
+
+#GPadvancedToolsPanel {
+  position: initial; /* overwritten */
+}
+
+/* General panels */
+
+.GPpanel {
+  box-shadow: 0 1px 5px #000;
+  border-radius: 5px;
+}
+
+.GPpanelHeader {
+  height: 32px;
+  background-color: #FFF;
+  border-top-left-radius: 5px;
+  border-top-right-radius: 5px;
+}
+
+.GPpanelTitle {
+  width: calc(100% - 60px);
+  margin: auto;
+  line-height: 32px;
+  color: #C77A04;
+  border-bottom: 1px solid #C77A04;
+}
+
+.GPpanelClose {
+  top: 0;
+  right: 0;
+  width: 30px;
+  height: 32px;
+  background-position: -30px 1px;
+}
+
+.GPpanelReduce {
+  top: 0;
+  right: 30px;
+  width: 30px;
+  height: 32px;
+  background-position: -60px 1px;
+}
+
+/* Showing/hiding advanced panel */
+
+.GPshowAdvancedToolPicto {
+  width: 30px;
+  height: 30px;
+  box-shadow: 0 1px 5px #000;
+  background-color: #FFF;
+  border-radius: 5px;
+}
+
+.GPshowAdvancedToolPicto:hover {
+  background-color: #F4F4F4;
+}
+
+.GPshowAdvancedToolOpen {
+  width: 100%;
+  height: 100%;
+}
+
+/* Submit inputs */
+
+input.GPinputSubmit {
+  background-color: #C77A04;
+}
+
+/* Showing additional hidden options */
+
+.GPshowMoreOptions {
+  background-image: url("../img/gp/GPshowMoreOptions.png");
+}
+
+div[id^=GPelevationPath-] {
+  top: 0; /*overwritten*/
+}
+
+/* Showing/hiding elevationPath panel */
+
+label[id^=GPshowElevationPathPicto] {
+  display: inline-block;
+}
+
+input[id^=GPshowElevationPath-] + label {
+  display: block;
+}
+
+input[id^=GPshowElevationPath-]:checked + label {
+  /* display: none; */
+}
+
+input[id^=GPshowElevationPath-] + label + div {
+  display: none;
+}
+
+input[id^=GPshowElevationPath-]:checked + label + div {
+  display: block;
+}
+
+span[id^=GPshowElevationPathOpen] {
+  background-image: url("../img/gp/GPshowElevationPath.png");
+}
+
+/* Panel */
+
+[id^=GPelevationPathPanelClose] {
+  background-image: url("../img/gp/GPshowElevationPath.png");
+}
+
+div[id^=GPelevationPathPanelReduce] {
+  background-image: url("../img/gp/GPshowElevationPath.png");
+}
+
+[id^=GPelevationPathPanel-] {
+  width: 280px;
+}
+
+/* ELEVATION PATH DISPLAY */
+
+[id^=GPelevationPathProfil] {
+  height: 150px;
+  width: inherit;
+  line-height: normal; /* surcharge leaflet container */
+}
+
+/*.GPpanelHeader {
+  padding: unset;
+}*/
+
+/*
+@media (min-width:720px) and (min-height:720px) {
+
+[id^=GPelevationPathPanel] {
+top: 15px;
+left: 15px;
+}
+
+}
+
+@media (min-width:720px) and (min-height:520px) {
+
+[id^=GPelevationPathPanel] {
+width: 460px;
+}
+
+[id^=GPelevationPathProfil] {
+height: 220px;
+}
+
+}
+
+@media (max-width:560px), (max-height:340px) {
+
+[id^=GPelevationPathPanel] {
+display: none !important;
+}
+
+}
+*/
+
+/* ISOCHRON */
+
+div[id^=GPisochron-] {
+   /* left: 10px; */
+  top: 0; /*overwritten*/
+}
+
+/* Showing/hiding isochron panel */
+
+span[id^=GPshowIsochronOpen] {
+  background-image: url("../img/gp/GPisochronOpen.png");
+}
+
+/* General panels */
+
+div[id^=GPisochronPanel-] {
+  left: 10px;
+}
+
+div[id^=GPisochronPanelClose] {
+  background-image: url("../img/gp/GPisochronOpen.png");
+}
+
+div[id^=GPisochronPanelReduce] {
+  background-image: url("../img/gp/GPisochronOpen.png");
+}
+
+/* Calc waiting */
+
+.GPisochronCalcWaitingContainerVisible,
+.GPisochronCalcWaitingContainerHidden {
+  border-radius: 5px;
+}
+
+/* Isochron form */
+
+.GPisochronChoiceAlt input:checked + label + span {
+  color: #C77A04;
+}
+
+.GPisochronOriginPointerImg,
+.GPisochronChoiceAltImg,
+.GPisochronTransportImg {
+  background-image: url("../img/gp/GPisochronOptions.png");
+}
+
+.GPisoExclusionsOption {
+  background-image: url("../img/gp/GPisochronCheck.png");
+}
+
+/* Reset picto */
+div[id^=GPisochronReset] {
+  background-color: #C77A04;
+  background-image: url("../img/gp/GPisochronOptions.png");
+}
+
+/* LAYER SWITCHER LEAFLET */
+
+#GPlayerSwitcher {
+  top: 10px;
+  right: 10px;
+}
+
+/* Showing/hiding layers list */
+
+#GPshowLayersListPicto {
+  width: 36px;
+  height: 36px;
+}
+
+#GPshowLayersListOpen,
+#GPshowLayersListClose {
+  background-image: url("../img/gp/GPshowLayersList.png");
+}
+
+#GPshowLayersListClose {
+  background-position: -36px 0;
+}
+
+#GPlayerSwitcher input[type="checkbox"]:checked + div + #GPshowLayersListPicto {
+  box-shadow: 0 2px 2px #000;
+  border-top: 1px solid #CCC;
+}
+
+#GPlayerSwitcher input[type="checkbox"]:checked + div + #GPshowLayersListPicto #GPshowLayersListOpen {
+  opacity: 0.4;
+}
+
+/* Layers list */
+
+.GPlayerVisibility,
+.GPshowLayerAdvancedTools,
+.GPlayerInfo,
+.GPlayerInfoOpened,
+.GPlayerRemove {
+  background-image: url("../img/gp/GPlayerTools.png");
+}
+
+/* Opacity slider : Chrome, Safari, Opera */
+
+.GPlayerOpacity input[type="range"]::-webkit-slider-runnable-track {
+  background: url("../img/gp/GPopacitySlider.png");
+}
+
+/* Opacity slider : Firefox */
+
+.GPlayerOpacity input[type="range"]::-moz-range-track {
+  background: url("../img/gp/GPopacitySlider.png");
+}
+
+/* Opacity slider : IE */
+
+.GPlayerOpacity input[type="range"]::-ms-track {
+  background: url("../img/gp/GPopacitySlider.png");
+}
+
+/* Layer info panel */
+
+#GPlayerInfoPanel {
+  right: 190px;
+}
+
+#GPlayerInfoTitle {
+  color: #C77A04;
+  border-bottom: 1px solid #C77A04;
+}
+
+#GPlayerInfoQuicklook {
+  background-image: url("../img/gp/GPlayerInfo.png");
+}
+
+#GPlayerInfoClose {
+  background-image: url("../img/gp/GPlayerInfoClose.png");
+}
+
+.GPlayerInfoLink,
+.GPlayerInfoPopup {
+  background-image: url("../img/gp/GPlayerInfo.png");
+}
+
+/* Location */
+
+.GPlocationStageFlexInput {
+  margin-bottom: 5px; /*overwritten*/
+}
+
+/* Location form */
+
+.GPlocationOriginPointerImg,
+.GPlocationStageRemove,
+div[id^=GPlocationStageAdd],
+.GPlocationTransportImg {
+  background-image: url("../img/gp/GPlocationOptions.png");
+}
+
+/* MOUSE POSITION */
+
+div[id^=GPmousePosition-] {
+  /* bottom: 10px; */
+  /* left: 10px; */
+}
+
+/* Showing/hiding mouse position panel */
+
+span[id^=GPshowMousePositionOpen] {
+  background-image: url("../img/gp/GPmousePositionOpen.png");
+}
+
+/* General panels */
+
+div[id^=GPmousePositionPanelClose] {
+  background-image: url("../img/gp/GPmousePositionOpen.png");
+}
+
+/* Map center localisation */
+
+#GPmapCenter {
+  background-image: url("../img/gp/GPmapCenter.png");
+}
+
+/* REVERSE GEOCODING */
+
+[id^="GPreverseGeocoding-"] {
+  /*left: 10px;*/
+  top: 0; /*overwritten*/
+}
+
+/* Showing/hiding reverse geocoding panel */
+
+[id^="GPshowReverseGeocodingOpen-"] {
+  background-image: url("../img/gp/GPreverseGeocodingOpen.png");
+}
+
+/* General panels */
+
+[id^="GPreverseGeocodingPanel-"] {
+  left: 10px;
+}
+
+[id^="GPreverseGeocodingPanelClose-"] {
+  background-image: url("../img/gp/GPreverseGeocodingOpen.png");
+}
+
+/* Calc waiting */
+
+.GPreverseGeocodingCalcWaitingContainerVisible,
+.GPreverseGeocodingCalcWaitingContainerHidden {
+  border-radius: 5px;
+}
+
+/* Results panel */
+
+[id^="GPreverseGeocodingReturnPicto-"] {
+  width: 30px  !important;
+  height: 30px !important;
+  background-color: #C77A04;
+  background-image: url("../img/gp/GPreturn.png");
+}
+
+.GPreverseGeocodedLocationHighlight {
+    background-color: rgba(255,200,0,0.25);
+    color: #222;
+}
+
+/* ROUTE */
+
+div[id^=GProute-] {
+   /* left: 10px; */
+   top: 0; /*overwritten*/
+}
+
+.GProuteStageFlexInput {
+  margin-bottom: 5px; /*overwritten*/
+}
+
+/* Showing/hiding route panel */
+
+span[id^=GPshowRouteOpen] {
+  background-image: url("../img/gp/GProuteOpen.png");
+}
+
+/* General panels */
+
+div[id^=GProutePanel-] {
+  left: 10px;
+}
+
+div[id^=GProutePanelClose] {
+  background-image: url("../img/gp/GProuteOpen.png");
+}
+
+/* Calc waiting */
+
+.GProuteCalcWaitingContainerVisible,
+.GProuteCalcWaitingContainerHidden {
+  border-radius: 5px;
+}
+
+/* Route form */
+
+.GProuteOriginPointerImg,
+.GProuteStageRemove,
+div[id^=GProuteStageAdd],
+.GProuteTransportImg {
+  background-image: url("../img/gp/GProuteOptions.png");
+}
+
+.GProuteExclusionsOption {
+  background-image: url("../img/gp/GProuteCheck.png");
+}
+
+/* Results panel */
+
+div[id^=GProuteResultsValueDist],
+div[id^=GProuteResultsValueTime] {
+  color: #C77A04;
+}
+
+div[id^=GProuteResultsNew] {
+  background-color: #C77A04;
+  background-image: url("../img/gp/GProuteOptions.png");
+}
+
+input[id^=GProuteResultsShowDetails] + label:hover,
+input[id^=GProuteResultsShowDetails] + label + label:hover {
+  color: #C77A04;
+}
+
+.GProuteResultsDetailsHighlight {
+    background-color: rgba(255,200,0,0.25);
+    color: #222;
+}
+
+/* SEARCH ENGINE */
+
+div[id^=GPsearchEngine-] {
+  /* top: 10px; */
+  /* left: 46px; */
+}
+
+/* Showing/hiding search engine input */
+
+span[id^=GPshowSearchEngineOpen] {
+  background-image: url("../img/gp/GPsearchEngineOpen.png");
+}
+
+/* Simple search input */
+
+form[id^=GPsearchInput-] {
+  height: 30px;
+}
+
+div[id^=GPsearchInputReset] {
+  background-image: url("../img/gp/GPsearchEngineClose.png");
+}
+
+/* General panels */
+
+div[id^=GPgeocodeResultsClose] {
+  background-image: url("../img/gp/GPsearchEngineClose.png");
+}
+
+div[id^=GPadvancedSearchClose] {
+  background-image: url("../img/gp/GPsearchEngineOpen.png");
+  background-position: -60px 0;
+}
+
+/* Advanced search picto */
+
+span[id^=GPshowAdvancedSearchOpen] {
+  background-image: url("../img/gp/GPsearchEngineOpen.png");
+  background-position: -30px 0;
+}
+
+/* Autocomplete list / geocode results */
+
+div[id^=GPautoCompleteList],
+div[id^=GPgeocodeResultsList] {
+  margin-left: 27px;
+  box-shadow: 0 1px 5px #000;
+}
+
+div[id^=GPgeocodeResultsList] {
+  top: 38px;
+  border-radius: 5px;
+}
+
+/* ================================================================== */
+/* Toolbars
+/* ================================================================== */
+
+.leaflet-draw-section {
+	position: relative;
+}
+
+.leaflet-draw-toolbar {
+	margin-top: 12px;
+}
+
+.leaflet-draw-toolbar-top {
+	margin-top: 0;
+}
+
+.leaflet-draw-toolbar-notop a:first-child {
+	border-top-right-radius: 0;
+}
+
+.leaflet-draw-toolbar-nobottom a:last-child {
+	border-bottom-right-radius: 0;
+}
+
+.leaflet-draw-toolbar a {
+	background-image: url('../img/gp/spritesheet.png');
+	background-repeat: no-repeat;
+}
+
+.leaflet-retina .leaflet-draw-toolbar a {
+	background-image: url('../img/gp/spritesheet-2x.png');
+	background-size: 270px 30px;
+}
+
+.leaflet-draw a {
+	display: block;
+	text-align: center;
+	text-decoration: none;
+}
+
+/* ================================================================== */
+/* Toolbar actions menu
+/* ================================================================== */
+
+.leaflet-draw-actions {
+	display: none;
+	list-style: none;
+	margin: 0;
+	padding: 0;
+	position: absolute;
+	left: 26px; /* leaflet-draw-toolbar.left + leaflet-draw-toolbar.width */
+	top: 0;
+	white-space: nowrap;
+}
+
+.leaflet-touch .leaflet-draw-actions {
+	left: 32px;
+}
+
+.leaflet-right .leaflet-draw-actions {
+	right:26px;
+	left:auto;
+}
+
+.leaflet-touch .leaflet-right .leaflet-draw-actions {
+	right:32px;
+	left:auto;
+}
+
+.leaflet-draw-actions li {
+	display: inline-block;
+}
+
+.leaflet-draw-actions li:first-child a {
+	border-left: none;
+}
+
+.leaflet-draw-actions li:last-child a {
+	-webkit-border-radius: 0 4px 4px 0;
+	        border-radius: 0 4px 4px 0;
+}
+
+.leaflet-right .leaflet-draw-actions li:last-child a {
+	-webkit-border-radius: 0;
+	        border-radius: 0;
+}
+
+.leaflet-right .leaflet-draw-actions li:first-child a {
+	-webkit-border-radius: 4px 0 0 4px;
+	        border-radius: 4px 0 0 4px;
+}
+
+.leaflet-draw-actions a {
+	background-color: #919187;
+	border-left: 1px solid #AAA;
+	color: #FFF;
+	font: 11px/19px "Helvetica Neue", Arial, Helvetica, sans-serif;
+	line-height: 28px;
+	text-decoration: none;
+	padding-left: 10px;
+	padding-right: 10px;
+	height: 28px;
+}
+
+.leaflet-touch .leaflet-draw-actions a {
+	font-size: 12px;
+	line-height: 30px;
+	height: 30px;
+}
+
+.leaflet-draw-actions-bottom {
+	margin-top: 0;
+}
+
+.leaflet-draw-actions-top {
+	margin-top: 1px;
+}
+
+.leaflet-draw-actions-top a,
+.leaflet-draw-actions-bottom a {
+	height: 27px;
+	line-height: 27px;
+}
+
+.leaflet-draw-actions a:hover {
+	background-color: #A0A098;
+}
+
+.leaflet-draw-actions-top.leaflet-draw-actions-bottom a {
+	height: 26px;
+	line-height: 26px;
+}
+
+/* ================================================================== */
+/* Draw toolbar
+/* ================================================================== */
+
+.leaflet-draw-toolbar .leaflet-draw-draw-polyline {
+	background-position: -2px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline {
+	background-position: 0 -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-draw-polygon {
+	background-position: -31px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon {
+	background-position: -29px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-draw-rectangle {
+	background-position: -62px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle {
+	background-position: -60px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-draw-circle {
+	background-position: -92px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle {
+	background-position: -90px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-draw-marker {
+	background-position: -122px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker {
+	background-position: -120px -1px;
+}
+
+/* ================================================================== */
+/* Edit toolbar
+/* ================================================================== */
+
+.leaflet-draw-toolbar .leaflet-draw-edit-edit {
+	background-position: -152px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit {
+	background-position: -150px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-edit-remove {
+	background-position: -182px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove {
+	background-position: -180px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled {
+	background-position: -212px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled {
+	background-position: -210px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled {
+	background-position: -242px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled {
+	background-position: -240px -2px;
+}
+
+/* ================================================================== */
+/* Drawing styles
+/* ================================================================== */
+
+.leaflet-mouse-marker {
+	background-color: #fff;
+	cursor: crosshair;
+}
+
+.leaflet-draw-tooltip {
+	background: rgb(54, 54, 54);
+	background: rgba(0, 0, 0, 0.5);
+	border: 1px solid transparent;
+	-webkit-border-radius: 4px;
+	        border-radius: 4px;
+	color: #fff;
+	font: 12px/18px "Helvetica Neue", Arial, Helvetica, sans-serif;
+	margin-left: 20px;
+	margin-top: -21px;
+	padding: 4px 8px;
+	position: absolute;
+	visibility: hidden;
+	white-space: nowrap;
+	z-index: 6;
+}
+
+.leaflet-draw-tooltip:before {
+	border-right: 6px solid black;
+	border-right-color: rgba(0, 0, 0, 0.5);
+	border-top: 6px solid transparent;
+	border-bottom: 6px solid transparent;
+	content: "";
+	position: absolute;
+	top: 7px;
+	left: -7px;
+}
+
+.leaflet-error-draw-tooltip {
+	background-color: #F2DEDE;
+	border: 1px solid #E6B6BD;
+	color: #B94A48;
+}
+
+.leaflet-error-draw-tooltip:before {
+	border-right-color: #E6B6BD;
+}
+
+.leaflet-draw-tooltip-single {
+	margin-top: -12px
+}
+
+.leaflet-draw-tooltip-subtext {
+	color: #f8d5e4;
+}
+
+.leaflet-draw-guide-dash {
+	font-size: 1%;
+	opacity: 0.6;
+	position: absolute;
+	width: 5px;
+	height: 5px;
+}
+
+/* ================================================================== */
+/* Edit styles
+/* ================================================================== */
+
+.leaflet-edit-marker-selected {
+	background: rgba(254, 87, 161, 0.1);
+	border: 4px dashed rgba(254, 87, 161, 0.6);
+	-webkit-border-radius: 4px;
+	        border-radius: 4px;
+	box-sizing: content-box;
+}
+
+.leaflet-edit-move {
+	cursor: move;
+}
+
+.leaflet-edit-resize {
+	cursor: pointer;
+}
+
+/* ================================================================== */
+/* Old IE styles
+/* ================================================================== */
+
+.leaflet-oldie .leaflet-draw-toolbar {
+	border: 1px solid #999;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-gp-3.0.2.min.css	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,15 @@
+/*!
+ * @brief Geoportal Extension for Leaflet
+ *
+ * This software is released under the licence CeCILL-B (Free BSD compatible)
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
+ * @see http://www.cecill.info/
+ *
+ * copyright CeCILL-B
+ * copyright IGN
+ * @author IGN
+ * @version 0.8.1
+ * @date 2016-12-02
+ *
+ */label[id^=GPshowDrawingPicto-]{display:inline-block}input[id^=GPshowDrawing-]+label{display:block}input[id^=GPshowDrawing-]:checked+label{display:none}input[id^=GPshowDrawing-]+label+div{display:none}input[id^=GPshowDrawing-]:checked+label+div{display:block}div[^=GPdrawingPanel-]{width:240px;overflow:hidden}div[^=GPdrawingBasicPanel-]{padding:10px 15px}.GPdrawingLabel,.GPdrawingCoords{display:inline-block;line-height:20px}.GPdrawingLabel{width:80px;font-weight:bold}.GPdrawingCoords{width:110px}.marker-input-radio{display:none}input.marker-input-radio:checked+label{border:1px solid red}.GPelevationPathCalcWaitingContainerVisible,.GPelevationPathCalcWaitingContainerHidden{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0.9);font-size:1.5em;font-weight:bold;overflow:hidden}.GPelevationPathCalcWaitingContainerVisible{display:-webkit-flex;display:flex}.GPelevationPathCalcWaitingContainerHidden{display:none}.GPelevationPathCalcWaiting{margin:auto}.GPelevationPathCalcWaitingContainerVisible,.GPelevationPathCalcWaitingContainerHidden{border-radius:5px}#profileElevationRaw{resize:none;padding:unset}div#profileElevationByDefault{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;flex-direction:column;height:inherit;width:inherit}div#profileElevationByDefault>*{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1 100%}ul#data-default{list-style:none;box-sizing:border-box;padding:0;position:relative;margin:10px;margin-top:auto;margin-bottom:auto;height:100px}.z-title-vertical{align-self:flex-start;padding-left:10px}.x-title-horizontal{align-self:flex-end;padding-right:10px}.z-axis{border-right:0;border-left:solid 2px;cursor:default}.x-axis{border-top:0;border-bottom:solid 2px;cursor:default}ul#data-default li.percent{display:inline-block;vertical-align:bottom;background-color:#c77a04;opacity:.3;border-top:solid 1px;border-radius:2px;cursor:pointer}li.axe span.bottom-axis{vertical-align:bottom}ul#data-default .percent:hover{display:inline-block;background-color:#f00}.v0{height:0}.v1{height:1%}.v2{height:2%}.v3{height:3%}.v4{height:4%}.v5{height:5%}.v6{height:6%}.v7{height:7%}.v8{height:8%}.v9{height:9%}.v10{height:10%}.v11{height:11%}.v12{height:12%}.v13{height:13%}.v14{height:14%}.v15{height:15%}.v16{height:16%}.v17{height:17%}.v18{height:18%}.v19{height:19%}.v20{height:20%}.v21{height:21%}.v22{height:22%}.v23{height:23%}.v24{height:24%}.v25{height:25%}.v26{height:26%}.v27{height:27%}.v28{height:28%}.v29{height:29%}.v30{height:30%}.v31{height:31%}.v32{height:32%}.v33{height:33%}.v34{height:34%}.v35{height:35%}.v36{height:36%}.v37{height:37%}.v38{height:38%}.v39{height:39%}.v40{height:40%}.v41{height:41%}.v42{height:42%}.v43{height:43%}.v44{height:44%}.v45{height:45%}.v46{height:46%}.v47{height:47%}.v48{height:48%}.v49{height:49%}.v50{height:50%}.v51{height:51%}.v52{height:52%}.v53{height:53%}.v54{height:54%}.v55{height:55%}.v56{height:56%}.v57{height:57%}.v58{height:58%}.v59{height:59%}.v60{height:60%}.v61{height:61%}.v62{height:62%}.v63{height:63%}.v64{height:64%}.v65{height:65%}.v66{height:66%}.v67{height:67%}.v68{height:68%}.v69{height:69%}.v70{height:70%}.v71{height:71%}.v72{height:72%}.v73{height:73%}.v74{height:74%}.v75{height:75%}.v76{height:76%}.v77{height:77%}.v78{height:78%}.v79{height:79%}.v80{height:80%}.v81{height:81%}.v82{height:82%}.v83{height:83%}.v84{height:84%}.v85{height:85%}.v86{height:86%}.v87{height:87%}.v88{height:88%}.v89{height:89%}.v90{height:90%}.v91{height:91%}.v92{height:92%}.v93{height:93%}.v94{height:94%}.v95{height:95%}.v96{height:96%}.v97{height:97%}.v98{height:98%}.v99{height:99%}.v100{height:100%}text{fill:#5e5e5e;font-family:Verdana;font-size:10px;opacity:1;text-anchor:end}.axis-d3{fill:none;stroke:#5e5e5e;stroke-width:1;shape-rendering:crispEdges}.area-d3{fill:#c77a04;stroke:#5e5e5e;stroke-width:0;fill-opacity:.4}.line-d3{fill:none;stroke:#c77a04;stroke-width:1px}.grid-d3 .tick{stroke:lightgrey;opacity:.7}.grid-d3 path{stroke-width:0}.grid-d3 .tick{stroke:lightgrey;opacity:.7}.grid-d3 path{stroke-width:0}.overlay-d3{fill:none;pointer-events:all}.focusLine-d3{fill:none;stroke:#c77a04;stroke-width:.5px}.focusCircle-d3{fill:#c77a04}div.tooltip-d3{position:inherit;text-align:left;width:80px;height:35px;padding:2px;font:8px sans-serif;background:lightsteelblue;border:0;border-radius:8px;pointer-events:none}.GPwidget{position:absolute;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;font-size:13px;color:#333}.GPwidget input[type='text'],.GPwidget input[type='button']{-webkit-appearance:none;color:#333}.GPwidget input[type="checkbox"]{display:none}.GPwidget select{padding-left:3px;border-radius:3px}.GPwidget form{margin-bottom:0}.GPwidget *{box-sizing:border-box;background-repeat:no-repeat}.GPwaiting{background-image:url("../img/gp/waiting.gif");background-position:center center;background-repeat:no-repeat}.GPpanel{background-color:#FFF}.GPpanelHeader{position:relative;width:100%}.GPpanelTitle{width:100%;height:100%;text-align:center;font-weight:bold}.GPpanelClose,.GPpanelReduce{position:absolute;cursor:pointer}.GPshowAdvancedToolPicto{position:relative;box-sizing:border-box;cursor:pointer}.GPshowAdvancedToolOpen{position:absolute;display:block;box-sizing:border-box}.GPflexInput{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;transition:max-height .3s ease-out,opacity .3s ease-out}.GPflexInput>*{display:block;height:28px;line-height:26px;border:1px solid #999;border-radius:0}.GPflexInput *:not(:last-child){border-right:0}.GPflexInput *:first-child{border-radius:3px 0 0 3px}.GPflexInput *:last-child{border-radius:0 3px 3px 0}.GPflexInput>*:not(input){overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.GPflexInput>input{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 5px;min-width:0}.GPflexInput>select{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1;padding-right:7px}.GPflexInput>label{background-color:#f2f2f2;color:#666;padding-left:7px;padding-right:9px;cursor:pointer}.GPinputSelect{display:block;height:28px;line-height:26px;margin:auto;border:1px solid #999;color:#333;cursor:pointer}input.GPinputSubmit{display:block;width:80px;margin:auto;height:28px;line-height:26px;padding:0;background:0;border:0;border-radius:3px;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;color:#FFF;font-weight:bold;opacity:.8;transition:opacity .2s ease-out;cursor:pointer}input.GPinputSubmit:hover{opacity:1}.GPautoCompleteList,.GPadvancedAutoCompleteList{z-index:2;display:none;position:absolute;max-height:140px;background-color:#FFF;border:1px solid #999;overflow-y:hidden}.GPadvancedAutoCompleteList{width:calc(100% - 28px);border-top:0;font-size:.9em}.GPautoCompleteProposal{width:100%;height:28px;line-height:16px;padding:6px 10px;color:#5e5e5e;font-size:1.0em;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;cursor:pointer}.GPautoCompleteProposal:hover{color:#000;background-color:#cedbef}.GPshowMoreOptions{display:block;position:absolute;width:28px;height:28px;cursor:pointer;transition:all .5s ease-out 0s}input[type="checkbox"]:checked+.GPshowMoreOptions{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}div[id^=GPisochron-]{top:140px}label[id^=GPshowIsochronPicto]{display:inline-block}input[id^=GPshowIsochron-]+label{display:block}input[id^=GPshowIsochron-]:checked+label{display:none}input[id^=GPshowIsochron-]+label+div{display:none}input[id^=GPshowIsochron-]:checked+label+div{display:block}div[id^=GPisochronPanel-]{width:280px}.GPisochronCalcWaitingContainerVisible,.GPisochronCalcWaitingContainerHidden{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0.9);font-size:1.5em;font-weight:bold;overflow:hidden}.GPisochronCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GPisochronCalcWaitingContainerHidden{display:none}.GPisochronCalcWaiting{margin:auto}form[id^=GPisochronForm]{padding:15px}.GPisochronFormMini{max-height:58px;overflow:hidden}.GPisochronFormMini div[id^="GPisochronReset-"],.GPisochronFormMini label[id^="GPshowIsoExclusionsPicto-"]{display:none}.GPisochronOriginVisible{display:block}.GPisochronOriginHidden{display:none}.GPisochronOriginPointerImg{width:28px;background-color:#f2f2f2;cursor:pointer}input[id^="GPisochronOriginPointer"]+.GPisochronOriginPointerImg{background-position:-1px -1px}input[id^="GPisochronOriginPointer"]:checked+.GPisochronOriginPointerImg{background-position:-29px -1px}input[id^=GPisochronSubmit]{margin-top:5px}div[id^=GPisochronChoice]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;width:160px;-webkit-justify-content:space-between;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:auto;margin-top:15px;margin-bottom:5px}.GPisochronChoiceAlt input{display:none}.GPisochronChoiceAltImg{display:block;width:28px;height:28px;margin:auto;cursor:pointer}input[id^=GPisochronChoiceAltChron]+.GPisochronChoiceAltImg{background-position:-56px 0}input[id^=GPisochronChoiceAltChron]:checked+.GPisochronChoiceAltImg{background-position:-84px 0}input[id^=GPisochronChoiceAltDist]+.GPisochronChoiceAltImg{background-position:-112px 0}input[id^=GPisochronChoiceAltDist]:checked+.GPisochronChoiceAltImg{background-position:-140px 0}.GPisochronChoiceAlt span{cursor:pointer;display:block;color:#999}.GPisochronValueHidden{display:none}div[id^=GPisochronValueChron],div[id^=GPisochronValueDist]{width:220px;margin:auto}div[id^=GPisochronModeChoice]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-between;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:15px 0}.GPisochronModeLabel{display:block;text-align:center;margin-bottom:5px}div[id^=GPisochronTransportChoice] input{display:none}.GPisochronTransportImg{display:inline-block;width:28px;height:28px;cursor:pointer}.GPisochronTransportImg:first-of-type{margin-left:18px;margin-right:10px}input[id^=GPisochronTransportCar]+.GPisochronTransportImg{background-position:-168px 0}input[id^=GPisochronTransportCar]:checked+.GPisochronTransportImg{background-position:-196px 0}input[id^=GPisochronTransportPedestrian]+.GPisochronTransportImg{background-position:-224px 0}input[id^=GPisochronTransportPedestrian]:checked+.GPisochronTransportImg{background-position:-252px 0}select[id^=GPisochronDirectionSelect]{width:80px}input[id^=GPshowIsoExclusions]{display:none}.GPshowIsoExclusionsPicto{top:250px;right:0;transition:all .5s ease-out 0s}input[id^=GPshowIsoExclusions]+label+div[id^=GPisoExclusions]{max-height:0;opacity:0;margin-bottom:0}input[id^=GPshowIsoExclusions]:checked+label+div[id^=GPisoExclusions]{display:block;max-height:60px;opacity:1;margin-bottom:15px}div[id^=GPisoExclusions]{transition:max-height .5s ease-in-out .25s,opacity .5s ease-in-out .25s,margin .3s ease-in-out .25s;overflow:hidden}.GPisoExclusionsLabel{display:block;text-align:center;margin-bottom:10px;font-weight:bold;line-height:16px}.GPisoExclusionsOptions{display:-webkit-flex;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.GPisoExclusionsOption{display:block;height:28px;line-height:26px;color:#A77;background-color:#FEE;padding-left:28px;padding-right:5px;border:1px solid #A77;border-radius:3px;cursor:pointer}input:checked+.GPisoExclusionsOption{background-color:#EFE;background-position:0 -28px;color:#797;border:1px solid #797}div[id^=GPisochronReset]{position:absolute;margin-top:5px;width:28px;height:28px;border-radius:3px;opacity:.8;background-position:-281px 0;transition:opacity .2s ease-out;cursor:pointer}div[id^=GPisochronReset]:hover{opacity:1}#GPlayerSwitcher{font-size:11px}#GPlayerSwitcher [draggable]{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;user-select:none;-khtml-user-drag:element;-webkit-user-drag:element}#GPlayerSwitcher input[type="checkbox"]+div,#GPlayerSwitcher input[type="checkbox"]+label+div{max-height:0}#GPlayerSwitcher label{display:block}#GPshowLayersListPicto{position:relative;float:right;display:block;opacity:1;transition:opacity .5s ease-out 0s,box-shadow .5s ease-out 0s,border .5s ease-out 0s,border-radius .5s ease-out 0s;cursor:pointer}#GPshowLayersListOpen,#GPshowLayersListClose{position:absolute;display:block;transition:border-radius .5s ease-out 0s,opacity .5s ease-out 0s}#GPshowLayersListOpen{background-position:0 0;opacity:1}#GPshowLayersListClose{opacity:0}#GPlayerSwitcher input[type="checkbox"]:checked+div+#GPshowLayersListPicto{border-top-left-radius:0;border-top-right-radius:0}#GPlayerSwitcher input[type="checkbox"]:checked+div+#GPshowLayersListPicto #GPshowLayersListClose{opacity:1}#GPlayersList{position:relative;width:180px;border-bottom-right-radius:0;opacity:0;overflow:auto;transition:max-height .5s ease-out 0s,opacity .5s ease-out .25s}#GPlayerSwitcher input[type="checkbox"]:checked+#GPlayersList{max-height:232px;opacity:1;transition:max-height .5s ease-in 0s,opacity .25s ease-in 0s}.GPlayerSwitcher_layer{position:relative;top:0;background-color:#FFF;border-bottom:1px dotted #CCC;overflow:hidden}#GPlayersList .GPlayerSwitcher_layer:last-child{border-bottom:0}.GPlayerBasicTools,.GPlayerAdvancedTools{position:relative;width:100%;height:28px}.GPlayerVisibility,.GPlayerInfo,.GPlayerInfoOpened,.GPlayerRemove{width:28px;height:28px;cursor:pointer}.GPlayerVisibility,.GPlayerName,.GPlayerInfo,.GPlayerInfoOpened,.GPlayerRemove,.GPlayerOpacity,.GPlayerOpacityValue{position:absolute;top:0}.GPghostLayer{opacity:0}.GPlayerBasicTools{background-color:#FFF}.GPlayerVisibility{left:0;background-position:-28px 0}input[type="checkbox"]:checked+.GPlayerVisibility{background-position:0 0}.GPlayerName{left:28px;width:calc(100% - 56px);line-height:28px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-left:4px;cursor:move}.outOfRange .GPlayerName{color:#AAA}.GPshowLayerAdvancedTools{top:0;right:0;background-position:-112px 0}.GPlayerAdvancedTools{display:block;max-height:0;opacity:0;transition:max-height .5s ease-out 0s,opacity .5s ease-out 0s}#GPlayerSwitcher input[type="checkbox"]:checked+label+.GPlayerAdvancedTools{max-height:28px;opacity:1}.GPlayerInfo{left:0;background-position:-55px 0}.GPlayerInfoOpened{left:0;background-position:-83px 0}.GPlayerOpacity{left:28px;width:calc(100% - 100px);height:28px;padding-left:8px}.GPlayerOpacityValue{width:32px;left:calc(100% - 60px);line-height:28px;font-size:10px;font-style:italic;cursor:default}.GPlayerRemove{right:0;background-position:-140px 0}.GPlayerOpacity input{-webkit-appearance:none;-moz-appearance:none;background:0;display:block;width:100%;height:100%;margin:0;padding:0;overflow:hidden;cursor:pointer}.GPlayerOpacity input[type="range"]:focus{box-shadow:none;outline:0}.GPlayerOpacity input[type="range"]::-webkit-slider-runnable-track{-webkit-appearance:none;height:3px}.GPlayerOpacity input[type="range"]::-webkit-slider-thumb:before{position:absolute;top:0;right:50%;left:-200px;height:3px;pointer-events:none}.GPlayerOpacity input[type="range"]::-webkit-slider-thumb{width:9px;height:17px;-webkit-appearance:none;border:2px solid #FFF;background-color:#505050;position:relative;top:-7px}.GPlayerOpacity input[type="range"]::-moz-range-track{width:80px;height:3px}.GPlayerOpacity input[type="range"]::-moz-range-thumb{width:5px;height:13px;border:2px solid #FFF;border-radius:0;box-shadow:0;background-color:#505050;position:relative}.GPlayerOpacity input[type="range"]::-ms-track{border:0;border-color:transparent;border-radius:0;border-width:0;color:transparent;height:3px;width:80px}.GPlayerOpacity input[type="range"]::-ms-fill-lower,.GPlayerOpacity input[type="range"]::-ms-fill-upper{background:transparent;border-radius:0}.GPlayerOpacity input[type="range"]::-ms-thumb{width:5px;height:13px;border:2px solid #FFF;background-color:#505050}.GPlayerOpacity input[type="range"]::-ms-tooltip{display:none}#GPlayerInfoPanel{position:absolute;top:0;overflow-y:hidden;padding-top:10px;padding-bottom:10px}.GPlayerInfoPanelOpened{display:block}.GPlayerInfoPanelClosed{display:none}#GPlayerInfoContent{position:relative;width:280px;max-height:200px;overflow-y:auto;padding-left:10px;padding-right:10px}#GPlayerInfoTitle{width:calc(100% - 52px);margin:auto;margin-bottom:10px;padding-bottom:5px;text-align:center;font-size:1.1em;font-weight:bold}#GPlayerInfoQuicklook{position:absolute;top:-2px;left:10px;width:20px;height:20px;cursor:pointer}#GPlayerInfoClose{position:absolute;top:-8px;right:10px;width:28px;height:28px;cursor:pointer}#GPlayerInfoDescription{font-size:.9em}.GPlayerInfoSubtitle{padding-left:35px;font-weight:bold;margin-top:10px;margin-bottom:4px}.GPlayerInfoLink,.GPlayerInfoPopup{line-height:20px;padding-left:23px;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;color:#999;background-repeat:no-repeat;cursor:pointer}.GPlayerInfoLink{background-position:0 -20px}.GPlayerInfoLink:hover,.GPlayerInfoPopup:hover{color:#333}.GPlayerInfoLink a,.GPlayerInfoLink a:visited .GPlayerInfoLink a:focus .GPlayerInfoLink a:hover{text-decoration:none;color:inherit}.GPlocationStageFlexInput{max-height:28px;opacity:1}.GPlocationStageFlexInputHidden{max-height:0;opacity:0;overflow:hidden}.GPlocationOriginVisible{display:block}.GPlocationOriginHidden{display:none}label.GPlocationOriginPointerImg[id*="GPlocationOriginPointerImg"]{width:28px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-right:1px solid #999}input[id*="GPlocationOriginPointer"]+.GPlocationOriginPointerImg{background-position:-1px -1px}input[id*="GPlocationOriginPointer"]:checked+.GPlocationOriginPointerImg{background-position:-29px -1px}.GPlocationStageRemove,div[id^=GPlocationStageAdd]{width:28px;border:0;cursor:pointer}.GPlocationStageRemove{background-position:-84px 0}div[id^=GPlocationStageAdd]{background-position:-56px 0}label[id^=GPshowMeasureAreaPicto-]{display:inline-block}input[id^=GPshowMeasureArea-]+label{display:block}input[id^=GPshowMeasureArea-]:checked+label{display:block;background-color:rgba(0,60,136,0.5)}input[id^=GPshowMeasureArea-]+label+div{display:block}input[id^=GPshowMeasureArea-]:checked+label+div{display:block}label[id^=GPshowMeasureAzimuthPicto-]{display:inline-block}input[id^=GPshowMeasureAzimuth-]+label{display:block}input[id^=GPshowMeasureAzimuth-]:checked+label{display:block;background-color:rgba(0,60,136,0.5)}input[id^=GPshowMeasureAzimuth-]+label+div{display:block}input[id^=GPshowMeasureAzimuth-]:checked+label+div{display:block}label[id^=GPshowMeasureLengthPicto-]{display:inline-block}input[id^=GPshowMeasureLength-]+label{display:block}input[id^=GPshowMeasureLength-]:checked+label{display:block;background-color:rgba(0,60,136,0.5)}input[id^=GPshowMeasureLength-]+label+div{display:block}input[id^=GPshowMeasureLength-]:checked+label+div{display:block}.tooltip{position:relative;background:rgba(0,0,0,0.5);border-radius:4px;color:white;padding:4px 8px;white-space:nowrap}.tooltip-measure{font-weight:bold}.tooltip-info{font-size:.75em;text-align:center}.tooltip-static{background-color:#fc3;color:black;border:1px solid white}.tooltip-hidden{display:none}.tooltip-measure::before,.tooltip-info::before,.tooltip-static::before{border-top:6px solid rgba(0,0,0,0.5);border-right:6px solid transparent;border-left:6px solid transparent;content:"";position:absolute;bottom:-6px;margin-left:-7px;left:50%}.tooltip-static::before{border-top-color:#fc3}label[id^=GPshowMousePositionPicto]{display:inline-block}input[id^=GPshowMousePosition-]+label{display:block}input[id^=GPshowMousePosition-]:checked+label{display:none}input[id^=GPshowMousePosition-]+label+div{display:none}input[id^=GPshowMousePosition-]:checked+label+div{display:block}div[id^=GPmousePositionPanel-]{width:240px;overflow:hidden}div[id^=GPmousePositionBasicPanel]{padding:10px 15px}.GPmousePositionLabel,.GPmousePositionCoords{display:inline-block;line-height:20px}.GPmousePositionLabel{width:80px;font-weight:bold}.GPmousePositionCoords{width:110px}.GPshowMousePositionSettingsPicto{bottom:5px;right:0;transition:all .5s ease-out 0s}div[id^=GPmousePosition-] input[type="checkbox"]:checked+.GPshowMousePositionSettingsPicto{bottom:100px}div[id^=GPmousePositionSettings-]{display:block;max-height:0;opacity:0;transition:max-height .5s ease-out 0s,opacity .5s ease-out 0s}div[id^=GPmousePosition-] input[type="checkbox"]:checked+label+div[id^=GPmousePositionSettings-]{max-height:95px;opacity:1}div[id^=GPmousePositionSettings-]{height:95px;padding-left:0 15px;overflow:hidden}.GPmousePositionSettingsLabel{display:block;margin:auto;text-align:center;font-weight:bold;line-height:16px}.GPmousePositionSettingsSelect{width:180px;margin-top:5px}#GPmapCenter{display:none;position:absolute;top:50%;left:50%;width:50px;height:50px;margin-top:-25px;margin-left:-25px}#GPmapCenter.GPmapCenterVisible{display:block}[id^="GPreverseGeocoding-"]{top:180px}[id^="GPshowReverseGeocodingPicto-"]{display:inline-block}[id^="GPshowReverseGeocoding-"]+label{display:block}[id^="GPshowReverseGeocoding-"]:checked+label{display:none}[id^="GPshowReverseGeocoding-"]+label+div{display:none}[id^="GPshowReverseGeocoding-"]:checked+label+div{display:block}div[id^=GPreverseGeocodingResultsClose]{top:0;right:0;width:30px;height:32px}[id^="GPreverseGeocodingPanel-"]{width:280px}.GPreverseGeocodingComponentHidden{display:none}div[id^="GPreverseGeocodingReturnPicto-"]{position:absolute;width:26px;height:26px;border-radius:3px;opacity:1;background-position:0 0;cursor:pointer}.GPreverseGeocodingReturnPictoHidden{display:none}.GPreverseGeocodingCalcWaitingContainerVisible,.GPreverseGeocodingCalcWaitingContainerHidden{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0.9);font-size:1.5em;font-weight:bold;overflow:hidden}.GPreverseGeocodingCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GPreverseGeocodingCalcWaitingContainerHidden{display:none}.GPreverseGeocodingCalcWaiting{margin:auto}[id^="GPreverseGeocodingForm-"]{position:relative;max-height:270px;overflow-y:auto;padding-left:15px;padding-right:15px;padding-top:10px}.GPreverseGeocodingCodeLabel,.GPreverseGeocodingFilterLabel{max-width:105px}.GPreverseGeocodingCodeLabel,.GPreverseGeocodingCode{margin-top:5px;margin-bottom:0}.GPreverseGeocodingFilterLabel,.GPreverseGeocodingFilterInput{margin-bottom:5px}input[id^="GPreverseGeocodingSubmit-"]{margin-top:5px;margin-bottom:15px;width:100px}.GPreverseGeocodingCalcWaitingContainerVisible,.GPreverseGeocodingCalcWaitingContainerHidden{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0.9);font-size:1.5em;font-weight:bold;overflow:hidden}.GPreverseGeocodingCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GPreverseGeocodingCalcWaitingContainerHidden{display:none}.GPreverseGeocodingCalcWaiting{margin:auto}div[id^=GPreverseGeocodingResultsList-]{position:relative;max-height:210px;overflow-y:auto}div[id^=GProute-]{top:100px}label[id^=GPshowRoutePicto]{display:inline-block}input[id^=GPshowRoute-]+label{display:block}input[id^=GPshowRoute-]:checked+label{display:none}input[id^=GPshowRoute-]+label+div{display:none}input[id^=GPshowRoute-]:checked+label+div{display:block}div[id^=GProutePanel-]{width:320px}.GProuteComponentHidden{display:none}.GProuteCalcWaitingContainerVisible,.GProuteCalcWaitingContainerHidden{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0.9);font-size:1.5em;font-weight:bold;overflow:hidden}.GProuteCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GProuteCalcWaitingContainerHidden{display:none}.GProuteCalcWaiting{margin:auto}form[id^=GProuteForm]{padding:15px}.GProuteFormMini{max-height:58px;overflow:hidden;-webkit-transform:translateY(-5px);transform:translateY(-5px)}.GProuteStageFlexInput{max-height:28px;opacity:1}.GProuteStageFlexInputHidden{max-height:0;opacity:0;overflow:hidden}form[id^=GProuteForm]>.GPlocationStageFlexInput{margin-top:5px}form[id^=GProuteForm]>.GPlocationStageFlexInputHidden{margin-top:0}form[id^=GProuteForm].GProuteFormMini .GPlocationStageFlexInput:first-child{margin-top:5px}.GProuteOriginVisible{display:block}.GProuteOriginHidden{display:none}label.GProuteOriginPointerImg[id*="GProuteOriginPointerImg"]{width:28px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-right:1px solid #999}input[id*="GProuteOriginPointer"]+.GProuteOriginPointerImg{background-position:-1px -1px}input[id*="GProuteOriginPointer"]:checked+.GProuteOriginPointerImg{background-position:-29px -1px}.GProuteStageRemove,div[id^=GProuteStageAdd]{width:28px;border:0;cursor:pointer}.GProuteFormMini .GProuteStageRemove,.GProuteFormMini div[id^=GProuteStageAdd]{display:none}.GProuteStageRemove{background-position:-84px 0}div[id^=GProuteStageAdd]{background-position:-56px 0}div[id^=GProuteModeChoice]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin:15px 0}.GProuteModeLabel{display:block;text-align:center;margin-bottom:5px}div[id^=GProuteTransportChoice] input{display:none}.GProuteTransportImg{display:inline-block;width:28px;height:28px;cursor:pointer}.GProuteTransportImg:first-of-type{margin-left:18px;margin-right:10px}input[id^=GProuteTransportCar]+.GProuteTransportImg{background-position:-112px 0}input[id^=GProuteTransportCar]:checked+.GProuteTransportImg{background-position:-140px 0}input[id^=GProuteTransportPedestrian]+.GProuteTransportImg{background-position:-168px 0}input[id^=GProuteTransportPedestrian]:checked+.GProuteTransportImg{background-position:-196px 0}select[id^=GProuteComputationSelect]{width:100px}input[id^=GPshowRouteExclusions]{display:none}.GPshowRouteExclusionsPicto{top:185px;right:0;transition:all .3s ease-out 0s}input[id^=GPshowRouteExclusions]+label+div[id^=GProuteExclusions]{max-height:0;opacity:0;margin-bottom:0}input[id^=GPshowRouteExclusions]:checked+label+div[id^=GProuteExclusions]{display:block;max-height:60px;opacity:1;margin-bottom:15px}div[id^=GProuteExclusions]{transition:max-height .5s ease-in-out .25s,opacity .5s ease-in-out .25s,margin .3s ease-in-out .25s;overflow:hidden}.GProuteExclusionsLabel{display:block;text-align:center;margin-bottom:10px;font-weight:bold;line-height:16px}.GProuteExclusionsOptions{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.GProuteExclusionsOption{display:block;height:28px;line-height:26px;color:#A77;background-color:#FEE;padding-left:28px;padding-right:5px;border:1px solid #A77;border-radius:3px;cursor:pointer}input:checked+.GProuteExclusionsOption{background-color:#EFE;background-position:0 -28px;color:#797;border:1px solid #797}div[id^=GProuteReset]{position:absolute;width:28px;height:28px;border-radius:3px;opacity:.8;background-position:-224px 0;transition:opacity .2s ease-out;cursor:pointer}div[id^=GProuteReset]:hover{opacity:1}div[id^=GProuteResultsPanel]{padding:15px}.GProuteResultStage{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}div[id^=GProuteResultsStages]{margin-bottom:15px}.GProuteResultStageLabel,.GProuteResultStageValue,.GProuteResultsValueLabel,div[id^=GProuteResultsValueDist],div[id^=GProuteResultsValueTime]{display:inline-block;line-height:18px}.GProuteResultStageLabel,.GProuteResultsValueLabel{color:#666}.GProuteResultStageLabel{width:60px}.GProuteResultsValueLabel{width:65px}.GProuteResultStageValue{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-x:hidden;white-space:nowrap;text-overflow:ellipsis}div[id^=GProuteResultsValueDist],div[id^=GProuteResultsValueTime]{width:80px;font-weight:bold}div[id^=GProuteResults-]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-between;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:10px}select[id^=GProuteResultsComputationSelect]{width:100px}div[id^=GProuteResultsNew]{width:28px;height:28px;border-radius:3px;opacity:.8;background-position:-224px 0;transition:opacity .2s ease-out;cursor:pointer}div[id^=GProuteResultsNew]:hover{opacity:1}.GPfakeBorder{display:inline-block;height:14px;width:60px;border-bottom:1px solid #999}.GPfakeBorderLeft{margin-left:15px}input[id^=GProuteResultsShowDetails]+label,input[id^=GProuteResultsShowDetails]+label+label{width:130px;line-height:28px;vertical-align:top;text-align:center;font-weight:bold;cursor:pointer;transition:color .2s ease-out}input[id^=GProuteResultsShowDetails]+label,input[id^=GProuteResultsShowDetails]:checked+label+label{display:inline-block}input[id^=GProuteResultsShowDetails]:checked+label,input[id^=GProuteResultsShowDetails]+label+label{display:none}input[id^=GProuteResultsShowDetails]+label+label+div+div[id^=GProuteResultsDetails]{max-height:0;opacity:0}input[id^=GProuteResultsShowDetails]:checked+label+label+div+div[id^=GProuteResultsDetails]{max-height:200px;opacity:1}div[id^=GProuteResultsDetails]{overflow-y:auto;transition:max-height .5s ease-in-out .25s,opacity .5s ease-in-out .25s}.GProuteResultsDetailsNumber,.GProuteResultsDetailsInstruction{display:inline-block;margin-top:4px;line-height:16px;color:#666}.GProuteResultsDetailsNumber{font-weight:bold;width:22px;text-align:right;vertical-align:top}.GProuteResultsDetailsInstruction{width:calc(100% - 30px);padding-left:5px}input[id^=GPshowSearchEngine-]+label+form[id^=GPsearchInput-]{max-width:0}#GPlayerSwitcher label{display:block}input[id^=GPshowSearchEngine-]{display:none}label[id^=GPshowSearchEnginePicto]{display:inline-block;transition:border-radius 0s ease-out 0s;transition-delay:.5s}input[id^=GPshowSearchEngine-]:checked+label{border-top-right-radius:0;border-bottom-right-radius:0;transition-delay:0s}input[id^=GPshowSearchEngine-]+label+form[id^=GPsearchInput-]{max-width:0;border:0;transition:max-width .5s ease-out 0s}input[id^=GPshowSearchEngine-]:checked+label+form[id^=GPsearchInput-]{max-width:280px}input[id^=GPshowSearchEngine-]+label+form[id^=GPsearchInput-]+div[id^=GPshowAdvancedSearch]{display:none}input[id^=GPshowSearchEngine-]:checked+label+form[id^=GPsearchInput-]+div[id^=GPshowAdvancedSearch]{display:inline-block}div[id^=GPautoCompleteList]{display:none}input[id^=GPshowSearchEngine-]:checked+label+form[id^=GPsearchInput-]+div[id^=GPautoCompleteList]{display:block}form[id^=GPsearchInput-]{display:inline-block;position:relative;left:-3px;width:280px;overflow:hidden}form[id^=GPsearchInput-] input{display:block;width:100%;height:100%;border:1px solid #999;border-top-right-radius:5px;border-bottom-right-radius:5px;padding:0;padding-right:30px;padding-left:5px;color:#333;font-size:1.0em}form[id^=GPsearchInput-] input:disabled{background-color:#DDD;color:#999}div[id^=GPsearchInputReset]{position:absolute;top:0;right:0;width:30px;height:32px;background-position:-30px 0;cursor:pointer}div[id^=GPgeocodeResultsClose],div[id^=GPadvancedSearchClose]{top:0;right:0;width:30px;height:32px}div[id^=GPgeocodeResultsClose]{background-position:0 0}div[id^=GPadvancedSearchClose]{background-repeat:no-repeat}div[id^=GPshowAdvancedSearch]{transition:border-radius 0s ease-out 0s;transition-delay:.5s}div[id^=GPadvancedSearchPanel]{display:none;width:280px;vertical-align:top;overflow:hidden}form[id^=GPadvancedSearchForm]{max-height:220px;overflow-y:auto;padding-left:15px;padding-right:15px}.GPadvancedSearchCodeLabel,.GPadvancedSearchFilterLabel{max-width:105px}.GPadvancedSearchCodeLabel,.GPadvancedSearchCode,div[id^=GPadvancedSearchFilters]{margin-top:15px}.GPadvancedSearchFilterLabel,.GPadvancedSearchFilterInput{margin-bottom:5px}input[id^=GPadvancedSearchSubmit]{margin-top:10px;margin-bottom:15px}div[id^=GPautoCompleteList],div[id^=GPgeocodeResultsList]{width:280px}div[id^=GPautoCompleteList]{top:35px}div[id^=GPgeocodeResultsList]{display:none;position:absolute;top:40px;border-radius:4px;overflow:hidden}div[id^=GPgeocodeResults-]{background-color:#FFF;max-height:140px;overflow-y:auto}.GPwidget{position:relative}#GPadvancedToolsPanel{position:initial}.GPpanel{box-shadow:0 1px 5px #000;border-radius:5px}.GPpanelHeader{height:32px;background-color:#FFF;border-top-left-radius:5px;border-top-right-radius:5px}.GPpanelTitle{width:calc(100% - 60px);margin:auto;line-height:32px;color:#c77a04;border-bottom:1px solid #c77a04}.GPpanelClose{top:0;right:0;width:30px;height:32px;background-position:-30px 1px}.GPpanelReduce{top:0;right:30px;width:30px;height:32px;background-position:-60px 1px}.GPshowAdvancedToolPicto{width:30px;height:30px;box-shadow:0 1px 5px #000;background-color:#FFF;border-radius:5px}.GPshowAdvancedToolPicto:hover{background-color:#f4f4f4}.GPshowAdvancedToolOpen{width:100%;height:100%}input.GPinputSubmit{background-color:#c77a04}.GPshowMoreOptions{background-image:url("../img/gp/GPshowMoreOptions.png")}div[id^=GPelevationPath-]{top:0}label[id^=GPshowElevationPathPicto]{display:inline-block}input[id^=GPshowElevationPath-]+label{display:block}input[id^=GPshowElevationPath-]+label+div{display:none}input[id^=GPshowElevationPath-]:checked+label+div{display:block}span[id^=GPshowElevationPathOpen]{background-image:url("../img/gp/GPshowElevationPath.png")}[id^=GPelevationPathPanelClose]{background-image:url("../img/gp/GPshowElevationPath.png")}div[id^=GPelevationPathPanelReduce]{background-image:url("../img/gp/GPshowElevationPath.png")}[id^=GPelevationPathPanel-]{width:280px}[id^=GPelevationPathProfil]{height:150px;width:inherit;line-height:normal}div[id^=GPisochron-]{top:0}span[id^=GPshowIsochronOpen]{background-image:url("../img/gp/GPisochronOpen.png")}div[id^=GPisochronPanel-]{left:10px}div[id^=GPisochronPanelClose]{background-image:url("../img/gp/GPisochronOpen.png")}div[id^=GPisochronPanelReduce]{background-image:url("../img/gp/GPisochronOpen.png")}.GPisochronCalcWaitingContainerVisible,.GPisochronCalcWaitingContainerHidden{border-radius:5px}.GPisochronChoiceAlt input:checked+label+span{color:#c77a04}.GPisochronOriginPointerImg,.GPisochronChoiceAltImg,.GPisochronTransportImg{background-image:url("../img/gp/GPisochronOptions.png")}.GPisoExclusionsOption{background-image:url("../img/gp/GPisochronCheck.png")}div[id^=GPisochronReset]{background-color:#c77a04;background-image:url("../img/gp/GPisochronOptions.png")}#GPlayerSwitcher{top:10px;right:10px}#GPshowLayersListPicto{width:36px;height:36px}#GPshowLayersListOpen,#GPshowLayersListClose{background-image:url("../img/gp/GPshowLayersList.png")}#GPshowLayersListClose{background-position:-36px 0}#GPlayerSwitcher input[type="checkbox"]:checked+div+#GPshowLayersListPicto{box-shadow:0 2px 2px #000;border-top:1px solid #CCC}#GPlayerSwitcher input[type="checkbox"]:checked+div+#GPshowLayersListPicto #GPshowLayersListOpen{opacity:.4}.GPlayerVisibility,.GPshowLayerAdvancedTools,.GPlayerInfo,.GPlayerInfoOpened,.GPlayerRemove{background-image:url("../img/gp/GPlayerTools.png")}.GPlayerOpacity input[type="range"]::-webkit-slider-runnable-track{background:url("../img/gp/GPopacitySlider.png")}.GPlayerOpacity input[type="range"]::-moz-range-track{background:url("../img/gp/GPopacitySlider.png")}.GPlayerOpacity input[type="range"]::-ms-track{background:url("../img/gp/GPopacitySlider.png")}#GPlayerInfoPanel{right:190px}#GPlayerInfoTitle{color:#c77a04;border-bottom:1px solid #c77a04}#GPlayerInfoQuicklook{background-image:url("../img/gp/GPlayerInfo.png")}#GPlayerInfoClose{background-image:url("../img/gp/GPlayerInfoClose.png")}.GPlayerInfoLink,.GPlayerInfoPopup{background-image:url("../img/gp/GPlayerInfo.png")}.GPlocationStageFlexInput{margin-bottom:5px}.GPlocationOriginPointerImg,.GPlocationStageRemove,div[id^=GPlocationStageAdd],.GPlocationTransportImg{background-image:url("../img/gp/GPlocationOptions.png")}span[id^=GPshowMousePositionOpen]{background-image:url("../img/gp/GPmousePositionOpen.png")}div[id^=GPmousePositionPanelClose]{background-image:url("../img/gp/GPmousePositionOpen.png")}#GPmapCenter{background-image:url("../img/gp/GPmapCenter.png")}[id^="GPreverseGeocoding-"]{top:0}[id^="GPshowReverseGeocodingOpen-"]{background-image:url("../img/gp/GPreverseGeocodingOpen.png")}[id^="GPreverseGeocodingPanel-"]{left:10px}[id^="GPreverseGeocodingPanelClose-"]{background-image:url("../img/gp/GPreverseGeocodingOpen.png")}.GPreverseGeocodingCalcWaitingContainerVisible,.GPreverseGeocodingCalcWaitingContainerHidden{border-radius:5px}[id^="GPreverseGeocodingReturnPicto-"]{width:30px!important;height:30px!important;background-color:#c77a04;background-image:url("../img/gp/GPreturn.png")}.GPreverseGeocodedLocationHighlight{background-color:rgba(255,200,0,0.25);color:#222}div[id^=GProute-]{top:0}.GProuteStageFlexInput{margin-bottom:5px}span[id^=GPshowRouteOpen]{background-image:url("../img/gp/GProuteOpen.png")}div[id^=GProutePanel-]{left:10px}div[id^=GProutePanelClose]{background-image:url("../img/gp/GProuteOpen.png")}.GProuteCalcWaitingContainerVisible,.GProuteCalcWaitingContainerHidden{border-radius:5px}.GProuteOriginPointerImg,.GProuteStageRemove,div[id^=GProuteStageAdd],.GProuteTransportImg{background-image:url("../img/gp/GProuteOptions.png")}.GProuteExclusionsOption{background-image:url("../img/gp/GProuteCheck.png")}div[id^=GProuteResultsValueDist],div[id^=GProuteResultsValueTime]{color:#c77a04}div[id^=GProuteResultsNew]{background-color:#c77a04;background-image:url("../img/gp/GProuteOptions.png")}input[id^=GProuteResultsShowDetails]+label:hover,input[id^=GProuteResultsShowDetails]+label+label:hover{color:#c77a04}.GProuteResultsDetailsHighlight{background-color:rgba(255,200,0,0.25);color:#222}span[id^=GPshowSearchEngineOpen]{background-image:url("../img/gp/GPsearchEngineOpen.png")}form[id^=GPsearchInput-]{height:30px}div[id^=GPsearchInputReset]{background-image:url("../img/gp/GPsearchEngineClose.png")}div[id^=GPgeocodeResultsClose]{background-image:url("../img/gp/GPsearchEngineClose.png")}div[id^=GPadvancedSearchClose]{background-image:url("../img/gp/GPsearchEngineOpen.png");background-position:-60px 0}span[id^=GPshowAdvancedSearchOpen]{background-image:url("../img/gp/GPsearchEngineOpen.png");background-position:-30px 0}div[id^=GPautoCompleteList],div[id^=GPgeocodeResultsList]{margin-left:27px;box-shadow:0 1px 5px #000}div[id^=GPgeocodeResultsList]{top:38px;border-radius:5px}.leaflet-draw-section{position:relative}.leaflet-draw-toolbar{margin-top:12px}.leaflet-draw-toolbar-top{margin-top:0}.leaflet-draw-toolbar-notop a:first-child{border-top-right-radius:0}.leaflet-draw-toolbar-nobottom a:last-child{border-bottom-right-radius:0}.leaflet-draw-toolbar a{background-image:url('../img/gp/spritesheet.png');background-repeat:no-repeat}.leaflet-retina .leaflet-draw-toolbar a{background-image:url('../img/gp/spritesheet-2x.png');background-size:270px 30px}.leaflet-draw a{display:block;text-align:center;text-decoration:none}.leaflet-draw-actions{display:none;list-style:none;margin:0;padding:0;position:absolute;left:26px;top:0;white-space:nowrap}.leaflet-touch .leaflet-draw-actions{left:32px}.leaflet-right .leaflet-draw-actions{right:26px;left:auto}.leaflet-touch .leaflet-right .leaflet-draw-actions{right:32px;left:auto}.leaflet-draw-actions li{display:inline-block}.leaflet-draw-actions li:first-child a{border-left:none}.leaflet-draw-actions li:last-child a{-webkit-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.leaflet-right .leaflet-draw-actions li:last-child a{-webkit-border-radius:0;border-radius:0}.leaflet-right .leaflet-draw-actions li:first-child a{-webkit-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.leaflet-draw-actions a{background-color:#919187;border-left:1px solid #AAA;color:#FFF;font:11px/19px "Helvetica Neue",Arial,Helvetica,sans-serif;line-height:28px;text-decoration:none;padding-left:10px;padding-right:10px;height:28px}.leaflet-touch .leaflet-draw-actions a{font-size:12px;line-height:30px;height:30px}.leaflet-draw-actions-bottom{margin-top:0}.leaflet-draw-actions-top{margin-top:1px}.leaflet-draw-actions-top a,.leaflet-draw-actions-bottom a{height:27px;line-height:27px}.leaflet-draw-actions a:hover{background-color:#a0a098}.leaflet-draw-actions-top.leaflet-draw-actions-bottom a{height:26px;line-height:26px}.leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:-2px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:0 -1px}.leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-31px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-29px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-62px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-60px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-92px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-90px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-122px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-120px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-152px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-150px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-182px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-180px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-212px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-210px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-242px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-240px -2px}.leaflet-mouse-marker{background-color:#fff;cursor:crosshair}.leaflet-draw-tooltip{background:#363636;background:rgba(0,0,0,0.5);border:1px solid transparent;-webkit-border-radius:4px;border-radius:4px;color:#fff;font:12px/18px "Helvetica Neue",Arial,Helvetica,sans-serif;margin-left:20px;margin-top:-21px;padding:4px 8px;position:absolute;visibility:hidden;white-space:nowrap;z-index:6}.leaflet-draw-tooltip:before{border-right:6px solid black;border-right-color:rgba(0,0,0,0.5);border-top:6px solid transparent;border-bottom:6px solid transparent;content:"";position:absolute;top:7px;left:-7px}.leaflet-error-draw-tooltip{background-color:#f2dede;border:1px solid #e6b6bd;color:#b94a48}.leaflet-error-draw-tooltip:before{border-right-color:#e6b6bd}.leaflet-draw-tooltip-single{margin-top:-12px}.leaflet-draw-tooltip-subtext{color:#f8d5e4}.leaflet-draw-guide-dash{font-size:1%;opacity:.6;position:absolute;width:5px;height:5px}.leaflet-edit-marker-selected{background:rgba(254,87,161,0.1);border:4px dashed rgba(254,87,161,0.6);-webkit-border-radius:4px;border-radius:4px;box-sizing:content-box}.leaflet-edit-move{cursor:move}.leaflet-edit-resize{cursor:pointer}.leaflet-oldie .leaflet-draw-toolbar{border:1px solid #999}
\ No newline at end of file
Binary file src/pyams_gis/resources/img/esri/loading.gif has changed
Binary file src/pyams_gis/resources/img/esri/loading@2x.gif has changed
Binary file src/pyams_gis/resources/img/esri/search-disabled.png has changed
Binary file src/pyams_gis/resources/img/esri/search.png has changed
Binary file src/pyams_gis/resources/img/esri/search@2x-disabled.png has changed
Binary file src/pyams_gis/resources/img/esri/search@2x.png has changed
Binary file src/pyams_gis/resources/img/gp/GPisochronCheck.png has changed
Binary file src/pyams_gis/resources/img/gp/GPisochronOpen.png has changed
Binary file src/pyams_gis/resources/img/gp/GPisochronOptions.png has changed
Binary file src/pyams_gis/resources/img/gp/GPlayerInfo.png has changed
Binary file src/pyams_gis/resources/img/gp/GPlayerInfoClose.png has changed
Binary file src/pyams_gis/resources/img/gp/GPlayerTools.png has changed
Binary file src/pyams_gis/resources/img/gp/GPlocationOptions.png has changed
Binary file src/pyams_gis/resources/img/gp/GPmapCenter.png has changed
Binary file src/pyams_gis/resources/img/gp/GPmousePositionOpen.png has changed
Binary file src/pyams_gis/resources/img/gp/GPopacitySlider.png has changed
Binary file src/pyams_gis/resources/img/gp/GPreturn.png has changed
Binary file src/pyams_gis/resources/img/gp/GPreverseGeocodingOpen.png has changed
Binary file src/pyams_gis/resources/img/gp/GProuteCheck.png has changed
Binary file src/pyams_gis/resources/img/gp/GProuteOpen.png has changed
Binary file src/pyams_gis/resources/img/gp/GProuteOptions.png has changed
Binary file src/pyams_gis/resources/img/gp/GPsearchEngineClose.png has changed
Binary file src/pyams_gis/resources/img/gp/GPsearchEngineOpen.png has changed
Binary file src/pyams_gis/resources/img/gp/GPshowElevationPath.png has changed
Binary file src/pyams_gis/resources/img/gp/GPshowLayersList.png has changed
Binary file src/pyams_gis/resources/img/gp/GPshowMoreOptions.png has changed
Binary file src/pyams_gis/resources/img/gp/spritesheet-2x.png has changed
Binary file src/pyams_gis/resources/img/gp/spritesheet.png has changed
Binary file src/pyams_gis/resources/img/gp/waiting.gif has changed
Binary file src/pyams_gis/resources/img/layers-2x.png has changed
Binary file src/pyams_gis/resources/img/layers.png has changed
Binary file src/pyams_gis/resources/img/marker-icon.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Edit.Circle.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,71 @@
+L.Edit = L.Edit || {};
+/**
+ * @class L.Edit.Circle
+ * @aka Edit.Circle
+ * @inherits L.Edit.SimpleShape
+ */
+L.Edit.Circle = L.Edit.SimpleShape.extend({
+	_createMoveMarker: function () {
+		var center = this._shape.getLatLng();
+
+		this._moveMarker = this._createMarker(center, this.options.moveIcon);
+	},
+
+	_createResizeMarker: function () {
+		var center = this._shape.getLatLng(),
+			resizemarkerPoint = this._getResizeMarkerPoint(center);
+
+		this._resizeMarkers = [];
+		this._resizeMarkers.push(this._createMarker(resizemarkerPoint, this.options.resizeIcon));
+	},
+
+	_getResizeMarkerPoint: function (latlng) {
+		// From L.shape.getBounds()
+		var delta = this._shape._radius * Math.cos(Math.PI / 4),
+			point = this._map.project(latlng);
+		return this._map.unproject([point.x + delta, point.y - delta]);
+	},
+
+	_move: function (latlng) {
+		var resizemarkerPoint = this._getResizeMarkerPoint(latlng);
+
+		// Move the resize marker
+		this._resizeMarkers[0].setLatLng(resizemarkerPoint);
+
+		// Move the circle
+		this._shape.setLatLng(latlng);
+
+		this._map.fire(L.Draw.Event.EDITMOVE, { layer: this._shape });
+	},
+
+	_resize: function (latlng) {
+		var moveLatLng = this._moveMarker.getLatLng(),
+			radius = moveLatLng.distanceTo(latlng);
+
+		this._shape.setRadius(radius);
+
+		this._map.fire(L.Draw.Event.EDITRESIZE, { layer: this._shape });
+	}
+});
+
+L.Circle.addInitHook(function () {
+	if (L.Edit.Circle) {
+		this.editing = new L.Edit.Circle(this);
+
+		if (this.options.editable) {
+			this.editing.enable();
+		}
+	}
+
+	this.on('add', function () {
+		if (this.editing && this.editing.enabled()) {
+			this.editing.addHooks();
+		}
+	});
+
+	this.on('remove', function () {
+		if (this.editing && this.editing.enabled()) {
+			this.editing.removeHooks();
+		}
+	});
+});
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Edit.Circle.min.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+L.Edit=L.Edit||{};L.Edit.Circle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var a=this._shape.getLatLng();this._moveMarker=this._createMarker(a,this.options.moveIcon)},_createResizeMarker:function(){var a=this._shape.getLatLng(),b=this._getResizeMarkerPoint(a);this._resizeMarkers=[];this._resizeMarkers.push(this._createMarker(b,this.options.resizeIcon))},_getResizeMarkerPoint:function(c){var b=this._shape._radius*Math.cos(Math.PI/4),a=this._map.project(c);return this._map.unproject([a.x+b,a.y-b])},_move:function(b){var a=this._getResizeMarkerPoint(b);this._resizeMarkers[0].setLatLng(a);this._shape.setLatLng(b);this._map.fire(L.Draw.Event.EDITMOVE,{layer:this._shape})},_resize:function(c){var b=this._moveMarker.getLatLng(),a=b.distanceTo(c);this._shape.setRadius(a);this._map.fire(L.Draw.Event.EDITRESIZE,{layer:this._shape})}});L.Circle.addInitHook(function(){if(L.Edit.Circle){this.editing=new L.Edit.Circle(this);if(this.options.editable){this.editing.enable()}}this.on("add",function(){if(this.editing&&this.editing.enabled()){this.editing.addHooks()}});this.on("remove",function(){if(this.editing&&this.editing.enabled()){this.editing.removeHooks()}})});
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Edit.Marker.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,84 @@
+L.Edit = L.Edit || {};
+
+/**
+ * @class L.Edit.Marker
+ * @aka Edit.Marker
+ */
+L.Edit.Marker = L.Handler.extend({
+	// @method initialize(): void
+	initialize: function (marker, options) {
+		this._marker = marker;
+		L.setOptions(this, options);
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler
+	addHooks: function () {
+		var marker = this._marker;
+
+		marker.dragging.enable();
+		marker.on('dragend', this._onDragEnd, marker);
+		this._toggleMarkerHighlight();
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler
+	removeHooks: function () {
+		var marker = this._marker;
+
+		marker.dragging.disable();
+		marker.off('dragend', this._onDragEnd, marker);
+		this._toggleMarkerHighlight();
+	},
+
+	_onDragEnd: function (e) {
+		var layer = e.target;
+		layer.edited = true;
+		this._map.fire(L.Draw.Event.EDITMOVE, { layer: layer });
+	},
+
+	_toggleMarkerHighlight: function () {
+		var icon = this._marker._icon;
+
+		// Don't do anything if this layer is a marker but doesn't have an icon. Markers
+		// should usually have icons. If using Leaflet.draw with Leaflet.markercluster there
+		// is a chance that a marker doesn't.
+		if (!icon) {
+			return;
+		}
+
+		// This is quite naughty, but I don't see another way of doing it. (short of setting a new icon)
+		icon.style.display = 'none';
+
+		if (L.DomUtil.hasClass(icon, 'leaflet-edit-marker-selected')) {
+			L.DomUtil.removeClass(icon, 'leaflet-edit-marker-selected');
+			// Offset as the border will make the icon move.
+			this._offsetMarker(icon, -4);
+
+		} else {
+			L.DomUtil.addClass(icon, 'leaflet-edit-marker-selected');
+			// Offset as the border will make the icon move.
+			this._offsetMarker(icon, 4);
+		}
+
+		icon.style.display = '';
+	},
+
+	_offsetMarker: function (icon, offset) {
+		var iconMarginTop = parseInt(icon.style.marginTop, 10) - offset,
+			iconMarginLeft = parseInt(icon.style.marginLeft, 10) - offset;
+
+		icon.style.marginTop = iconMarginTop + 'px';
+		icon.style.marginLeft = iconMarginLeft + 'px';
+	}
+});
+
+L.Marker.addInitHook(function () {
+	if (L.Edit.Marker) {
+		this.editing = new L.Edit.Marker(this);
+
+		if (this.options.editable) {
+			this.editing.enable();
+		}
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Edit.Marker.min.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+L.Edit=L.Edit||{};L.Edit.Marker=L.Handler.extend({initialize:function(a,b){this._marker=a;L.setOptions(this,b)},addHooks:function(){var a=this._marker;a.dragging.enable();a.on("dragend",this._onDragEnd,a);this._toggleMarkerHighlight()},removeHooks:function(){var a=this._marker;a.dragging.disable();a.off("dragend",this._onDragEnd,a);this._toggleMarkerHighlight()},_onDragEnd:function(b){var a=b.target;a.edited=true;this._map.fire(L.Draw.Event.EDITMOVE,{layer:a})},_toggleMarkerHighlight:function(){var a=this._marker._icon;if(!a){return}a.style.display="none";if(L.DomUtil.hasClass(a,"leaflet-edit-marker-selected")){L.DomUtil.removeClass(a,"leaflet-edit-marker-selected");this._offsetMarker(a,-4)}else{L.DomUtil.addClass(a,"leaflet-edit-marker-selected");this._offsetMarker(a,4)}a.style.display=""},_offsetMarker:function(b,d){var c=parseInt(b.style.marginTop,10)-d,a=parseInt(b.style.marginLeft,10)-d;b.style.marginTop=c+"px";b.style.marginLeft=a+"px"}});L.Marker.addInitHook(function(){if(L.Edit.Marker){this.editing=new L.Edit.Marker(this);if(this.options.editable){this.editing.enable()}}});
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Edit.Poly.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,490 @@
+L.Edit = L.Edit || {};
+
+/**
+ * @class L.Edit.Polyline
+ * @aka L.Edit.Poly
+ * @aka Edit.Poly
+ */
+L.Edit.Poly = L.Handler.extend({
+	options: {},
+
+	// @method initialize(): void
+	initialize: function (poly, options) {
+
+		this.latlngs = [poly._latlngs];
+		if (poly._holes) {
+			this.latlngs = this.latlngs.concat(poly._holes);
+		}
+
+		this._poly = poly;
+		L.setOptions(this, options);
+
+		this._poly.on('revert-edited', this._updateLatLngs, this);
+	},
+
+	// Compatibility method to normalize Poly* objects
+	// between 0.7.x and 1.0+
+	_defaultShape: function () {
+		if (!L.Polyline._flat) {
+			return this._poly._latlngs;
+		}
+		return L.Polyline._flat(this._poly._latlngs) ? this._poly._latlngs : this._poly._latlngs[0];
+	},
+
+	_eachVertexHandler: function (callback) {
+		for (var i = 0; i < this._verticesHandlers.length; i++) {
+			callback(this._verticesHandlers[i]);
+		}
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler
+	addHooks: function () {
+		this._initHandlers();
+		this._eachVertexHandler(function (handler) {
+			handler.addHooks();
+		});
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler
+	removeHooks: function () {
+		this._eachVertexHandler(function (handler) {
+			handler.removeHooks();
+		});
+	},
+
+	// @method updateMarkers(): void
+	// Fire an update for each vertex handler
+	updateMarkers: function () {
+		this._eachVertexHandler(function (handler) {
+			handler.updateMarkers();
+		});
+	},
+
+	_initHandlers: function () {
+		this._verticesHandlers = [];
+		for (var i = 0; i < this.latlngs.length; i++) {
+			this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(this._poly, this.latlngs[i], this.options));
+		}
+	},
+
+	_updateLatLngs: function (e) {
+		this.latlngs = [e.layer._latlngs];
+		if (e.layer._holes) {
+			this.latlngs = this.latlngs.concat(e.layer._holes);
+		}
+	}
+
+});
+
+/**
+ * @class L.Edit.PolyVerticesEdit
+ * @aka Edit.PolyVerticesEdit
+ */
+L.Edit.PolyVerticesEdit = L.Handler.extend({
+	options: {
+		icon: new L.DivIcon({
+			iconSize: new L.Point(8, 8),
+			className: 'leaflet-div-icon leaflet-editing-icon'
+		}),
+		touchIcon: new L.DivIcon({
+			iconSize: new L.Point(20, 20),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon'
+		}),
+		drawError: {
+			color: '#b00b00',
+			timeout: 1000
+		}
+
+
+	},
+
+	// @method intialize(): void
+	initialize: function (poly, latlngs, options) {
+		// if touch, switch to touch icon
+		if (L.Browser.touch) {
+			this.options.icon = this.options.touchIcon;
+		}
+		this._poly = poly;
+
+		if (options && options.drawError) {
+			options.drawError = L.Util.extend({}, this.options.drawError, options.drawError);
+		}
+
+		this._latlngs = latlngs;
+
+		L.setOptions(this, options);
+	},
+
+	// Compatibility method to normalize Poly* objects
+	// between 0.7.x and 1.0+
+	_defaultShape: function () {
+		if (!L.Polyline._flat) {
+			return this._latlngs;
+		}
+		return L.Polyline._flat(this._latlngs) ? this._latlngs : this._latlngs[0];
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler.
+	addHooks: function () {
+		var poly = this._poly;
+
+		if (!(poly instanceof L.Polygon)) {
+			poly.options.fill = false;
+			if (poly.options.editing) {
+				poly.options.editing.fill = false;
+			}
+		}
+
+		poly.setStyle(poly.options.editing);
+
+		if (this._poly._map) {
+
+			this._map = this._poly._map; // Set map
+
+			if (!this._markerGroup) {
+				this._initMarkers();
+			}
+			this._poly._map.addLayer(this._markerGroup);
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler.
+	removeHooks: function () {
+		var poly = this._poly;
+
+		poly.setStyle(poly.options.original);
+
+		if (poly._map) {
+			poly._map.removeLayer(this._markerGroup);
+			delete this._markerGroup;
+			delete this._markers;
+		}
+	},
+
+	// @method updateMarkers(): void
+	// Clear markers and update their location
+	updateMarkers: function () {
+		this._markerGroup.clearLayers();
+		this._initMarkers();
+	},
+
+	_initMarkers: function () {
+		if (!this._markerGroup) {
+			this._markerGroup = new L.LayerGroup();
+		}
+		this._markers = [];
+
+		var latlngs = this._defaultShape(),
+			i, j, len, marker;
+
+		for (i = 0, len = latlngs.length; i < len; i++) {
+
+			marker = this._createMarker(latlngs[i], i);
+			marker.on('click', this._onMarkerClick, this);
+			this._markers.push(marker);
+		}
+
+		var markerLeft, markerRight;
+
+		for (i = 0, j = len - 1; i < len; j = i++) {
+			if (i === 0 && !(L.Polygon && (this._poly instanceof L.Polygon))) {
+				continue;
+			}
+
+			markerLeft = this._markers[j];
+			markerRight = this._markers[i];
+
+			this._createMiddleMarker(markerLeft, markerRight);
+			this._updatePrevNext(markerLeft, markerRight);
+		}
+	},
+
+	_createMarker: function (latlng, index) {
+		// Extending L.Marker in TouchEvents.js to include touch.
+		var marker = new L.Marker.Touch(latlng, {
+			draggable: true,
+			icon: this.options.icon,
+		});
+
+		marker._origLatLng = latlng;
+		marker._index = index;
+
+		marker
+			.on('dragstart', this._onMarkerDragStart, this)
+			.on('drag', this._onMarkerDrag, this)
+			.on('dragend', this._fireEdit, this)
+			.on('touchmove', this._onTouchMove, this)
+			.on('touchend', this._fireEdit, this)
+			.on('MSPointerMove', this._onTouchMove, this)
+			.on('MSPointerUp', this._fireEdit, this);
+
+		this._markerGroup.addLayer(marker);
+
+		return marker;
+	},
+
+	_onMarkerDragStart: function () {
+		this._poly.fire('editstart');
+	},
+
+	_spliceLatLngs: function () {
+		var latlngs = this._defaultShape();
+		var removed = [].splice.apply(latlngs, arguments);
+		this._poly._convertLatLngs(latlngs, true);
+		this._poly.redraw();
+		return removed;
+	},
+
+	_removeMarker: function (marker) {
+		var i = marker._index;
+
+		this._markerGroup.removeLayer(marker);
+		this._markers.splice(i, 1);
+		this._spliceLatLngs(i, 1);
+		this._updateIndexes(i, -1);
+
+		marker
+			.off('dragstart', this._onMarkerDragStart, this)
+			.off('drag', this._onMarkerDrag, this)
+			.off('dragend', this._fireEdit, this)
+			.off('touchmove', this._onMarkerDrag, this)
+			.off('touchend', this._fireEdit, this)
+			.off('click', this._onMarkerClick, this)
+			.off('MSPointerMove', this._onTouchMove, this)
+			.off('MSPointerUp', this._fireEdit, this);
+	},
+
+	_fireEdit: function () {
+		this._poly.edited = true;
+		this._poly.fire('edit');
+		this._poly._map.fire(L.Draw.Event.EDITVERTEX, { layers: this._markerGroup, poly: this._poly });
+	},
+
+	_onMarkerDrag: function (e) {
+		var marker = e.target;
+		var poly = this._poly;
+
+		L.extend(marker._origLatLng, marker._latlng);
+
+		if (marker._middleLeft) {
+			marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
+		}
+		if (marker._middleRight) {
+			marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
+		}
+
+		if (poly.options.poly) {
+			var tooltip = poly._map._editTooltip; // Access the tooltip
+
+			// If we don't allow intersections and the polygon intersects
+			if (!poly.options.poly.allowIntersection && poly.intersects()) {
+
+				var originalColor = poly.options.color;
+				poly.setStyle({ color: this.options.drawError.color });
+
+				// Manually trigger 'dragend' behavior on marker we are about to remove
+				// WORKAROUND: introduced in 1.0.0-rc2, may be related to #4484
+				if (L.version.indexOf('0.7') !== 0) {
+					marker.dragging._draggable._onUp(e);
+				}
+				this._onMarkerClick(e); // Remove violating marker
+				// FIXME: Reset the marker to it's original position (instead of remove)
+
+				if (tooltip) {
+					tooltip.updateContent({
+						text: L.drawLocal.draw.handlers.polyline.error
+					});
+				}
+
+				// Reset everything back to normal after a second
+				setTimeout(function () {
+					poly.setStyle({ color: originalColor });
+					if (tooltip) {
+						tooltip.updateContent({
+							text: L.drawLocal.edit.handlers.edit.tooltip.text,
+							subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
+						});
+					}
+				}, 1000);
+			}
+		}
+
+		this._poly.redraw();
+		this._poly.fire('editdrag');
+	},
+
+	_onMarkerClick: function (e) {
+
+		var minPoints = L.Polygon && (this._poly instanceof L.Polygon) ? 4 : 3,
+			marker = e.target;
+
+		// If removing this point would create an invalid polyline/polygon don't remove
+		if (this._defaultShape().length < minPoints) {
+			return;
+		}
+
+		// remove the marker
+		this._removeMarker(marker);
+
+		// update prev/next links of adjacent markers
+		this._updatePrevNext(marker._prev, marker._next);
+
+		// remove ghost markers near the removed marker
+		if (marker._middleLeft) {
+			this._markerGroup.removeLayer(marker._middleLeft);
+		}
+		if (marker._middleRight) {
+			this._markerGroup.removeLayer(marker._middleRight);
+		}
+
+		// create a ghost marker in place of the removed one
+		if (marker._prev && marker._next) {
+			this._createMiddleMarker(marker._prev, marker._next);
+
+		} else if (!marker._prev) {
+			marker._next._middleLeft = null;
+
+		} else if (!marker._next) {
+			marker._prev._middleRight = null;
+		}
+
+		this._fireEdit();
+	},
+
+	_onTouchMove: function (e) {
+
+		var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]),
+			latlng = this._map.layerPointToLatLng(layerPoint),
+			marker = e.target;
+
+		L.extend(marker._origLatLng, latlng);
+
+		if (marker._middleLeft) {
+			marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
+		}
+		if (marker._middleRight) {
+			marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
+		}
+
+		this._poly.redraw();
+		this.updateMarkers();
+	},
+
+	_updateIndexes: function (index, delta) {
+		this._markerGroup.eachLayer(function (marker) {
+			if (marker._index > index) {
+				marker._index += delta;
+			}
+		});
+	},
+
+	_createMiddleMarker: function (marker1, marker2) {
+		var latlng = this._getMiddleLatLng(marker1, marker2),
+			marker = this._createMarker(latlng),
+			onClick,
+			onDragStart,
+			onDragEnd;
+
+		marker.setOpacity(0.6);
+
+		marker1._middleRight = marker2._middleLeft = marker;
+
+		onDragStart = function () {
+			marker.off('touchmove', onDragStart, this);
+			var i = marker2._index;
+
+			marker._index = i;
+
+			marker
+				.off('click', onClick, this)
+				.on('click', this._onMarkerClick, this);
+
+			latlng.lat = marker.getLatLng().lat;
+			latlng.lng = marker.getLatLng().lng;
+			this._spliceLatLngs(i, 0, latlng);
+			this._markers.splice(i, 0, marker);
+
+			marker.setOpacity(1);
+
+			this._updateIndexes(i, 1);
+			marker2._index++;
+			this._updatePrevNext(marker1, marker);
+			this._updatePrevNext(marker, marker2);
+
+			this._poly.fire('editstart');
+		};
+
+		onDragEnd = function () {
+			marker.off('dragstart', onDragStart, this);
+			marker.off('dragend', onDragEnd, this);
+			marker.off('touchmove', onDragStart, this);
+
+			this._createMiddleMarker(marker1, marker);
+			this._createMiddleMarker(marker, marker2);
+		};
+
+		onClick = function () {
+			onDragStart.call(this);
+			onDragEnd.call(this);
+			this._fireEdit();
+		};
+
+		marker
+			.on('click', onClick, this)
+			.on('dragstart', onDragStart, this)
+			.on('dragend', onDragEnd, this)
+			.on('touchmove', onDragStart, this);
+
+		this._markerGroup.addLayer(marker);
+	},
+
+	_updatePrevNext: function (marker1, marker2) {
+		if (marker1) {
+			marker1._next = marker2;
+		}
+		if (marker2) {
+			marker2._prev = marker1;
+		}
+	},
+
+	_getMiddleLatLng: function (marker1, marker2) {
+		var map = this._poly._map,
+			p1 = map.project(marker1.getLatLng()),
+			p2 = map.project(marker2.getLatLng());
+
+		return map.unproject(p1._add(p2)._divideBy(2));
+	}
+});
+
+L.Polyline.addInitHook(function () {
+
+	// Check to see if handler has already been initialized. This is to support versions of Leaflet that still have L.Handler.PolyEdit
+	if (this.editing) {
+		return;
+	}
+
+	if (L.Edit.Poly) {
+
+		this.editing = new L.Edit.Poly(this, this.options.poly);
+
+		if (this.options.editable) {
+			this.editing.enable();
+		}
+	}
+
+	this.on('add', function () {
+		if (this.editing && this.editing.enabled()) {
+			this.editing.addHooks();
+		}
+	});
+
+	this.on('remove', function () {
+		if (this.editing && this.editing.enabled()) {
+			this.editing.removeHooks();
+		}
+	});
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Edit.Poly.min.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+L.Edit=L.Edit||{};L.Edit.Poly=L.Handler.extend({options:{},initialize:function(b,a){this.latlngs=[b._latlngs];if(b._holes){this.latlngs=this.latlngs.concat(b._holes)}this._poly=b;L.setOptions(this,a);this._poly.on("revert-edited",this._updateLatLngs,this)},_defaultShape:function(){if(!L.Polyline._flat){return this._poly._latlngs}return L.Polyline._flat(this._poly._latlngs)?this._poly._latlngs:this._poly._latlngs[0]},_eachVertexHandler:function(b){for(var a=0;a<this._verticesHandlers.length;a++){b(this._verticesHandlers[a])}},addHooks:function(){this._initHandlers();this._eachVertexHandler(function(a){a.addHooks()})},removeHooks:function(){this._eachVertexHandler(function(a){a.removeHooks()})},updateMarkers:function(){this._eachVertexHandler(function(a){a.updateMarkers()})},_initHandlers:function(){this._verticesHandlers=[];for(var a=0;a<this.latlngs.length;a++){this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(this._poly,this.latlngs[a],this.options))}},_updateLatLngs:function(a){this.latlngs=[a.layer._latlngs];if(a.layer._holes){this.latlngs=this.latlngs.concat(a.layer._holes)}}});L.Edit.PolyVerticesEdit=L.Handler.extend({options:{icon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"}),touchIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-touch-icon"}),drawError:{color:"#b00b00",timeout:1000}},initialize:function(c,a,b){if(L.Browser.touch){this.options.icon=this.options.touchIcon}this._poly=c;if(b&&b.drawError){b.drawError=L.Util.extend({},this.options.drawError,b.drawError)}this._latlngs=a;L.setOptions(this,b)},_defaultShape:function(){if(!L.Polyline._flat){return this._latlngs}return L.Polyline._flat(this._latlngs)?this._latlngs:this._latlngs[0]},addHooks:function(){var a=this._poly;if(!(a instanceof L.Polygon)){a.options.fill=false;if(a.options.editing){a.options.editing.fill=false}}a.setStyle(a.options.editing);if(this._poly._map){this._map=this._poly._map;if(!this._markerGroup){this._initMarkers()}this._poly._map.addLayer(this._markerGroup)}},removeHooks:function(){var a=this._poly;a.setStyle(a.options.original);if(a._map){a._map.removeLayer(this._markerGroup);delete this._markerGroup;delete this._markers}},updateMarkers:function(){this._markerGroup.clearLayers();this._initMarkers()},_initMarkers:function(){if(!this._markerGroup){this._markerGroup=new L.LayerGroup()}this._markers=[];var b=this._defaultShape(),g,f,a,c;for(g=0,a=b.length;g<a;g++){c=this._createMarker(b[g],g);c.on("click",this._onMarkerClick,this);this._markers.push(c)}var e,d;for(g=0,f=a-1;g<a;f=g++){if(g===0&&!(L.Polygon&&(this._poly instanceof L.Polygon))){continue}e=this._markers[f];d=this._markers[g];this._createMiddleMarker(e,d);this._updatePrevNext(e,d)}},_createMarker:function(c,b){var a=new L.Marker.Touch(c,{draggable:true,icon:this.options.icon,});a._origLatLng=c;a._index=b;a.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._fireEdit,this).on("touchmove",this._onTouchMove,this).on("touchend",this._fireEdit,this).on("MSPointerMove",this._onTouchMove,this).on("MSPointerUp",this._fireEdit,this);this._markerGroup.addLayer(a);return a},_onMarkerDragStart:function(){this._poly.fire("editstart")},_spliceLatLngs:function(){var a=this._defaultShape();var b=[].splice.apply(a,arguments);this._poly._convertLatLngs(a,true);this._poly.redraw();return b},_removeMarker:function(a){var b=a._index;this._markerGroup.removeLayer(a);this._markers.splice(b,1);this._spliceLatLngs(b,1);this._updateIndexes(b,-1);a.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._fireEdit,this).off("touchmove",this._onMarkerDrag,this).off("touchend",this._fireEdit,this).off("click",this._onMarkerClick,this).off("MSPointerMove",this._onTouchMove,this).off("MSPointerUp",this._fireEdit,this)},_fireEdit:function(){this._poly.edited=true;this._poly.fire("edit");this._poly._map.fire(L.Draw.Event.EDITVERTEX,{layers:this._markerGroup,poly:this._poly})},_onMarkerDrag:function(f){var a=f.target;var d=this._poly;L.extend(a._origLatLng,a._latlng);if(a._middleLeft){a._middleLeft.setLatLng(this._getMiddleLatLng(a._prev,a))}if(a._middleRight){a._middleRight.setLatLng(this._getMiddleLatLng(a,a._next))}if(d.options.poly){var c=d._map._editTooltip;if(!d.options.poly.allowIntersection&&d.intersects()){var b=d.options.color;d.setStyle({color:this.options.drawError.color});if(L.version.indexOf("0.7")!==0){a.dragging._draggable._onUp(f)}this._onMarkerClick(f);if(c){c.updateContent({text:L.drawLocal.draw.handlers.polyline.error})}setTimeout(function(){d.setStyle({color:b});if(c){c.updateContent({text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext})}},1000)}}this._poly.redraw();this._poly.fire("editdrag")},_onMarkerClick:function(c){var b=L.Polygon&&(this._poly instanceof L.Polygon)?4:3,a=c.target;if(this._defaultShape().length<b){return}this._removeMarker(a);this._updatePrevNext(a._prev,a._next);if(a._middleLeft){this._markerGroup.removeLayer(a._middleLeft)}if(a._middleRight){this._markerGroup.removeLayer(a._middleRight)}if(a._prev&&a._next){this._createMiddleMarker(a._prev,a._next)}else{if(!a._prev){a._next._middleLeft=null}else{if(!a._next){a._prev._middleRight=null}}}this._fireEdit()},_onTouchMove:function(c){var b=this._map.mouseEventToLayerPoint(c.originalEvent.touches[0]),d=this._map.layerPointToLatLng(b),a=c.target;L.extend(a._origLatLng,d);if(a._middleLeft){a._middleLeft.setLatLng(this._getMiddleLatLng(a._prev,a))}if(a._middleRight){a._middleRight.setLatLng(this._getMiddleLatLng(a,a._next))}this._poly.redraw();this.updateMarkers()},_updateIndexes:function(a,b){this._markerGroup.eachLayer(function(c){if(c._index>a){c._index+=b}})},_createMiddleMarker:function(f,d){var g=this._getMiddleLatLng(f,d),a=this._createMarker(g),e,c,b;a.setOpacity(0.6);f._middleRight=d._middleLeft=a;c=function(){a.off("touchmove",c,this);var h=d._index;a._index=h;a.off("click",e,this).on("click",this._onMarkerClick,this);g.lat=a.getLatLng().lat;g.lng=a.getLatLng().lng;this._spliceLatLngs(h,0,g);this._markers.splice(h,0,a);a.setOpacity(1);this._updateIndexes(h,1);d._index++;this._updatePrevNext(f,a);this._updatePrevNext(a,d);this._poly.fire("editstart")};b=function(){a.off("dragstart",c,this);a.off("dragend",b,this);a.off("touchmove",c,this);this._createMiddleMarker(f,a);this._createMiddleMarker(a,d)};e=function(){c.call(this);b.call(this);this._fireEdit()};a.on("click",e,this).on("dragstart",c,this).on("dragend",b,this).on("touchmove",c,this);this._markerGroup.addLayer(a)},_updatePrevNext:function(b,a){if(b){b._next=a}if(a){a._prev=b}},_getMiddleLatLng:function(e,c){var b=this._poly._map,d=b.project(e.getLatLng()),a=b.project(c.getLatLng());return b.unproject(d._add(a)._divideBy(2))}});L.Polyline.addInitHook(function(){if(this.editing){return}if(L.Edit.Poly){this.editing=new L.Edit.Poly(this,this.options.poly);if(this.options.editable){this.editing.enable()}}this.on("add",function(){if(this.editing&&this.editing.enabled()){this.editing.addHooks()}});this.on("remove",function(){if(this.editing&&this.editing.enabled()){this.editing.removeHooks()}})});
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Edit.Rectangle.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,125 @@
+L.Edit = L.Edit || {};
+/**
+ * @class L.Edit.Rectangle
+ * @aka Edit.Rectangle
+ * @inherits L.Edit.SimpleShape
+ */
+L.Edit.Rectangle = L.Edit.SimpleShape.extend({
+	_createMoveMarker: function () {
+		var bounds = this._shape.getBounds(),
+			center = bounds.getCenter();
+
+		this._moveMarker = this._createMarker(center, this.options.moveIcon);
+	},
+
+	_createResizeMarker: function () {
+		var corners = this._getCorners();
+
+		this._resizeMarkers = [];
+
+		for (var i = 0, l = corners.length; i < l; i++) {
+			this._resizeMarkers.push(this._createMarker(corners[i], this.options.resizeIcon));
+			// Monkey in the corner index as we will need to know this for dragging
+			this._resizeMarkers[i]._cornerIndex = i;
+		}
+	},
+
+	_onMarkerDragStart: function (e) {
+		L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e);
+
+		// Save a reference to the opposite point
+		var corners = this._getCorners(),
+			marker = e.target,
+			currentCornerIndex = marker._cornerIndex;
+
+		this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];
+
+		this._toggleCornerMarkers(0, currentCornerIndex);
+	},
+
+	_onMarkerDragEnd: function (e) {
+		var marker = e.target,
+			bounds, center;
+
+		// Reset move marker position to the center
+		if (marker === this._moveMarker) {
+			bounds = this._shape.getBounds();
+			center = bounds.getCenter();
+
+			marker.setLatLng(center);
+		}
+
+		this._toggleCornerMarkers(1);
+
+		this._repositionCornerMarkers();
+
+		L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this, e);
+	},
+
+	_move: function (newCenter) {
+		var latlngs = this._shape._defaultShape ? this._shape._defaultShape() : this._shape.getLatLngs(),
+			bounds = this._shape.getBounds(),
+			center = bounds.getCenter(),
+			offset, newLatLngs = [];
+
+		// Offset the latlngs to the new center
+		for (var i = 0, l = latlngs.length; i < l; i++) {
+			offset = [latlngs[i].lat - center.lat, latlngs[i].lng - center.lng];
+			newLatLngs.push([newCenter.lat + offset[0], newCenter.lng + offset[1]]);
+		}
+
+		this._shape.setLatLngs(newLatLngs);
+
+		// Reposition the resize markers
+		this._repositionCornerMarkers();
+
+		this._map.fire(L.Draw.Event.EDITMOVE, { layer: this._shape });
+	},
+
+	_resize: function (latlng) {
+		var bounds;
+
+		// Update the shape based on the current position of this corner and the opposite point
+		this._shape.setBounds(L.latLngBounds(latlng, this._oppositeCorner));
+
+		// Reposition the move marker
+		bounds = this._shape.getBounds();
+		this._moveMarker.setLatLng(bounds.getCenter());
+
+		this._map.fire(L.Draw.Event.EDITRESIZE, { layer: this._shape });
+	},
+
+	_getCorners: function () {
+		var bounds = this._shape.getBounds(),
+			nw = bounds.getNorthWest(),
+			ne = bounds.getNorthEast(),
+			se = bounds.getSouthEast(),
+			sw = bounds.getSouthWest();
+
+		return [nw, ne, se, sw];
+	},
+
+	_toggleCornerMarkers: function (opacity) {
+		for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
+			this._resizeMarkers[i].setOpacity(opacity);
+		}
+	},
+
+	_repositionCornerMarkers: function () {
+		var corners = this._getCorners();
+
+		for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
+			this._resizeMarkers[i].setLatLng(corners[i]);
+		}
+	}
+});
+
+L.Rectangle.addInitHook(function () {
+	if (L.Edit.Rectangle) {
+		this.editing = new L.Edit.Rectangle(this);
+
+		if (this.options.editable) {
+			this.editing.enable();
+		}
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Edit.Rectangle.min.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+L.Edit=L.Edit||{};L.Edit.Rectangle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var b=this._shape.getBounds(),a=b.getCenter();this._moveMarker=this._createMarker(a,this.options.moveIcon)},_createResizeMarker:function(){var b=this._getCorners();this._resizeMarkers=[];for(var c=0,a=b.length;c<a;c++){this._resizeMarkers.push(this._createMarker(b[c],this.options.resizeIcon));this._resizeMarkers[c]._cornerIndex=c}},_onMarkerDragStart:function(d){L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,d);var b=this._getCorners(),a=d.target,c=a._cornerIndex;this._oppositeCorner=b[(c+2)%4];this._toggleCornerMarkers(0,c)},_onMarkerDragEnd:function(d){var b=d.target,c,a;if(b===this._moveMarker){c=this._shape.getBounds();a=c.getCenter();b.setLatLng(a)}this._toggleCornerMarkers(1);this._repositionCornerMarkers();L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this,d)},_move:function(d){var b=this._shape._defaultShape?this._shape._defaultShape():this._shape.getLatLngs(),g=this._shape.getBounds(),a=g.getCenter(),h,f=[];for(var e=0,c=b.length;e<c;e++){h=[b[e].lat-a.lat,b[e].lng-a.lng];f.push([d.lat+h[0],d.lng+h[1]])}this._shape.setLatLngs(f);this._repositionCornerMarkers();this._map.fire(L.Draw.Event.EDITMOVE,{layer:this._shape})},_resize:function(b){var a;this._shape.setBounds(L.latLngBounds(b,this._oppositeCorner));a=this._shape.getBounds();this._moveMarker.setLatLng(a.getCenter());this._map.fire(L.Draw.Event.EDITRESIZE,{layer:this._shape})},_getCorners:function(){var c=this._shape.getBounds(),b=c.getNorthWest(),e=c.getNorthEast(),d=c.getSouthEast(),a=c.getSouthWest();return[b,e,d,a]},_toggleCornerMarkers:function(b){for(var c=0,a=this._resizeMarkers.length;c<a;c++){this._resizeMarkers[c].setOpacity(b)}},_repositionCornerMarkers:function(){var b=this._getCorners();for(var c=0,a=this._resizeMarkers.length;c<a;c++){this._resizeMarkers[c].setLatLng(b[c])}}});L.Rectangle.addInitHook(function(){if(L.Edit.Rectangle){this.editing=new L.Edit.Rectangle(this);if(this.options.editable){this.editing.enable()}}});
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Edit.SimpleShape.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,229 @@
+L.Edit = L.Edit || {};
+/**
+ * @class L.Edit.SimpleShape
+ * @aka Edit.SimpleShape
+ */
+L.Edit.SimpleShape = L.Handler.extend({
+	options: {
+		moveIcon: new L.DivIcon({
+			iconSize: new L.Point(8, 8),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move'
+		}),
+		resizeIcon: new L.DivIcon({
+			iconSize: new L.Point(8, 8),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize'
+		}),
+		touchMoveIcon: new L.DivIcon({
+			iconSize: new L.Point(20, 20),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon'
+		}),
+		touchResizeIcon: new L.DivIcon({
+			iconSize: new L.Point(20, 20),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon'
+		}),
+	},
+
+	// @method intialize(): void
+	initialize: function (shape, options) {
+		// if touch, switch to touch icon
+		if (L.Browser.touch) {
+			this.options.moveIcon = this.options.touchMoveIcon;
+			this.options.resizeIcon = this.options.touchResizeIcon;
+		}
+
+		this._shape = shape;
+		L.Util.setOptions(this, options);
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler
+	addHooks: function () {
+		var shape = this._shape;
+		if (this._shape._map) {
+			this._map = this._shape._map;
+			shape.setStyle(shape.options.editing);
+
+			if (shape._map) {
+				this._map = shape._map;
+				if (!this._markerGroup) {
+					this._initMarkers();
+				}
+				this._map.addLayer(this._markerGroup);
+			}
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler
+	removeHooks: function () {
+		var shape = this._shape;
+
+		shape.setStyle(shape.options.original);
+
+		if (shape._map) {
+			this._unbindMarker(this._moveMarker);
+
+			for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
+				this._unbindMarker(this._resizeMarkers[i]);
+			}
+			this._resizeMarkers = null;
+
+			this._map.removeLayer(this._markerGroup);
+			delete this._markerGroup;
+		}
+
+		this._map = null;
+	},
+
+	// @method updateMarkers(): void
+	// Remove the edit markers from this layer
+	updateMarkers: function () {
+		this._markerGroup.clearLayers();
+		this._initMarkers();
+	},
+
+	_initMarkers: function () {
+		if (!this._markerGroup) {
+			this._markerGroup = new L.LayerGroup();
+		}
+
+		// Create center marker
+		this._createMoveMarker();
+
+		// Create edge marker
+		this._createResizeMarker();
+	},
+
+	_createMoveMarker: function () {
+		// Children override
+	},
+
+	_createResizeMarker: function () {
+		// Children override
+	},
+
+	_createMarker: function (latlng, icon) {
+		// Extending L.Marker in TouchEvents.js to include touch.
+		var marker = new L.Marker.Touch(latlng, {
+			draggable: true,
+			icon: icon,
+			zIndexOffset: 10
+		});
+
+		this._bindMarker(marker);
+
+		this._markerGroup.addLayer(marker);
+
+		return marker;
+	},
+
+	_bindMarker: function (marker) {
+		marker
+			.on('dragstart', this._onMarkerDragStart, this)
+			.on('drag', this._onMarkerDrag, this)
+			.on('dragend', this._onMarkerDragEnd, this)
+			.on('touchstart', this._onTouchStart, this)
+			.on('touchmove', this._onTouchMove, this)
+			.on('MSPointerMove', this._onTouchMove, this)
+			.on('touchend', this._onTouchEnd, this)
+			.on('MSPointerUp', this._onTouchEnd, this);
+	},
+
+	_unbindMarker: function (marker) {
+		marker
+			.off('dragstart', this._onMarkerDragStart, this)
+			.off('drag', this._onMarkerDrag, this)
+			.off('dragend', this._onMarkerDragEnd, this)
+			.off('touchstart', this._onTouchStart, this)
+			.off('touchmove', this._onTouchMove, this)
+			.off('MSPointerMove', this._onTouchMove, this)
+			.off('touchend', this._onTouchEnd, this)
+			.off('MSPointerUp', this._onTouchEnd, this);
+	},
+
+	_onMarkerDragStart: function (e) {
+		var marker = e.target;
+		marker.setOpacity(0);
+
+		this._shape.fire('editstart');
+	},
+
+	_fireEdit: function () {
+		this._shape.edited = true;
+		this._shape.fire('edit');
+	},
+
+	_onMarkerDrag: function (e) {
+		var marker = e.target,
+			latlng = marker.getLatLng();
+
+		if (marker === this._moveMarker) {
+			this._move(latlng);
+		} else {
+			this._resize(latlng);
+		}
+
+		this._shape.redraw();
+		this._shape.fire('editdrag');
+	},
+
+	_onMarkerDragEnd: function (e) {
+		var marker = e.target;
+		marker.setOpacity(1);
+
+		this._fireEdit();
+	},
+
+	_onTouchStart: function (e) {
+		L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e);
+
+		if (typeof(this._getCorners) === 'function') {
+			// Save a reference to the opposite point
+			var corners = this._getCorners(),
+				marker = e.target,
+				currentCornerIndex = marker._cornerIndex;
+
+			marker.setOpacity(0);
+
+			// Copyed from Edit.Rectangle.js line 23 _onMarkerDragStart()
+			// Latlng is null otherwise.
+			this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];
+			this._toggleCornerMarkers(0, currentCornerIndex);
+		}
+
+		this._shape.fire('editstart');
+	},
+
+	_onTouchMove: function (e) {
+		var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]),
+			latlng = this._map.layerPointToLatLng(layerPoint),
+			marker = e.target;
+
+		if (marker === this._moveMarker) {
+			this._move(latlng);
+		} else {
+			this._resize(latlng);
+		}
+
+		this._shape.redraw();
+
+		// prevent touchcancel in IOS
+		// e.preventDefault();
+		return false;
+	},
+
+	_onTouchEnd: function (e) {
+		var marker = e.target;
+		marker.setOpacity(1);
+		this.updateMarkers();
+		this._fireEdit();
+	},
+
+	_move: function () {
+		// Children override
+	},
+
+	_resize: function () {
+		// Children override
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Edit.SimpleShape.min.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+L.Edit=L.Edit||{};L.Edit.SimpleShape=L.Handler.extend({options:{moveIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move"}),resizeIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize"}),touchMoveIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon"}),touchResizeIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon"}),},initialize:function(a,b){if(L.Browser.touch){this.options.moveIcon=this.options.touchMoveIcon;this.options.resizeIcon=this.options.touchResizeIcon}this._shape=a;L.Util.setOptions(this,b)},addHooks:function(){var a=this._shape;if(this._shape._map){this._map=this._shape._map;a.setStyle(a.options.editing);if(a._map){this._map=a._map;if(!this._markerGroup){this._initMarkers()}this._map.addLayer(this._markerGroup)}}},removeHooks:function(){var b=this._shape;b.setStyle(b.options.original);if(b._map){this._unbindMarker(this._moveMarker);for(var c=0,a=this._resizeMarkers.length;c<a;c++){this._unbindMarker(this._resizeMarkers[c])}this._resizeMarkers=null;this._map.removeLayer(this._markerGroup);delete this._markerGroup}this._map=null},updateMarkers:function(){this._markerGroup.clearLayers();this._initMarkers()},_initMarkers:function(){if(!this._markerGroup){this._markerGroup=new L.LayerGroup()}this._createMoveMarker();this._createResizeMarker()},_createMoveMarker:function(){},_createResizeMarker:function(){},_createMarker:function(c,b){var a=new L.Marker.Touch(c,{draggable:true,icon:b,zIndexOffset:10});this._bindMarker(a);this._markerGroup.addLayer(a);return a},_bindMarker:function(a){a.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._onMarkerDragEnd,this).on("touchstart",this._onTouchStart,this).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onTouchEnd,this).on("MSPointerUp",this._onTouchEnd,this)},_unbindMarker:function(a){a.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._onMarkerDragEnd,this).off("touchstart",this._onTouchStart,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onTouchEnd,this).off("MSPointerUp",this._onTouchEnd,this)},_onMarkerDragStart:function(b){var a=b.target;a.setOpacity(0);this._shape.fire("editstart")},_fireEdit:function(){this._shape.edited=true;this._shape.fire("edit")},_onMarkerDrag:function(b){var a=b.target,c=a.getLatLng();if(a===this._moveMarker){this._move(c)}else{this._resize(c)}this._shape.redraw();this._shape.fire("editdrag")},_onMarkerDragEnd:function(b){var a=b.target;a.setOpacity(1);this._fireEdit()},_onTouchStart:function(d){L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,d);if(typeof(this._getCorners)==="function"){var b=this._getCorners(),a=d.target,c=a._cornerIndex;a.setOpacity(0);this._oppositeCorner=b[(c+2)%4];this._toggleCornerMarkers(0,c)}this._shape.fire("editstart")},_onTouchMove:function(c){var b=this._map.mouseEventToLayerPoint(c.originalEvent.touches[0]),d=this._map.layerPointToLatLng(b),a=c.target;if(a===this._moveMarker){this._move(d)}else{this._resize(d)}this._shape.redraw();return false},_onTouchEnd:function(b){var a=b.target;a.setOpacity(1);this.updateMarkers();this._fireEdit()},_move:function(){},_resize:function(){}});
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/TouchEvents.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,272 @@
+L.Map.mergeOptions({
+	touchExtend: true
+});
+
+/**
+ * @class L.Map.TouchExtend
+ * @aka TouchExtend
+ */
+L.Map.TouchExtend = L.Handler.extend({
+
+	// @method initialize(): void
+	// Sets TouchExtend private accessor variables
+	initialize: function (map) {
+		this._map = map;
+		this._container = map._container;
+		this._pane = map._panes.overlayPane;
+	},
+
+	// @method addHooks(): void
+	// Adds dom listener events to the map container
+	addHooks: function () {
+		L.DomEvent.on(this._container, 'touchstart', this._onTouchStart, this);
+		L.DomEvent.on(this._container, 'touchend', this._onTouchEnd, this);
+		L.DomEvent.on(this._container, 'touchmove', this._onTouchMove, this);
+		if (this._detectIE()) {
+			L.DomEvent.on(this._container, 'MSPointerDown', this._onTouchStart, this);
+			L.DomEvent.on(this._container, 'MSPointerUp', this._onTouchEnd, this);
+			L.DomEvent.on(this._container, 'MSPointerMove', this._onTouchMove, this);
+			L.DomEvent.on(this._container, 'MSPointerCancel', this._onTouchCancel, this);
+
+		} else {
+			L.DomEvent.on(this._container, 'touchcancel', this._onTouchCancel, this);
+			L.DomEvent.on(this._container, 'touchleave', this._onTouchLeave, this);
+		}
+	},
+
+	// @method removeHooks(): void
+	// Removes dom listener events from the map container
+	removeHooks: function () {
+		L.DomEvent.off(this._container, 'touchstart', this._onTouchStart);
+		L.DomEvent.off(this._container, 'touchend', this._onTouchEnd);
+		L.DomEvent.off(this._container, 'touchmove', this._onTouchMove);
+		if (this._detectIE()) {
+			L.DomEvent.off(this._container, 'MSPointerDowm', this._onTouchStart);
+			L.DomEvent.off(this._container, 'MSPointerUp', this._onTouchEnd);
+			L.DomEvent.off(this._container, 'MSPointerMove', this._onTouchMove);
+			L.DomEvent.off(this._container, 'MSPointerCancel', this._onTouchCancel);
+		} else {
+			L.DomEvent.off(this._container, 'touchcancel', this._onTouchCancel);
+			L.DomEvent.off(this._container, 'touchleave', this._onTouchLeave);
+		}
+	},
+
+	_touchEvent: function (e, type) {
+		// #TODO: fix the pageX error that is do a bug in Android where a single touch triggers two click events
+		// _filterClick is what leaflet uses as a workaround.
+		// This is a problem with more things than just android. Another problem is touchEnd has no touches in
+		// its touch list.
+		var touchEvent = {};
+		if (typeof e.touches !== 'undefined') {
+			if (!e.touches.length) {
+				return;
+			}
+			touchEvent = e.touches[0];
+		} else if (e.pointerType === 'touch') {
+			touchEvent = e;
+			if (!this._filterClick(e)) {
+				return;
+			}
+		} else {
+			return;
+		}
+
+		var containerPoint = this._map.mouseEventToContainerPoint(touchEvent),
+			layerPoint = this._map.mouseEventToLayerPoint(touchEvent),
+			latlng = this._map.layerPointToLatLng(layerPoint);
+
+		this._map.fire(type, {
+			latlng: latlng,
+			layerPoint: layerPoint,
+			containerPoint: containerPoint,
+			pageX: touchEvent.pageX,
+			pageY: touchEvent.pageY,
+			originalEvent: e
+		});
+	},
+
+	/** Borrowed from Leaflet and modified for bool ops **/
+	_filterClick: function (e) {
+		var timeStamp = (e.timeStamp || e.originalEvent.timeStamp),
+			elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);
+
+		// are they closer together than 500ms yet more than 100ms?
+		// Android typically triggers them ~300ms apart while multiple listeners
+		// on the same event should be triggered far faster;
+		// or check if click is simulated on the element, and if it is, reject any non-simulated events
+		if ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) {
+			L.DomEvent.stop(e);
+			return false;
+		}
+		L.DomEvent._lastClick = timeStamp;
+		return true;
+	},
+
+	_onTouchStart: function (e) {
+		if (!this._map._loaded) {
+			return;
+		}
+
+		var type = 'touchstart';
+		this._touchEvent(e, type);
+
+	},
+
+	_onTouchEnd: function (e) {
+		if (!this._map._loaded) {
+			return;
+		}
+
+		var type = 'touchend';
+		this._touchEvent(e, type);
+	},
+
+	_onTouchCancel: function (e) {
+		if (!this._map._loaded) {
+			return;
+		}
+
+		var type = 'touchcancel';
+		if (this._detectIE()) {
+			type = 'pointercancel';
+		}
+		this._touchEvent(e, type);
+	},
+
+	_onTouchLeave: function (e) {
+		if (!this._map._loaded) {
+			return;
+		}
+
+		var type = 'touchleave';
+		this._touchEvent(e, type);
+	},
+
+	_onTouchMove: function (e) {
+		if (!this._map._loaded) {
+			return;
+		}
+
+		var type = 'touchmove';
+		this._touchEvent(e, type);
+	},
+
+	_detectIE: function () {
+		var ua = window.navigator.userAgent;
+
+		var msie = ua.indexOf('MSIE ');
+		if (msie > 0) {
+			// IE 10 or older => return version number
+			return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
+		}
+
+		var trident = ua.indexOf('Trident/');
+		if (trident > 0) {
+			// IE 11 => return version number
+			var rv = ua.indexOf('rv:');
+			return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
+		}
+
+		var edge = ua.indexOf('Edge/');
+		if (edge > 0) {
+			// IE 12 => return version number
+			return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
+		}
+
+		// other browser
+		return false;
+	}
+});
+
+L.Map.addInitHook('addHandler', 'touchExtend', L.Map.TouchExtend);
+
+
+/**
+ * @class L.Marker.Touch
+ * @aka Marker.Touch
+ *
+ * This isn't full Touch support. This is just to get markers to also support dom touch events after creation
+ * #TODO: find a better way of getting markers to support touch.
+ */
+L.Marker.Touch = L.Marker.extend({
+
+	_initInteraction: function () {
+		if (!this.addInteractiveTarget) {
+			// 0.7.x support
+			return this._initInteractionLegacy();
+		}
+		// TODO this may need be updated to re-add touch events for 1.0+
+		return L.Marker.prototype._initInteraction.apply(this);
+	},
+
+	// This is an exact copy of https://github.com/Leaflet/Leaflet/blob/v0.7/src/layer/marker/Marker.js
+	// with the addition of the touch events
+	_initInteractionLegacy: function () {
+
+		if (!this.options.clickable) {
+			return;
+		}
+
+		// TODO refactor into something shared with Map/Path/etc. to DRY it up
+
+		var icon = this._icon,
+			events = ['dblclick',
+					  'mousedown',
+					  'mouseover',
+					  'mouseout',
+					  'contextmenu',
+					  'touchstart',
+					  'touchend',
+					  'touchmove'];
+		if (this._detectIE) {
+			events.concat(['MSPointerDown',
+						   'MSPointerUp',
+						   'MSPointerMove',
+						   'MSPointerCancel']);
+		} else {
+			events.concat(['touchcancel']);
+		}
+
+		L.DomUtil.addClass(icon, 'leaflet-clickable');
+		L.DomEvent.on(icon, 'click', this._onMouseClick, this);
+		L.DomEvent.on(icon, 'keypress', this._onKeyPress, this);
+
+		for (var i = 0; i < events.length; i++) {
+			L.DomEvent.on(icon, events[i], this._fireMouseEvent, this);
+		}
+
+		if (L.Handler.MarkerDrag) {
+			this.dragging = new L.Handler.MarkerDrag(this);
+
+			if (this.options.draggable) {
+				this.dragging.enable();
+			}
+		}
+	},
+
+	_detectIE: function () {
+		var ua = window.navigator.userAgent;
+
+		var msie = ua.indexOf('MSIE ');
+		if (msie > 0) {
+			// IE 10 or older => return version number
+			return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
+		}
+
+		var trident = ua.indexOf('Trident/');
+		if (trident > 0) {
+			// IE 11 => return version number
+			var rv = ua.indexOf('rv:');
+			return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
+		}
+
+		var edge = ua.indexOf('Edge/');
+		if (edge > 0) {
+			// IE 12 => return version number
+			return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
+		}
+
+		// other browser
+		return false;
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/TouchEvents.min.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+L.Map.mergeOptions({touchExtend:true});L.Map.TouchExtend=L.Handler.extend({initialize:function(a){this._map=a;this._container=a._container;this._pane=a._panes.overlayPane},addHooks:function(){L.DomEvent.on(this._container,"touchstart",this._onTouchStart,this);L.DomEvent.on(this._container,"touchend",this._onTouchEnd,this);L.DomEvent.on(this._container,"touchmove",this._onTouchMove,this);if(this._detectIE()){L.DomEvent.on(this._container,"MSPointerDown",this._onTouchStart,this);L.DomEvent.on(this._container,"MSPointerUp",this._onTouchEnd,this);L.DomEvent.on(this._container,"MSPointerMove",this._onTouchMove,this);L.DomEvent.on(this._container,"MSPointerCancel",this._onTouchCancel,this)}else{L.DomEvent.on(this._container,"touchcancel",this._onTouchCancel,this);L.DomEvent.on(this._container,"touchleave",this._onTouchLeave,this)}},removeHooks:function(){L.DomEvent.off(this._container,"touchstart",this._onTouchStart);L.DomEvent.off(this._container,"touchend",this._onTouchEnd);L.DomEvent.off(this._container,"touchmove",this._onTouchMove);if(this._detectIE()){L.DomEvent.off(this._container,"MSPointerDowm",this._onTouchStart);L.DomEvent.off(this._container,"MSPointerUp",this._onTouchEnd);L.DomEvent.off(this._container,"MSPointerMove",this._onTouchMove);L.DomEvent.off(this._container,"MSPointerCancel",this._onTouchCancel)}else{L.DomEvent.off(this._container,"touchcancel",this._onTouchCancel);L.DomEvent.off(this._container,"touchleave",this._onTouchLeave)}},_touchEvent:function(f,d){var a={};if(typeof f.touches!=="undefined"){if(!f.touches.length){return}a=f.touches[0]}else{if(f.pointerType==="touch"){a=f;if(!this._filterClick(f)){return}}else{return}}var c=this._map.mouseEventToContainerPoint(a),b=this._map.mouseEventToLayerPoint(a),g=this._map.layerPointToLatLng(b);this._map.fire(d,{latlng:g,layerPoint:b,containerPoint:c,pageX:a.pageX,pageY:a.pageY,originalEvent:f})},_filterClick:function(c){var b=(c.timeStamp||c.originalEvent.timeStamp),a=L.DomEvent._lastClick&&(b-L.DomEvent._lastClick);if((a&&a>100&&a<500)||(c.target._simulatedClick&&!c._simulated)){L.DomEvent.stop(c);return false}L.DomEvent._lastClick=b;return true},_onTouchStart:function(b){if(!this._map._loaded){return}var a="touchstart";this._touchEvent(b,a)},_onTouchEnd:function(b){if(!this._map._loaded){return}var a="touchend";this._touchEvent(b,a)},_onTouchCancel:function(b){if(!this._map._loaded){return}var a="touchcancel";if(this._detectIE()){a="pointercancel"}this._touchEvent(b,a)},_onTouchLeave:function(b){if(!this._map._loaded){return}var a="touchleave";this._touchEvent(b,a)},_onTouchMove:function(b){if(!this._map._loaded){return}var a="touchmove";this._touchEvent(b,a)},_detectIE:function(){var c=window.navigator.userAgent;var b=c.indexOf("MSIE ");if(b>0){return parseInt(c.substring(b+5,c.indexOf(".",b)),10)}var a=c.indexOf("Trident/");if(a>0){var e=c.indexOf("rv:");return parseInt(c.substring(e+3,c.indexOf(".",e)),10)}var d=c.indexOf("Edge/");if(d>0){return parseInt(c.substring(d+5,c.indexOf(".",d)),10)}return false}});L.Map.addInitHook("addHandler","touchExtend",L.Map.TouchExtend);L.Marker.Touch=L.Marker.extend({_initInteraction:function(){if(!this.addInteractiveTarget){return this._initInteractionLegacy()}return L.Marker.prototype._initInteraction.apply(this)},_initInteractionLegacy:function(){if(!this.options.clickable){return}var c=this._icon,b=["dblclick","mousedown","mouseover","mouseout","contextmenu","touchstart","touchend","touchmove"];if(this._detectIE){b.concat(["MSPointerDown","MSPointerUp","MSPointerMove","MSPointerCancel"])}else{b.concat(["touchcancel"])}L.DomUtil.addClass(c,"leaflet-clickable");L.DomEvent.on(c,"click",this._onMouseClick,this);L.DomEvent.on(c,"keypress",this._onKeyPress,this);for(var a=0;a<b.length;a++){L.DomEvent.on(c,b[a],this._fireMouseEvent,this)}if(L.Handler.MarkerDrag){this.dragging=new L.Handler.MarkerDrag(this);if(this.options.draggable){this.dragging.enable()}}},_detectIE:function(){var c=window.navigator.userAgent;var b=c.indexOf("MSIE ");if(b>0){return parseInt(c.substring(b+5,c.indexOf(".",b)),10)}var a=c.indexOf("Trident/");if(a>0){var e=c.indexOf("rv:");return parseInt(c.substring(e+3,c.indexOf(".",e)),10)}var d=c.indexOf("Edge/");if(d>0){return parseInt(c.substring(d+5,c.indexOf(".",d)),10)}return false}});
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-1.0.3.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,13251 @@
+/*
+ Leaflet 1.0.3+ed36a04, a JS library for interactive maps. http://leafletjs.com
+ (c) 2010-2016 Vladimir Agafonkin, (c) 2010-2011 CloudMade
+*/
+(function (window, document, undefined) {
+var L = {
+	version: "1.0.3+ed36a04"
+};
+
+function expose() {
+	var oldL = window.L;
+
+	L.noConflict = function () {
+		window.L = oldL;
+		return this;
+	};
+
+	window.L = L;
+}
+
+// define Leaflet for Node module pattern loaders, including Browserify
+if (typeof module === 'object' && typeof module.exports === 'object') {
+	module.exports = L;
+
+// define Leaflet as an AMD module
+} else if (typeof define === 'function' && define.amd) {
+	define(L);
+}
+
+// define Leaflet as a global L variable, saving the original L to restore later if needed
+if (typeof window !== 'undefined') {
+	expose();
+}
+
+
+
+/*
+ * @namespace Util
+ *
+ * Various utility functions, used by Leaflet internally.
+ */
+
+L.Util = {
+
+	// @function extend(dest: Object, src?: Object): Object
+	// Merges the properties of the `src` object (or multiple objects) into `dest` object and returns the latter. Has an `L.extend` shortcut.
+	extend: function (dest) {
+		var i, j, len, src;
+
+		for (j = 1, len = arguments.length; j < len; j++) {
+			src = arguments[j];
+			for (i in src) {
+				dest[i] = src[i];
+			}
+		}
+		return dest;
+	},
+
+	// @function create(proto: Object, properties?: Object): Object
+	// Compatibility polyfill for [Object.create](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/create)
+	create: Object.create || (function () {
+		function F() {}
+		return function (proto) {
+			F.prototype = proto;
+			return new F();
+		};
+	})(),
+
+	// @function bind(fn: Function, …): Function
+	// Returns a new function bound to the arguments passed, like [Function.prototype.bind](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).
+	// Has a `L.bind()` shortcut.
+	bind: function (fn, obj) {
+		var slice = Array.prototype.slice;
+
+		if (fn.bind) {
+			return fn.bind.apply(fn, slice.call(arguments, 1));
+		}
+
+		var args = slice.call(arguments, 2);
+
+		return function () {
+			return fn.apply(obj, args.length ? args.concat(slice.call(arguments)) : arguments);
+		};
+	},
+
+	// @function stamp(obj: Object): Number
+	// Returns the unique ID of an object, assiging it one if it doesn't have it.
+	stamp: function (obj) {
+		/*eslint-disable */
+		obj._leaflet_id = obj._leaflet_id || ++L.Util.lastId;
+		return obj._leaflet_id;
+		/*eslint-enable */
+	},
+
+	// @property lastId: Number
+	// Last unique ID used by [`stamp()`](#util-stamp)
+	lastId: 0,
+
+	// @function throttle(fn: Function, time: Number, context: Object): Function
+	// Returns a function which executes function `fn` with the given scope `context`
+	// (so that the `this` keyword refers to `context` inside `fn`'s code). The function
+	// `fn` will be called no more than one time per given amount of `time`. The arguments
+	// received by the bound function will be any arguments passed when binding the
+	// function, followed by any arguments passed when invoking the bound function.
+	// Has an `L.bind` shortcut.
+	throttle: function (fn, time, context) {
+		var lock, args, wrapperFn, later;
+
+		later = function () {
+			// reset lock and call if queued
+			lock = false;
+			if (args) {
+				wrapperFn.apply(context, args);
+				args = false;
+			}
+		};
+
+		wrapperFn = function () {
+			if (lock) {
+				// called too soon, queue to call later
+				args = arguments;
+
+			} else {
+				// call and lock until later
+				fn.apply(context, arguments);
+				setTimeout(later, time);
+				lock = true;
+			}
+		};
+
+		return wrapperFn;
+	},
+
+	// @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number
+	// Returns the number `num` modulo `range` in such a way so it lies within
+	// `range[0]` and `range[1]`. The returned value will be always smaller than
+	// `range[1]` unless `includeMax` is set to `true`.
+	wrapNum: function (x, range, includeMax) {
+		var max = range[1],
+		    min = range[0],
+		    d = max - min;
+		return x === max && includeMax ? x : ((x - min) % d + d) % d + min;
+	},
+
+	// @function falseFn(): Function
+	// Returns a function which always returns `false`.
+	falseFn: function () { return false; },
+
+	// @function formatNum(num: Number, digits?: Number): Number
+	// Returns the number `num` rounded to `digits` decimals, or to 5 decimals by default.
+	formatNum: function (num, digits) {
+		var pow = Math.pow(10, digits || 5);
+		return Math.round(num * pow) / pow;
+	},
+
+	// @function trim(str: String): String
+	// Compatibility polyfill for [String.prototype.trim](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim)
+	trim: function (str) {
+		return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
+	},
+
+	// @function splitWords(str: String): String[]
+	// Trims and splits the string on whitespace and returns the array of parts.
+	splitWords: function (str) {
+		return L.Util.trim(str).split(/\s+/);
+	},
+
+	// @function setOptions(obj: Object, options: Object): Object
+	// Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut.
+	setOptions: function (obj, options) {
+		if (!obj.hasOwnProperty('options')) {
+			obj.options = obj.options ? L.Util.create(obj.options) : {};
+		}
+		for (var i in options) {
+			obj.options[i] = options[i];
+		}
+		return obj.options;
+	},
+
+	// @function getParamString(obj: Object, existingUrl?: String, uppercase?: Boolean): String
+	// Converts an object into a parameter URL string, e.g. `{a: "foo", b: "bar"}`
+	// translates to `'?a=foo&b=bar'`. If `existingUrl` is set, the parameters will
+	// be appended at the end. If `uppercase` is `true`, the parameter names will
+	// be uppercased (e.g. `'?A=foo&B=bar'`)
+	getParamString: function (obj, existingUrl, uppercase) {
+		var params = [];
+		for (var i in obj) {
+			params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));
+		}
+		return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');
+	},
+
+	// @function template(str: String, data: Object): String
+	// Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'`
+	// and a data object like `{a: 'foo', b: 'bar'}`, returns evaluated string
+	// `('Hello foo, bar')`. You can also specify functions instead of strings for
+	// data values — they will be evaluated passing `data` as an argument.
+	template: function (str, data) {
+		return str.replace(L.Util.templateRe, function (str, key) {
+			var value = data[key];
+
+			if (value === undefined) {
+				throw new Error('No value provided for variable ' + str);
+
+			} else if (typeof value === 'function') {
+				value = value(data);
+			}
+			return value;
+		});
+	},
+
+	templateRe: /\{ *([\w_\-]+) *\}/g,
+
+	// @function isArray(obj): Boolean
+	// Compatibility polyfill for [Array.isArray](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray)
+	isArray: Array.isArray || function (obj) {
+		return (Object.prototype.toString.call(obj) === '[object Array]');
+	},
+
+	// @function indexOf(array: Array, el: Object): Number
+	// Compatibility polyfill for [Array.prototype.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)
+	indexOf: function (array, el) {
+		for (var i = 0; i < array.length; i++) {
+			if (array[i] === el) { return i; }
+		}
+		return -1;
+	},
+
+	// @property emptyImageUrl: String
+	// Data URI string containing a base64-encoded empty GIF image.
+	// Used as a hack to free memory from unused images on WebKit-powered
+	// mobile devices (by setting image `src` to this string).
+	emptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='
+};
+
+(function () {
+	// inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/
+
+	function getPrefixed(name) {
+		return window['webkit' + name] || window['moz' + name] || window['ms' + name];
+	}
+
+	var lastTime = 0;
+
+	// fallback for IE 7-8
+	function timeoutDefer(fn) {
+		var time = +new Date(),
+		    timeToCall = Math.max(0, 16 - (time - lastTime));
+
+		lastTime = time + timeToCall;
+		return window.setTimeout(fn, timeToCall);
+	}
+
+	var requestFn = window.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || timeoutDefer,
+	    cancelFn = window.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') ||
+	               getPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); };
+
+
+	// @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean): Number
+	// Schedules `fn` to be executed when the browser repaints. `fn` is bound to
+	// `context` if given. When `immediate` is set, `fn` is called immediately if
+	// the browser doesn't have native support for
+	// [`window.requestAnimationFrame`](https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame),
+	// otherwise it's delayed. Returns a request ID that can be used to cancel the request.
+	L.Util.requestAnimFrame = function (fn, context, immediate) {
+		if (immediate && requestFn === timeoutDefer) {
+			fn.call(context);
+		} else {
+			return requestFn.call(window, L.bind(fn, context));
+		}
+	};
+
+	// @function cancelAnimFrame(id: Number): undefined
+	// Cancels a previous `requestAnimFrame`. See also [window.cancelAnimationFrame](https://developer.mozilla.org/docs/Web/API/window/cancelAnimationFrame).
+	L.Util.cancelAnimFrame = function (id) {
+		if (id) {
+			cancelFn.call(window, id);
+		}
+	};
+})();
+
+// shortcuts for most used utility functions
+L.extend = L.Util.extend;
+L.bind = L.Util.bind;
+L.stamp = L.Util.stamp;
+L.setOptions = L.Util.setOptions;
+
+
+
+
+// @class Class
+// @aka L.Class
+
+// @section
+// @uninheritable
+
+// Thanks to John Resig and Dean Edwards for inspiration!
+
+L.Class = function () {};
+
+L.Class.extend = function (props) {
+
+	// @function extend(props: Object): Function
+	// [Extends the current class](#class-inheritance) given the properties to be included.
+	// Returns a Javascript function that is a class constructor (to be called with `new`).
+	var NewClass = function () {
+
+		// call the constructor
+		if (this.initialize) {
+			this.initialize.apply(this, arguments);
+		}
+
+		// call all constructor hooks
+		this.callInitHooks();
+	};
+
+	var parentProto = NewClass.__super__ = this.prototype;
+
+	var proto = L.Util.create(parentProto);
+	proto.constructor = NewClass;
+
+	NewClass.prototype = proto;
+
+	// inherit parent's statics
+	for (var i in this) {
+		if (this.hasOwnProperty(i) && i !== 'prototype') {
+			NewClass[i] = this[i];
+		}
+	}
+
+	// mix static properties into the class
+	if (props.statics) {
+		L.extend(NewClass, props.statics);
+		delete props.statics;
+	}
+
+	// mix includes into the prototype
+	if (props.includes) {
+		L.Util.extend.apply(null, [proto].concat(props.includes));
+		delete props.includes;
+	}
+
+	// merge options
+	if (proto.options) {
+		props.options = L.Util.extend(L.Util.create(proto.options), props.options);
+	}
+
+	// mix given properties into the prototype
+	L.extend(proto, props);
+
+	proto._initHooks = [];
+
+	// add method for calling all hooks
+	proto.callInitHooks = function () {
+
+		if (this._initHooksCalled) { return; }
+
+		if (parentProto.callInitHooks) {
+			parentProto.callInitHooks.call(this);
+		}
+
+		this._initHooksCalled = true;
+
+		for (var i = 0, len = proto._initHooks.length; i < len; i++) {
+			proto._initHooks[i].call(this);
+		}
+	};
+
+	return NewClass;
+};
+
+
+// @function include(properties: Object): this
+// [Includes a mixin](#class-includes) into the current class.
+L.Class.include = function (props) {
+	L.extend(this.prototype, props);
+	return this;
+};
+
+// @function mergeOptions(options: Object): this
+// [Merges `options`](#class-options) into the defaults of the class.
+L.Class.mergeOptions = function (options) {
+	L.extend(this.prototype.options, options);
+	return this;
+};
+
+// @function addInitHook(fn: Function): this
+// Adds a [constructor hook](#class-constructor-hooks) to the class.
+L.Class.addInitHook = function (fn) { // (Function) || (String, args...)
+	var args = Array.prototype.slice.call(arguments, 1);
+
+	var init = typeof fn === 'function' ? fn : function () {
+		this[fn].apply(this, args);
+	};
+
+	this.prototype._initHooks = this.prototype._initHooks || [];
+	this.prototype._initHooks.push(init);
+	return this;
+};
+
+
+
+/*
+ * @class Evented
+ * @aka L.Evented
+ * @inherits Class
+ *
+ * A set of methods shared between event-powered classes (like `Map` and `Marker`). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire `'click'` event).
+ *
+ * @example
+ *
+ * ```js
+ * map.on('click', function(e) {
+ * 	alert(e.latlng);
+ * } );
+ * ```
+ *
+ * Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:
+ *
+ * ```js
+ * function onClick(e) { ... }
+ *
+ * map.on('click', onClick);
+ * map.off('click', onClick);
+ * ```
+ */
+
+
+L.Evented = L.Class.extend({
+
+	/* @method on(type: String, fn: Function, context?: Object): this
+	 * Adds a listener function (`fn`) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. `'click dblclick'`).
+	 *
+	 * @alternative
+	 * @method on(eventMap: Object): this
+	 * Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`
+	 */
+	on: function (types, fn, context) {
+
+		// types can be a map of types/handlers
+		if (typeof types === 'object') {
+			for (var type in types) {
+				// we don't process space-separated events here for performance;
+				// it's a hot path since Layer uses the on(obj) syntax
+				this._on(type, types[type], fn);
+			}
+
+		} else {
+			// types can be a string of space-separated words
+			types = L.Util.splitWords(types);
+
+			for (var i = 0, len = types.length; i < len; i++) {
+				this._on(types[i], fn, context);
+			}
+		}
+
+		return this;
+	},
+
+	/* @method off(type: String, fn?: Function, context?: Object): this
+	 * Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to `on`, you must pass the same context to `off` in order to remove the listener.
+	 *
+	 * @alternative
+	 * @method off(eventMap: Object): this
+	 * Removes a set of type/listener pairs.
+	 *
+	 * @alternative
+	 * @method off: this
+	 * Removes all listeners to all events on the object.
+	 */
+	off: function (types, fn, context) {
+
+		if (!types) {
+			// clear all listeners if called without arguments
+			delete this._events;
+
+		} else if (typeof types === 'object') {
+			for (var type in types) {
+				this._off(type, types[type], fn);
+			}
+
+		} else {
+			types = L.Util.splitWords(types);
+
+			for (var i = 0, len = types.length; i < len; i++) {
+				this._off(types[i], fn, context);
+			}
+		}
+
+		return this;
+	},
+
+	// attach listener (without syntactic sugar now)
+	_on: function (type, fn, context) {
+		this._events = this._events || {};
+
+		/* get/init listeners for type */
+		var typeListeners = this._events[type];
+		if (!typeListeners) {
+			typeListeners = [];
+			this._events[type] = typeListeners;
+		}
+
+		if (context === this) {
+			// Less memory footprint.
+			context = undefined;
+		}
+		var newListener = {fn: fn, ctx: context},
+		    listeners = typeListeners;
+
+		// check if fn already there
+		for (var i = 0, len = listeners.length; i < len; i++) {
+			if (listeners[i].fn === fn && listeners[i].ctx === context) {
+				return;
+			}
+		}
+
+		listeners.push(newListener);
+	},
+
+	_off: function (type, fn, context) {
+		var listeners,
+		    i,
+		    len;
+
+		if (!this._events) { return; }
+
+		listeners = this._events[type];
+
+		if (!listeners) {
+			return;
+		}
+
+		if (!fn) {
+			// Set all removed listeners to noop so they are not called if remove happens in fire
+			for (i = 0, len = listeners.length; i < len; i++) {
+				listeners[i].fn = L.Util.falseFn;
+			}
+			// clear all listeners for a type if function isn't specified
+			delete this._events[type];
+			return;
+		}
+
+		if (context === this) {
+			context = undefined;
+		}
+
+		if (listeners) {
+
+			// find fn and remove it
+			for (i = 0, len = listeners.length; i < len; i++) {
+				var l = listeners[i];
+				if (l.ctx !== context) { continue; }
+				if (l.fn === fn) {
+
+					// set the removed listener to noop so that's not called if remove happens in fire
+					l.fn = L.Util.falseFn;
+
+					if (this._firingCount) {
+						/* copy array in case events are being fired */
+						this._events[type] = listeners = listeners.slice();
+					}
+					listeners.splice(i, 1);
+
+					return;
+				}
+			}
+		}
+	},
+
+	// @method fire(type: String, data?: Object, propagate?: Boolean): this
+	// Fires an event of the specified type. You can optionally provide an data
+	// object — the first argument of the listener function will contain its
+	// properties. The event can optionally be propagated to event parents.
+	fire: function (type, data, propagate) {
+		if (!this.listens(type, propagate)) { return this; }
+
+		var event = L.Util.extend({}, data, {type: type, target: this});
+
+		if (this._events) {
+			var listeners = this._events[type];
+
+			if (listeners) {
+				this._firingCount = (this._firingCount + 1) || 1;
+				for (var i = 0, len = listeners.length; i < len; i++) {
+					var l = listeners[i];
+					l.fn.call(l.ctx || this, event);
+				}
+
+				this._firingCount--;
+			}
+		}
+
+		if (propagate) {
+			// propagate the event to parents (set with addEventParent)
+			this._propagateEvent(event);
+		}
+
+		return this;
+	},
+
+	// @method listens(type: String): Boolean
+	// Returns `true` if a particular event type has any listeners attached to it.
+	listens: function (type, propagate) {
+		var listeners = this._events && this._events[type];
+		if (listeners && listeners.length) { return true; }
+
+		if (propagate) {
+			// also check parents for listeners if event propagates
+			for (var id in this._eventParents) {
+				if (this._eventParents[id].listens(type, propagate)) { return true; }
+			}
+		}
+		return false;
+	},
+
+	// @method once(…): this
+	// Behaves as [`on(…)`](#evented-on), except the listener will only get fired once and then removed.
+	once: function (types, fn, context) {
+
+		if (typeof types === 'object') {
+			for (var type in types) {
+				this.once(type, types[type], fn);
+			}
+			return this;
+		}
+
+		var handler = L.bind(function () {
+			this
+			    .off(types, fn, context)
+			    .off(types, handler, context);
+		}, this);
+
+		// add a listener that's executed once and removed after that
+		return this
+		    .on(types, fn, context)
+		    .on(types, handler, context);
+	},
+
+	// @method addEventParent(obj: Evented): this
+	// Adds an event parent - an `Evented` that will receive propagated events
+	addEventParent: function (obj) {
+		this._eventParents = this._eventParents || {};
+		this._eventParents[L.stamp(obj)] = obj;
+		return this;
+	},
+
+	// @method removeEventParent(obj: Evented): this
+	// Removes an event parent, so it will stop receiving propagated events
+	removeEventParent: function (obj) {
+		if (this._eventParents) {
+			delete this._eventParents[L.stamp(obj)];
+		}
+		return this;
+	},
+
+	_propagateEvent: function (e) {
+		for (var id in this._eventParents) {
+			this._eventParents[id].fire(e.type, L.extend({layer: e.target}, e), true);
+		}
+	}
+});
+
+var proto = L.Evented.prototype;
+
+// aliases; we should ditch those eventually
+
+// @method addEventListener(…): this
+// Alias to [`on(…)`](#evented-on)
+proto.addEventListener = proto.on;
+
+// @method removeEventListener(…): this
+// Alias to [`off(…)`](#evented-off)
+
+// @method clearAllEventListeners(…): this
+// Alias to [`off()`](#evented-off)
+proto.removeEventListener = proto.clearAllEventListeners = proto.off;
+
+// @method addOneTimeEventListener(…): this
+// Alias to [`once(…)`](#evented-once)
+proto.addOneTimeEventListener = proto.once;
+
+// @method fireEvent(…): this
+// Alias to [`fire(…)`](#evented-fire)
+proto.fireEvent = proto.fire;
+
+// @method hasEventListeners(…): Boolean
+// Alias to [`listens(…)`](#evented-listens)
+proto.hasEventListeners = proto.listens;
+
+L.Mixin = {Events: proto};
+
+
+
+/*
+ * @namespace Browser
+ * @aka L.Browser
+ *
+ * A namespace with static properties for browser/feature detection used by Leaflet internally.
+ *
+ * @example
+ *
+ * ```js
+ * if (L.Browser.ielt9) {
+ *   alert('Upgrade your browser, dude!');
+ * }
+ * ```
+ */
+
+(function () {
+
+	var ua = navigator.userAgent.toLowerCase(),
+	    doc = document.documentElement,
+
+	    ie = 'ActiveXObject' in window,
+
+	    webkit    = ua.indexOf('webkit') !== -1,
+	    phantomjs = ua.indexOf('phantom') !== -1,
+	    android23 = ua.search('android [23]') !== -1,
+	    chrome    = ua.indexOf('chrome') !== -1,
+	    gecko     = ua.indexOf('gecko') !== -1  && !webkit && !window.opera && !ie,
+
+	    win = navigator.platform.indexOf('Win') === 0,
+
+	    mobile = typeof orientation !== 'undefined' || ua.indexOf('mobile') !== -1,
+	    msPointer = !window.PointerEvent && window.MSPointerEvent,
+	    pointer = window.PointerEvent || msPointer,
+
+	    ie3d = ie && ('transition' in doc.style),
+	    webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23,
+	    gecko3d = 'MozPerspective' in doc.style,
+	    opera12 = 'OTransition' in doc.style;
+
+
+	var touch = !window.L_NO_TOUCH && (pointer || 'ontouchstart' in window ||
+			(window.DocumentTouch && document instanceof window.DocumentTouch));
+
+	L.Browser = {
+
+		// @property ie: Boolean
+		// `true` for all Internet Explorer versions (not Edge).
+		ie: ie,
+
+		// @property ielt9: Boolean
+		// `true` for Internet Explorer versions less than 9.
+		ielt9: ie && !document.addEventListener,
+
+		// @property edge: Boolean
+		// `true` for the Edge web browser.
+		edge: 'msLaunchUri' in navigator && !('documentMode' in document),
+
+		// @property webkit: Boolean
+		// `true` for webkit-based browsers like Chrome and Safari (including mobile versions).
+		webkit: webkit,
+
+		// @property gecko: Boolean
+		// `true` for gecko-based browsers like Firefox.
+		gecko: gecko,
+
+		// @property android: Boolean
+		// `true` for any browser running on an Android platform.
+		android: ua.indexOf('android') !== -1,
+
+		// @property android23: Boolean
+		// `true` for browsers running on Android 2 or Android 3.
+		android23: android23,
+
+		// @property chrome: Boolean
+		// `true` for the Chrome browser.
+		chrome: chrome,
+
+		// @property safari: Boolean
+		// `true` for the Safari browser.
+		safari: !chrome && ua.indexOf('safari') !== -1,
+
+
+		// @property win: Boolean
+		// `true` when the browser is running in a Windows platform
+		win: win,
+
+
+		// @property ie3d: Boolean
+		// `true` for all Internet Explorer versions supporting CSS transforms.
+		ie3d: ie3d,
+
+		// @property webkit3d: Boolean
+		// `true` for webkit-based browsers supporting CSS transforms.
+		webkit3d: webkit3d,
+
+		// @property gecko3d: Boolean
+		// `true` for gecko-based browsers supporting CSS transforms.
+		gecko3d: gecko3d,
+
+		// @property opera12: Boolean
+		// `true` for the Opera browser supporting CSS transforms (version 12 or later).
+		opera12: opera12,
+
+		// @property any3d: Boolean
+		// `true` for all browsers supporting CSS transforms.
+		any3d: !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantomjs,
+
+
+		// @property mobile: Boolean
+		// `true` for all browsers running in a mobile device.
+		mobile: mobile,
+
+		// @property mobileWebkit: Boolean
+		// `true` for all webkit-based browsers in a mobile device.
+		mobileWebkit: mobile && webkit,
+
+		// @property mobileWebkit3d: Boolean
+		// `true` for all webkit-based browsers in a mobile device supporting CSS transforms.
+		mobileWebkit3d: mobile && webkit3d,
+
+		// @property mobileOpera: Boolean
+		// `true` for the Opera browser in a mobile device.
+		mobileOpera: mobile && window.opera,
+
+		// @property mobileGecko: Boolean
+		// `true` for gecko-based browsers running in a mobile device.
+		mobileGecko: mobile && gecko,
+
+
+		// @property touch: Boolean
+		// `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events).
+		// This does not necessarily mean that the browser is running in a computer with
+		// a touchscreen, it only means that the browser is capable of understanding
+		// touch events.
+		touch: !!touch,
+
+		// @property msPointer: Boolean
+		// `true` for browsers implementing the Microsoft touch events model (notably IE10).
+		msPointer: !!msPointer,
+
+		// @property pointer: Boolean
+		// `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx).
+		pointer: !!pointer,
+
+
+		// @property retina: Boolean
+		// `true` for browsers on a high-resolution "retina" screen.
+		retina: (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1
+	};
+
+}());
+
+
+
+/*
+ * @class Point
+ * @aka L.Point
+ *
+ * Represents a point with `x` and `y` coordinates in pixels.
+ *
+ * @example
+ *
+ * ```js
+ * var point = L.point(200, 300);
+ * ```
+ *
+ * All Leaflet methods and options that accept `Point` objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:
+ *
+ * ```js
+ * map.panBy([200, 300]);
+ * map.panBy(L.point(200, 300));
+ * ```
+ */
+
+L.Point = function (x, y, round) {
+	// @property x: Number; The `x` coordinate of the point
+	this.x = (round ? Math.round(x) : x);
+	// @property y: Number; The `y` coordinate of the point
+	this.y = (round ? Math.round(y) : y);
+};
+
+L.Point.prototype = {
+
+	// @method clone(): Point
+	// Returns a copy of the current point.
+	clone: function () {
+		return new L.Point(this.x, this.y);
+	},
+
+	// @method add(otherPoint: Point): Point
+	// Returns the result of addition of the current and the given points.
+	add: function (point) {
+		// non-destructive, returns a new point
+		return this.clone()._add(L.point(point));
+	},
+
+	_add: function (point) {
+		// destructive, used directly for performance in situations where it's safe to modify existing point
+		this.x += point.x;
+		this.y += point.y;
+		return this;
+	},
+
+	// @method subtract(otherPoint: Point): Point
+	// Returns the result of subtraction of the given point from the current.
+	subtract: function (point) {
+		return this.clone()._subtract(L.point(point));
+	},
+
+	_subtract: function (point) {
+		this.x -= point.x;
+		this.y -= point.y;
+		return this;
+	},
+
+	// @method divideBy(num: Number): Point
+	// Returns the result of division of the current point by the given number.
+	divideBy: function (num) {
+		return this.clone()._divideBy(num);
+	},
+
+	_divideBy: function (num) {
+		this.x /= num;
+		this.y /= num;
+		return this;
+	},
+
+	// @method multiplyBy(num: Number): Point
+	// Returns the result of multiplication of the current point by the given number.
+	multiplyBy: function (num) {
+		return this.clone()._multiplyBy(num);
+	},
+
+	_multiplyBy: function (num) {
+		this.x *= num;
+		this.y *= num;
+		return this;
+	},
+
+	// @method scaleBy(scale: Point): Point
+	// Multiply each coordinate of the current point by each coordinate of
+	// `scale`. In linear algebra terms, multiply the point by the
+	// [scaling matrix](https://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation)
+	// defined by `scale`.
+	scaleBy: function (point) {
+		return new L.Point(this.x * point.x, this.y * point.y);
+	},
+
+	// @method unscaleBy(scale: Point): Point
+	// Inverse of `scaleBy`. Divide each coordinate of the current point by
+	// each coordinate of `scale`.
+	unscaleBy: function (point) {
+		return new L.Point(this.x / point.x, this.y / point.y);
+	},
+
+	// @method round(): Point
+	// Returns a copy of the current point with rounded coordinates.
+	round: function () {
+		return this.clone()._round();
+	},
+
+	_round: function () {
+		this.x = Math.round(this.x);
+		this.y = Math.round(this.y);
+		return this;
+	},
+
+	// @method floor(): Point
+	// Returns a copy of the current point with floored coordinates (rounded down).
+	floor: function () {
+		return this.clone()._floor();
+	},
+
+	_floor: function () {
+		this.x = Math.floor(this.x);
+		this.y = Math.floor(this.y);
+		return this;
+	},
+
+	// @method ceil(): Point
+	// Returns a copy of the current point with ceiled coordinates (rounded up).
+	ceil: function () {
+		return this.clone()._ceil();
+	},
+
+	_ceil: function () {
+		this.x = Math.ceil(this.x);
+		this.y = Math.ceil(this.y);
+		return this;
+	},
+
+	// @method distanceTo(otherPoint: Point): Number
+	// Returns the cartesian distance between the current and the given points.
+	distanceTo: function (point) {
+		point = L.point(point);
+
+		var x = point.x - this.x,
+		    y = point.y - this.y;
+
+		return Math.sqrt(x * x + y * y);
+	},
+
+	// @method equals(otherPoint: Point): Boolean
+	// Returns `true` if the given point has the same coordinates.
+	equals: function (point) {
+		point = L.point(point);
+
+		return point.x === this.x &&
+		       point.y === this.y;
+	},
+
+	// @method contains(otherPoint: Point): Boolean
+	// Returns `true` if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).
+	contains: function (point) {
+		point = L.point(point);
+
+		return Math.abs(point.x) <= Math.abs(this.x) &&
+		       Math.abs(point.y) <= Math.abs(this.y);
+	},
+
+	// @method toString(): String
+	// Returns a string representation of the point for debugging purposes.
+	toString: function () {
+		return 'Point(' +
+		        L.Util.formatNum(this.x) + ', ' +
+		        L.Util.formatNum(this.y) + ')';
+	}
+};
+
+// @factory L.point(x: Number, y: Number, round?: Boolean)
+// Creates a Point object with the given `x` and `y` coordinates. If optional `round` is set to true, rounds the `x` and `y` values.
+
+// @alternative
+// @factory L.point(coords: Number[])
+// Expects an array of the form `[x, y]` instead.
+
+// @alternative
+// @factory L.point(coords: Object)
+// Expects a plain object of the form `{x: Number, y: Number}` instead.
+L.point = function (x, y, round) {
+	if (x instanceof L.Point) {
+		return x;
+	}
+	if (L.Util.isArray(x)) {
+		return new L.Point(x[0], x[1]);
+	}
+	if (x === undefined || x === null) {
+		return x;
+	}
+	if (typeof x === 'object' && 'x' in x && 'y' in x) {
+		return new L.Point(x.x, x.y);
+	}
+	return new L.Point(x, y, round);
+};
+
+
+
+/*
+ * @class Bounds
+ * @aka L.Bounds
+ *
+ * Represents a rectangular area in pixel coordinates.
+ *
+ * @example
+ *
+ * ```js
+ * var p1 = L.point(10, 10),
+ * p2 = L.point(40, 60),
+ * bounds = L.bounds(p1, p2);
+ * ```
+ *
+ * All Leaflet methods that accept `Bounds` objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:
+ *
+ * ```js
+ * otherBounds.intersects([[10, 10], [40, 60]]);
+ * ```
+ */
+
+L.Bounds = function (a, b) {
+	if (!a) { return; }
+
+	var points = b ? [a, b] : a;
+
+	for (var i = 0, len = points.length; i < len; i++) {
+		this.extend(points[i]);
+	}
+};
+
+L.Bounds.prototype = {
+	// @method extend(point: Point): this
+	// Extends the bounds to contain the given point.
+	extend: function (point) { // (Point)
+		point = L.point(point);
+
+		// @property min: Point
+		// The top left corner of the rectangle.
+		// @property max: Point
+		// The bottom right corner of the rectangle.
+		if (!this.min && !this.max) {
+			this.min = point.clone();
+			this.max = point.clone();
+		} else {
+			this.min.x = Math.min(point.x, this.min.x);
+			this.max.x = Math.max(point.x, this.max.x);
+			this.min.y = Math.min(point.y, this.min.y);
+			this.max.y = Math.max(point.y, this.max.y);
+		}
+		return this;
+	},
+
+	// @method getCenter(round?: Boolean): Point
+	// Returns the center point of the bounds.
+	getCenter: function (round) {
+		return new L.Point(
+		        (this.min.x + this.max.x) / 2,
+		        (this.min.y + this.max.y) / 2, round);
+	},
+
+	// @method getBottomLeft(): Point
+	// Returns the bottom-left point of the bounds.
+	getBottomLeft: function () {
+		return new L.Point(this.min.x, this.max.y);
+	},
+
+	// @method getTopRight(): Point
+	// Returns the top-right point of the bounds.
+	getTopRight: function () { // -> Point
+		return new L.Point(this.max.x, this.min.y);
+	},
+
+	// @method getSize(): Point
+	// Returns the size of the given bounds
+	getSize: function () {
+		return this.max.subtract(this.min);
+	},
+
+	// @method contains(otherBounds: Bounds): Boolean
+	// Returns `true` if the rectangle contains the given one.
+	// @alternative
+	// @method contains(point: Point): Boolean
+	// Returns `true` if the rectangle contains the given point.
+	contains: function (obj) {
+		var min, max;
+
+		if (typeof obj[0] === 'number' || obj instanceof L.Point) {
+			obj = L.point(obj);
+		} else {
+			obj = L.bounds(obj);
+		}
+
+		if (obj instanceof L.Bounds) {
+			min = obj.min;
+			max = obj.max;
+		} else {
+			min = max = obj;
+		}
+
+		return (min.x >= this.min.x) &&
+		       (max.x <= this.max.x) &&
+		       (min.y >= this.min.y) &&
+		       (max.y <= this.max.y);
+	},
+
+	// @method intersects(otherBounds: Bounds): Boolean
+	// Returns `true` if the rectangle intersects the given bounds. Two bounds
+	// intersect if they have at least one point in common.
+	intersects: function (bounds) { // (Bounds) -> Boolean
+		bounds = L.bounds(bounds);
+
+		var min = this.min,
+		    max = this.max,
+		    min2 = bounds.min,
+		    max2 = bounds.max,
+		    xIntersects = (max2.x >= min.x) && (min2.x <= max.x),
+		    yIntersects = (max2.y >= min.y) && (min2.y <= max.y);
+
+		return xIntersects && yIntersects;
+	},
+
+	// @method overlaps(otherBounds: Bounds): Boolean
+	// Returns `true` if the rectangle overlaps the given bounds. Two bounds
+	// overlap if their intersection is an area.
+	overlaps: function (bounds) { // (Bounds) -> Boolean
+		bounds = L.bounds(bounds);
+
+		var min = this.min,
+		    max = this.max,
+		    min2 = bounds.min,
+		    max2 = bounds.max,
+		    xOverlaps = (max2.x > min.x) && (min2.x < max.x),
+		    yOverlaps = (max2.y > min.y) && (min2.y < max.y);
+
+		return xOverlaps && yOverlaps;
+	},
+
+	isValid: function () {
+		return !!(this.min && this.max);
+	}
+};
+
+
+// @factory L.bounds(topLeft: Point, bottomRight: Point)
+// Creates a Bounds object from two coordinates (usually top-left and bottom-right corners).
+// @alternative
+// @factory L.bounds(points: Point[])
+// Creates a Bounds object from the points it contains
+L.bounds = function (a, b) {
+	if (!a || a instanceof L.Bounds) {
+		return a;
+	}
+	return new L.Bounds(a, b);
+};
+
+
+
+/*
+ * @class Transformation
+ * @aka L.Transformation
+ *
+ * Represents an affine transformation: a set of coefficients `a`, `b`, `c`, `d`
+ * for transforming a point of a form `(x, y)` into `(a*x + b, c*y + d)` and doing
+ * the reverse. Used by Leaflet in its projections code.
+ *
+ * @example
+ *
+ * ```js
+ * var transformation = new L.Transformation(2, 5, -1, 10),
+ * 	p = L.point(1, 2),
+ * 	p2 = transformation.transform(p), //  L.point(7, 8)
+ * 	p3 = transformation.untransform(p2); //  L.point(1, 2)
+ * ```
+ */
+
+
+// factory new L.Transformation(a: Number, b: Number, c: Number, d: Number)
+// Creates a `Transformation` object with the given coefficients.
+L.Transformation = function (a, b, c, d) {
+	this._a = a;
+	this._b = b;
+	this._c = c;
+	this._d = d;
+};
+
+L.Transformation.prototype = {
+	// @method transform(point: Point, scale?: Number): Point
+	// Returns a transformed point, optionally multiplied by the given scale.
+	// Only accepts actual `L.Point` instances, not arrays.
+	transform: function (point, scale) { // (Point, Number) -> Point
+		return this._transform(point.clone(), scale);
+	},
+
+	// destructive transform (faster)
+	_transform: function (point, scale) {
+		scale = scale || 1;
+		point.x = scale * (this._a * point.x + this._b);
+		point.y = scale * (this._c * point.y + this._d);
+		return point;
+	},
+
+	// @method untransform(point: Point, scale?: Number): Point
+	// Returns the reverse transformation of the given point, optionally divided
+	// by the given scale. Only accepts actual `L.Point` instances, not arrays.
+	untransform: function (point, scale) {
+		scale = scale || 1;
+		return new L.Point(
+		        (point.x / scale - this._b) / this._a,
+		        (point.y / scale - this._d) / this._c);
+	}
+};
+
+
+
+/*
+ * @namespace DomUtil
+ *
+ * Utility functions to work with the [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model)
+ * tree, used by Leaflet internally.
+ *
+ * Most functions expecting or returning a `HTMLElement` also work for
+ * SVG elements. The only difference is that classes refer to CSS classes
+ * in HTML and SVG classes in SVG.
+ */
+
+L.DomUtil = {
+
+	// @function get(id: String|HTMLElement): HTMLElement
+	// Returns an element given its DOM id, or returns the element itself
+	// if it was passed directly.
+	get: function (id) {
+		return typeof id === 'string' ? document.getElementById(id) : id;
+	},
+
+	// @function getStyle(el: HTMLElement, styleAttrib: String): String
+	// Returns the value for a certain style attribute on an element,
+	// including computed values or values set through CSS.
+	getStyle: function (el, style) {
+
+		var value = el.style[style] || (el.currentStyle && el.currentStyle[style]);
+
+		if ((!value || value === 'auto') && document.defaultView) {
+			var css = document.defaultView.getComputedStyle(el, null);
+			value = css ? css[style] : null;
+		}
+
+		return value === 'auto' ? null : value;
+	},
+
+	// @function create(tagName: String, className?: String, container?: HTMLElement): HTMLElement
+	// Creates an HTML element with `tagName`, sets its class to `className`, and optionally appends it to `container` element.
+	create: function (tagName, className, container) {
+
+		var el = document.createElement(tagName);
+		el.className = className || '';
+
+		if (container) {
+			container.appendChild(el);
+		}
+
+		return el;
+	},
+
+	// @function remove(el: HTMLElement)
+	// Removes `el` from its parent element
+	remove: function (el) {
+		var parent = el.parentNode;
+		if (parent) {
+			parent.removeChild(el);
+		}
+	},
+
+	// @function empty(el: HTMLElement)
+	// Removes all of `el`'s children elements from `el`
+	empty: function (el) {
+		while (el.firstChild) {
+			el.removeChild(el.firstChild);
+		}
+	},
+
+	// @function toFront(el: HTMLElement)
+	// Makes `el` the last children of its parent, so it renders in front of the other children.
+	toFront: function (el) {
+		el.parentNode.appendChild(el);
+	},
+
+	// @function toBack(el: HTMLElement)
+	// Makes `el` the first children of its parent, so it renders back from the other children.
+	toBack: function (el) {
+		var parent = el.parentNode;
+		parent.insertBefore(el, parent.firstChild);
+	},
+
+	// @function hasClass(el: HTMLElement, name: String): Boolean
+	// Returns `true` if the element's class attribute contains `name`.
+	hasClass: function (el, name) {
+		if (el.classList !== undefined) {
+			return el.classList.contains(name);
+		}
+		var className = L.DomUtil.getClass(el);
+		return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className);
+	},
+
+	// @function addClass(el: HTMLElement, name: String)
+	// Adds `name` to the element's class attribute.
+	addClass: function (el, name) {
+		if (el.classList !== undefined) {
+			var classes = L.Util.splitWords(name);
+			for (var i = 0, len = classes.length; i < len; i++) {
+				el.classList.add(classes[i]);
+			}
+		} else if (!L.DomUtil.hasClass(el, name)) {
+			var className = L.DomUtil.getClass(el);
+			L.DomUtil.setClass(el, (className ? className + ' ' : '') + name);
+		}
+	},
+
+	// @function removeClass(el: HTMLElement, name: String)
+	// Removes `name` from the element's class attribute.
+	removeClass: function (el, name) {
+		if (el.classList !== undefined) {
+			el.classList.remove(name);
+		} else {
+			L.DomUtil.setClass(el, L.Util.trim((' ' + L.DomUtil.getClass(el) + ' ').replace(' ' + name + ' ', ' ')));
+		}
+	},
+
+	// @function setClass(el: HTMLElement, name: String)
+	// Sets the element's class.
+	setClass: function (el, name) {
+		if (el.className.baseVal === undefined) {
+			el.className = name;
+		} else {
+			// in case of SVG element
+			el.className.baseVal = name;
+		}
+	},
+
+	// @function getClass(el: HTMLElement): String
+	// Returns the element's class.
+	getClass: function (el) {
+		return el.className.baseVal === undefined ? el.className : el.className.baseVal;
+	},
+
+	// @function setOpacity(el: HTMLElement, opacity: Number)
+	// Set the opacity of an element (including old IE support).
+	// `opacity` must be a number from `0` to `1`.
+	setOpacity: function (el, value) {
+
+		if ('opacity' in el.style) {
+			el.style.opacity = value;
+
+		} else if ('filter' in el.style) {
+			L.DomUtil._setOpacityIE(el, value);
+		}
+	},
+
+	_setOpacityIE: function (el, value) {
+		var filter = false,
+		    filterName = 'DXImageTransform.Microsoft.Alpha';
+
+		// filters collection throws an error if we try to retrieve a filter that doesn't exist
+		try {
+			filter = el.filters.item(filterName);
+		} catch (e) {
+			// don't set opacity to 1 if we haven't already set an opacity,
+			// it isn't needed and breaks transparent pngs.
+			if (value === 1) { return; }
+		}
+
+		value = Math.round(value * 100);
+
+		if (filter) {
+			filter.Enabled = (value !== 100);
+			filter.Opacity = value;
+		} else {
+			el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';
+		}
+	},
+
+	// @function testProp(props: String[]): String|false
+	// Goes through the array of style names and returns the first name
+	// that is a valid style name for an element. If no such name is found,
+	// it returns false. Useful for vendor-prefixed styles like `transform`.
+	testProp: function (props) {
+
+		var style = document.documentElement.style;
+
+		for (var i = 0; i < props.length; i++) {
+			if (props[i] in style) {
+				return props[i];
+			}
+		}
+		return false;
+	},
+
+	// @function setTransform(el: HTMLElement, offset: Point, scale?: Number)
+	// Resets the 3D CSS transform of `el` so it is translated by `offset` pixels
+	// and optionally scaled by `scale`. Does not have an effect if the
+	// browser doesn't support 3D CSS transforms.
+	setTransform: function (el, offset, scale) {
+		var pos = offset || new L.Point(0, 0);
+
+		el.style[L.DomUtil.TRANSFORM] =
+			(L.Browser.ie3d ?
+				'translate(' + pos.x + 'px,' + pos.y + 'px)' :
+				'translate3d(' + pos.x + 'px,' + pos.y + 'px,0)') +
+			(scale ? ' scale(' + scale + ')' : '');
+	},
+
+	// @function setPosition(el: HTMLElement, position: Point)
+	// Sets the position of `el` to coordinates specified by `position`,
+	// using CSS translate or top/left positioning depending on the browser
+	// (used by Leaflet internally to position its layers).
+	setPosition: function (el, point) { // (HTMLElement, Point[, Boolean])
+
+		/*eslint-disable */
+		el._leaflet_pos = point;
+		/*eslint-enable */
+
+		if (L.Browser.any3d) {
+			L.DomUtil.setTransform(el, point);
+		} else {
+			el.style.left = point.x + 'px';
+			el.style.top = point.y + 'px';
+		}
+	},
+
+	// @function getPosition(el: HTMLElement): Point
+	// Returns the coordinates of an element previously positioned with setPosition.
+	getPosition: function (el) {
+		// this method is only used for elements previously positioned using setPosition,
+		// so it's safe to cache the position for performance
+
+		return el._leaflet_pos || new L.Point(0, 0);
+	}
+};
+
+
+(function () {
+	// prefix style property names
+
+	// @property TRANSFORM: String
+	// Vendor-prefixed fransform style name (e.g. `'webkitTransform'` for WebKit).
+	L.DomUtil.TRANSFORM = L.DomUtil.testProp(
+			['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']);
+
+
+	// webkitTransition comes first because some browser versions that drop vendor prefix don't do
+	// the same for the transitionend event, in particular the Android 4.1 stock browser
+
+	// @property TRANSITION: String
+	// Vendor-prefixed transform style name.
+	var transition = L.DomUtil.TRANSITION = L.DomUtil.testProp(
+			['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);
+
+	L.DomUtil.TRANSITION_END =
+			transition === 'webkitTransition' || transition === 'OTransition' ? transition + 'End' : 'transitionend';
+
+	// @function disableTextSelection()
+	// Prevents the user from generating `selectstart` DOM events, usually generated
+	// when the user drags the mouse through a page with text. Used internally
+	// by Leaflet to override the behaviour of any click-and-drag interaction on
+	// the map. Affects drag interactions on the whole document.
+
+	// @function enableTextSelection()
+	// Cancels the effects of a previous [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection).
+	if ('onselectstart' in document) {
+		L.DomUtil.disableTextSelection = function () {
+			L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);
+		};
+		L.DomUtil.enableTextSelection = function () {
+			L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);
+		};
+
+	} else {
+		var userSelectProperty = L.DomUtil.testProp(
+			['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);
+
+		L.DomUtil.disableTextSelection = function () {
+			if (userSelectProperty) {
+				var style = document.documentElement.style;
+				this._userSelect = style[userSelectProperty];
+				style[userSelectProperty] = 'none';
+			}
+		};
+		L.DomUtil.enableTextSelection = function () {
+			if (userSelectProperty) {
+				document.documentElement.style[userSelectProperty] = this._userSelect;
+				delete this._userSelect;
+			}
+		};
+	}
+
+	// @function disableImageDrag()
+	// As [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection), but
+	// for `dragstart` DOM events, usually generated when the user drags an image.
+	L.DomUtil.disableImageDrag = function () {
+		L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault);
+	};
+
+	// @function enableImageDrag()
+	// Cancels the effects of a previous [`L.DomUtil.disableImageDrag`](#domutil-disabletextselection).
+	L.DomUtil.enableImageDrag = function () {
+		L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault);
+	};
+
+	// @function preventOutline(el: HTMLElement)
+	// Makes the [outline](https://developer.mozilla.org/docs/Web/CSS/outline)
+	// of the element `el` invisible. Used internally by Leaflet to prevent
+	// focusable elements from displaying an outline when the user performs a
+	// drag interaction on them.
+	L.DomUtil.preventOutline = function (element) {
+		while (element.tabIndex === -1) {
+			element = element.parentNode;
+		}
+		if (!element || !element.style) { return; }
+		L.DomUtil.restoreOutline();
+		this._outlineElement = element;
+		this._outlineStyle = element.style.outline;
+		element.style.outline = 'none';
+		L.DomEvent.on(window, 'keydown', L.DomUtil.restoreOutline, this);
+	};
+
+	// @function restoreOutline()
+	// Cancels the effects of a previous [`L.DomUtil.preventOutline`]().
+	L.DomUtil.restoreOutline = function () {
+		if (!this._outlineElement) { return; }
+		this._outlineElement.style.outline = this._outlineStyle;
+		delete this._outlineElement;
+		delete this._outlineStyle;
+		L.DomEvent.off(window, 'keydown', L.DomUtil.restoreOutline, this);
+	};
+})();
+
+
+
+/* @class LatLng
+ * @aka L.LatLng
+ *
+ * Represents a geographical point with a certain latitude and longitude.
+ *
+ * @example
+ *
+ * ```
+ * var latlng = L.latLng(50.5, 30.5);
+ * ```
+ *
+ * All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:
+ *
+ * ```
+ * map.panTo([50, 30]);
+ * map.panTo({lon: 30, lat: 50});
+ * map.panTo({lat: 50, lng: 30});
+ * map.panTo(L.latLng(50, 30));
+ * ```
+ */
+
+L.LatLng = function (lat, lng, alt) {
+	if (isNaN(lat) || isNaN(lng)) {
+		throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');
+	}
+
+	// @property lat: Number
+	// Latitude in degrees
+	this.lat = +lat;
+
+	// @property lng: Number
+	// Longitude in degrees
+	this.lng = +lng;
+
+	// @property alt: Number
+	// Altitude in meters (optional)
+	if (alt !== undefined) {
+		this.alt = +alt;
+	}
+};
+
+L.LatLng.prototype = {
+	// @method equals(otherLatLng: LatLng, maxMargin?: Number): Boolean
+	// Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overriden by setting `maxMargin` to a small number.
+	equals: function (obj, maxMargin) {
+		if (!obj) { return false; }
+
+		obj = L.latLng(obj);
+
+		var margin = Math.max(
+		        Math.abs(this.lat - obj.lat),
+		        Math.abs(this.lng - obj.lng));
+
+		return margin <= (maxMargin === undefined ? 1.0E-9 : maxMargin);
+	},
+
+	// @method toString(): String
+	// Returns a string representation of the point (for debugging purposes).
+	toString: function (precision) {
+		return 'LatLng(' +
+		        L.Util.formatNum(this.lat, precision) + ', ' +
+		        L.Util.formatNum(this.lng, precision) + ')';
+	},
+
+	// @method distanceTo(otherLatLng: LatLng): Number
+	// Returns the distance (in meters) to the given `LatLng` calculated using the [Haversine formula](http://en.wikipedia.org/wiki/Haversine_formula).
+	distanceTo: function (other) {
+		return L.CRS.Earth.distance(this, L.latLng(other));
+	},
+
+	// @method wrap(): LatLng
+	// Returns a new `LatLng` object with the longitude wrapped so it's always between -180 and +180 degrees.
+	wrap: function () {
+		return L.CRS.Earth.wrapLatLng(this);
+	},
+
+	// @method toBounds(sizeInMeters: Number): LatLngBounds
+	// Returns a new `LatLngBounds` object in which each boundary is `sizeInMeters/2` meters apart from the `LatLng`.
+	toBounds: function (sizeInMeters) {
+		var latAccuracy = 180 * sizeInMeters / 40075017,
+		    lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat);
+
+		return L.latLngBounds(
+		        [this.lat - latAccuracy, this.lng - lngAccuracy],
+		        [this.lat + latAccuracy, this.lng + lngAccuracy]);
+	},
+
+	clone: function () {
+		return new L.LatLng(this.lat, this.lng, this.alt);
+	}
+};
+
+
+
+// @factory L.latLng(latitude: Number, longitude: Number, altitude?: Number): LatLng
+// Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
+
+// @alternative
+// @factory L.latLng(coords: Array): LatLng
+// Expects an array of the form `[Number, Number]` or `[Number, Number, Number]` instead.
+
+// @alternative
+// @factory L.latLng(coords: Object): LatLng
+// Expects an plain object of the form `{lat: Number, lng: Number}` or `{lat: Number, lng: Number, alt: Number}` instead.
+
+L.latLng = function (a, b, c) {
+	if (a instanceof L.LatLng) {
+		return a;
+	}
+	if (L.Util.isArray(a) && typeof a[0] !== 'object') {
+		if (a.length === 3) {
+			return new L.LatLng(a[0], a[1], a[2]);
+		}
+		if (a.length === 2) {
+			return new L.LatLng(a[0], a[1]);
+		}
+		return null;
+	}
+	if (a === undefined || a === null) {
+		return a;
+	}
+	if (typeof a === 'object' && 'lat' in a) {
+		return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);
+	}
+	if (b === undefined) {
+		return null;
+	}
+	return new L.LatLng(a, b, c);
+};
+
+
+
+/*
+ * @class LatLngBounds
+ * @aka L.LatLngBounds
+ *
+ * Represents a rectangular geographical area on a map.
+ *
+ * @example
+ *
+ * ```js
+ * var corner1 = L.latLng(40.712, -74.227),
+ * corner2 = L.latLng(40.774, -74.125),
+ * bounds = L.latLngBounds(corner1, corner2);
+ * ```
+ *
+ * All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:
+ *
+ * ```js
+ * map.fitBounds([
+ * 	[40.712, -74.227],
+ * 	[40.774, -74.125]
+ * ]);
+ * ```
+ *
+ * Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range.
+ */
+
+L.LatLngBounds = function (corner1, corner2) { // (LatLng, LatLng) or (LatLng[])
+	if (!corner1) { return; }
+
+	var latlngs = corner2 ? [corner1, corner2] : corner1;
+
+	for (var i = 0, len = latlngs.length; i < len; i++) {
+		this.extend(latlngs[i]);
+	}
+};
+
+L.LatLngBounds.prototype = {
+
+	// @method extend(latlng: LatLng): this
+	// Extend the bounds to contain the given point
+
+	// @alternative
+	// @method extend(otherBounds: LatLngBounds): this
+	// Extend the bounds to contain the given bounds
+	extend: function (obj) {
+		var sw = this._southWest,
+		    ne = this._northEast,
+		    sw2, ne2;
+
+		if (obj instanceof L.LatLng) {
+			sw2 = obj;
+			ne2 = obj;
+
+		} else if (obj instanceof L.LatLngBounds) {
+			sw2 = obj._southWest;
+			ne2 = obj._northEast;
+
+			if (!sw2 || !ne2) { return this; }
+
+		} else {
+			return obj ? this.extend(L.latLng(obj) || L.latLngBounds(obj)) : this;
+		}
+
+		if (!sw && !ne) {
+			this._southWest = new L.LatLng(sw2.lat, sw2.lng);
+			this._northEast = new L.LatLng(ne2.lat, ne2.lng);
+		} else {
+			sw.lat = Math.min(sw2.lat, sw.lat);
+			sw.lng = Math.min(sw2.lng, sw.lng);
+			ne.lat = Math.max(ne2.lat, ne.lat);
+			ne.lng = Math.max(ne2.lng, ne.lng);
+		}
+
+		return this;
+	},
+
+	// @method pad(bufferRatio: Number): LatLngBounds
+	// Returns bigger bounds created by extending the current bounds by a given percentage in each direction.
+	pad: function (bufferRatio) {
+		var sw = this._southWest,
+		    ne = this._northEast,
+		    heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,
+		    widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;
+
+		return new L.LatLngBounds(
+		        new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),
+		        new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));
+	},
+
+	// @method getCenter(): LatLng
+	// Returns the center point of the bounds.
+	getCenter: function () {
+		return new L.LatLng(
+		        (this._southWest.lat + this._northEast.lat) / 2,
+		        (this._southWest.lng + this._northEast.lng) / 2);
+	},
+
+	// @method getSouthWest(): LatLng
+	// Returns the south-west point of the bounds.
+	getSouthWest: function () {
+		return this._southWest;
+	},
+
+	// @method getNorthEast(): LatLng
+	// Returns the north-east point of the bounds.
+	getNorthEast: function () {
+		return this._northEast;
+	},
+
+	// @method getNorthWest(): LatLng
+	// Returns the north-west point of the bounds.
+	getNorthWest: function () {
+		return new L.LatLng(this.getNorth(), this.getWest());
+	},
+
+	// @method getSouthEast(): LatLng
+	// Returns the south-east point of the bounds.
+	getSouthEast: function () {
+		return new L.LatLng(this.getSouth(), this.getEast());
+	},
+
+	// @method getWest(): Number
+	// Returns the west longitude of the bounds
+	getWest: function () {
+		return this._southWest.lng;
+	},
+
+	// @method getSouth(): Number
+	// Returns the south latitude of the bounds
+	getSouth: function () {
+		return this._southWest.lat;
+	},
+
+	// @method getEast(): Number
+	// Returns the east longitude of the bounds
+	getEast: function () {
+		return this._northEast.lng;
+	},
+
+	// @method getNorth(): Number
+	// Returns the north latitude of the bounds
+	getNorth: function () {
+		return this._northEast.lat;
+	},
+
+	// @method contains(otherBounds: LatLngBounds): Boolean
+	// Returns `true` if the rectangle contains the given one.
+
+	// @alternative
+	// @method contains (latlng: LatLng): Boolean
+	// Returns `true` if the rectangle contains the given point.
+	contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean
+		if (typeof obj[0] === 'number' || obj instanceof L.LatLng || 'lat' in obj) {
+			obj = L.latLng(obj);
+		} else {
+			obj = L.latLngBounds(obj);
+		}
+
+		var sw = this._southWest,
+		    ne = this._northEast,
+		    sw2, ne2;
+
+		if (obj instanceof L.LatLngBounds) {
+			sw2 = obj.getSouthWest();
+			ne2 = obj.getNorthEast();
+		} else {
+			sw2 = ne2 = obj;
+		}
+
+		return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&
+		       (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);
+	},
+
+	// @method intersects(otherBounds: LatLngBounds): Boolean
+	// Returns `true` if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.
+	intersects: function (bounds) {
+		bounds = L.latLngBounds(bounds);
+
+		var sw = this._southWest,
+		    ne = this._northEast,
+		    sw2 = bounds.getSouthWest(),
+		    ne2 = bounds.getNorthEast(),
+
+		    latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),
+		    lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);
+
+		return latIntersects && lngIntersects;
+	},
+
+	// @method overlaps(otherBounds: Bounds): Boolean
+	// Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.
+	overlaps: function (bounds) {
+		bounds = L.latLngBounds(bounds);
+
+		var sw = this._southWest,
+		    ne = this._northEast,
+		    sw2 = bounds.getSouthWest(),
+		    ne2 = bounds.getNorthEast(),
+
+		    latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat),
+		    lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng);
+
+		return latOverlaps && lngOverlaps;
+	},
+
+	// @method toBBoxString(): String
+	// Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.
+	toBBoxString: function () {
+		return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');
+	},
+
+	// @method equals(otherBounds: LatLngBounds): Boolean
+	// Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds.
+	equals: function (bounds) {
+		if (!bounds) { return false; }
+
+		bounds = L.latLngBounds(bounds);
+
+		return this._southWest.equals(bounds.getSouthWest()) &&
+		       this._northEast.equals(bounds.getNorthEast());
+	},
+
+	// @method isValid(): Boolean
+	// Returns `true` if the bounds are properly initialized.
+	isValid: function () {
+		return !!(this._southWest && this._northEast);
+	}
+};
+
+// TODO International date line?
+
+// @factory L.latLngBounds(corner1: LatLng, corner2: LatLng)
+// Creates a `LatLngBounds` object by defining two diagonally opposite corners of the rectangle.
+
+// @alternative
+// @factory L.latLngBounds(latlngs: LatLng[])
+// Creates a `LatLngBounds` object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with [`fitBounds`](#map-fitbounds).
+L.latLngBounds = function (a, b) {
+	if (a instanceof L.LatLngBounds) {
+		return a;
+	}
+	return new L.LatLngBounds(a, b);
+};
+
+
+
+/*
+ * @namespace Projection
+ * @section
+ * Leaflet comes with a set of already defined Projections out of the box:
+ *
+ * @projection L.Projection.LonLat
+ *
+ * Equirectangular, or Plate Carree projection — the most simple projection,
+ * mostly used by GIS enthusiasts. Directly maps `x` as longitude, and `y` as
+ * latitude. Also suitable for flat worlds, e.g. game maps. Used by the
+ * `EPSG:3395` and `Simple` CRS.
+ */
+
+L.Projection = {};
+
+L.Projection.LonLat = {
+	project: function (latlng) {
+		return new L.Point(latlng.lng, latlng.lat);
+	},
+
+	unproject: function (point) {
+		return new L.LatLng(point.y, point.x);
+	},
+
+	bounds: L.bounds([-180, -90], [180, 90])
+};
+
+
+
+/*
+ * @namespace Projection
+ * @projection L.Projection.SphericalMercator
+ *
+ * Spherical Mercator projection — the most common projection for online maps,
+ * used by almost all free and commercial tile providers. Assumes that Earth is
+ * a sphere. Used by the `EPSG:3857` CRS.
+ */
+
+L.Projection.SphericalMercator = {
+
+	R: 6378137,
+	MAX_LATITUDE: 85.0511287798,
+
+	project: function (latlng) {
+		var d = Math.PI / 180,
+		    max = this.MAX_LATITUDE,
+		    lat = Math.max(Math.min(max, latlng.lat), -max),
+		    sin = Math.sin(lat * d);
+
+		return new L.Point(
+				this.R * latlng.lng * d,
+				this.R * Math.log((1 + sin) / (1 - sin)) / 2);
+	},
+
+	unproject: function (point) {
+		var d = 180 / Math.PI;
+
+		return new L.LatLng(
+			(2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d,
+			point.x * d / this.R);
+	},
+
+	bounds: (function () {
+		var d = 6378137 * Math.PI;
+		return L.bounds([-d, -d], [d, d]);
+	})()
+};
+
+
+
+/*
+ * @class CRS
+ * @aka L.CRS
+ * Abstract class that defines coordinate reference systems for projecting
+ * geographical points into pixel (screen) coordinates and back (and to
+ * coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See
+ * [spatial reference system](http://en.wikipedia.org/wiki/Coordinate_reference_system).
+ *
+ * Leaflet defines the most usual CRSs by default. If you want to use a
+ * CRS not defined by default, take a look at the
+ * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin.
+ */
+
+L.CRS = {
+	// @method latLngToPoint(latlng: LatLng, zoom: Number): Point
+	// Projects geographical coordinates into pixel coordinates for a given zoom.
+	latLngToPoint: function (latlng, zoom) {
+		var projectedPoint = this.projection.project(latlng),
+		    scale = this.scale(zoom);
+
+		return this.transformation._transform(projectedPoint, scale);
+	},
+
+	// @method pointToLatLng(point: Point, zoom: Number): LatLng
+	// The inverse of `latLngToPoint`. Projects pixel coordinates on a given
+	// zoom into geographical coordinates.
+	pointToLatLng: function (point, zoom) {
+		var scale = this.scale(zoom),
+		    untransformedPoint = this.transformation.untransform(point, scale);
+
+		return this.projection.unproject(untransformedPoint);
+	},
+
+	// @method project(latlng: LatLng): Point
+	// Projects geographical coordinates into coordinates in units accepted for
+	// this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).
+	project: function (latlng) {
+		return this.projection.project(latlng);
+	},
+
+	// @method unproject(point: Point): LatLng
+	// Given a projected coordinate returns the corresponding LatLng.
+	// The inverse of `project`.
+	unproject: function (point) {
+		return this.projection.unproject(point);
+	},
+
+	// @method scale(zoom: Number): Number
+	// Returns the scale used when transforming projected coordinates into
+	// pixel coordinates for a particular zoom. For example, it returns
+	// `256 * 2^zoom` for Mercator-based CRS.
+	scale: function (zoom) {
+		return 256 * Math.pow(2, zoom);
+	},
+
+	// @method zoom(scale: Number): Number
+	// Inverse of `scale()`, returns the zoom level corresponding to a scale
+	// factor of `scale`.
+	zoom: function (scale) {
+		return Math.log(scale / 256) / Math.LN2;
+	},
+
+	// @method getProjectedBounds(zoom: Number): Bounds
+	// Returns the projection's bounds scaled and transformed for the provided `zoom`.
+	getProjectedBounds: function (zoom) {
+		if (this.infinite) { return null; }
+
+		var b = this.projection.bounds,
+		    s = this.scale(zoom),
+		    min = this.transformation.transform(b.min, s),
+		    max = this.transformation.transform(b.max, s);
+
+		return L.bounds(min, max);
+	},
+
+	// @method distance(latlng1: LatLng, latlng2: LatLng): Number
+	// Returns the distance between two geographical coordinates.
+
+	// @property code: String
+	// Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`)
+	//
+	// @property wrapLng: Number[]
+	// An array of two numbers defining whether the longitude (horizontal) coordinate
+	// axis wraps around a given range and how. Defaults to `[-180, 180]` in most
+	// geographical CRSs. If `undefined`, the longitude axis does not wrap around.
+	//
+	// @property wrapLat: Number[]
+	// Like `wrapLng`, but for the latitude (vertical) axis.
+
+	// wrapLng: [min, max],
+	// wrapLat: [min, max],
+
+	// @property infinite: Boolean
+	// If true, the coordinate space will be unbounded (infinite in both axes)
+	infinite: false,
+
+	// @method wrapLatLng(latlng: LatLng): LatLng
+	// Returns a `LatLng` where lat and lng has been wrapped according to the
+	// CRS's `wrapLat` and `wrapLng` properties, if they are outside the CRS's bounds.
+	// Only accepts actual `L.LatLng` instances, not arrays.
+	wrapLatLng: function (latlng) {
+		var lng = this.wrapLng ? L.Util.wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng,
+		    lat = this.wrapLat ? L.Util.wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat,
+		    alt = latlng.alt;
+
+		return L.latLng(lat, lng, alt);
+	},
+
+	// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds
+	// Returns a `LatLngBounds` with the same size as the given one, ensuring
+	// that its center is within the CRS's bounds.
+	// Only accepts actual `L.LatLngBounds` instances, not arrays.
+	wrapLatLngBounds: function (bounds) {
+		var center = bounds.getCenter(),
+		    newCenter = this.wrapLatLng(center),
+		    latShift = center.lat - newCenter.lat,
+		    lngShift = center.lng - newCenter.lng;
+
+		if (latShift === 0 && lngShift === 0) {
+			return bounds;
+		}
+
+		var sw = bounds.getSouthWest(),
+		    ne = bounds.getNorthEast(),
+		    newSw = L.latLng({lat: sw.lat - latShift, lng: sw.lng - lngShift}),
+		    newNe = L.latLng({lat: ne.lat - latShift, lng: ne.lng - lngShift});
+
+		return new L.LatLngBounds(newSw, newNe);
+	}
+};
+
+
+
+/*
+ * @namespace CRS
+ * @crs L.CRS.Simple
+ *
+ * A simple CRS that maps longitude and latitude into `x` and `y` directly.
+ * May be used for maps of flat surfaces (e.g. game maps). Note that the `y`
+ * axis should still be inverted (going from bottom to top). `distance()` returns
+ * simple euclidean distance.
+ */
+
+L.CRS.Simple = L.extend({}, L.CRS, {
+	projection: L.Projection.LonLat,
+	transformation: new L.Transformation(1, 0, -1, 0),
+
+	scale: function (zoom) {
+		return Math.pow(2, zoom);
+	},
+
+	zoom: function (scale) {
+		return Math.log(scale) / Math.LN2;
+	},
+
+	distance: function (latlng1, latlng2) {
+		var dx = latlng2.lng - latlng1.lng,
+		    dy = latlng2.lat - latlng1.lat;
+
+		return Math.sqrt(dx * dx + dy * dy);
+	},
+
+	infinite: true
+});
+
+
+
+/*
+ * @namespace CRS
+ * @crs L.CRS.Earth
+ *
+ * Serves as the base for CRS that are global such that they cover the earth.
+ * Can only be used as the base for other CRS and cannot be used directly,
+ * since it does not have a `code`, `projection` or `transformation`. `distance()` returns
+ * meters.
+ */
+
+L.CRS.Earth = L.extend({}, L.CRS, {
+	wrapLng: [-180, 180],
+
+	// Mean Earth Radius, as recommended for use by
+	// the International Union of Geodesy and Geophysics,
+	// see http://rosettacode.org/wiki/Haversine_formula
+	R: 6371000,
+
+	// distance between two geographical points using spherical law of cosines approximation
+	distance: function (latlng1, latlng2) {
+		var rad = Math.PI / 180,
+		    lat1 = latlng1.lat * rad,
+		    lat2 = latlng2.lat * rad,
+		    a = Math.sin(lat1) * Math.sin(lat2) +
+		        Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad);
+
+		return this.R * Math.acos(Math.min(a, 1));
+	}
+});
+
+
+
+/*
+ * @namespace CRS
+ * @crs L.CRS.EPSG3857
+ *
+ * The most common CRS for online maps, used by almost all free and commercial
+ * tile providers. Uses Spherical Mercator projection. Set in by default in
+ * Map's `crs` option.
+ */
+
+L.CRS.EPSG3857 = L.extend({}, L.CRS.Earth, {
+	code: 'EPSG:3857',
+	projection: L.Projection.SphericalMercator,
+
+	transformation: (function () {
+		var scale = 0.5 / (Math.PI * L.Projection.SphericalMercator.R);
+		return new L.Transformation(scale, 0.5, -scale, 0.5);
+	}())
+});
+
+L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, {
+	code: 'EPSG:900913'
+});
+
+
+
+/*
+ * @namespace CRS
+ * @crs L.CRS.EPSG4326
+ *
+ * A common CRS among GIS enthusiasts. Uses simple Equirectangular projection.
+ *
+ * Leaflet 1.0.x complies with the [TMS coordinate scheme for EPSG:4326](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#global-geodetic),
+ * which is a breaking change from 0.7.x behaviour.  If you are using a `TileLayer`
+ * with this CRS, ensure that there are two 256x256 pixel tiles covering the
+ * whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90),
+ * or (-180,-90) for `TileLayer`s with [the `tms` option](#tilelayer-tms) set.
+ */
+
+L.CRS.EPSG4326 = L.extend({}, L.CRS.Earth, {
+	code: 'EPSG:4326',
+	projection: L.Projection.LonLat,
+	transformation: new L.Transformation(1 / 180, 1, -1 / 180, 0.5)
+});
+
+
+
+/*
+ * @class Map
+ * @aka L.Map
+ * @inherits Evented
+ *
+ * The central class of the API — it is used to create a map on a page and manipulate it.
+ *
+ * @example
+ *
+ * ```js
+ * // initialize the map on the "map" div with a given center and zoom
+ * var map = L.map('map', {
+ * 	center: [51.505, -0.09],
+ * 	zoom: 13
+ * });
+ * ```
+ *
+ */
+
+L.Map = L.Evented.extend({
+
+	options: {
+		// @section Map State Options
+		// @option crs: CRS = L.CRS.EPSG3857
+		// The [Coordinate Reference System](#crs) to use. Don't change this if you're not
+		// sure what it means.
+		crs: L.CRS.EPSG3857,
+
+		// @option center: LatLng = undefined
+		// Initial geographic center of the map
+		center: undefined,
+
+		// @option zoom: Number = undefined
+		// Initial map zoom level
+		zoom: undefined,
+
+		// @option minZoom: Number = undefined
+		// Minimum zoom level of the map. Overrides any `minZoom` option set on map layers.
+		minZoom: undefined,
+
+		// @option maxZoom: Number = undefined
+		// Maximum zoom level of the map. Overrides any `maxZoom` option set on map layers.
+		maxZoom: undefined,
+
+		// @option layers: Layer[] = []
+		// Array of layers that will be added to the map initially
+		layers: [],
+
+		// @option maxBounds: LatLngBounds = null
+		// When this option is set, the map restricts the view to the given
+		// geographical bounds, bouncing the user back if the user tries to pan
+		// outside the view. To set the restriction dynamically, use
+		// [`setMaxBounds`](#map-setmaxbounds) method.
+		maxBounds: undefined,
+
+		// @option renderer: Renderer = *
+		// The default method for drawing vector layers on the map. `L.SVG`
+		// or `L.Canvas` by default depending on browser support.
+		renderer: undefined,
+
+
+		// @section Animation Options
+		// @option zoomAnimation: Boolean = true
+		// Whether the map zoom animation is enabled. By default it's enabled
+		// in all browsers that support CSS3 Transitions except Android.
+		zoomAnimation: true,
+
+		// @option zoomAnimationThreshold: Number = 4
+		// Won't animate zoom if the zoom difference exceeds this value.
+		zoomAnimationThreshold: 4,
+
+		// @option fadeAnimation: Boolean = true
+		// Whether the tile fade animation is enabled. By default it's enabled
+		// in all browsers that support CSS3 Transitions except Android.
+		fadeAnimation: true,
+
+		// @option markerZoomAnimation: Boolean = true
+		// Whether markers animate their zoom with the zoom animation, if disabled
+		// they will disappear for the length of the animation. By default it's
+		// enabled in all browsers that support CSS3 Transitions except Android.
+		markerZoomAnimation: true,
+
+		// @option transform3DLimit: Number = 2^23
+		// Defines the maximum size of a CSS translation transform. The default
+		// value should not be changed unless a web browser positions layers in
+		// the wrong place after doing a large `panBy`.
+		transform3DLimit: 8388608, // Precision limit of a 32-bit float
+
+		// @section Interaction Options
+		// @option zoomSnap: Number = 1
+		// Forces the map's zoom level to always be a multiple of this, particularly
+		// right after a [`fitBounds()`](#map-fitbounds) or a pinch-zoom.
+		// By default, the zoom level snaps to the nearest integer; lower values
+		// (e.g. `0.5` or `0.1`) allow for greater granularity. A value of `0`
+		// means the zoom level will not be snapped after `fitBounds` or a pinch-zoom.
+		zoomSnap: 1,
+
+		// @option zoomDelta: Number = 1
+		// Controls how much the map's zoom level will change after a
+		// [`zoomIn()`](#map-zoomin), [`zoomOut()`](#map-zoomout), pressing `+`
+		// or `-` on the keyboard, or using the [zoom controls](#control-zoom).
+		// Values smaller than `1` (e.g. `0.5`) allow for greater granularity.
+		zoomDelta: 1,
+
+		// @option trackResize: Boolean = true
+		// Whether the map automatically handles browser window resize to update itself.
+		trackResize: true
+	},
+
+	initialize: function (id, options) { // (HTMLElement or String, Object)
+		options = L.setOptions(this, options);
+
+		this._initContainer(id);
+		this._initLayout();
+
+		// hack for https://github.com/Leaflet/Leaflet/issues/1980
+		this._onResize = L.bind(this._onResize, this);
+
+		this._initEvents();
+
+		if (options.maxBounds) {
+			this.setMaxBounds(options.maxBounds);
+		}
+
+		if (options.zoom !== undefined) {
+			this._zoom = this._limitZoom(options.zoom);
+		}
+
+		if (options.center && options.zoom !== undefined) {
+			this.setView(L.latLng(options.center), options.zoom, {reset: true});
+		}
+
+		this._handlers = [];
+		this._layers = {};
+		this._zoomBoundLayers = {};
+		this._sizeChanged = true;
+
+		this.callInitHooks();
+
+		// don't animate on browsers without hardware-accelerated transitions or old Android/Opera
+		this._zoomAnimated = L.DomUtil.TRANSITION && L.Browser.any3d && !L.Browser.mobileOpera &&
+				this.options.zoomAnimation;
+
+		// zoom transitions run with the same duration for all layers, so if one of transitionend events
+		// happens after starting zoom animation (propagating to the map pane), we know that it ended globally
+		if (this._zoomAnimated) {
+			this._createAnimProxy();
+			L.DomEvent.on(this._proxy, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this);
+		}
+
+		this._addLayers(this.options.layers);
+	},
+
+
+	// @section Methods for modifying map state
+
+	// @method setView(center: LatLng, zoom: Number, options?: Zoom/pan options): this
+	// Sets the view of the map (geographical center and zoom) with the given
+	// animation options.
+	setView: function (center, zoom, options) {
+
+		zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);
+		center = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds);
+		options = options || {};
+
+		this._stop();
+
+		if (this._loaded && !options.reset && options !== true) {
+
+			if (options.animate !== undefined) {
+				options.zoom = L.extend({animate: options.animate}, options.zoom);
+				options.pan = L.extend({animate: options.animate, duration: options.duration}, options.pan);
+			}
+
+			// try animating pan or zoom
+			var moved = (this._zoom !== zoom) ?
+				this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :
+				this._tryAnimatedPan(center, options.pan);
+
+			if (moved) {
+				// prevent resize handler call, the view will refresh after animation anyway
+				clearTimeout(this._sizeTimer);
+				return this;
+			}
+		}
+
+		// animation didn't start, just reset the map view
+		this._resetView(center, zoom);
+
+		return this;
+	},
+
+	// @method setZoom(zoom: Number, options: Zoom/pan options): this
+	// Sets the zoom of the map.
+	setZoom: function (zoom, options) {
+		if (!this._loaded) {
+			this._zoom = zoom;
+			return this;
+		}
+		return this.setView(this.getCenter(), zoom, {zoom: options});
+	},
+
+	// @method zoomIn(delta?: Number, options?: Zoom options): this
+	// Increases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).
+	zoomIn: function (delta, options) {
+		delta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1);
+		return this.setZoom(this._zoom + delta, options);
+	},
+
+	// @method zoomOut(delta?: Number, options?: Zoom options): this
+	// Decreases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).
+	zoomOut: function (delta, options) {
+		delta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1);
+		return this.setZoom(this._zoom - delta, options);
+	},
+
+	// @method setZoomAround(latlng: LatLng, zoom: Number, options: Zoom options): this
+	// Zooms the map while keeping a specified geographical point on the map
+	// stationary (e.g. used internally for scroll zoom and double-click zoom).
+	// @alternative
+	// @method setZoomAround(offset: Point, zoom: Number, options: Zoom options): this
+	// Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.
+	setZoomAround: function (latlng, zoom, options) {
+		var scale = this.getZoomScale(zoom),
+		    viewHalf = this.getSize().divideBy(2),
+		    containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),
+
+		    centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),
+		    newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));
+
+		return this.setView(newCenter, zoom, {zoom: options});
+	},
+
+	_getBoundsCenterZoom: function (bounds, options) {
+
+		options = options || {};
+		bounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds);
+
+		var paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]),
+		    paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]),
+
+		    zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR));
+
+		zoom = (typeof options.maxZoom === 'number') ? Math.min(options.maxZoom, zoom) : zoom;
+
+		var paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),
+
+		    swPoint = this.project(bounds.getSouthWest(), zoom),
+		    nePoint = this.project(bounds.getNorthEast(), zoom),
+		    center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);
+
+		return {
+			center: center,
+			zoom: zoom
+		};
+	},
+
+	// @method fitBounds(bounds: LatLngBounds, options?: fitBounds options): this
+	// Sets a map view that contains the given geographical bounds with the
+	// maximum zoom level possible.
+	fitBounds: function (bounds, options) {
+
+		bounds = L.latLngBounds(bounds);
+
+		if (!bounds.isValid()) {
+			throw new Error('Bounds are not valid.');
+		}
+
+		var target = this._getBoundsCenterZoom(bounds, options);
+		return this.setView(target.center, target.zoom, options);
+	},
+
+	// @method fitWorld(options?: fitBounds options): this
+	// Sets a map view that mostly contains the whole world with the maximum
+	// zoom level possible.
+	fitWorld: function (options) {
+		return this.fitBounds([[-90, -180], [90, 180]], options);
+	},
+
+	// @method panTo(latlng: LatLng, options?: Pan options): this
+	// Pans the map to a given center.
+	panTo: function (center, options) { // (LatLng)
+		return this.setView(center, this._zoom, {pan: options});
+	},
+
+	// @method panBy(offset: Point): this
+	// Pans the map by a given number of pixels (animated).
+	panBy: function (offset, options) {
+		offset = L.point(offset).round();
+		options = options || {};
+
+		if (!offset.x && !offset.y) {
+			return this.fire('moveend');
+		}
+		// If we pan too far, Chrome gets issues with tiles
+		// and makes them disappear or appear in the wrong place (slightly offset) #2602
+		if (options.animate !== true && !this.getSize().contains(offset)) {
+			this._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom());
+			return this;
+		}
+
+		if (!this._panAnim) {
+			this._panAnim = new L.PosAnimation();
+
+			this._panAnim.on({
+				'step': this._onPanTransitionStep,
+				'end': this._onPanTransitionEnd
+			}, this);
+		}
+
+		// don't fire movestart if animating inertia
+		if (!options.noMoveStart) {
+			this.fire('movestart');
+		}
+
+		// animate pan unless animate: false specified
+		if (options.animate !== false) {
+			L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim');
+
+			var newPos = this._getMapPanePos().subtract(offset).round();
+			this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);
+		} else {
+			this._rawPanBy(offset);
+			this.fire('move').fire('moveend');
+		}
+
+		return this;
+	},
+
+	// @method flyTo(latlng: LatLng, zoom?: Number, options?: Zoom/pan options): this
+	// Sets the view of the map (geographical center and zoom) performing a smooth
+	// pan-zoom animation.
+	flyTo: function (targetCenter, targetZoom, options) {
+
+		options = options || {};
+		if (options.animate === false || !L.Browser.any3d) {
+			return this.setView(targetCenter, targetZoom, options);
+		}
+
+		this._stop();
+
+		var from = this.project(this.getCenter()),
+		    to = this.project(targetCenter),
+		    size = this.getSize(),
+		    startZoom = this._zoom;
+
+		targetCenter = L.latLng(targetCenter);
+		targetZoom = targetZoom === undefined ? startZoom : targetZoom;
+
+		var w0 = Math.max(size.x, size.y),
+		    w1 = w0 * this.getZoomScale(startZoom, targetZoom),
+		    u1 = (to.distanceTo(from)) || 1,
+		    rho = 1.42,
+		    rho2 = rho * rho;
+
+		function r(i) {
+			var s1 = i ? -1 : 1,
+			    s2 = i ? w1 : w0,
+			    t1 = w1 * w1 - w0 * w0 + s1 * rho2 * rho2 * u1 * u1,
+			    b1 = 2 * s2 * rho2 * u1,
+			    b = t1 / b1,
+			    sq = Math.sqrt(b * b + 1) - b;
+
+			    // workaround for floating point precision bug when sq = 0, log = -Infinite,
+			    // thus triggering an infinite loop in flyTo
+			    var log = sq < 0.000000001 ? -18 : Math.log(sq);
+
+			return log;
+		}
+
+		function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }
+		function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }
+		function tanh(n) { return sinh(n) / cosh(n); }
+
+		var r0 = r(0);
+
+		function w(s) { return w0 * (cosh(r0) / cosh(r0 + rho * s)); }
+		function u(s) { return w0 * (cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2; }
+
+		function easeOut(t) { return 1 - Math.pow(1 - t, 1.5); }
+
+		var start = Date.now(),
+		    S = (r(1) - r0) / rho,
+		    duration = options.duration ? 1000 * options.duration : 1000 * S * 0.8;
+
+		function frame() {
+			var t = (Date.now() - start) / duration,
+			    s = easeOut(t) * S;
+
+			if (t <= 1) {
+				this._flyToFrame = L.Util.requestAnimFrame(frame, this);
+
+				this._move(
+					this.unproject(from.add(to.subtract(from).multiplyBy(u(s) / u1)), startZoom),
+					this.getScaleZoom(w0 / w(s), startZoom),
+					{flyTo: true});
+
+			} else {
+				this
+					._move(targetCenter, targetZoom)
+					._moveEnd(true);
+			}
+		}
+
+		this._moveStart(true);
+
+		frame.call(this);
+		return this;
+	},
+
+	// @method flyToBounds(bounds: LatLngBounds, options?: fitBounds options): this
+	// Sets the view of the map with a smooth animation like [`flyTo`](#map-flyto),
+	// but takes a bounds parameter like [`fitBounds`](#map-fitbounds).
+	flyToBounds: function (bounds, options) {
+		var target = this._getBoundsCenterZoom(bounds, options);
+		return this.flyTo(target.center, target.zoom, options);
+	},
+
+	// @method setMaxBounds(bounds: Bounds): this
+	// Restricts the map view to the given bounds (see the [maxBounds](#map-maxbounds) option).
+	setMaxBounds: function (bounds) {
+		bounds = L.latLngBounds(bounds);
+
+		if (!bounds.isValid()) {
+			this.options.maxBounds = null;
+			return this.off('moveend', this._panInsideMaxBounds);
+		} else if (this.options.maxBounds) {
+			this.off('moveend', this._panInsideMaxBounds);
+		}
+
+		this.options.maxBounds = bounds;
+
+		if (this._loaded) {
+			this._panInsideMaxBounds();
+		}
+
+		return this.on('moveend', this._panInsideMaxBounds);
+	},
+
+	// @method setMinZoom(zoom: Number): this
+	// Sets the lower limit for the available zoom levels (see the [minZoom](#map-minzoom) option).
+	setMinZoom: function (zoom) {
+		this.options.minZoom = zoom;
+
+		if (this._loaded && this.getZoom() < this.options.minZoom) {
+			return this.setZoom(zoom);
+		}
+
+		return this;
+	},
+
+	// @method setMaxZoom(zoom: Number): this
+	// Sets the upper limit for the available zoom levels (see the [maxZoom](#map-maxzoom) option).
+	setMaxZoom: function (zoom) {
+		this.options.maxZoom = zoom;
+
+		if (this._loaded && (this.getZoom() > this.options.maxZoom)) {
+			return this.setZoom(zoom);
+		}
+
+		return this;
+	},
+
+	// @method panInsideBounds(bounds: LatLngBounds, options?: Pan options): this
+	// Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.
+	panInsideBounds: function (bounds, options) {
+		this._enforcingBounds = true;
+		var center = this.getCenter(),
+		    newCenter = this._limitCenter(center, this._zoom, L.latLngBounds(bounds));
+
+		if (!center.equals(newCenter)) {
+			this.panTo(newCenter, options);
+		}
+
+		this._enforcingBounds = false;
+		return this;
+	},
+
+	// @method invalidateSize(options: Zoom/Pan options): this
+	// Checks if the map container size changed and updates the map if so —
+	// call it after you've changed the map size dynamically, also animating
+	// pan by default. If `options.pan` is `false`, panning will not occur.
+	// If `options.debounceMoveend` is `true`, it will delay `moveend` event so
+	// that it doesn't happen often even if the method is called many
+	// times in a row.
+
+	// @alternative
+	// @method invalidateSize(animate: Boolean): this
+	// Checks if the map container size changed and updates the map if so —
+	// call it after you've changed the map size dynamically, also animating
+	// pan by default.
+	invalidateSize: function (options) {
+		if (!this._loaded) { return this; }
+
+		options = L.extend({
+			animate: false,
+			pan: true
+		}, options === true ? {animate: true} : options);
+
+		var oldSize = this.getSize();
+		this._sizeChanged = true;
+		this._lastCenter = null;
+
+		var newSize = this.getSize(),
+		    oldCenter = oldSize.divideBy(2).round(),
+		    newCenter = newSize.divideBy(2).round(),
+		    offset = oldCenter.subtract(newCenter);
+
+		if (!offset.x && !offset.y) { return this; }
+
+		if (options.animate && options.pan) {
+			this.panBy(offset);
+
+		} else {
+			if (options.pan) {
+				this._rawPanBy(offset);
+			}
+
+			this.fire('move');
+
+			if (options.debounceMoveend) {
+				clearTimeout(this._sizeTimer);
+				this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);
+			} else {
+				this.fire('moveend');
+			}
+		}
+
+		// @section Map state change events
+		// @event resize: ResizeEvent
+		// Fired when the map is resized.
+		return this.fire('resize', {
+			oldSize: oldSize,
+			newSize: newSize
+		});
+	},
+
+	// @section Methods for modifying map state
+	// @method stop(): this
+	// Stops the currently running `panTo` or `flyTo` animation, if any.
+	stop: function () {
+		this.setZoom(this._limitZoom(this._zoom));
+		if (!this.options.zoomSnap) {
+			this.fire('viewreset');
+		}
+		return this._stop();
+	},
+
+	// @section Geolocation methods
+	// @method locate(options?: Locate options): this
+	// Tries to locate the user using the Geolocation API, firing a [`locationfound`](#map-locationfound)
+	// event with location data on success or a [`locationerror`](#map-locationerror) event on failure,
+	// and optionally sets the map view to the user's location with respect to
+	// detection accuracy (or to the world view if geolocation failed).
+	// Note that, if your page doesn't use HTTPS, this method will fail in
+	// modern browsers ([Chrome 50 and newer](https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins))
+	// See `Locate options` for more details.
+	locate: function (options) {
+
+		options = this._locateOptions = L.extend({
+			timeout: 10000,
+			watch: false
+			// setView: false
+			// maxZoom: <Number>
+			// maximumAge: 0
+			// enableHighAccuracy: false
+		}, options);
+
+		if (!('geolocation' in navigator)) {
+			this._handleGeolocationError({
+				code: 0,
+				message: 'Geolocation not supported.'
+			});
+			return this;
+		}
+
+		var onResponse = L.bind(this._handleGeolocationResponse, this),
+		    onError = L.bind(this._handleGeolocationError, this);
+
+		if (options.watch) {
+			this._locationWatchId =
+			        navigator.geolocation.watchPosition(onResponse, onError, options);
+		} else {
+			navigator.geolocation.getCurrentPosition(onResponse, onError, options);
+		}
+		return this;
+	},
+
+	// @method stopLocate(): this
+	// Stops watching location previously initiated by `map.locate({watch: true})`
+	// and aborts resetting the map view if map.locate was called with
+	// `{setView: true}`.
+	stopLocate: function () {
+		if (navigator.geolocation && navigator.geolocation.clearWatch) {
+			navigator.geolocation.clearWatch(this._locationWatchId);
+		}
+		if (this._locateOptions) {
+			this._locateOptions.setView = false;
+		}
+		return this;
+	},
+
+	_handleGeolocationError: function (error) {
+		var c = error.code,
+		    message = error.message ||
+		            (c === 1 ? 'permission denied' :
+		            (c === 2 ? 'position unavailable' : 'timeout'));
+
+		if (this._locateOptions.setView && !this._loaded) {
+			this.fitWorld();
+		}
+
+		// @section Location events
+		// @event locationerror: ErrorEvent
+		// Fired when geolocation (using the [`locate`](#map-locate) method) failed.
+		this.fire('locationerror', {
+			code: c,
+			message: 'Geolocation error: ' + message + '.'
+		});
+	},
+
+	_handleGeolocationResponse: function (pos) {
+		var lat = pos.coords.latitude,
+		    lng = pos.coords.longitude,
+		    latlng = new L.LatLng(lat, lng),
+		    bounds = latlng.toBounds(pos.coords.accuracy),
+		    options = this._locateOptions;
+
+		if (options.setView) {
+			var zoom = this.getBoundsZoom(bounds);
+			this.setView(latlng, options.maxZoom ? Math.min(zoom, options.maxZoom) : zoom);
+		}
+
+		var data = {
+			latlng: latlng,
+			bounds: bounds,
+			timestamp: pos.timestamp
+		};
+
+		for (var i in pos.coords) {
+			if (typeof pos.coords[i] === 'number') {
+				data[i] = pos.coords[i];
+			}
+		}
+
+		// @event locationfound: LocationEvent
+		// Fired when geolocation (using the [`locate`](#map-locate) method)
+		// went successfully.
+		this.fire('locationfound', data);
+	},
+
+	// TODO handler.addTo
+	// TODO Appropiate docs section?
+	// @section Other Methods
+	// @method addHandler(name: String, HandlerClass: Function): this
+	// Adds a new `Handler` to the map, given its name and constructor function.
+	addHandler: function (name, HandlerClass) {
+		if (!HandlerClass) { return this; }
+
+		var handler = this[name] = new HandlerClass(this);
+
+		this._handlers.push(handler);
+
+		if (this.options[name]) {
+			handler.enable();
+		}
+
+		return this;
+	},
+
+	// @method remove(): this
+	// Destroys the map and clears all related event listeners.
+	remove: function () {
+
+		this._initEvents(true);
+
+		if (this._containerId !== this._container._leaflet_id) {
+			throw new Error('Map container is being reused by another instance');
+		}
+
+		try {
+			// throws error in IE6-8
+			delete this._container._leaflet_id;
+			delete this._containerId;
+		} catch (e) {
+			/*eslint-disable */
+			this._container._leaflet_id = undefined;
+			/*eslint-enable */
+			this._containerId = undefined;
+		}
+
+		L.DomUtil.remove(this._mapPane);
+
+		if (this._clearControlPos) {
+			this._clearControlPos();
+		}
+
+		this._clearHandlers();
+
+		if (this._loaded) {
+			// @section Map state change events
+			// @event unload: Event
+			// Fired when the map is destroyed with [remove](#map-remove) method.
+			this.fire('unload');
+		}
+
+		for (var i in this._layers) {
+			this._layers[i].remove();
+		}
+
+		return this;
+	},
+
+	// @section Other Methods
+	// @method createPane(name: String, container?: HTMLElement): HTMLElement
+	// Creates a new [map pane](#map-pane) with the given name if it doesn't exist already,
+	// then returns it. The pane is created as a children of `container`, or
+	// as a children of the main map pane if not set.
+	createPane: function (name, container) {
+		var className = 'leaflet-pane' + (name ? ' leaflet-' + name.replace('Pane', '') + '-pane' : ''),
+		    pane = L.DomUtil.create('div', className, container || this._mapPane);
+
+		if (name) {
+			this._panes[name] = pane;
+		}
+		return pane;
+	},
+
+	// @section Methods for Getting Map State
+
+	// @method getCenter(): LatLng
+	// Returns the geographical center of the map view
+	getCenter: function () {
+		this._checkIfLoaded();
+
+		if (this._lastCenter && !this._moved()) {
+			return this._lastCenter;
+		}
+		return this.layerPointToLatLng(this._getCenterLayerPoint());
+	},
+
+	// @method getZoom(): Number
+	// Returns the current zoom level of the map view
+	getZoom: function () {
+		return this._zoom;
+	},
+
+	// @method getBounds(): LatLngBounds
+	// Returns the geographical bounds visible in the current map view
+	getBounds: function () {
+		var bounds = this.getPixelBounds(),
+		    sw = this.unproject(bounds.getBottomLeft()),
+		    ne = this.unproject(bounds.getTopRight());
+
+		return new L.LatLngBounds(sw, ne);
+	},
+
+	// @method getMinZoom(): Number
+	// Returns the minimum zoom level of the map (if set in the `minZoom` option of the map or of any layers), or `0` by default.
+	getMinZoom: function () {
+		return this.options.minZoom === undefined ? this._layersMinZoom || 0 : this.options.minZoom;
+	},
+
+	// @method getMaxZoom(): Number
+	// Returns the maximum zoom level of the map (if set in the `maxZoom` option of the map or of any layers).
+	getMaxZoom: function () {
+		return this.options.maxZoom === undefined ?
+			(this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :
+			this.options.maxZoom;
+	},
+
+	// @method getBoundsZoom(bounds: LatLngBounds, inside?: Boolean): Number
+	// Returns the maximum zoom level on which the given bounds fit to the map
+	// view in its entirety. If `inside` (optional) is set to `true`, the method
+	// instead returns the minimum zoom level on which the map view fits into
+	// the given bounds in its entirety.
+	getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number
+		bounds = L.latLngBounds(bounds);
+		padding = L.point(padding || [0, 0]);
+
+		var zoom = this.getZoom() || 0,
+		    min = this.getMinZoom(),
+		    max = this.getMaxZoom(),
+		    nw = bounds.getNorthWest(),
+		    se = bounds.getSouthEast(),
+		    size = this.getSize().subtract(padding),
+		    boundsSize = L.bounds(this.project(se, zoom), this.project(nw, zoom)).getSize(),
+		    snap = L.Browser.any3d ? this.options.zoomSnap : 1;
+
+		var scale = Math.min(size.x / boundsSize.x, size.y / boundsSize.y);
+		zoom = this.getScaleZoom(scale, zoom);
+
+		if (snap) {
+			zoom = Math.round(zoom / (snap / 100)) * (snap / 100); // don't jump if within 1% of a snap level
+			zoom = inside ? Math.ceil(zoom / snap) * snap : Math.floor(zoom / snap) * snap;
+		}
+
+		return Math.max(min, Math.min(max, zoom));
+	},
+
+	// @method getSize(): Point
+	// Returns the current size of the map container (in pixels).
+	getSize: function () {
+		if (!this._size || this._sizeChanged) {
+			this._size = new L.Point(
+				this._container.clientWidth || 0,
+				this._container.clientHeight || 0);
+
+			this._sizeChanged = false;
+		}
+		return this._size.clone();
+	},
+
+	// @method getPixelBounds(): Bounds
+	// Returns the bounds of the current map view in projected pixel
+	// coordinates (sometimes useful in layer and overlay implementations).
+	getPixelBounds: function (center, zoom) {
+		var topLeftPoint = this._getTopLeftPoint(center, zoom);
+		return new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));
+	},
+
+	// TODO: Check semantics - isn't the pixel origin the 0,0 coord relative to
+	// the map pane? "left point of the map layer" can be confusing, specially
+	// since there can be negative offsets.
+	// @method getPixelOrigin(): Point
+	// Returns the projected pixel coordinates of the top left point of
+	// the map layer (useful in custom layer and overlay implementations).
+	getPixelOrigin: function () {
+		this._checkIfLoaded();
+		return this._pixelOrigin;
+	},
+
+	// @method getPixelWorldBounds(zoom?: Number): Bounds
+	// Returns the world's bounds in pixel coordinates for zoom level `zoom`.
+	// If `zoom` is omitted, the map's current zoom level is used.
+	getPixelWorldBounds: function (zoom) {
+		return this.options.crs.getProjectedBounds(zoom === undefined ? this.getZoom() : zoom);
+	},
+
+	// @section Other Methods
+
+	// @method getPane(pane: String|HTMLElement): HTMLElement
+	// Returns a [map pane](#map-pane), given its name or its HTML element (its identity).
+	getPane: function (pane) {
+		return typeof pane === 'string' ? this._panes[pane] : pane;
+	},
+
+	// @method getPanes(): Object
+	// Returns a plain object containing the names of all [panes](#map-pane) as keys and
+	// the panes as values.
+	getPanes: function () {
+		return this._panes;
+	},
+
+	// @method getContainer: HTMLElement
+	// Returns the HTML element that contains the map.
+	getContainer: function () {
+		return this._container;
+	},
+
+
+	// @section Conversion Methods
+
+	// @method getZoomScale(toZoom: Number, fromZoom: Number): Number
+	// Returns the scale factor to be applied to a map transition from zoom level
+	// `fromZoom` to `toZoom`. Used internally to help with zoom animations.
+	getZoomScale: function (toZoom, fromZoom) {
+		// TODO replace with universal implementation after refactoring projections
+		var crs = this.options.crs;
+		fromZoom = fromZoom === undefined ? this._zoom : fromZoom;
+		return crs.scale(toZoom) / crs.scale(fromZoom);
+	},
+
+	// @method getScaleZoom(scale: Number, fromZoom: Number): Number
+	// Returns the zoom level that the map would end up at, if it is at `fromZoom`
+	// level and everything is scaled by a factor of `scale`. Inverse of
+	// [`getZoomScale`](#map-getZoomScale).
+	getScaleZoom: function (scale, fromZoom) {
+		var crs = this.options.crs;
+		fromZoom = fromZoom === undefined ? this._zoom : fromZoom;
+		var zoom = crs.zoom(scale * crs.scale(fromZoom));
+		return isNaN(zoom) ? Infinity : zoom;
+	},
+
+	// @method project(latlng: LatLng, zoom: Number): Point
+	// Projects a geographical coordinate `LatLng` according to the projection
+	// of the map's CRS, then scales it according to `zoom` and the CRS's
+	// `Transformation`. The result is pixel coordinate relative to
+	// the CRS origin.
+	project: function (latlng, zoom) {
+		zoom = zoom === undefined ? this._zoom : zoom;
+		return this.options.crs.latLngToPoint(L.latLng(latlng), zoom);
+	},
+
+	// @method unproject(point: Point, zoom: Number): LatLng
+	// Inverse of [`project`](#map-project).
+	unproject: function (point, zoom) {
+		zoom = zoom === undefined ? this._zoom : zoom;
+		return this.options.crs.pointToLatLng(L.point(point), zoom);
+	},
+
+	// @method layerPointToLatLng(point: Point): LatLng
+	// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),
+	// returns the corresponding geographical coordinate (for the current zoom level).
+	layerPointToLatLng: function (point) {
+		var projectedPoint = L.point(point).add(this.getPixelOrigin());
+		return this.unproject(projectedPoint);
+	},
+
+	// @method latLngToLayerPoint(latlng: LatLng): Point
+	// Given a geographical coordinate, returns the corresponding pixel coordinate
+	// relative to the [origin pixel](#map-getpixelorigin).
+	latLngToLayerPoint: function (latlng) {
+		var projectedPoint = this.project(L.latLng(latlng))._round();
+		return projectedPoint._subtract(this.getPixelOrigin());
+	},
+
+	// @method wrapLatLng(latlng: LatLng): LatLng
+	// Returns a `LatLng` where `lat` and `lng` has been wrapped according to the
+	// map's CRS's `wrapLat` and `wrapLng` properties, if they are outside the
+	// CRS's bounds.
+	// By default this means longitude is wrapped around the dateline so its
+	// value is between -180 and +180 degrees.
+	wrapLatLng: function (latlng) {
+		return this.options.crs.wrapLatLng(L.latLng(latlng));
+	},
+
+	// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds
+	// Returns a `LatLngBounds` with the same size as the given one, ensuring that
+	// its center is within the CRS's bounds.
+	// By default this means the center longitude is wrapped around the dateline so its
+	// value is between -180 and +180 degrees, and the majority of the bounds
+	// overlaps the CRS's bounds.
+	wrapLatLngBounds: function (latlng) {
+		return this.options.crs.wrapLatLngBounds(L.latLngBounds(latlng));
+	},
+
+	// @method distance(latlng1: LatLng, latlng2: LatLng): Number
+	// Returns the distance between two geographical coordinates according to
+	// the map's CRS. By default this measures distance in meters.
+	distance: function (latlng1, latlng2) {
+		return this.options.crs.distance(L.latLng(latlng1), L.latLng(latlng2));
+	},
+
+	// @method containerPointToLayerPoint(point: Point): Point
+	// Given a pixel coordinate relative to the map container, returns the corresponding
+	// pixel coordinate relative to the [origin pixel](#map-getpixelorigin).
+	containerPointToLayerPoint: function (point) { // (Point)
+		return L.point(point).subtract(this._getMapPanePos());
+	},
+
+	// @method layerPointToContainerPoint(point: Point): Point
+	// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),
+	// returns the corresponding pixel coordinate relative to the map container.
+	layerPointToContainerPoint: function (point) { // (Point)
+		return L.point(point).add(this._getMapPanePos());
+	},
+
+	// @method containerPointToLatLng(point: Point): LatLng
+	// Given a pixel coordinate relative to the map container, returns
+	// the corresponding geographical coordinate (for the current zoom level).
+	containerPointToLatLng: function (point) {
+		var layerPoint = this.containerPointToLayerPoint(L.point(point));
+		return this.layerPointToLatLng(layerPoint);
+	},
+
+	// @method latLngToContainerPoint(latlng: LatLng): Point
+	// Given a geographical coordinate, returns the corresponding pixel coordinate
+	// relative to the map container.
+	latLngToContainerPoint: function (latlng) {
+		return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));
+	},
+
+	// @method mouseEventToContainerPoint(ev: MouseEvent): Point
+	// Given a MouseEvent object, returns the pixel coordinate relative to the
+	// map container where the event took place.
+	mouseEventToContainerPoint: function (e) {
+		return L.DomEvent.getMousePosition(e, this._container);
+	},
+
+	// @method mouseEventToLayerPoint(ev: MouseEvent): Point
+	// Given a MouseEvent object, returns the pixel coordinate relative to
+	// the [origin pixel](#map-getpixelorigin) where the event took place.
+	mouseEventToLayerPoint: function (e) {
+		return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));
+	},
+
+	// @method mouseEventToLatLng(ev: MouseEvent): LatLng
+	// Given a MouseEvent object, returns geographical coordinate where the
+	// event took place.
+	mouseEventToLatLng: function (e) { // (MouseEvent)
+		return this.layerPointToLatLng(this.mouseEventToLayerPoint(e));
+	},
+
+
+	// map initialization methods
+
+	_initContainer: function (id) {
+		var container = this._container = L.DomUtil.get(id);
+
+		if (!container) {
+			throw new Error('Map container not found.');
+		} else if (container._leaflet_id) {
+			throw new Error('Map container is already initialized.');
+		}
+
+		L.DomEvent.addListener(container, 'scroll', this._onScroll, this);
+		this._containerId = L.Util.stamp(container);
+	},
+
+	_initLayout: function () {
+		var container = this._container;
+
+		this._fadeAnimated = this.options.fadeAnimation && L.Browser.any3d;
+
+		L.DomUtil.addClass(container, 'leaflet-container' +
+			(L.Browser.touch ? ' leaflet-touch' : '') +
+			(L.Browser.retina ? ' leaflet-retina' : '') +
+			(L.Browser.ielt9 ? ' leaflet-oldie' : '') +
+			(L.Browser.safari ? ' leaflet-safari' : '') +
+			(this._fadeAnimated ? ' leaflet-fade-anim' : ''));
+
+		var position = L.DomUtil.getStyle(container, 'position');
+
+		if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {
+			container.style.position = 'relative';
+		}
+
+		this._initPanes();
+
+		if (this._initControlPos) {
+			this._initControlPos();
+		}
+	},
+
+	_initPanes: function () {
+		var panes = this._panes = {};
+		this._paneRenderers = {};
+
+		// @section
+		//
+		// Panes are DOM elements used to control the ordering of layers on the map. You
+		// can access panes with [`map.getPane`](#map-getpane) or
+		// [`map.getPanes`](#map-getpanes) methods. New panes can be created with the
+		// [`map.createPane`](#map-createpane) method.
+		//
+		// Every map has the following default panes that differ only in zIndex.
+		//
+		// @pane mapPane: HTMLElement = 'auto'
+		// Pane that contains all other map panes
+
+		this._mapPane = this.createPane('mapPane', this._container);
+		L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));
+
+		// @pane tilePane: HTMLElement = 200
+		// Pane for `GridLayer`s and `TileLayer`s
+		this.createPane('tilePane');
+		// @pane overlayPane: HTMLElement = 400
+		// Pane for vector overlays (`Path`s), like `Polyline`s and `Polygon`s
+		this.createPane('shadowPane');
+		// @pane shadowPane: HTMLElement = 500
+		// Pane for overlay shadows (e.g. `Marker` shadows)
+		this.createPane('overlayPane');
+		// @pane markerPane: HTMLElement = 600
+		// Pane for `Icon`s of `Marker`s
+		this.createPane('markerPane');
+		// @pane tooltipPane: HTMLElement = 650
+		// Pane for tooltip.
+		this.createPane('tooltipPane');
+		// @pane popupPane: HTMLElement = 700
+		// Pane for `Popup`s.
+		this.createPane('popupPane');
+
+		if (!this.options.markerZoomAnimation) {
+			L.DomUtil.addClass(panes.markerPane, 'leaflet-zoom-hide');
+			L.DomUtil.addClass(panes.shadowPane, 'leaflet-zoom-hide');
+		}
+	},
+
+
+	// private methods that modify map state
+
+	// @section Map state change events
+	_resetView: function (center, zoom) {
+		L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));
+
+		var loading = !this._loaded;
+		this._loaded = true;
+		zoom = this._limitZoom(zoom);
+
+		this.fire('viewprereset');
+
+		var zoomChanged = this._zoom !== zoom;
+		this
+			._moveStart(zoomChanged)
+			._move(center, zoom)
+			._moveEnd(zoomChanged);
+
+		// @event viewreset: Event
+		// Fired when the map needs to redraw its content (this usually happens
+		// on map zoom or load). Very useful for creating custom overlays.
+		this.fire('viewreset');
+
+		// @event load: Event
+		// Fired when the map is initialized (when its center and zoom are set
+		// for the first time).
+		if (loading) {
+			this.fire('load');
+		}
+	},
+
+	_moveStart: function (zoomChanged) {
+		// @event zoomstart: Event
+		// Fired when the map zoom is about to change (e.g. before zoom animation).
+		// @event movestart: Event
+		// Fired when the view of the map starts changing (e.g. user starts dragging the map).
+		if (zoomChanged) {
+			this.fire('zoomstart');
+		}
+		return this.fire('movestart');
+	},
+
+	_move: function (center, zoom, data) {
+		if (zoom === undefined) {
+			zoom = this._zoom;
+		}
+		var zoomChanged = this._zoom !== zoom;
+
+		this._zoom = zoom;
+		this._lastCenter = center;
+		this._pixelOrigin = this._getNewPixelOrigin(center);
+
+		// @event zoom: Event
+		// Fired repeatedly during any change in zoom level, including zoom
+		// and fly animations.
+		if (zoomChanged || (data && data.pinch)) {	// Always fire 'zoom' if pinching because #3530
+			this.fire('zoom', data);
+		}
+
+		// @event move: Event
+		// Fired repeatedly during any movement of the map, including pan and
+		// fly animations.
+		return this.fire('move', data);
+	},
+
+	_moveEnd: function (zoomChanged) {
+		// @event zoomend: Event
+		// Fired when the map has changed, after any animations.
+		if (zoomChanged) {
+			this.fire('zoomend');
+		}
+
+		// @event moveend: Event
+		// Fired when the center of the map stops changing (e.g. user stopped
+		// dragging the map).
+		return this.fire('moveend');
+	},
+
+	_stop: function () {
+		L.Util.cancelAnimFrame(this._flyToFrame);
+		if (this._panAnim) {
+			this._panAnim.stop();
+		}
+		return this;
+	},
+
+	_rawPanBy: function (offset) {
+		L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));
+	},
+
+	_getZoomSpan: function () {
+		return this.getMaxZoom() - this.getMinZoom();
+	},
+
+	_panInsideMaxBounds: function () {
+		if (!this._enforcingBounds) {
+			this.panInsideBounds(this.options.maxBounds);
+		}
+	},
+
+	_checkIfLoaded: function () {
+		if (!this._loaded) {
+			throw new Error('Set map center and zoom first.');
+		}
+	},
+
+	// DOM event handling
+
+	// @section Interaction events
+	_initEvents: function (remove) {
+		if (!L.DomEvent) { return; }
+
+		this._targets = {};
+		this._targets[L.stamp(this._container)] = this;
+
+		var onOff = remove ? 'off' : 'on';
+
+		// @event click: MouseEvent
+		// Fired when the user clicks (or taps) the map.
+		// @event dblclick: MouseEvent
+		// Fired when the user double-clicks (or double-taps) the map.
+		// @event mousedown: MouseEvent
+		// Fired when the user pushes the mouse button on the map.
+		// @event mouseup: MouseEvent
+		// Fired when the user releases the mouse button on the map.
+		// @event mouseover: MouseEvent
+		// Fired when the mouse enters the map.
+		// @event mouseout: MouseEvent
+		// Fired when the mouse leaves the map.
+		// @event mousemove: MouseEvent
+		// Fired while the mouse moves over the map.
+		// @event contextmenu: MouseEvent
+		// Fired when the user pushes the right mouse button on the map, prevents
+		// default browser context menu from showing if there are listeners on
+		// this event. Also fired on mobile when the user holds a single touch
+		// for a second (also called long press).
+		// @event keypress: KeyboardEvent
+		// Fired when the user presses a key from the keyboard while the map is focused.
+		L.DomEvent[onOff](this._container, 'click dblclick mousedown mouseup ' +
+			'mouseover mouseout mousemove contextmenu keypress', this._handleDOMEvent, this);
+
+		if (this.options.trackResize) {
+			L.DomEvent[onOff](window, 'resize', this._onResize, this);
+		}
+
+		if (L.Browser.any3d && this.options.transform3DLimit) {
+			this[onOff]('moveend', this._onMoveEnd);
+		}
+	},
+
+	_onResize: function () {
+		L.Util.cancelAnimFrame(this._resizeRequest);
+		this._resizeRequest = L.Util.requestAnimFrame(
+		        function () { this.invalidateSize({debounceMoveend: true}); }, this);
+	},
+
+	_onScroll: function () {
+		this._container.scrollTop  = 0;
+		this._container.scrollLeft = 0;
+	},
+
+	_onMoveEnd: function () {
+		var pos = this._getMapPanePos();
+		if (Math.max(Math.abs(pos.x), Math.abs(pos.y)) >= this.options.transform3DLimit) {
+			// https://bugzilla.mozilla.org/show_bug.cgi?id=1203873 but Webkit also have
+			// a pixel offset on very high values, see: http://jsfiddle.net/dg6r5hhb/
+			this._resetView(this.getCenter(), this.getZoom());
+		}
+	},
+
+	_findEventTargets: function (e, type) {
+		var targets = [],
+		    target,
+		    isHover = type === 'mouseout' || type === 'mouseover',
+		    src = e.target || e.srcElement,
+		    dragging = false;
+
+		while (src) {
+			target = this._targets[L.stamp(src)];
+			if (target && (type === 'click' || type === 'preclick') && !e._simulated && this._draggableMoved(target)) {
+				// Prevent firing click after you just dragged an object.
+				dragging = true;
+				break;
+			}
+			if (target && target.listens(type, true)) {
+				if (isHover && !L.DomEvent._isExternalTarget(src, e)) { break; }
+				targets.push(target);
+				if (isHover) { break; }
+			}
+			if (src === this._container) { break; }
+			src = src.parentNode;
+		}
+		if (!targets.length && !dragging && !isHover && L.DomEvent._isExternalTarget(src, e)) {
+			targets = [this];
+		}
+		return targets;
+	},
+
+	_handleDOMEvent: function (e) {
+		if (!this._loaded || L.DomEvent._skipped(e)) { return; }
+
+		var type = e.type === 'keypress' && e.keyCode === 13 ? 'click' : e.type;
+
+		if (type === 'mousedown') {
+			// prevents outline when clicking on keyboard-focusable element
+			L.DomUtil.preventOutline(e.target || e.srcElement);
+		}
+
+		this._fireDOMEvent(e, type);
+	},
+
+	_fireDOMEvent: function (e, type, targets) {
+
+		if (e.type === 'click') {
+			// Fire a synthetic 'preclick' event which propagates up (mainly for closing popups).
+			// @event preclick: MouseEvent
+			// Fired before mouse click on the map (sometimes useful when you
+			// want something to happen on click before any existing click
+			// handlers start running).
+			var synth = L.Util.extend({}, e);
+			synth.type = 'preclick';
+			this._fireDOMEvent(synth, synth.type, targets);
+		}
+
+		if (e._stopped) { return; }
+
+		// Find the layer the event is propagating from and its parents.
+		targets = (targets || []).concat(this._findEventTargets(e, type));
+
+		if (!targets.length) { return; }
+
+		var target = targets[0];
+		if (type === 'contextmenu' && target.listens(type, true)) {
+			L.DomEvent.preventDefault(e);
+		}
+
+		var data = {
+			originalEvent: e
+		};
+
+		if (e.type !== 'keypress') {
+			var isMarker = target instanceof L.Marker;
+			data.containerPoint = isMarker ?
+					this.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e);
+			data.layerPoint = this.containerPointToLayerPoint(data.containerPoint);
+			data.latlng = isMarker ? target.getLatLng() : this.layerPointToLatLng(data.layerPoint);
+		}
+
+		for (var i = 0; i < targets.length; i++) {
+			targets[i].fire(type, data, true);
+			if (data.originalEvent._stopped ||
+				(targets[i].options.nonBubblingEvents && L.Util.indexOf(targets[i].options.nonBubblingEvents, type) !== -1)) { return; }
+		}
+	},
+
+	_draggableMoved: function (obj) {
+		obj = obj.dragging && obj.dragging.enabled() ? obj : this;
+		return (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved());
+	},
+
+	_clearHandlers: function () {
+		for (var i = 0, len = this._handlers.length; i < len; i++) {
+			this._handlers[i].disable();
+		}
+	},
+
+	// @section Other Methods
+
+	// @method whenReady(fn: Function, context?: Object): this
+	// Runs the given function `fn` when the map gets initialized with
+	// a view (center and zoom) and at least one layer, or immediately
+	// if it's already initialized, optionally passing a function context.
+	whenReady: function (callback, context) {
+		if (this._loaded) {
+			callback.call(context || this, {target: this});
+		} else {
+			this.on('load', callback, context);
+		}
+		return this;
+	},
+
+
+	// private methods for getting map state
+
+	_getMapPanePos: function () {
+		return L.DomUtil.getPosition(this._mapPane) || new L.Point(0, 0);
+	},
+
+	_moved: function () {
+		var pos = this._getMapPanePos();
+		return pos && !pos.equals([0, 0]);
+	},
+
+	_getTopLeftPoint: function (center, zoom) {
+		var pixelOrigin = center && zoom !== undefined ?
+			this._getNewPixelOrigin(center, zoom) :
+			this.getPixelOrigin();
+		return pixelOrigin.subtract(this._getMapPanePos());
+	},
+
+	_getNewPixelOrigin: function (center, zoom) {
+		var viewHalf = this.getSize()._divideBy(2);
+		return this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round();
+	},
+
+	_latLngToNewLayerPoint: function (latlng, zoom, center) {
+		var topLeft = this._getNewPixelOrigin(center, zoom);
+		return this.project(latlng, zoom)._subtract(topLeft);
+	},
+
+	_latLngBoundsToNewLayerBounds: function (latLngBounds, zoom, center) {
+		var topLeft = this._getNewPixelOrigin(center, zoom);
+		return L.bounds([
+			this.project(latLngBounds.getSouthWest(), zoom)._subtract(topLeft),
+			this.project(latLngBounds.getNorthWest(), zoom)._subtract(topLeft),
+			this.project(latLngBounds.getSouthEast(), zoom)._subtract(topLeft),
+			this.project(latLngBounds.getNorthEast(), zoom)._subtract(topLeft)
+		]);
+	},
+
+	// layer point of the current center
+	_getCenterLayerPoint: function () {
+		return this.containerPointToLayerPoint(this.getSize()._divideBy(2));
+	},
+
+	// offset of the specified place to the current center in pixels
+	_getCenterOffset: function (latlng) {
+		return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());
+	},
+
+	// adjust center for view to get inside bounds
+	_limitCenter: function (center, zoom, bounds) {
+
+		if (!bounds) { return center; }
+
+		var centerPoint = this.project(center, zoom),
+		    viewHalf = this.getSize().divideBy(2),
+		    viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),
+		    offset = this._getBoundsOffset(viewBounds, bounds, zoom);
+
+		// If offset is less than a pixel, ignore.
+		// This prevents unstable projections from getting into
+		// an infinite loop of tiny offsets.
+		if (offset.round().equals([0, 0])) {
+			return center;
+		}
+
+		return this.unproject(centerPoint.add(offset), zoom);
+	},
+
+	// adjust offset for view to get inside bounds
+	_limitOffset: function (offset, bounds) {
+		if (!bounds) { return offset; }
+
+		var viewBounds = this.getPixelBounds(),
+		    newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));
+
+		return offset.add(this._getBoundsOffset(newBounds, bounds));
+	},
+
+	// returns offset needed for pxBounds to get inside maxBounds at a specified zoom
+	_getBoundsOffset: function (pxBounds, maxBounds, zoom) {
+		var projectedMaxBounds = L.bounds(
+		        this.project(maxBounds.getNorthEast(), zoom),
+		        this.project(maxBounds.getSouthWest(), zoom)
+		    ),
+		    minOffset = projectedMaxBounds.min.subtract(pxBounds.min),
+		    maxOffset = projectedMaxBounds.max.subtract(pxBounds.max),
+
+		    dx = this._rebound(minOffset.x, -maxOffset.x),
+		    dy = this._rebound(minOffset.y, -maxOffset.y);
+
+		return new L.Point(dx, dy);
+	},
+
+	_rebound: function (left, right) {
+		return left + right > 0 ?
+			Math.round(left - right) / 2 :
+			Math.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));
+	},
+
+	_limitZoom: function (zoom) {
+		var min = this.getMinZoom(),
+		    max = this.getMaxZoom(),
+		    snap = L.Browser.any3d ? this.options.zoomSnap : 1;
+		if (snap) {
+			zoom = Math.round(zoom / snap) * snap;
+		}
+		return Math.max(min, Math.min(max, zoom));
+	},
+
+	_onPanTransitionStep: function () {
+		this.fire('move');
+	},
+
+	_onPanTransitionEnd: function () {
+		L.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');
+		this.fire('moveend');
+	},
+
+	_tryAnimatedPan: function (center, options) {
+		// difference between the new and current centers in pixels
+		var offset = this._getCenterOffset(center)._floor();
+
+		// don't animate too far unless animate: true specified in options
+		if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }
+
+		this.panBy(offset, options);
+
+		return true;
+	},
+
+	_createAnimProxy: function () {
+
+		var proxy = this._proxy = L.DomUtil.create('div', 'leaflet-proxy leaflet-zoom-animated');
+		this._panes.mapPane.appendChild(proxy);
+
+		this.on('zoomanim', function (e) {
+			var prop = L.DomUtil.TRANSFORM,
+			    transform = proxy.style[prop];
+
+			L.DomUtil.setTransform(proxy, this.project(e.center, e.zoom), this.getZoomScale(e.zoom, 1));
+
+			// workaround for case when transform is the same and so transitionend event is not fired
+			if (transform === proxy.style[prop] && this._animatingZoom) {
+				this._onZoomTransitionEnd();
+			}
+		}, this);
+
+		this.on('load moveend', function () {
+			var c = this.getCenter(),
+			    z = this.getZoom();
+			L.DomUtil.setTransform(proxy, this.project(c, z), this.getZoomScale(z, 1));
+		}, this);
+	},
+
+	_catchTransitionEnd: function (e) {
+		if (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) {
+			this._onZoomTransitionEnd();
+		}
+	},
+
+	_nothingToAnimate: function () {
+		return !this._container.getElementsByClassName('leaflet-zoom-animated').length;
+	},
+
+	_tryAnimatedZoom: function (center, zoom, options) {
+
+		if (this._animatingZoom) { return true; }
+
+		options = options || {};
+
+		// don't animate if disabled, not supported or zoom difference is too large
+		if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||
+		        Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }
+
+		// offset is the pixel coords of the zoom origin relative to the current center
+		var scale = this.getZoomScale(zoom),
+		    offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale);
+
+		// don't animate if the zoom origin isn't within one screen from the current center, unless forced
+		if (options.animate !== true && !this.getSize().contains(offset)) { return false; }
+
+		L.Util.requestAnimFrame(function () {
+			this
+			    ._moveStart(true)
+			    ._animateZoom(center, zoom, true);
+		}, this);
+
+		return true;
+	},
+
+	_animateZoom: function (center, zoom, startAnim, noUpdate) {
+		if (startAnim) {
+			this._animatingZoom = true;
+
+			// remember what center/zoom to set after animation
+			this._animateToCenter = center;
+			this._animateToZoom = zoom;
+
+			L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');
+		}
+
+		// @event zoomanim: ZoomAnimEvent
+		// Fired on every frame of a zoom animation
+		this.fire('zoomanim', {
+			center: center,
+			zoom: zoom,
+			noUpdate: noUpdate
+		});
+
+		// Work around webkit not firing 'transitionend', see https://github.com/Leaflet/Leaflet/issues/3689, 2693
+		setTimeout(L.bind(this._onZoomTransitionEnd, this), 250);
+	},
+
+	_onZoomTransitionEnd: function () {
+		if (!this._animatingZoom) { return; }
+
+		L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');
+
+		this._animatingZoom = false;
+
+		this._move(this._animateToCenter, this._animateToZoom);
+
+		// This anim frame should prevent an obscure iOS webkit tile loading race condition.
+		L.Util.requestAnimFrame(function () {
+			this._moveEnd(true);
+		}, this);
+	}
+});
+
+// @section
+
+// @factory L.map(id: String, options?: Map options)
+// Instantiates a map object given the DOM ID of a `<div>` element
+// and optionally an object literal with `Map options`.
+//
+// @alternative
+// @factory L.map(el: HTMLElement, options?: Map options)
+// Instantiates a map object given an instance of a `<div>` HTML element
+// and optionally an object literal with `Map options`.
+L.map = function (id, options) {
+	return new L.Map(id, options);
+};
+
+
+
+
+/*
+ * @class Layer
+ * @inherits Evented
+ * @aka L.Layer
+ * @aka ILayer
+ *
+ * A set of methods from the Layer base class that all Leaflet layers use.
+ * Inherits all methods, options and events from `L.Evented`.
+ *
+ * @example
+ *
+ * ```js
+ * var layer = L.Marker(latlng).addTo(map);
+ * layer.addTo(map);
+ * layer.remove();
+ * ```
+ *
+ * @event add: Event
+ * Fired after the layer is added to a map
+ *
+ * @event remove: Event
+ * Fired after the layer is removed from a map
+ */
+
+
+L.Layer = L.Evented.extend({
+
+	// Classes extending `L.Layer` will inherit the following options:
+	options: {
+		// @option pane: String = 'overlayPane'
+		// By default the layer will be added to the map's [overlay pane](#map-overlaypane). Overriding this option will cause the layer to be placed on another pane by default.
+		pane: 'overlayPane',
+		nonBubblingEvents: [],  // Array of events that should not be bubbled to DOM parents (like the map),
+
+		// @option attribution: String = null
+		// String to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
+		attribution: null
+	},
+
+	/* @section
+	 * Classes extending `L.Layer` will inherit the following methods:
+	 *
+	 * @method addTo(map: Map): this
+	 * Adds the layer to the given map
+	 */
+	addTo: function (map) {
+		map.addLayer(this);
+		return this;
+	},
+
+	// @method remove: this
+	// Removes the layer from the map it is currently active on.
+	remove: function () {
+		return this.removeFrom(this._map || this._mapToAdd);
+	},
+
+	// @method removeFrom(map: Map): this
+	// Removes the layer from the given map
+	removeFrom: function (obj) {
+		if (obj) {
+			obj.removeLayer(this);
+		}
+		return this;
+	},
+
+	// @method getPane(name? : String): HTMLElement
+	// Returns the `HTMLElement` representing the named pane on the map. If `name` is omitted, returns the pane for this layer.
+	getPane: function (name) {
+		return this._map.getPane(name ? (this.options[name] || name) : this.options.pane);
+	},
+
+	addInteractiveTarget: function (targetEl) {
+		this._map._targets[L.stamp(targetEl)] = this;
+		return this;
+	},
+
+	removeInteractiveTarget: function (targetEl) {
+		delete this._map._targets[L.stamp(targetEl)];
+		return this;
+	},
+
+	// @method getAttribution: String
+	// Used by the `attribution control`, returns the [attribution option](#gridlayer-attribution).
+	getAttribution: function () {
+		return this.options.attribution;
+	},
+
+	_layerAdd: function (e) {
+		var map = e.target;
+
+		// check in case layer gets added and then removed before the map is ready
+		if (!map.hasLayer(this)) { return; }
+
+		this._map = map;
+		this._zoomAnimated = map._zoomAnimated;
+
+		if (this.getEvents) {
+			var events = this.getEvents();
+			map.on(events, this);
+			this.once('remove', function () {
+				map.off(events, this);
+			}, this);
+		}
+
+		this.onAdd(map);
+
+		if (this.getAttribution && map.attributionControl) {
+			map.attributionControl.addAttribution(this.getAttribution());
+		}
+
+		this.fire('add');
+		map.fire('layeradd', {layer: this});
+	}
+});
+
+/* @section Extension methods
+ * @uninheritable
+ *
+ * Every layer should extend from `L.Layer` and (re-)implement the following methods.
+ *
+ * @method onAdd(map: Map): this
+ * Should contain code that creates DOM elements for the layer, adds them to `map panes` where they should belong and puts listeners on relevant map events. Called on [`map.addLayer(layer)`](#map-addlayer).
+ *
+ * @method onRemove(map: Map): this
+ * Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in [`onAdd`](#layer-onadd). Called on [`map.removeLayer(layer)`](#map-removelayer).
+ *
+ * @method getEvents(): Object
+ * This optional method should return an object like `{ viewreset: this._reset }` for [`addEventListener`](#evented-addeventlistener). The event handlers in this object will be automatically added and removed from the map with your layer.
+ *
+ * @method getAttribution(): String
+ * This optional method should return a string containing HTML to be shown on the `Attribution control` whenever the layer is visible.
+ *
+ * @method beforeAdd(map: Map): this
+ * Optional method. Called on [`map.addLayer(layer)`](#map-addlayer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.
+ */
+
+
+/* @namespace Map
+ * @section Layer events
+ *
+ * @event layeradd: LayerEvent
+ * Fired when a new layer is added to the map.
+ *
+ * @event layerremove: LayerEvent
+ * Fired when some layer is removed from the map
+ *
+ * @section Methods for Layers and Controls
+ */
+L.Map.include({
+	// @method addLayer(layer: Layer): this
+	// Adds the given layer to the map
+	addLayer: function (layer) {
+		var id = L.stamp(layer);
+		if (this._layers[id]) { return this; }
+		this._layers[id] = layer;
+
+		layer._mapToAdd = this;
+
+		if (layer.beforeAdd) {
+			layer.beforeAdd(this);
+		}
+
+		this.whenReady(layer._layerAdd, layer);
+
+		return this;
+	},
+
+	// @method removeLayer(layer: Layer): this
+	// Removes the given layer from the map.
+	removeLayer: function (layer) {
+		var id = L.stamp(layer);
+
+		if (!this._layers[id]) { return this; }
+
+		if (this._loaded) {
+			layer.onRemove(this);
+		}
+
+		if (layer.getAttribution && this.attributionControl) {
+			this.attributionControl.removeAttribution(layer.getAttribution());
+		}
+
+		delete this._layers[id];
+
+		if (this._loaded) {
+			this.fire('layerremove', {layer: layer});
+			layer.fire('remove');
+		}
+
+		layer._map = layer._mapToAdd = null;
+
+		return this;
+	},
+
+	// @method hasLayer(layer: Layer): Boolean
+	// Returns `true` if the given layer is currently added to the map
+	hasLayer: function (layer) {
+		return !!layer && (L.stamp(layer) in this._layers);
+	},
+
+	/* @method eachLayer(fn: Function, context?: Object): this
+	 * Iterates over the layers of the map, optionally specifying context of the iterator function.
+	 * ```
+	 * map.eachLayer(function(layer){
+	 *     layer.bindPopup('Hello');
+	 * });
+	 * ```
+	 */
+	eachLayer: function (method, context) {
+		for (var i in this._layers) {
+			method.call(context, this._layers[i]);
+		}
+		return this;
+	},
+
+	_addLayers: function (layers) {
+		layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];
+
+		for (var i = 0, len = layers.length; i < len; i++) {
+			this.addLayer(layers[i]);
+		}
+	},
+
+	_addZoomLimit: function (layer) {
+		if (isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) {
+			this._zoomBoundLayers[L.stamp(layer)] = layer;
+			this._updateZoomLevels();
+		}
+	},
+
+	_removeZoomLimit: function (layer) {
+		var id = L.stamp(layer);
+
+		if (this._zoomBoundLayers[id]) {
+			delete this._zoomBoundLayers[id];
+			this._updateZoomLevels();
+		}
+	},
+
+	_updateZoomLevels: function () {
+		var minZoom = Infinity,
+		    maxZoom = -Infinity,
+		    oldZoomSpan = this._getZoomSpan();
+
+		for (var i in this._zoomBoundLayers) {
+			var options = this._zoomBoundLayers[i].options;
+
+			minZoom = options.minZoom === undefined ? minZoom : Math.min(minZoom, options.minZoom);
+			maxZoom = options.maxZoom === undefined ? maxZoom : Math.max(maxZoom, options.maxZoom);
+		}
+
+		this._layersMaxZoom = maxZoom === -Infinity ? undefined : maxZoom;
+		this._layersMinZoom = minZoom === Infinity ? undefined : minZoom;
+
+		// @section Map state change events
+		// @event zoomlevelschange: Event
+		// Fired when the number of zoomlevels on the map is changed due
+		// to adding or removing a layer.
+		if (oldZoomSpan !== this._getZoomSpan()) {
+			this.fire('zoomlevelschange');
+		}
+
+		if (this.options.maxZoom === undefined && this._layersMaxZoom && this.getZoom() > this._layersMaxZoom) {
+			this.setZoom(this._layersMaxZoom);
+		}
+		if (this.options.minZoom === undefined && this._layersMinZoom && this.getZoom() < this._layersMinZoom) {
+			this.setZoom(this._layersMinZoom);
+		}
+	}
+});
+
+
+
+/*
+ * @namespace DomEvent
+ * Utility functions to work with the [DOM events](https://developer.mozilla.org/docs/Web/API/Event), used by Leaflet internally.
+ */
+
+// Inspired by John Resig, Dean Edwards and YUI addEvent implementations.
+
+
+
+var eventsKey = '_leaflet_events';
+
+L.DomEvent = {
+
+	// @function on(el: HTMLElement, types: String, fn: Function, context?: Object): this
+	// Adds a listener function (`fn`) to a particular DOM event type of the
+	// element `el`. You can optionally specify the context of the listener
+	// (object the `this` keyword will point to). You can also pass several
+	// space-separated types (e.g. `'click dblclick'`).
+
+	// @alternative
+	// @function on(el: HTMLElement, eventMap: Object, context?: Object): this
+	// Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`
+	on: function (obj, types, fn, context) {
+
+		if (typeof types === 'object') {
+			for (var type in types) {
+				this._on(obj, type, types[type], fn);
+			}
+		} else {
+			types = L.Util.splitWords(types);
+
+			for (var i = 0, len = types.length; i < len; i++) {
+				this._on(obj, types[i], fn, context);
+			}
+		}
+
+		return this;
+	},
+
+	// @function off(el: HTMLElement, types: String, fn: Function, context?: Object): this
+	// Removes a previously added listener function. If no function is specified,
+	// it will remove all the listeners of that particular DOM event from the element.
+	// Note that if you passed a custom context to on, you must pass the same
+	// context to `off` in order to remove the listener.
+
+	// @alternative
+	// @function off(el: HTMLElement, eventMap: Object, context?: Object): this
+	// Removes a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`
+	off: function (obj, types, fn, context) {
+
+		if (typeof types === 'object') {
+			for (var type in types) {
+				this._off(obj, type, types[type], fn);
+			}
+		} else {
+			types = L.Util.splitWords(types);
+
+			for (var i = 0, len = types.length; i < len; i++) {
+				this._off(obj, types[i], fn, context);
+			}
+		}
+
+		return this;
+	},
+
+	_on: function (obj, type, fn, context) {
+		var id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : '');
+
+		if (obj[eventsKey] && obj[eventsKey][id]) { return this; }
+
+		var handler = function (e) {
+			return fn.call(context || obj, e || window.event);
+		};
+
+		var originalHandler = handler;
+
+		if (L.Browser.pointer && type.indexOf('touch') === 0) {
+			this.addPointerListener(obj, type, handler, id);
+
+		} else if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener &&
+		           !(L.Browser.pointer && L.Browser.chrome)) {
+			// Chrome >55 does not need the synthetic dblclicks from addDoubleTapListener
+			// See #5180
+			this.addDoubleTapListener(obj, handler, id);
+
+		} else if ('addEventListener' in obj) {
+
+			if (type === 'mousewheel') {
+				obj.addEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false);
+
+			} else if ((type === 'mouseenter') || (type === 'mouseleave')) {
+				handler = function (e) {
+					e = e || window.event;
+					if (L.DomEvent._isExternalTarget(obj, e)) {
+						originalHandler(e);
+					}
+				};
+				obj.addEventListener(type === 'mouseenter' ? 'mouseover' : 'mouseout', handler, false);
+
+			} else {
+				if (type === 'click' && L.Browser.android) {
+					handler = function (e) {
+						return L.DomEvent._filterClick(e, originalHandler);
+					};
+				}
+				obj.addEventListener(type, handler, false);
+			}
+
+		} else if ('attachEvent' in obj) {
+			obj.attachEvent('on' + type, handler);
+		}
+
+		obj[eventsKey] = obj[eventsKey] || {};
+		obj[eventsKey][id] = handler;
+
+		return this;
+	},
+
+	_off: function (obj, type, fn, context) {
+
+		var id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : ''),
+		    handler = obj[eventsKey] && obj[eventsKey][id];
+
+		if (!handler) { return this; }
+
+		if (L.Browser.pointer && type.indexOf('touch') === 0) {
+			this.removePointerListener(obj, type, id);
+
+		} else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {
+			this.removeDoubleTapListener(obj, id);
+
+		} else if ('removeEventListener' in obj) {
+
+			if (type === 'mousewheel') {
+				obj.removeEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false);
+
+			} else {
+				obj.removeEventListener(
+					type === 'mouseenter' ? 'mouseover' :
+					type === 'mouseleave' ? 'mouseout' : type, handler, false);
+			}
+
+		} else if ('detachEvent' in obj) {
+			obj.detachEvent('on' + type, handler);
+		}
+
+		obj[eventsKey][id] = null;
+
+		return this;
+	},
+
+	// @function stopPropagation(ev: DOMEvent): this
+	// Stop the given event from propagation to parent elements. Used inside the listener functions:
+	// ```js
+	// L.DomEvent.on(div, 'click', function (ev) {
+	// 	L.DomEvent.stopPropagation(ev);
+	// });
+	// ```
+	stopPropagation: function (e) {
+
+		if (e.stopPropagation) {
+			e.stopPropagation();
+		} else if (e.originalEvent) {  // In case of Leaflet event.
+			e.originalEvent._stopped = true;
+		} else {
+			e.cancelBubble = true;
+		}
+		L.DomEvent._skipped(e);
+
+		return this;
+	},
+
+	// @function disableScrollPropagation(el: HTMLElement): this
+	// Adds `stopPropagation` to the element's `'mousewheel'` events (plus browser variants).
+	disableScrollPropagation: function (el) {
+		return L.DomEvent.on(el, 'mousewheel', L.DomEvent.stopPropagation);
+	},
+
+	// @function disableClickPropagation(el: HTMLElement): this
+	// Adds `stopPropagation` to the element's `'click'`, `'doubleclick'`,
+	// `'mousedown'` and `'touchstart'` events (plus browser variants).
+	disableClickPropagation: function (el) {
+		var stop = L.DomEvent.stopPropagation;
+
+		L.DomEvent.on(el, L.Draggable.START.join(' '), stop);
+
+		return L.DomEvent.on(el, {
+			click: L.DomEvent._fakeStop,
+			dblclick: stop
+		});
+	},
+
+	// @function preventDefault(ev: DOMEvent): this
+	// Prevents the default action of the DOM Event `ev` from happening (such as
+	// following a link in the href of the a element, or doing a POST request
+	// with page reload when a `<form>` is submitted).
+	// Use it inside listener functions.
+	preventDefault: function (e) {
+
+		if (e.preventDefault) {
+			e.preventDefault();
+		} else {
+			e.returnValue = false;
+		}
+		return this;
+	},
+
+	// @function stop(ev): this
+	// Does `stopPropagation` and `preventDefault` at the same time.
+	stop: function (e) {
+		return L.DomEvent
+			.preventDefault(e)
+			.stopPropagation(e);
+	},
+
+	// @function getMousePosition(ev: DOMEvent, container?: HTMLElement): Point
+	// Gets normalized mouse position from a DOM event relative to the
+	// `container` or to the whole page if not specified.
+	getMousePosition: function (e, container) {
+		if (!container) {
+			return new L.Point(e.clientX, e.clientY);
+		}
+
+		var rect = container.getBoundingClientRect();
+
+		return new L.Point(
+			e.clientX - rect.left - container.clientLeft,
+			e.clientY - rect.top - container.clientTop);
+	},
+
+	// Chrome on Win scrolls double the pixels as in other platforms (see #4538),
+	// and Firefox scrolls device pixels, not CSS pixels
+	_wheelPxFactor: (L.Browser.win && L.Browser.chrome) ? 2 :
+	                L.Browser.gecko ? window.devicePixelRatio :
+	                1,
+
+	// @function getWheelDelta(ev: DOMEvent): Number
+	// Gets normalized wheel delta from a mousewheel DOM event, in vertical
+	// pixels scrolled (negative if scrolling down).
+	// Events from pointing devices without precise scrolling are mapped to
+	// a best guess of 60 pixels.
+	getWheelDelta: function (e) {
+		return (L.Browser.edge) ? e.wheelDeltaY / 2 : // Don't trust window-geometry-based delta
+		       (e.deltaY && e.deltaMode === 0) ? -e.deltaY / L.DomEvent._wheelPxFactor : // Pixels
+		       (e.deltaY && e.deltaMode === 1) ? -e.deltaY * 20 : // Lines
+		       (e.deltaY && e.deltaMode === 2) ? -e.deltaY * 60 : // Pages
+		       (e.deltaX || e.deltaZ) ? 0 :	// Skip horizontal/depth wheel events
+		       e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 2 : // Legacy IE pixels
+		       (e.detail && Math.abs(e.detail) < 32765) ? -e.detail * 20 : // Legacy Moz lines
+		       e.detail ? e.detail / -32765 * 60 : // Legacy Moz pages
+		       0;
+	},
+
+	_skipEvents: {},
+
+	_fakeStop: function (e) {
+		// fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e)
+		L.DomEvent._skipEvents[e.type] = true;
+	},
+
+	_skipped: function (e) {
+		var skipped = this._skipEvents[e.type];
+		// reset when checking, as it's only used in map container and propagates outside of the map
+		this._skipEvents[e.type] = false;
+		return skipped;
+	},
+
+	// check if element really left/entered the event target (for mouseenter/mouseleave)
+	_isExternalTarget: function (el, e) {
+
+		var related = e.relatedTarget;
+
+		if (!related) { return true; }
+
+		try {
+			while (related && (related !== el)) {
+				related = related.parentNode;
+			}
+		} catch (err) {
+			return false;
+		}
+		return (related !== el);
+	},
+
+	// this is a horrible workaround for a bug in Android where a single touch triggers two click events
+	_filterClick: function (e, handler) {
+		var timeStamp = (e.timeStamp || (e.originalEvent && e.originalEvent.timeStamp)),
+		    elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);
+
+		// are they closer together than 500ms yet more than 100ms?
+		// Android typically triggers them ~300ms apart while multiple listeners
+		// on the same event should be triggered far faster;
+		// or check if click is simulated on the element, and if it is, reject any non-simulated events
+
+		if ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) {
+			L.DomEvent.stop(e);
+			return;
+		}
+		L.DomEvent._lastClick = timeStamp;
+
+		handler(e);
+	}
+};
+
+// @function addListener(…): this
+// Alias to [`L.DomEvent.on`](#domevent-on)
+L.DomEvent.addListener = L.DomEvent.on;
+
+// @function removeListener(…): this
+// Alias to [`L.DomEvent.off`](#domevent-off)
+L.DomEvent.removeListener = L.DomEvent.off;
+
+
+
+/*
+ * @class PosAnimation
+ * @aka L.PosAnimation
+ * @inherits Evented
+ * Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.
+ *
+ * @example
+ * ```js
+ * var fx = new L.PosAnimation();
+ * fx.run(el, [300, 500], 0.5);
+ * ```
+ *
+ * @constructor L.PosAnimation()
+ * Creates a `PosAnimation` object.
+ *
+ */
+
+L.PosAnimation = L.Evented.extend({
+
+	// @method run(el: HTMLElement, newPos: Point, duration?: Number, easeLinearity?: Number)
+	// Run an animation of a given element to a new position, optionally setting
+	// duration in seconds (`0.25` by default) and easing linearity factor (3rd
+	// argument of the [cubic bezier curve](http://cubic-bezier.com/#0,0,.5,1),
+	// `0.5` by default).
+	run: function (el, newPos, duration, easeLinearity) {
+		this.stop();
+
+		this._el = el;
+		this._inProgress = true;
+		this._duration = duration || 0.25;
+		this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2);
+
+		this._startPos = L.DomUtil.getPosition(el);
+		this._offset = newPos.subtract(this._startPos);
+		this._startTime = +new Date();
+
+		// @event start: Event
+		// Fired when the animation starts
+		this.fire('start');
+
+		this._animate();
+	},
+
+	// @method stop()
+	// Stops the animation (if currently running).
+	stop: function () {
+		if (!this._inProgress) { return; }
+
+		this._step(true);
+		this._complete();
+	},
+
+	_animate: function () {
+		// animation loop
+		this._animId = L.Util.requestAnimFrame(this._animate, this);
+		this._step();
+	},
+
+	_step: function (round) {
+		var elapsed = (+new Date()) - this._startTime,
+		    duration = this._duration * 1000;
+
+		if (elapsed < duration) {
+			this._runFrame(this._easeOut(elapsed / duration), round);
+		} else {
+			this._runFrame(1);
+			this._complete();
+		}
+	},
+
+	_runFrame: function (progress, round) {
+		var pos = this._startPos.add(this._offset.multiplyBy(progress));
+		if (round) {
+			pos._round();
+		}
+		L.DomUtil.setPosition(this._el, pos);
+
+		// @event step: Event
+		// Fired continuously during the animation.
+		this.fire('step');
+	},
+
+	_complete: function () {
+		L.Util.cancelAnimFrame(this._animId);
+
+		this._inProgress = false;
+		// @event end: Event
+		// Fired when the animation ends.
+		this.fire('end');
+	},
+
+	_easeOut: function (t) {
+		return 1 - Math.pow(1 - t, this._easeOutPower);
+	}
+});
+
+
+
+/*
+ * @namespace Projection
+ * @projection L.Projection.Mercator
+ *
+ * Elliptical Mercator projection — more complex than Spherical Mercator. Takes into account that Earth is a geoid, not a perfect sphere. Used by the EPSG:3395 CRS.
+ */
+
+L.Projection.Mercator = {
+	R: 6378137,
+	R_MINOR: 6356752.314245179,
+
+	bounds: L.bounds([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]),
+
+	project: function (latlng) {
+		var d = Math.PI / 180,
+		    r = this.R,
+		    y = latlng.lat * d,
+		    tmp = this.R_MINOR / r,
+		    e = Math.sqrt(1 - tmp * tmp),
+		    con = e * Math.sin(y);
+
+		var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);
+		y = -r * Math.log(Math.max(ts, 1E-10));
+
+		return new L.Point(latlng.lng * d * r, y);
+	},
+
+	unproject: function (point) {
+		var d = 180 / Math.PI,
+		    r = this.R,
+		    tmp = this.R_MINOR / r,
+		    e = Math.sqrt(1 - tmp * tmp),
+		    ts = Math.exp(-point.y / r),
+		    phi = Math.PI / 2 - 2 * Math.atan(ts);
+
+		for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {
+			con = e * Math.sin(phi);
+			con = Math.pow((1 - con) / (1 + con), e / 2);
+			dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;
+			phi += dphi;
+		}
+
+		return new L.LatLng(phi * d, point.x * d / r);
+	}
+};
+
+
+
+/*
+ * @namespace CRS
+ * @crs L.CRS.EPSG3395
+ *
+ * Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
+ */
+
+L.CRS.EPSG3395 = L.extend({}, L.CRS.Earth, {
+	code: 'EPSG:3395',
+	projection: L.Projection.Mercator,
+
+	transformation: (function () {
+		var scale = 0.5 / (Math.PI * L.Projection.Mercator.R);
+		return new L.Transformation(scale, 0.5, -scale, 0.5);
+	}())
+});
+
+
+
+/*
+ * @class GridLayer
+ * @inherits Layer
+ * @aka L.GridLayer
+ *
+ * Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces `TileLayer.Canvas`.
+ * GridLayer can be extended to create a tiled grid of HTML elements like `<canvas>`, `<img>` or `<div>`. GridLayer will handle creating and animating these DOM elements for you.
+ *
+ *
+ * @section Synchronous usage
+ * @example
+ *
+ * To create a custom layer, extend GridLayer and implement the `createTile()` method, which will be passed a `Point` object with the `x`, `y`, and `z` (zoom level) coordinates to draw your tile.
+ *
+ * ```js
+ * var CanvasLayer = L.GridLayer.extend({
+ *     createTile: function(coords){
+ *         // create a <canvas> element for drawing
+ *         var tile = L.DomUtil.create('canvas', 'leaflet-tile');
+ *
+ *         // setup tile width and height according to the options
+ *         var size = this.getTileSize();
+ *         tile.width = size.x;
+ *         tile.height = size.y;
+ *
+ *         // get a canvas context and draw something on it using coords.x, coords.y and coords.z
+ *         var ctx = tile.getContext('2d');
+ *
+ *         // return the tile so it can be rendered on screen
+ *         return tile;
+ *     }
+ * });
+ * ```
+ *
+ * @section Asynchronous usage
+ * @example
+ *
+ * Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the `done()` callback.
+ *
+ * ```js
+ * var CanvasLayer = L.GridLayer.extend({
+ *     createTile: function(coords, done){
+ *         var error;
+ *
+ *         // create a <canvas> element for drawing
+ *         var tile = L.DomUtil.create('canvas', 'leaflet-tile');
+ *
+ *         // setup tile width and height according to the options
+ *         var size = this.getTileSize();
+ *         tile.width = size.x;
+ *         tile.height = size.y;
+ *
+ *         // draw something asynchronously and pass the tile to the done() callback
+ *         setTimeout(function() {
+ *             done(error, tile);
+ *         }, 1000);
+ *
+ *         return tile;
+ *     }
+ * });
+ * ```
+ *
+ * @section
+ */
+
+
+L.GridLayer = L.Layer.extend({
+
+	// @section
+	// @aka GridLayer options
+	options: {
+		// @option tileSize: Number|Point = 256
+		// Width and height of tiles in the grid. Use a number if width and height are equal, or `L.point(width, height)` otherwise.
+		tileSize: 256,
+
+		// @option opacity: Number = 1.0
+		// Opacity of the tiles. Can be used in the `createTile()` function.
+		opacity: 1,
+
+		// @option updateWhenIdle: Boolean = depends
+		// If `false`, new tiles are loaded during panning, otherwise only after it (for better performance). `true` by default on mobile browsers, otherwise `false`.
+		updateWhenIdle: L.Browser.mobile,
+
+		// @option updateWhenZooming: Boolean = true
+		// By default, a smooth zoom animation (during a [touch zoom](#map-touchzoom) or a [`flyTo()`](#map-flyto)) will update grid layers every integer zoom level. Setting this option to `false` will update the grid layer only when the smooth animation ends.
+		updateWhenZooming: true,
+
+		// @option updateInterval: Number = 200
+		// Tiles will not update more than once every `updateInterval` milliseconds when panning.
+		updateInterval: 200,
+
+		// @option zIndex: Number = 1
+		// The explicit zIndex of the tile layer.
+		zIndex: 1,
+
+		// @option bounds: LatLngBounds = undefined
+		// If set, tiles will only be loaded inside the set `LatLngBounds`.
+		bounds: null,
+
+		// @option minZoom: Number = 0
+		// The minimum zoom level that tiles will be loaded at. By default the entire map.
+		minZoom: 0,
+
+		// @option maxZoom: Number = undefined
+		// The maximum zoom level that tiles will be loaded at.
+		maxZoom: undefined,
+
+		// @option noWrap: Boolean = false
+		// Whether the layer is wrapped around the antimeridian. If `true`, the
+		// GridLayer will only be displayed once at low zoom levels. Has no
+		// effect when the [map CRS](#map-crs) doesn't wrap around. Can be used
+		// in combination with [`bounds`](#gridlayer-bounds) to prevent requesting
+		// tiles outside the CRS limits.
+		noWrap: false,
+
+		// @option pane: String = 'tilePane'
+		// `Map pane` where the grid layer will be added.
+		pane: 'tilePane',
+
+		// @option className: String = ''
+		// A custom class name to assign to the tile layer. Empty by default.
+		className: '',
+
+		// @option keepBuffer: Number = 2
+		// When panning the map, keep this many rows and columns of tiles before unloading them.
+		keepBuffer: 2
+	},
+
+	initialize: function (options) {
+		L.setOptions(this, options);
+	},
+
+	onAdd: function () {
+		this._initContainer();
+
+		this._levels = {};
+		this._tiles = {};
+
+		this._resetView();
+		this._update();
+	},
+
+	beforeAdd: function (map) {
+		map._addZoomLimit(this);
+	},
+
+	onRemove: function (map) {
+		this._removeAllTiles();
+		L.DomUtil.remove(this._container);
+		map._removeZoomLimit(this);
+		this._container = null;
+		this._tileZoom = null;
+	},
+
+	// @method bringToFront: this
+	// Brings the tile layer to the top of all tile layers.
+	bringToFront: function () {
+		if (this._map) {
+			L.DomUtil.toFront(this._container);
+			this._setAutoZIndex(Math.max);
+		}
+		return this;
+	},
+
+	// @method bringToBack: this
+	// Brings the tile layer to the bottom of all tile layers.
+	bringToBack: function () {
+		if (this._map) {
+			L.DomUtil.toBack(this._container);
+			this._setAutoZIndex(Math.min);
+		}
+		return this;
+	},
+
+	// @method getContainer: HTMLElement
+	// Returns the HTML element that contains the tiles for this layer.
+	getContainer: function () {
+		return this._container;
+	},
+
+	// @method setOpacity(opacity: Number): this
+	// Changes the [opacity](#gridlayer-opacity) of the grid layer.
+	setOpacity: function (opacity) {
+		this.options.opacity = opacity;
+		this._updateOpacity();
+		return this;
+	},
+
+	// @method setZIndex(zIndex: Number): this
+	// Changes the [zIndex](#gridlayer-zindex) of the grid layer.
+	setZIndex: function (zIndex) {
+		this.options.zIndex = zIndex;
+		this._updateZIndex();
+
+		return this;
+	},
+
+	// @method isLoading: Boolean
+	// Returns `true` if any tile in the grid layer has not finished loading.
+	isLoading: function () {
+		return this._loading;
+	},
+
+	// @method redraw: this
+	// Causes the layer to clear all the tiles and request them again.
+	redraw: function () {
+		if (this._map) {
+			this._removeAllTiles();
+			this._update();
+		}
+		return this;
+	},
+
+	getEvents: function () {
+		var events = {
+			viewprereset: this._invalidateAll,
+			viewreset: this._resetView,
+			zoom: this._resetView,
+			moveend: this._onMoveEnd
+		};
+
+		if (!this.options.updateWhenIdle) {
+			// update tiles on move, but not more often than once per given interval
+			if (!this._onMove) {
+				this._onMove = L.Util.throttle(this._onMoveEnd, this.options.updateInterval, this);
+			}
+
+			events.move = this._onMove;
+		}
+
+		if (this._zoomAnimated) {
+			events.zoomanim = this._animateZoom;
+		}
+
+		return events;
+	},
+
+	// @section Extension methods
+	// Layers extending `GridLayer` shall reimplement the following method.
+	// @method createTile(coords: Object, done?: Function): HTMLElement
+	// Called only internally, must be overriden by classes extending `GridLayer`.
+	// Returns the `HTMLElement` corresponding to the given `coords`. If the `done` callback
+	// is specified, it must be called when the tile has finished loading and drawing.
+	createTile: function () {
+		return document.createElement('div');
+	},
+
+	// @section
+	// @method getTileSize: Point
+	// Normalizes the [tileSize option](#gridlayer-tilesize) into a point. Used by the `createTile()` method.
+	getTileSize: function () {
+		var s = this.options.tileSize;
+		return s instanceof L.Point ? s : new L.Point(s, s);
+	},
+
+	_updateZIndex: function () {
+		if (this._container && this.options.zIndex !== undefined && this.options.zIndex !== null) {
+			this._container.style.zIndex = this.options.zIndex;
+		}
+	},
+
+	_setAutoZIndex: function (compare) {
+		// go through all other layers of the same pane, set zIndex to max + 1 (front) or min - 1 (back)
+
+		var layers = this.getPane().children,
+		    edgeZIndex = -compare(-Infinity, Infinity); // -Infinity for max, Infinity for min
+
+		for (var i = 0, len = layers.length, zIndex; i < len; i++) {
+
+			zIndex = layers[i].style.zIndex;
+
+			if (layers[i] !== this._container && zIndex) {
+				edgeZIndex = compare(edgeZIndex, +zIndex);
+			}
+		}
+
+		if (isFinite(edgeZIndex)) {
+			this.options.zIndex = edgeZIndex + compare(-1, 1);
+			this._updateZIndex();
+		}
+	},
+
+	_updateOpacity: function () {
+		if (!this._map) { return; }
+
+		// IE doesn't inherit filter opacity properly, so we're forced to set it on tiles
+		if (L.Browser.ielt9) { return; }
+
+		L.DomUtil.setOpacity(this._container, this.options.opacity);
+
+		var now = +new Date(),
+		    nextFrame = false,
+		    willPrune = false;
+
+		for (var key in this._tiles) {
+			var tile = this._tiles[key];
+			if (!tile.current || !tile.loaded) { continue; }
+
+			var fade = Math.min(1, (now - tile.loaded) / 200);
+
+			L.DomUtil.setOpacity(tile.el, fade);
+			if (fade < 1) {
+				nextFrame = true;
+			} else {
+				if (tile.active) { willPrune = true; }
+				tile.active = true;
+			}
+		}
+
+		if (willPrune && !this._noPrune) { this._pruneTiles(); }
+
+		if (nextFrame) {
+			L.Util.cancelAnimFrame(this._fadeFrame);
+			this._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this);
+		}
+	},
+
+	_initContainer: function () {
+		if (this._container) { return; }
+
+		this._container = L.DomUtil.create('div', 'leaflet-layer ' + (this.options.className || ''));
+		this._updateZIndex();
+
+		if (this.options.opacity < 1) {
+			this._updateOpacity();
+		}
+
+		this.getPane().appendChild(this._container);
+	},
+
+	_updateLevels: function () {
+
+		var zoom = this._tileZoom,
+		    maxZoom = this.options.maxZoom;
+
+		if (zoom === undefined) { return undefined; }
+
+		for (var z in this._levels) {
+			if (this._levels[z].el.children.length || z === zoom) {
+				this._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z);
+			} else {
+				L.DomUtil.remove(this._levels[z].el);
+				this._removeTilesAtZoom(z);
+				delete this._levels[z];
+			}
+		}
+
+		var level = this._levels[zoom],
+		    map = this._map;
+
+		if (!level) {
+			level = this._levels[zoom] = {};
+
+			level.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container);
+			level.el.style.zIndex = maxZoom;
+
+			level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round();
+			level.zoom = zoom;
+
+			this._setZoomTransform(level, map.getCenter(), map.getZoom());
+
+			// force the browser to consider the newly added element for transition
+			L.Util.falseFn(level.el.offsetWidth);
+		}
+
+		this._level = level;
+
+		return level;
+	},
+
+	_pruneTiles: function () {
+		if (!this._map) {
+			return;
+		}
+
+		var key, tile;
+
+		var zoom = this._map.getZoom();
+		if (zoom > this.options.maxZoom ||
+			zoom < this.options.minZoom) {
+			this._removeAllTiles();
+			return;
+		}
+
+		for (key in this._tiles) {
+			tile = this._tiles[key];
+			tile.retain = tile.current;
+		}
+
+		for (key in this._tiles) {
+			tile = this._tiles[key];
+			if (tile.current && !tile.active) {
+				var coords = tile.coords;
+				if (!this._retainParent(coords.x, coords.y, coords.z, coords.z - 5)) {
+					this._retainChildren(coords.x, coords.y, coords.z, coords.z + 2);
+				}
+			}
+		}
+
+		for (key in this._tiles) {
+			if (!this._tiles[key].retain) {
+				this._removeTile(key);
+			}
+		}
+	},
+
+	_removeTilesAtZoom: function (zoom) {
+		for (var key in this._tiles) {
+			if (this._tiles[key].coords.z !== zoom) {
+				continue;
+			}
+			this._removeTile(key);
+		}
+	},
+
+	_removeAllTiles: function () {
+		for (var key in this._tiles) {
+			this._removeTile(key);
+		}
+	},
+
+	_invalidateAll: function () {
+		for (var z in this._levels) {
+			L.DomUtil.remove(this._levels[z].el);
+			delete this._levels[z];
+		}
+		this._removeAllTiles();
+
+		this._tileZoom = null;
+	},
+
+	_retainParent: function (x, y, z, minZoom) {
+		var x2 = Math.floor(x / 2),
+		    y2 = Math.floor(y / 2),
+		    z2 = z - 1,
+		    coords2 = new L.Point(+x2, +y2);
+		coords2.z = +z2;
+
+		var key = this._tileCoordsToKey(coords2),
+		    tile = this._tiles[key];
+
+		if (tile && tile.active) {
+			tile.retain = true;
+			return true;
+
+		} else if (tile && tile.loaded) {
+			tile.retain = true;
+		}
+
+		if (z2 > minZoom) {
+			return this._retainParent(x2, y2, z2, minZoom);
+		}
+
+		return false;
+	},
+
+	_retainChildren: function (x, y, z, maxZoom) {
+
+		for (var i = 2 * x; i < 2 * x + 2; i++) {
+			for (var j = 2 * y; j < 2 * y + 2; j++) {
+
+				var coords = new L.Point(i, j);
+				coords.z = z + 1;
+
+				var key = this._tileCoordsToKey(coords),
+				    tile = this._tiles[key];
+
+				if (tile && tile.active) {
+					tile.retain = true;
+					continue;
+
+				} else if (tile && tile.loaded) {
+					tile.retain = true;
+				}
+
+				if (z + 1 < maxZoom) {
+					this._retainChildren(i, j, z + 1, maxZoom);
+				}
+			}
+		}
+	},
+
+	_resetView: function (e) {
+		var animating = e && (e.pinch || e.flyTo);
+		this._setView(this._map.getCenter(), this._map.getZoom(), animating, animating);
+	},
+
+	_animateZoom: function (e) {
+		this._setView(e.center, e.zoom, true, e.noUpdate);
+	},
+
+	_setView: function (center, zoom, noPrune, noUpdate) {
+		var tileZoom = Math.round(zoom);
+		if ((this.options.maxZoom !== undefined && tileZoom > this.options.maxZoom) ||
+		    (this.options.minZoom !== undefined && tileZoom < this.options.minZoom)) {
+			tileZoom = undefined;
+		}
+
+		var tileZoomChanged = this.options.updateWhenZooming && (tileZoom !== this._tileZoom);
+
+		if (!noUpdate || tileZoomChanged) {
+
+			this._tileZoom = tileZoom;
+
+			if (this._abortLoading) {
+				this._abortLoading();
+			}
+
+			this._updateLevels();
+			this._resetGrid();
+
+			if (tileZoom !== undefined) {
+				this._update(center);
+			}
+
+			if (!noPrune) {
+				this._pruneTiles();
+			}
+
+			// Flag to prevent _updateOpacity from pruning tiles during
+			// a zoom anim or a pinch gesture
+			this._noPrune = !!noPrune;
+		}
+
+		this._setZoomTransforms(center, zoom);
+	},
+
+	_setZoomTransforms: function (center, zoom) {
+		for (var i in this._levels) {
+			this._setZoomTransform(this._levels[i], center, zoom);
+		}
+	},
+
+	_setZoomTransform: function (level, center, zoom) {
+		var scale = this._map.getZoomScale(zoom, level.zoom),
+		    translate = level.origin.multiplyBy(scale)
+		        .subtract(this._map._getNewPixelOrigin(center, zoom)).round();
+
+		if (L.Browser.any3d) {
+			L.DomUtil.setTransform(level.el, translate, scale);
+		} else {
+			L.DomUtil.setPosition(level.el, translate);
+		}
+	},
+
+	_resetGrid: function () {
+		var map = this._map,
+		    crs = map.options.crs,
+		    tileSize = this._tileSize = this.getTileSize(),
+		    tileZoom = this._tileZoom;
+
+		var bounds = this._map.getPixelWorldBounds(this._tileZoom);
+		if (bounds) {
+			this._globalTileRange = this._pxBoundsToTileRange(bounds);
+		}
+
+		this._wrapX = crs.wrapLng && !this.options.noWrap && [
+			Math.floor(map.project([0, crs.wrapLng[0]], tileZoom).x / tileSize.x),
+			Math.ceil(map.project([0, crs.wrapLng[1]], tileZoom).x / tileSize.y)
+		];
+		this._wrapY = crs.wrapLat && !this.options.noWrap && [
+			Math.floor(map.project([crs.wrapLat[0], 0], tileZoom).y / tileSize.x),
+			Math.ceil(map.project([crs.wrapLat[1], 0], tileZoom).y / tileSize.y)
+		];
+	},
+
+	_onMoveEnd: function () {
+		if (!this._map || this._map._animatingZoom) { return; }
+
+		this._update();
+	},
+
+	_getTiledPixelBounds: function (center) {
+		var map = this._map,
+		    mapZoom = map._animatingZoom ? Math.max(map._animateToZoom, map.getZoom()) : map.getZoom(),
+		    scale = map.getZoomScale(mapZoom, this._tileZoom),
+		    pixelCenter = map.project(center, this._tileZoom).floor(),
+		    halfSize = map.getSize().divideBy(scale * 2);
+
+		return new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize));
+	},
+
+	// Private method to load tiles in the grid's active zoom level according to map bounds
+	_update: function (center) {
+		var map = this._map;
+		if (!map) { return; }
+		var zoom = map.getZoom();
+
+		if (center === undefined) { center = map.getCenter(); }
+		if (this._tileZoom === undefined) { return; }	// if out of minzoom/maxzoom
+
+		var pixelBounds = this._getTiledPixelBounds(center),
+		    tileRange = this._pxBoundsToTileRange(pixelBounds),
+		    tileCenter = tileRange.getCenter(),
+		    queue = [],
+		    margin = this.options.keepBuffer,
+		    noPruneRange = new L.Bounds(tileRange.getBottomLeft().subtract([margin, -margin]),
+		                              tileRange.getTopRight().add([margin, -margin]));
+
+		for (var key in this._tiles) {
+			var c = this._tiles[key].coords;
+			if (c.z !== this._tileZoom || !noPruneRange.contains(L.point(c.x, c.y))) {
+				this._tiles[key].current = false;
+			}
+		}
+
+		// _update just loads more tiles. If the tile zoom level differs too much
+		// from the map's, let _setView reset levels and prune old tiles.
+		if (Math.abs(zoom - this._tileZoom) > 1) { this._setView(center, zoom); return; }
+
+		// create a queue of coordinates to load tiles from
+		for (var j = tileRange.min.y; j <= tileRange.max.y; j++) {
+			for (var i = tileRange.min.x; i <= tileRange.max.x; i++) {
+				var coords = new L.Point(i, j);
+				coords.z = this._tileZoom;
+
+				if (!this._isValidTile(coords)) { continue; }
+
+				var tile = this._tiles[this._tileCoordsToKey(coords)];
+				if (tile) {
+					tile.current = true;
+				} else {
+					queue.push(coords);
+				}
+			}
+		}
+
+		// sort tile queue to load tiles in order of their distance to center
+		queue.sort(function (a, b) {
+			return a.distanceTo(tileCenter) - b.distanceTo(tileCenter);
+		});
+
+		if (queue.length !== 0) {
+			// if it's the first batch of tiles to load
+			if (!this._loading) {
+				this._loading = true;
+				// @event loading: Event
+				// Fired when the grid layer starts loading tiles.
+				this.fire('loading');
+			}
+
+			// create DOM fragment to append tiles in one batch
+			var fragment = document.createDocumentFragment();
+
+			for (i = 0; i < queue.length; i++) {
+				this._addTile(queue[i], fragment);
+			}
+
+			this._level.el.appendChild(fragment);
+		}
+	},
+
+	_isValidTile: function (coords) {
+		var crs = this._map.options.crs;
+
+		if (!crs.infinite) {
+			// don't load tile if it's out of bounds and not wrapped
+			var bounds = this._globalTileRange;
+			if ((!crs.wrapLng && (coords.x < bounds.min.x || coords.x > bounds.max.x)) ||
+			    (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y))) { return false; }
+		}
+
+		if (!this.options.bounds) { return true; }
+
+		// don't load tile if it doesn't intersect the bounds in options
+		var tileBounds = this._tileCoordsToBounds(coords);
+		return L.latLngBounds(this.options.bounds).overlaps(tileBounds);
+	},
+
+	_keyToBounds: function (key) {
+		return this._tileCoordsToBounds(this._keyToTileCoords(key));
+	},
+
+	// converts tile coordinates to its geographical bounds
+	_tileCoordsToBounds: function (coords) {
+
+		var map = this._map,
+		    tileSize = this.getTileSize(),
+
+		    nwPoint = coords.scaleBy(tileSize),
+		    sePoint = nwPoint.add(tileSize),
+
+		    nw = map.unproject(nwPoint, coords.z),
+		    se = map.unproject(sePoint, coords.z),
+		    bounds = new L.LatLngBounds(nw, se);
+
+		if (!this.options.noWrap) {
+			map.wrapLatLngBounds(bounds);
+		}
+
+		return bounds;
+	},
+
+	// converts tile coordinates to key for the tile cache
+	_tileCoordsToKey: function (coords) {
+		return coords.x + ':' + coords.y + ':' + coords.z;
+	},
+
+	// converts tile cache key to coordinates
+	_keyToTileCoords: function (key) {
+		var k = key.split(':'),
+		    coords = new L.Point(+k[0], +k[1]);
+		coords.z = +k[2];
+		return coords;
+	},
+
+	_removeTile: function (key) {
+		var tile = this._tiles[key];
+		if (!tile) { return; }
+
+		L.DomUtil.remove(tile.el);
+
+		delete this._tiles[key];
+
+		// @event tileunload: TileEvent
+		// Fired when a tile is removed (e.g. when a tile goes off the screen).
+		this.fire('tileunload', {
+			tile: tile.el,
+			coords: this._keyToTileCoords(key)
+		});
+	},
+
+	_initTile: function (tile) {
+		L.DomUtil.addClass(tile, 'leaflet-tile');
+
+		var tileSize = this.getTileSize();
+		tile.style.width = tileSize.x + 'px';
+		tile.style.height = tileSize.y + 'px';
+
+		tile.onselectstart = L.Util.falseFn;
+		tile.onmousemove = L.Util.falseFn;
+
+		// update opacity on tiles in IE7-8 because of filter inheritance problems
+		if (L.Browser.ielt9 && this.options.opacity < 1) {
+			L.DomUtil.setOpacity(tile, this.options.opacity);
+		}
+
+		// without this hack, tiles disappear after zoom on Chrome for Android
+		// https://github.com/Leaflet/Leaflet/issues/2078
+		if (L.Browser.android && !L.Browser.android23) {
+			tile.style.WebkitBackfaceVisibility = 'hidden';
+		}
+	},
+
+	_addTile: function (coords, container) {
+		var tilePos = this._getTilePos(coords),
+		    key = this._tileCoordsToKey(coords);
+
+		var tile = this.createTile(this._wrapCoords(coords), L.bind(this._tileReady, this, coords));
+
+		this._initTile(tile);
+
+		// if createTile is defined with a second argument ("done" callback),
+		// we know that tile is async and will be ready later; otherwise
+		if (this.createTile.length < 2) {
+			// mark tile as ready, but delay one frame for opacity animation to happen
+			L.Util.requestAnimFrame(L.bind(this._tileReady, this, coords, null, tile));
+		}
+
+		L.DomUtil.setPosition(tile, tilePos);
+
+		// save tile in cache
+		this._tiles[key] = {
+			el: tile,
+			coords: coords,
+			current: true
+		};
+
+		container.appendChild(tile);
+		// @event tileloadstart: TileEvent
+		// Fired when a tile is requested and starts loading.
+		this.fire('tileloadstart', {
+			tile: tile,
+			coords: coords
+		});
+	},
+
+	_tileReady: function (coords, err, tile) {
+		if (!this._map) { return; }
+
+		if (err) {
+			// @event tileerror: TileErrorEvent
+			// Fired when there is an error loading a tile.
+			this.fire('tileerror', {
+				error: err,
+				tile: tile,
+				coords: coords
+			});
+		}
+
+		var key = this._tileCoordsToKey(coords);
+
+		tile = this._tiles[key];
+		if (!tile) { return; }
+
+		tile.loaded = +new Date();
+		if (this._map._fadeAnimated) {
+			L.DomUtil.setOpacity(tile.el, 0);
+			L.Util.cancelAnimFrame(this._fadeFrame);
+			this._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this);
+		} else {
+			tile.active = true;
+			this._pruneTiles();
+		}
+
+		if (!err) {
+			L.DomUtil.addClass(tile.el, 'leaflet-tile-loaded');
+
+			// @event tileload: TileEvent
+			// Fired when a tile loads.
+			this.fire('tileload', {
+				tile: tile.el,
+				coords: coords
+			});
+		}
+
+		if (this._noTilesToLoad()) {
+			this._loading = false;
+			// @event load: Event
+			// Fired when the grid layer loaded all visible tiles.
+			this.fire('load');
+
+			if (L.Browser.ielt9 || !this._map._fadeAnimated) {
+				L.Util.requestAnimFrame(this._pruneTiles, this);
+			} else {
+				// Wait a bit more than 0.2 secs (the duration of the tile fade-in)
+				// to trigger a pruning.
+				setTimeout(L.bind(this._pruneTiles, this), 250);
+			}
+		}
+	},
+
+	_getTilePos: function (coords) {
+		return coords.scaleBy(this.getTileSize()).subtract(this._level.origin);
+	},
+
+	_wrapCoords: function (coords) {
+		var newCoords = new L.Point(
+			this._wrapX ? L.Util.wrapNum(coords.x, this._wrapX) : coords.x,
+			this._wrapY ? L.Util.wrapNum(coords.y, this._wrapY) : coords.y);
+		newCoords.z = coords.z;
+		return newCoords;
+	},
+
+	_pxBoundsToTileRange: function (bounds) {
+		var tileSize = this.getTileSize();
+		return new L.Bounds(
+			bounds.min.unscaleBy(tileSize).floor(),
+			bounds.max.unscaleBy(tileSize).ceil().subtract([1, 1]));
+	},
+
+	_noTilesToLoad: function () {
+		for (var key in this._tiles) {
+			if (!this._tiles[key].loaded) { return false; }
+		}
+		return true;
+	}
+});
+
+// @factory L.gridLayer(options?: GridLayer options)
+// Creates a new instance of GridLayer with the supplied options.
+L.gridLayer = function (options) {
+	return new L.GridLayer(options);
+};
+
+
+
+/*
+ * @class TileLayer
+ * @inherits GridLayer
+ * @aka L.TileLayer
+ * Used to load and display tile layers on the map. Extends `GridLayer`.
+ *
+ * @example
+ *
+ * ```js
+ * L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar'}).addTo(map);
+ * ```
+ *
+ * @section URL template
+ * @example
+ *
+ * A string of the following form:
+ *
+ * ```
+ * 'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'
+ * ```
+ *
+ * `{s}` means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; `a`, `b` or `c` by default, can be omitted), `{z}` — zoom level, `{x}` and `{y}` — tile coordinates. `{r}` can be used to add @2x to the URL to load retina tiles.
+ *
+ * You can use custom keys in the template, which will be [evaluated](#util-template) from TileLayer options, like this:
+ *
+ * ```
+ * L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
+ * ```
+ */
+
+
+L.TileLayer = L.GridLayer.extend({
+
+	// @section
+	// @aka TileLayer options
+	options: {
+		// @option minZoom: Number = 0
+		// Minimum zoom number.
+		minZoom: 0,
+
+		// @option maxZoom: Number = 18
+		// Maximum zoom number.
+		maxZoom: 18,
+
+		// @option maxNativeZoom: Number = null
+		// Maximum zoom number the tile source has available. If it is specified,
+		// the tiles on all zoom levels higher than `maxNativeZoom` will be loaded
+		// from `maxNativeZoom` level and auto-scaled.
+		maxNativeZoom: null,
+
+		// @option minNativeZoom: Number = null
+		// Minimum zoom number the tile source has available. If it is specified,
+		// the tiles on all zoom levels lower than `minNativeZoom` will be loaded
+		// from `minNativeZoom` level and auto-scaled.
+		minNativeZoom: null,
+
+		// @option subdomains: String|String[] = 'abc'
+		// Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
+		subdomains: 'abc',
+
+		// @option errorTileUrl: String = ''
+		// URL to the tile image to show in place of the tile that failed to load.
+		errorTileUrl: '',
+
+		// @option zoomOffset: Number = 0
+		// The zoom number used in tile URLs will be offset with this value.
+		zoomOffset: 0,
+
+		// @option tms: Boolean = false
+		// If `true`, inverses Y axis numbering for tiles (turn this on for [TMS](https://en.wikipedia.org/wiki/Tile_Map_Service) services).
+		tms: false,
+
+		// @option zoomReverse: Boolean = false
+		// If set to true, the zoom number used in tile URLs will be reversed (`maxZoom - zoom` instead of `zoom`)
+		zoomReverse: false,
+
+		// @option detectRetina: Boolean = false
+		// If `true` and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
+		detectRetina: false,
+
+		// @option crossOrigin: Boolean = false
+		// If true, all tiles will have their crossOrigin attribute set to ''. This is needed if you want to access tile pixel data.
+		crossOrigin: false
+	},
+
+	initialize: function (url, options) {
+
+		this._url = url;
+
+		options = L.setOptions(this, options);
+
+		// detecting retina displays, adjusting tileSize and zoom levels
+		if (options.detectRetina && L.Browser.retina && options.maxZoom > 0) {
+
+			options.tileSize = Math.floor(options.tileSize / 2);
+
+			if (!options.zoomReverse) {
+				options.zoomOffset++;
+				options.maxZoom--;
+			} else {
+				options.zoomOffset--;
+				options.minZoom++;
+			}
+
+			options.minZoom = Math.max(0, options.minZoom);
+		}
+
+		if (typeof options.subdomains === 'string') {
+			options.subdomains = options.subdomains.split('');
+		}
+
+		// for https://github.com/Leaflet/Leaflet/issues/137
+		if (!L.Browser.android) {
+			this.on('tileunload', this._onTileRemove);
+		}
+	},
+
+	// @method setUrl(url: String, noRedraw?: Boolean): this
+	// Updates the layer's URL template and redraws it (unless `noRedraw` is set to `true`).
+	setUrl: function (url, noRedraw) {
+		this._url = url;
+
+		if (!noRedraw) {
+			this.redraw();
+		}
+		return this;
+	},
+
+	// @method createTile(coords: Object, done?: Function): HTMLElement
+	// Called only internally, overrides GridLayer's [`createTile()`](#gridlayer-createtile)
+	// to return an `<img>` HTML element with the appropiate image URL given `coords`. The `done`
+	// callback is called when the tile has been loaded.
+	createTile: function (coords, done) {
+		var tile = document.createElement('img');
+
+		L.DomEvent.on(tile, 'load', L.bind(this._tileOnLoad, this, done, tile));
+		L.DomEvent.on(tile, 'error', L.bind(this._tileOnError, this, done, tile));
+
+		if (this.options.crossOrigin) {
+			tile.crossOrigin = '';
+		}
+
+		/*
+		 Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons
+		 http://www.w3.org/TR/WCAG20-TECHS/H67
+		*/
+		tile.alt = '';
+
+		/*
+		 Set role="presentation" to force screen readers to ignore this
+		 https://www.w3.org/TR/wai-aria/roles#textalternativecomputation
+		*/
+		tile.setAttribute('role', 'presentation');
+
+		tile.src = this.getTileUrl(coords);
+
+		return tile;
+	},
+
+	// @section Extension methods
+	// @uninheritable
+	// Layers extending `TileLayer` might reimplement the following method.
+	// @method getTileUrl(coords: Object): String
+	// Called only internally, returns the URL for a tile given its coordinates.
+	// Classes extending `TileLayer` can override this function to provide custom tile URL naming schemes.
+	getTileUrl: function (coords) {
+		var data = {
+			r: L.Browser.retina ? '@2x' : '',
+			s: this._getSubdomain(coords),
+			x: coords.x,
+			y: coords.y,
+			z: this._getZoomForUrl()
+		};
+		if (this._map && !this._map.options.crs.infinite) {
+			var invertedY = this._globalTileRange.max.y - coords.y;
+			if (this.options.tms) {
+				data['y'] = invertedY;
+			}
+			data['-y'] = invertedY;
+		}
+
+		return L.Util.template(this._url, L.extend(data, this.options));
+	},
+
+	_tileOnLoad: function (done, tile) {
+		// For https://github.com/Leaflet/Leaflet/issues/3332
+		if (L.Browser.ielt9) {
+			setTimeout(L.bind(done, this, null, tile), 0);
+		} else {
+			done(null, tile);
+		}
+	},
+
+	_tileOnError: function (done, tile, e) {
+		var errorUrl = this.options.errorTileUrl;
+		if (errorUrl && tile.src !== errorUrl) {
+			tile.src = errorUrl;
+		}
+		done(e, tile);
+	},
+
+	getTileSize: function () {
+		var map = this._map,
+		tileSize = L.GridLayer.prototype.getTileSize.call(this),
+		zoom = this._tileZoom + this.options.zoomOffset,
+		minNativeZoom = this.options.minNativeZoom,
+		maxNativeZoom = this.options.maxNativeZoom;
+
+		// decrease tile size when scaling below minNativeZoom
+		if (minNativeZoom !== null && zoom < minNativeZoom) {
+			return tileSize.divideBy(map.getZoomScale(minNativeZoom, zoom)).round();
+		}
+
+		// increase tile size when scaling above maxNativeZoom
+		if (maxNativeZoom !== null && zoom > maxNativeZoom) {
+			return tileSize.divideBy(map.getZoomScale(maxNativeZoom, zoom)).round();
+		}
+
+		return tileSize;
+	},
+
+	_onTileRemove: function (e) {
+		e.tile.onload = null;
+	},
+
+	_getZoomForUrl: function () {
+		var zoom = this._tileZoom,
+		maxZoom = this.options.maxZoom,
+		zoomReverse = this.options.zoomReverse,
+		zoomOffset = this.options.zoomOffset,
+		minNativeZoom = this.options.minNativeZoom,
+		maxNativeZoom = this.options.maxNativeZoom;
+
+		if (zoomReverse) {
+			zoom = maxZoom - zoom;
+		}
+
+		zoom += zoomOffset;
+
+		if (minNativeZoom !== null && zoom < minNativeZoom) {
+			return minNativeZoom;
+		}
+
+		if (maxNativeZoom !== null && zoom > maxNativeZoom) {
+			return maxNativeZoom;
+		}
+
+		return zoom;
+	},
+
+	_getSubdomain: function (tilePoint) {
+		var index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;
+		return this.options.subdomains[index];
+	},
+
+	// stops loading all tiles in the background layer
+	_abortLoading: function () {
+		var i, tile;
+		for (i in this._tiles) {
+			if (this._tiles[i].coords.z !== this._tileZoom) {
+				tile = this._tiles[i].el;
+
+				tile.onload = L.Util.falseFn;
+				tile.onerror = L.Util.falseFn;
+
+				if (!tile.complete) {
+					tile.src = L.Util.emptyImageUrl;
+					L.DomUtil.remove(tile);
+				}
+			}
+		}
+	}
+});
+
+
+// @factory L.tilelayer(urlTemplate: String, options?: TileLayer options)
+// Instantiates a tile layer object given a `URL template` and optionally an options object.
+
+L.tileLayer = function (url, options) {
+	return new L.TileLayer(url, options);
+};
+
+
+
+/*
+ * @class TileLayer.WMS
+ * @inherits TileLayer
+ * @aka L.TileLayer.WMS
+ * Used to display [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services as tile layers on the map. Extends `TileLayer`.
+ *
+ * @example
+ *
+ * ```js
+ * var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
+ * 	layers: 'nexrad-n0r-900913',
+ * 	format: 'image/png',
+ * 	transparent: true,
+ * 	attribution: "Weather data © 2012 IEM Nexrad"
+ * });
+ * ```
+ */
+
+L.TileLayer.WMS = L.TileLayer.extend({
+
+	// @section
+	// @aka TileLayer.WMS options
+	// If any custom options not documented here are used, they will be sent to the
+	// WMS server as extra parameters in each request URL. This can be useful for
+	// [non-standard vendor WMS parameters](http://docs.geoserver.org/stable/en/user/services/wms/vendor.html).
+	defaultWmsParams: {
+		service: 'WMS',
+		request: 'GetMap',
+
+		// @option layers: String = ''
+		// **(required)** Comma-separated list of WMS layers to show.
+		layers: '',
+
+		// @option styles: String = ''
+		// Comma-separated list of WMS styles.
+		styles: '',
+
+		// @option format: String = 'image/jpeg'
+		// WMS image format (use `'image/png'` for layers with transparency).
+		format: 'image/jpeg',
+
+		// @option transparent: Boolean = false
+		// If `true`, the WMS service will return images with transparency.
+		transparent: false,
+
+		// @option version: String = '1.1.1'
+		// Version of the WMS service to use
+		version: '1.1.1'
+	},
+
+	options: {
+		// @option crs: CRS = null
+		// Coordinate Reference System to use for the WMS requests, defaults to
+		// map CRS. Don't change this if you're not sure what it means.
+		crs: null,
+
+		// @option uppercase: Boolean = false
+		// If `true`, WMS request parameter keys will be uppercase.
+		uppercase: false
+	},
+
+	initialize: function (url, options) {
+
+		this._url = url;
+
+		var wmsParams = L.extend({}, this.defaultWmsParams);
+
+		// all keys that are not TileLayer options go to WMS params
+		for (var i in options) {
+			if (!(i in this.options)) {
+				wmsParams[i] = options[i];
+			}
+		}
+
+		options = L.setOptions(this, options);
+
+		wmsParams.width = wmsParams.height = options.tileSize * (options.detectRetina && L.Browser.retina ? 2 : 1);
+
+		this.wmsParams = wmsParams;
+	},
+
+	onAdd: function (map) {
+
+		this._crs = this.options.crs || map.options.crs;
+		this._wmsVersion = parseFloat(this.wmsParams.version);
+
+		var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';
+		this.wmsParams[projectionKey] = this._crs.code;
+
+		L.TileLayer.prototype.onAdd.call(this, map);
+	},
+
+	getTileUrl: function (coords) {
+
+		var tileBounds = this._tileCoordsToBounds(coords),
+		    nw = this._crs.project(tileBounds.getNorthWest()),
+		    se = this._crs.project(tileBounds.getSouthEast()),
+
+		    bbox = (this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ?
+			    [se.y, nw.x, nw.y, se.x] :
+			    [nw.x, se.y, se.x, nw.y]).join(','),
+
+		    url = L.TileLayer.prototype.getTileUrl.call(this, coords);
+
+		return url +
+			L.Util.getParamString(this.wmsParams, url, this.options.uppercase) +
+			(this.options.uppercase ? '&BBOX=' : '&bbox=') + bbox;
+	},
+
+	// @method setParams(params: Object, noRedraw?: Boolean): this
+	// Merges an object with the new parameters and re-requests tiles on the current screen (unless `noRedraw` was set to true).
+	setParams: function (params, noRedraw) {
+
+		L.extend(this.wmsParams, params);
+
+		if (!noRedraw) {
+			this.redraw();
+		}
+
+		return this;
+	}
+});
+
+
+// @factory L.tileLayer.wms(baseUrl: String, options: TileLayer.WMS options)
+// Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
+L.tileLayer.wms = function (url, options) {
+	return new L.TileLayer.WMS(url, options);
+};
+
+
+
+/*
+ * @class ImageOverlay
+ * @aka L.ImageOverlay
+ * @inherits Interactive layer
+ *
+ * Used to load and display a single image over specific bounds of the map. Extends `Layer`.
+ *
+ * @example
+ *
+ * ```js
+ * var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
+ * 	imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];
+ * L.imageOverlay(imageUrl, imageBounds).addTo(map);
+ * ```
+ */
+
+L.ImageOverlay = L.Layer.extend({
+
+	// @section
+	// @aka ImageOverlay options
+	options: {
+		// @option opacity: Number = 1.0
+		// The opacity of the image overlay.
+		opacity: 1,
+
+		// @option alt: String = ''
+		// Text for the `alt` attribute of the image (useful for accessibility).
+		alt: '',
+
+		// @option interactive: Boolean = false
+		// If `true`, the image overlay will emit [mouse events](#interactive-layer) when clicked or hovered.
+		interactive: false,
+
+		// @option crossOrigin: Boolean = false
+		// If true, the image will have its crossOrigin attribute set to ''. This is needed if you want to access image pixel data.
+		crossOrigin: false
+	},
+
+	initialize: function (url, bounds, options) { // (String, LatLngBounds, Object)
+		this._url = url;
+		this._bounds = L.latLngBounds(bounds);
+
+		L.setOptions(this, options);
+	},
+
+	onAdd: function () {
+		if (!this._image) {
+			this._initImage();
+
+			if (this.options.opacity < 1) {
+				this._updateOpacity();
+			}
+		}
+
+		if (this.options.interactive) {
+			L.DomUtil.addClass(this._image, 'leaflet-interactive');
+			this.addInteractiveTarget(this._image);
+		}
+
+		this.getPane().appendChild(this._image);
+		this._reset();
+	},
+
+	onRemove: function () {
+		L.DomUtil.remove(this._image);
+		if (this.options.interactive) {
+			this.removeInteractiveTarget(this._image);
+		}
+	},
+
+	// @method setOpacity(opacity: Number): this
+	// Sets the opacity of the overlay.
+	setOpacity: function (opacity) {
+		this.options.opacity = opacity;
+
+		if (this._image) {
+			this._updateOpacity();
+		}
+		return this;
+	},
+
+	setStyle: function (styleOpts) {
+		if (styleOpts.opacity) {
+			this.setOpacity(styleOpts.opacity);
+		}
+		return this;
+	},
+
+	// @method bringToFront(): this
+	// Brings the layer to the top of all overlays.
+	bringToFront: function () {
+		if (this._map) {
+			L.DomUtil.toFront(this._image);
+		}
+		return this;
+	},
+
+	// @method bringToBack(): this
+	// Brings the layer to the bottom of all overlays.
+	bringToBack: function () {
+		if (this._map) {
+			L.DomUtil.toBack(this._image);
+		}
+		return this;
+	},
+
+	// @method setUrl(url: String): this
+	// Changes the URL of the image.
+	setUrl: function (url) {
+		this._url = url;
+
+		if (this._image) {
+			this._image.src = url;
+		}
+		return this;
+	},
+
+	// @method setBounds(bounds: LatLngBounds): this
+	// Update the bounds that this ImageOverlay covers
+	setBounds: function (bounds) {
+		this._bounds = bounds;
+
+		if (this._map) {
+			this._reset();
+		}
+		return this;
+	},
+
+	getEvents: function () {
+		var events = {
+			zoom: this._reset,
+			viewreset: this._reset
+		};
+
+		if (this._zoomAnimated) {
+			events.zoomanim = this._animateZoom;
+		}
+
+		return events;
+	},
+
+	// @method getBounds(): LatLngBounds
+	// Get the bounds that this ImageOverlay covers
+	getBounds: function () {
+		return this._bounds;
+	},
+
+	// @method getElement(): HTMLElement
+	// Get the img element that represents the ImageOverlay on the map
+	getElement: function () {
+		return this._image;
+	},
+
+	_initImage: function () {
+		var img = this._image = L.DomUtil.create('img',
+				'leaflet-image-layer ' + (this._zoomAnimated ? 'leaflet-zoom-animated' : ''));
+
+		img.onselectstart = L.Util.falseFn;
+		img.onmousemove = L.Util.falseFn;
+
+		img.onload = L.bind(this.fire, this, 'load');
+
+		if (this.options.crossOrigin) {
+			img.crossOrigin = '';
+		}
+
+		img.src = this._url;
+		img.alt = this.options.alt;
+	},
+
+	_animateZoom: function (e) {
+		var scale = this._map.getZoomScale(e.zoom),
+		    offset = this._map._latLngBoundsToNewLayerBounds(this._bounds, e.zoom, e.center).min;
+
+		L.DomUtil.setTransform(this._image, offset, scale);
+	},
+
+	_reset: function () {
+		var image = this._image,
+		    bounds = new L.Bounds(
+		        this._map.latLngToLayerPoint(this._bounds.getNorthWest()),
+		        this._map.latLngToLayerPoint(this._bounds.getSouthEast())),
+		    size = bounds.getSize();
+
+		L.DomUtil.setPosition(image, bounds.min);
+
+		image.style.width  = size.x + 'px';
+		image.style.height = size.y + 'px';
+	},
+
+	_updateOpacity: function () {
+		L.DomUtil.setOpacity(this._image, this.options.opacity);
+	}
+});
+
+// @factory L.imageOverlay(imageUrl: String, bounds: LatLngBounds, options?: ImageOverlay options)
+// Instantiates an image overlay object given the URL of the image and the
+// geographical bounds it is tied to.
+L.imageOverlay = function (url, bounds, options) {
+	return new L.ImageOverlay(url, bounds, options);
+};
+
+
+
+/*
+ * @class Icon
+ * @aka L.Icon
+ * @inherits Layer
+ *
+ * Represents an icon to provide when creating a marker.
+ *
+ * @example
+ *
+ * ```js
+ * var myIcon = L.icon({
+ *     iconUrl: 'my-icon.png',
+ *     iconRetinaUrl: 'my-icon@2x.png',
+ *     iconSize: [38, 95],
+ *     iconAnchor: [22, 94],
+ *     popupAnchor: [-3, -76],
+ *     shadowUrl: 'my-icon-shadow.png',
+ *     shadowRetinaUrl: 'my-icon-shadow@2x.png',
+ *     shadowSize: [68, 95],
+ *     shadowAnchor: [22, 94]
+ * });
+ *
+ * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
+ * ```
+ *
+ * `L.Icon.Default` extends `L.Icon` and is the blue icon Leaflet uses for markers by default.
+ *
+ */
+
+L.Icon = L.Class.extend({
+
+	/* @section
+	 * @aka Icon options
+	 *
+	 * @option iconUrl: String = null
+	 * **(required)** The URL to the icon image (absolute or relative to your script path).
+	 *
+	 * @option iconRetinaUrl: String = null
+	 * The URL to a retina sized version of the icon image (absolute or relative to your
+	 * script path). Used for Retina screen devices.
+	 *
+	 * @option iconSize: Point = null
+	 * Size of the icon image in pixels.
+	 *
+	 * @option iconAnchor: Point = null
+	 * The coordinates of the "tip" of the icon (relative to its top left corner). The icon
+	 * will be aligned so that this point is at the marker's geographical location. Centered
+	 * by default if size is specified, also can be set in CSS with negative margins.
+	 *
+	 * @option popupAnchor: Point = null
+	 * The coordinates of the point from which popups will "open", relative to the icon anchor.
+	 *
+	 * @option shadowUrl: String = null
+	 * The URL to the icon shadow image. If not specified, no shadow image will be created.
+	 *
+	 * @option shadowRetinaUrl: String = null
+	 *
+	 * @option shadowSize: Point = null
+	 * Size of the shadow image in pixels.
+	 *
+	 * @option shadowAnchor: Point = null
+	 * The coordinates of the "tip" of the shadow (relative to its top left corner) (the same
+	 * as iconAnchor if not specified).
+	 *
+	 * @option className: String = ''
+	 * A custom class name to assign to both icon and shadow images. Empty by default.
+	 */
+
+	initialize: function (options) {
+		L.setOptions(this, options);
+	},
+
+	// @method createIcon(oldIcon?: HTMLElement): HTMLElement
+	// Called internally when the icon has to be shown, returns a `<img>` HTML element
+	// styled according to the options.
+	createIcon: function (oldIcon) {
+		return this._createIcon('icon', oldIcon);
+	},
+
+	// @method createShadow(oldIcon?: HTMLElement): HTMLElement
+	// As `createIcon`, but for the shadow beneath it.
+	createShadow: function (oldIcon) {
+		return this._createIcon('shadow', oldIcon);
+	},
+
+	_createIcon: function (name, oldIcon) {
+		var src = this._getIconUrl(name);
+
+		if (!src) {
+			if (name === 'icon') {
+				throw new Error('iconUrl not set in Icon options (see the docs).');
+			}
+			return null;
+		}
+
+		var img = this._createImg(src, oldIcon && oldIcon.tagName === 'IMG' ? oldIcon : null);
+		this._setIconStyles(img, name);
+
+		return img;
+	},
+
+	_setIconStyles: function (img, name) {
+		var options = this.options;
+		var sizeOption = options[name + 'Size'];
+
+		if (typeof sizeOption === 'number') {
+			sizeOption = [sizeOption, sizeOption];
+		}
+
+		var size = L.point(sizeOption),
+		    anchor = L.point(name === 'shadow' && options.shadowAnchor || options.iconAnchor ||
+		            size && size.divideBy(2, true));
+
+		img.className = 'leaflet-marker-' + name + ' ' + (options.className || '');
+
+		if (anchor) {
+			img.style.marginLeft = (-anchor.x) + 'px';
+			img.style.marginTop  = (-anchor.y) + 'px';
+		}
+
+		if (size) {
+			img.style.width  = size.x + 'px';
+			img.style.height = size.y + 'px';
+		}
+	},
+
+	_createImg: function (src, el) {
+		el = el || document.createElement('img');
+		el.src = src;
+		return el;
+	},
+
+	_getIconUrl: function (name) {
+		return L.Browser.retina && this.options[name + 'RetinaUrl'] || this.options[name + 'Url'];
+	}
+});
+
+
+// @factory L.icon(options: Icon options)
+// Creates an icon instance with the given options.
+L.icon = function (options) {
+	return new L.Icon(options);
+};
+
+
+
+/*
+ * @miniclass Icon.Default (Icon)
+ * @aka L.Icon.Default
+ * @section
+ *
+ * A trivial subclass of `Icon`, represents the icon to use in `Marker`s when
+ * no icon is specified. Points to the blue marker image distributed with Leaflet
+ * releases.
+ *
+ * In order to customize the default icon, just change the properties of `L.Icon.Default.prototype.options`
+ * (which is a set of `Icon options`).
+ *
+ * If you want to _completely_ replace the default icon, override the
+ * `L.Marker.prototype.options.icon` with your own icon instead.
+ */
+
+L.Icon.Default = L.Icon.extend({
+
+	options: {
+		iconUrl:       'marker-icon.png',
+		iconRetinaUrl: 'marker-icon-2x.png',
+		shadowUrl:     'marker-shadow.png',
+		iconSize:    [25, 41],
+		iconAnchor:  [12, 41],
+		popupAnchor: [1, -34],
+		tooltipAnchor: [16, -28],
+		shadowSize:  [41, 41]
+	},
+
+	_getIconUrl: function (name) {
+		if (!L.Icon.Default.imagePath) {	// Deprecated, backwards-compatibility only
+			L.Icon.Default.imagePath = this._detectIconPath();
+		}
+
+		// @option imagePath: String
+		// `L.Icon.Default` will try to auto-detect the absolute location of the
+		// blue icon images. If you are placing these images in a non-standard
+		// way, set this option to point to the right absolute path.
+		return (this.options.imagePath || L.Icon.Default.imagePath) + L.Icon.prototype._getIconUrl.call(this, name);
+	},
+
+	_detectIconPath: function () {
+		var el = L.DomUtil.create('div',  'leaflet-default-icon-path', document.body);
+		var path = L.DomUtil.getStyle(el, 'background-image') ||
+		           L.DomUtil.getStyle(el, 'backgroundImage');	// IE8
+
+		document.body.removeChild(el);
+
+		return path.indexOf('url') === 0 ?
+			path.replace(/^url\([\"\']?/, '').replace(/marker-icon\.png[\"\']?\)$/, '') : '';
+	}
+});
+
+
+
+/*
+ * @class Marker
+ * @inherits Interactive layer
+ * @aka L.Marker
+ * L.Marker is used to display clickable/draggable icons on the map. Extends `Layer`.
+ *
+ * @example
+ *
+ * ```js
+ * L.marker([50.5, 30.5]).addTo(map);
+ * ```
+ */
+
+L.Marker = L.Layer.extend({
+
+	// @section
+	// @aka Marker options
+	options: {
+		// @option icon: Icon = *
+		// Icon class to use for rendering the marker. See [Icon documentation](#L.Icon) for details on how to customize the marker icon. If not specified, a new `L.Icon.Default` is used.
+		icon: new L.Icon.Default(),
+
+		// Option inherited from "Interactive layer" abstract class
+		interactive: true,
+
+		// @option draggable: Boolean = false
+		// Whether the marker is draggable with mouse/touch or not.
+		draggable: false,
+
+		// @option keyboard: Boolean = true
+		// Whether the marker can be tabbed to with a keyboard and clicked by pressing enter.
+		keyboard: true,
+
+		// @option title: String = ''
+		// Text for the browser tooltip that appear on marker hover (no tooltip by default).
+		title: '',
+
+		// @option alt: String = ''
+		// Text for the `alt` attribute of the icon image (useful for accessibility).
+		alt: '',
+
+		// @option zIndexOffset: Number = 0
+		// By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like `1000` (or high negative value, respectively).
+		zIndexOffset: 0,
+
+		// @option opacity: Number = 1.0
+		// The opacity of the marker.
+		opacity: 1,
+
+		// @option riseOnHover: Boolean = false
+		// If `true`, the marker will get on top of others when you hover the mouse over it.
+		riseOnHover: false,
+
+		// @option riseOffset: Number = 250
+		// The z-index offset used for the `riseOnHover` feature.
+		riseOffset: 250,
+
+		// @option pane: String = 'markerPane'
+		// `Map pane` where the markers icon will be added.
+		pane: 'markerPane',
+
+		// FIXME: shadowPane is no longer a valid option
+		nonBubblingEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu']
+	},
+
+	/* @section
+	 *
+	 * In addition to [shared layer methods](#Layer) like `addTo()` and `remove()` and [popup methods](#Popup) like bindPopup() you can also use the following methods:
+	 */
+
+	initialize: function (latlng, options) {
+		L.setOptions(this, options);
+		this._latlng = L.latLng(latlng);
+	},
+
+	onAdd: function (map) {
+		this._zoomAnimated = this._zoomAnimated && map.options.markerZoomAnimation;
+
+		if (this._zoomAnimated) {
+			map.on('zoomanim', this._animateZoom, this);
+		}
+
+		this._initIcon();
+		this.update();
+	},
+
+	onRemove: function (map) {
+		if (this.dragging && this.dragging.enabled()) {
+			this.options.draggable = true;
+			this.dragging.removeHooks();
+		}
+
+		if (this._zoomAnimated) {
+			map.off('zoomanim', this._animateZoom, this);
+		}
+
+		this._removeIcon();
+		this._removeShadow();
+	},
+
+	getEvents: function () {
+		return {
+			zoom: this.update,
+			viewreset: this.update
+		};
+	},
+
+	// @method getLatLng: LatLng
+	// Returns the current geographical position of the marker.
+	getLatLng: function () {
+		return this._latlng;
+	},
+
+	// @method setLatLng(latlng: LatLng): this
+	// Changes the marker position to the given point.
+	setLatLng: function (latlng) {
+		var oldLatLng = this._latlng;
+		this._latlng = L.latLng(latlng);
+		this.update();
+
+		// @event move: Event
+		// Fired when the marker is moved via [`setLatLng`](#marker-setlatlng) or by [dragging](#marker-dragging). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`.
+		return this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng});
+	},
+
+	// @method setZIndexOffset(offset: Number): this
+	// Changes the [zIndex offset](#marker-zindexoffset) of the marker.
+	setZIndexOffset: function (offset) {
+		this.options.zIndexOffset = offset;
+		return this.update();
+	},
+
+	// @method setIcon(icon: Icon): this
+	// Changes the marker icon.
+	setIcon: function (icon) {
+
+		this.options.icon = icon;
+
+		if (this._map) {
+			this._initIcon();
+			this.update();
+		}
+
+		if (this._popup) {
+			this.bindPopup(this._popup, this._popup.options);
+		}
+
+		return this;
+	},
+
+	getElement: function () {
+		return this._icon;
+	},
+
+	update: function () {
+
+		if (this._icon) {
+			var pos = this._map.latLngToLayerPoint(this._latlng).round();
+			this._setPos(pos);
+		}
+
+		return this;
+	},
+
+	_initIcon: function () {
+		var options = this.options,
+		    classToAdd = 'leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');
+
+		var icon = options.icon.createIcon(this._icon),
+		    addIcon = false;
+
+		// if we're not reusing the icon, remove the old one and init new one
+		if (icon !== this._icon) {
+			if (this._icon) {
+				this._removeIcon();
+			}
+			addIcon = true;
+
+			if (options.title) {
+				icon.title = options.title;
+			}
+			if (options.alt) {
+				icon.alt = options.alt;
+			}
+		}
+
+		L.DomUtil.addClass(icon, classToAdd);
+
+		if (options.keyboard) {
+			icon.tabIndex = '0';
+		}
+
+		this._icon = icon;
+
+		if (options.riseOnHover) {
+			this.on({
+				mouseover: this._bringToFront,
+				mouseout: this._resetZIndex
+			});
+		}
+
+		var newShadow = options.icon.createShadow(this._shadow),
+		    addShadow = false;
+
+		if (newShadow !== this._shadow) {
+			this._removeShadow();
+			addShadow = true;
+		}
+
+		if (newShadow) {
+			L.DomUtil.addClass(newShadow, classToAdd);
+			newShadow.alt = '';
+		}
+		this._shadow = newShadow;
+
+
+		if (options.opacity < 1) {
+			this._updateOpacity();
+		}
+
+
+		if (addIcon) {
+			this.getPane().appendChild(this._icon);
+		}
+		this._initInteraction();
+		if (newShadow && addShadow) {
+			this.getPane('shadowPane').appendChild(this._shadow);
+		}
+	},
+
+	_removeIcon: function () {
+		if (this.options.riseOnHover) {
+			this.off({
+				mouseover: this._bringToFront,
+				mouseout: this._resetZIndex
+			});
+		}
+
+		L.DomUtil.remove(this._icon);
+		this.removeInteractiveTarget(this._icon);
+
+		this._icon = null;
+	},
+
+	_removeShadow: function () {
+		if (this._shadow) {
+			L.DomUtil.remove(this._shadow);
+		}
+		this._shadow = null;
+	},
+
+	_setPos: function (pos) {
+		L.DomUtil.setPosition(this._icon, pos);
+
+		if (this._shadow) {
+			L.DomUtil.setPosition(this._shadow, pos);
+		}
+
+		this._zIndex = pos.y + this.options.zIndexOffset;
+
+		this._resetZIndex();
+	},
+
+	_updateZIndex: function (offset) {
+		this._icon.style.zIndex = this._zIndex + offset;
+	},
+
+	_animateZoom: function (opt) {
+		var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();
+
+		this._setPos(pos);
+	},
+
+	_initInteraction: function () {
+
+		if (!this.options.interactive) { return; }
+
+		L.DomUtil.addClass(this._icon, 'leaflet-interactive');
+
+		this.addInteractiveTarget(this._icon);
+
+		if (L.Handler.MarkerDrag) {
+			var draggable = this.options.draggable;
+			if (this.dragging) {
+				draggable = this.dragging.enabled();
+				this.dragging.disable();
+			}
+
+			this.dragging = new L.Handler.MarkerDrag(this);
+
+			if (draggable) {
+				this.dragging.enable();
+			}
+		}
+	},
+
+	// @method setOpacity(opacity: Number): this
+	// Changes the opacity of the marker.
+	setOpacity: function (opacity) {
+		this.options.opacity = opacity;
+		if (this._map) {
+			this._updateOpacity();
+		}
+
+		return this;
+	},
+
+	_updateOpacity: function () {
+		var opacity = this.options.opacity;
+
+		L.DomUtil.setOpacity(this._icon, opacity);
+
+		if (this._shadow) {
+			L.DomUtil.setOpacity(this._shadow, opacity);
+		}
+	},
+
+	_bringToFront: function () {
+		this._updateZIndex(this.options.riseOffset);
+	},
+
+	_resetZIndex: function () {
+		this._updateZIndex(0);
+	},
+
+	_getPopupAnchor: function () {
+		return this.options.icon.options.popupAnchor || [0, 0];
+	},
+
+	_getTooltipAnchor: function () {
+		return this.options.icon.options.tooltipAnchor || [0, 0];
+	}
+});
+
+
+// factory L.marker(latlng: LatLng, options? : Marker options)
+
+// @factory L.marker(latlng: LatLng, options? : Marker options)
+// Instantiates a Marker object given a geographical point and optionally an options object.
+L.marker = function (latlng, options) {
+	return new L.Marker(latlng, options);
+};
+
+
+
+/*
+ * @class DivIcon
+ * @aka L.DivIcon
+ * @inherits Icon
+ *
+ * Represents a lightweight icon for markers that uses a simple `<div>`
+ * element instead of an image. Inherits from `Icon` but ignores the `iconUrl` and shadow options.
+ *
+ * @example
+ * ```js
+ * var myIcon = L.divIcon({className: 'my-div-icon'});
+ * // you can set .my-div-icon styles in CSS
+ *
+ * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
+ * ```
+ *
+ * By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.
+ */
+
+L.DivIcon = L.Icon.extend({
+	options: {
+		// @section
+		// @aka DivIcon options
+		iconSize: [12, 12], // also can be set through CSS
+
+		// iconAnchor: (Point),
+		// popupAnchor: (Point),
+
+		// @option html: String = ''
+		// Custom HTML code to put inside the div element, empty by default.
+		html: false,
+
+		// @option bgPos: Point = [0, 0]
+		// Optional relative position of the background, in pixels
+		bgPos: null,
+
+		className: 'leaflet-div-icon'
+	},
+
+	createIcon: function (oldIcon) {
+		var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),
+		    options = this.options;
+
+		div.innerHTML = options.html !== false ? options.html : '';
+
+		if (options.bgPos) {
+			var bgPos = L.point(options.bgPos);
+			div.style.backgroundPosition = (-bgPos.x) + 'px ' + (-bgPos.y) + 'px';
+		}
+		this._setIconStyles(div, 'icon');
+
+		return div;
+	},
+
+	createShadow: function () {
+		return null;
+	}
+});
+
+// @factory L.divIcon(options: DivIcon options)
+// Creates a `DivIcon` instance with the given options.
+L.divIcon = function (options) {
+	return new L.DivIcon(options);
+};
+
+
+
+/*
+ * @class DivOverlay
+ * @inherits Layer
+ * @aka L.DivOverlay
+ * Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.
+ */
+
+// @namespace DivOverlay
+L.DivOverlay = L.Layer.extend({
+
+	// @section
+	// @aka DivOverlay options
+	options: {
+		// @option offset: Point = Point(0, 7)
+		// The offset of the popup position. Useful to control the anchor
+		// of the popup when opening it on some overlays.
+		offset: [0, 7],
+
+		// @option className: String = ''
+		// A custom CSS class name to assign to the popup.
+		className: '',
+
+		// @option pane: String = 'popupPane'
+		// `Map pane` where the popup will be added.
+		pane: 'popupPane'
+	},
+
+	initialize: function (options, source) {
+		L.setOptions(this, options);
+
+		this._source = source;
+	},
+
+	onAdd: function (map) {
+		this._zoomAnimated = map._zoomAnimated;
+
+		if (!this._container) {
+			this._initLayout();
+		}
+
+		if (map._fadeAnimated) {
+			L.DomUtil.setOpacity(this._container, 0);
+		}
+
+		clearTimeout(this._removeTimeout);
+		this.getPane().appendChild(this._container);
+		this.update();
+
+		if (map._fadeAnimated) {
+			L.DomUtil.setOpacity(this._container, 1);
+		}
+
+		this.bringToFront();
+	},
+
+	onRemove: function (map) {
+		if (map._fadeAnimated) {
+			L.DomUtil.setOpacity(this._container, 0);
+			this._removeTimeout = setTimeout(L.bind(L.DomUtil.remove, L.DomUtil, this._container), 200);
+		} else {
+			L.DomUtil.remove(this._container);
+		}
+	},
+
+	// @namespace Popup
+	// @method getLatLng: LatLng
+	// Returns the geographical point of popup.
+	getLatLng: function () {
+		return this._latlng;
+	},
+
+	// @method setLatLng(latlng: LatLng): this
+	// Sets the geographical point where the popup will open.
+	setLatLng: function (latlng) {
+		this._latlng = L.latLng(latlng);
+		if (this._map) {
+			this._updatePosition();
+			this._adjustPan();
+		}
+		return this;
+	},
+
+	// @method getContent: String|HTMLElement
+	// Returns the content of the popup.
+	getContent: function () {
+		return this._content;
+	},
+
+	// @method setContent(htmlContent: String|HTMLElement|Function): this
+	// Sets the HTML content of the popup. If a function is passed the source layer will be passed to the function. The function should return a `String` or `HTMLElement` to be used in the popup.
+	setContent: function (content) {
+		this._content = content;
+		this.update();
+		return this;
+	},
+
+	// @method getElement: String|HTMLElement
+	// Alias for [getContent()](#popup-getcontent)
+	getElement: function () {
+		return this._container;
+	},
+
+	// @method update: null
+	// Updates the popup content, layout and position. Useful for updating the popup after something inside changed, e.g. image loaded.
+	update: function () {
+		if (!this._map) { return; }
+
+		this._container.style.visibility = 'hidden';
+
+		this._updateContent();
+		this._updateLayout();
+		this._updatePosition();
+
+		this._container.style.visibility = '';
+
+		this._adjustPan();
+	},
+
+	getEvents: function () {
+		var events = {
+			zoom: this._updatePosition,
+			viewreset: this._updatePosition
+		};
+
+		if (this._zoomAnimated) {
+			events.zoomanim = this._animateZoom;
+		}
+		return events;
+	},
+
+	// @method isOpen: Boolean
+	// Returns `true` when the popup is visible on the map.
+	isOpen: function () {
+		return !!this._map && this._map.hasLayer(this);
+	},
+
+	// @method bringToFront: this
+	// Brings this popup in front of other popups (in the same map pane).
+	bringToFront: function () {
+		if (this._map) {
+			L.DomUtil.toFront(this._container);
+		}
+		return this;
+	},
+
+	// @method bringToBack: this
+	// Brings this popup to the back of other popups (in the same map pane).
+	bringToBack: function () {
+		if (this._map) {
+			L.DomUtil.toBack(this._container);
+		}
+		return this;
+	},
+
+	_updateContent: function () {
+		if (!this._content) { return; }
+
+		var node = this._contentNode;
+		var content = (typeof this._content === 'function') ? this._content(this._source || this) : this._content;
+
+		if (typeof content === 'string') {
+			node.innerHTML = content;
+		} else {
+			while (node.hasChildNodes()) {
+				node.removeChild(node.firstChild);
+			}
+			node.appendChild(content);
+		}
+		this.fire('contentupdate');
+	},
+
+	_updatePosition: function () {
+		if (!this._map) { return; }
+
+		var pos = this._map.latLngToLayerPoint(this._latlng),
+		    offset = L.point(this.options.offset),
+		    anchor = this._getAnchor();
+
+		if (this._zoomAnimated) {
+			L.DomUtil.setPosition(this._container, pos.add(anchor));
+		} else {
+			offset = offset.add(pos).add(anchor);
+		}
+
+		var bottom = this._containerBottom = -offset.y,
+		    left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x;
+
+		// bottom position the popup in case the height of the popup changes (images loading etc)
+		this._container.style.bottom = bottom + 'px';
+		this._container.style.left = left + 'px';
+	},
+
+	_getAnchor: function () {
+		return [0, 0];
+	}
+
+});
+
+
+
+/*
+ * @class Popup
+ * @inherits DivOverlay
+ * @aka L.Popup
+ * Used to open popups in certain places of the map. Use [Map.openPopup](#map-openpopup) to
+ * open popups while making sure that only one popup is open at one time
+ * (recommended for usability), or use [Map.addLayer](#map-addlayer) to open as many as you want.
+ *
+ * @example
+ *
+ * If you want to just bind a popup to marker click and then open it, it's really easy:
+ *
+ * ```js
+ * marker.bindPopup(popupContent).openPopup();
+ * ```
+ * Path overlays like polylines also have a `bindPopup` method.
+ * Here's a more complicated way to open a popup on a map:
+ *
+ * ```js
+ * var popup = L.popup()
+ * 	.setLatLng(latlng)
+ * 	.setContent('<p>Hello world!<br />This is a nice popup.</p>')
+ * 	.openOn(map);
+ * ```
+ */
+
+
+// @namespace Popup
+L.Popup = L.DivOverlay.extend({
+
+	// @section
+	// @aka Popup options
+	options: {
+		// @option maxWidth: Number = 300
+		// Max width of the popup, in pixels.
+		maxWidth: 300,
+
+		// @option minWidth: Number = 50
+		// Min width of the popup, in pixels.
+		minWidth: 50,
+
+		// @option maxHeight: Number = null
+		// If set, creates a scrollable container of the given height
+		// inside a popup if its content exceeds it.
+		maxHeight: null,
+
+		// @option autoPan: Boolean = true
+		// Set it to `false` if you don't want the map to do panning animation
+		// to fit the opened popup.
+		autoPan: true,
+
+		// @option autoPanPaddingTopLeft: Point = null
+		// The margin between the popup and the top left corner of the map
+		// view after autopanning was performed.
+		autoPanPaddingTopLeft: null,
+
+		// @option autoPanPaddingBottomRight: Point = null
+		// The margin between the popup and the bottom right corner of the map
+		// view after autopanning was performed.
+		autoPanPaddingBottomRight: null,
+
+		// @option autoPanPadding: Point = Point(5, 5)
+		// Equivalent of setting both top left and bottom right autopan padding to the same value.
+		autoPanPadding: [5, 5],
+
+		// @option keepInView: Boolean = false
+		// Set it to `true` if you want to prevent users from panning the popup
+		// off of the screen while it is open.
+		keepInView: false,
+
+		// @option closeButton: Boolean = true
+		// Controls the presence of a close button in the popup.
+		closeButton: true,
+
+		// @option autoClose: Boolean = true
+		// Set it to `false` if you want to override the default behavior of
+		// the popup closing when user clicks the map (set globally by
+		// the Map's [closePopupOnClick](#map-closepopuponclick) option).
+		autoClose: true,
+
+		// @option className: String = ''
+		// A custom CSS class name to assign to the popup.
+		className: ''
+	},
+
+	// @namespace Popup
+	// @method openOn(map: Map): this
+	// Adds the popup to the map and closes the previous one. The same as `map.openPopup(popup)`.
+	openOn: function (map) {
+		map.openPopup(this);
+		return this;
+	},
+
+	onAdd: function (map) {
+		L.DivOverlay.prototype.onAdd.call(this, map);
+
+		// @namespace Map
+		// @section Popup events
+		// @event popupopen: PopupEvent
+		// Fired when a popup is opened in the map
+		map.fire('popupopen', {popup: this});
+
+		if (this._source) {
+			// @namespace Layer
+			// @section Popup events
+			// @event popupopen: PopupEvent
+			// Fired when a popup bound to this layer is opened
+			this._source.fire('popupopen', {popup: this}, true);
+			// For non-path layers, we toggle the popup when clicking
+			// again the layer, so prevent the map to reopen it.
+			if (!(this._source instanceof L.Path)) {
+				this._source.on('preclick', L.DomEvent.stopPropagation);
+			}
+		}
+	},
+
+	onRemove: function (map) {
+		L.DivOverlay.prototype.onRemove.call(this, map);
+
+		// @namespace Map
+		// @section Popup events
+		// @event popupclose: PopupEvent
+		// Fired when a popup in the map is closed
+		map.fire('popupclose', {popup: this});
+
+		if (this._source) {
+			// @namespace Layer
+			// @section Popup events
+			// @event popupclose: PopupEvent
+			// Fired when a popup bound to this layer is closed
+			this._source.fire('popupclose', {popup: this}, true);
+			if (!(this._source instanceof L.Path)) {
+				this._source.off('preclick', L.DomEvent.stopPropagation);
+			}
+		}
+	},
+
+	getEvents: function () {
+		var events = L.DivOverlay.prototype.getEvents.call(this);
+
+		if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) {
+			events.preclick = this._close;
+		}
+
+		if (this.options.keepInView) {
+			events.moveend = this._adjustPan;
+		}
+
+		return events;
+	},
+
+	_close: function () {
+		if (this._map) {
+			this._map.closePopup(this);
+		}
+	},
+
+	_initLayout: function () {
+		var prefix = 'leaflet-popup',
+		    container = this._container = L.DomUtil.create('div',
+			prefix + ' ' + (this.options.className || '') +
+			' leaflet-zoom-animated');
+
+		if (this.options.closeButton) {
+			var closeButton = this._closeButton = L.DomUtil.create('a', prefix + '-close-button', container);
+			closeButton.href = '#close';
+			closeButton.innerHTML = '&#215;';
+
+			L.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this);
+		}
+
+		var wrapper = this._wrapper = L.DomUtil.create('div', prefix + '-content-wrapper', container);
+		this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);
+
+		L.DomEvent
+			.disableClickPropagation(wrapper)
+			.disableScrollPropagation(this._contentNode)
+			.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation);
+
+		this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);
+		this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);
+	},
+
+	_updateLayout: function () {
+		var container = this._contentNode,
+		    style = container.style;
+
+		style.width = '';
+		style.whiteSpace = 'nowrap';
+
+		var width = container.offsetWidth;
+		width = Math.min(width, this.options.maxWidth);
+		width = Math.max(width, this.options.minWidth);
+
+		style.width = (width + 1) + 'px';
+		style.whiteSpace = '';
+
+		style.height = '';
+
+		var height = container.offsetHeight,
+		    maxHeight = this.options.maxHeight,
+		    scrolledClass = 'leaflet-popup-scrolled';
+
+		if (maxHeight && height > maxHeight) {
+			style.height = maxHeight + 'px';
+			L.DomUtil.addClass(container, scrolledClass);
+		} else {
+			L.DomUtil.removeClass(container, scrolledClass);
+		}
+
+		this._containerWidth = this._container.offsetWidth;
+	},
+
+	_animateZoom: function (e) {
+		var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center),
+		    anchor = this._getAnchor();
+		L.DomUtil.setPosition(this._container, pos.add(anchor));
+	},
+
+	_adjustPan: function () {
+		if (!this.options.autoPan || (this._map._panAnim && this._map._panAnim._inProgress)) { return; }
+
+		var map = this._map,
+		    marginBottom = parseInt(L.DomUtil.getStyle(this._container, 'marginBottom'), 10) || 0,
+		    containerHeight = this._container.offsetHeight + marginBottom,
+		    containerWidth = this._containerWidth,
+		    layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom);
+
+		layerPos._add(L.DomUtil.getPosition(this._container));
+
+		var containerPos = map.layerPointToContainerPoint(layerPos),
+		    padding = L.point(this.options.autoPanPadding),
+		    paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding),
+		    paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding),
+		    size = map.getSize(),
+		    dx = 0,
+		    dy = 0;
+
+		if (containerPos.x + containerWidth + paddingBR.x > size.x) { // right
+			dx = containerPos.x + containerWidth - size.x + paddingBR.x;
+		}
+		if (containerPos.x - dx - paddingTL.x < 0) { // left
+			dx = containerPos.x - paddingTL.x;
+		}
+		if (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom
+			dy = containerPos.y + containerHeight - size.y + paddingBR.y;
+		}
+		if (containerPos.y - dy - paddingTL.y < 0) { // top
+			dy = containerPos.y - paddingTL.y;
+		}
+
+		// @namespace Map
+		// @section Popup events
+		// @event autopanstart: Event
+		// Fired when the map starts autopanning when opening a popup.
+		if (dx || dy) {
+			map
+			    .fire('autopanstart')
+			    .panBy([dx, dy]);
+		}
+	},
+
+	_onCloseButtonClick: function (e) {
+		this._close();
+		L.DomEvent.stop(e);
+	},
+
+	_getAnchor: function () {
+		// Where should we anchor the popup on the source layer?
+		return L.point(this._source && this._source._getPopupAnchor ? this._source._getPopupAnchor() : [0, 0]);
+	}
+
+});
+
+// @namespace Popup
+// @factory L.popup(options?: Popup options, source?: Layer)
+// Instantiates a `Popup` object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the popup with a reference to the Layer to which it refers.
+L.popup = function (options, source) {
+	return new L.Popup(options, source);
+};
+
+
+/* @namespace Map
+ * @section Interaction Options
+ * @option closePopupOnClick: Boolean = true
+ * Set it to `false` if you don't want popups to close when user clicks the map.
+ */
+L.Map.mergeOptions({
+	closePopupOnClick: true
+});
+
+
+// @namespace Map
+// @section Methods for Layers and Controls
+L.Map.include({
+	// @method openPopup(popup: Popup): this
+	// Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).
+	// @alternative
+	// @method openPopup(content: String|HTMLElement, latlng: LatLng, options?: Popup options): this
+	// Creates a popup with the specified content and options and opens it in the given point on a map.
+	openPopup: function (popup, latlng, options) {
+		if (!(popup instanceof L.Popup)) {
+			popup = new L.Popup(options).setContent(popup);
+		}
+
+		if (latlng) {
+			popup.setLatLng(latlng);
+		}
+
+		if (this.hasLayer(popup)) {
+			return this;
+		}
+
+		if (this._popup && this._popup.options.autoClose) {
+			this.closePopup();
+		}
+
+		this._popup = popup;
+		return this.addLayer(popup);
+	},
+
+	// @method closePopup(popup?: Popup): this
+	// Closes the popup previously opened with [openPopup](#map-openpopup) (or the given one).
+	closePopup: function (popup) {
+		if (!popup || popup === this._popup) {
+			popup = this._popup;
+			this._popup = null;
+		}
+		if (popup) {
+			this.removeLayer(popup);
+		}
+		return this;
+	}
+});
+
+/*
+ * @namespace Layer
+ * @section Popup methods example
+ *
+ * All layers share a set of methods convenient for binding popups to it.
+ *
+ * ```js
+ * var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);
+ * layer.openPopup();
+ * layer.closePopup();
+ * ```
+ *
+ * Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.
+ */
+
+// @section Popup methods
+L.Layer.include({
+
+	// @method bindPopup(content: String|HTMLElement|Function|Popup, options?: Popup options): this
+	// Binds a popup to the layer with the passed `content` and sets up the
+	// neccessary event listeners. If a `Function` is passed it will receive
+	// the layer as the first argument and should return a `String` or `HTMLElement`.
+	bindPopup: function (content, options) {
+
+		if (content instanceof L.Popup) {
+			L.setOptions(content, options);
+			this._popup = content;
+			content._source = this;
+		} else {
+			if (!this._popup || options) {
+				this._popup = new L.Popup(options, this);
+			}
+			this._popup.setContent(content);
+		}
+
+		if (!this._popupHandlersAdded) {
+			this.on({
+				click: this._openPopup,
+				remove: this.closePopup,
+				move: this._movePopup
+			});
+			this._popupHandlersAdded = true;
+		}
+
+		return this;
+	},
+
+	// @method unbindPopup(): this
+	// Removes the popup previously bound with `bindPopup`.
+	unbindPopup: function () {
+		if (this._popup) {
+			this.off({
+				click: this._openPopup,
+				remove: this.closePopup,
+				move: this._movePopup
+			});
+			this._popupHandlersAdded = false;
+			this._popup = null;
+		}
+		return this;
+	},
+
+	// @method openPopup(latlng?: LatLng): this
+	// Opens the bound popup at the specificed `latlng` or at the default popup anchor if no `latlng` is passed.
+	openPopup: function (layer, latlng) {
+		if (!(layer instanceof L.Layer)) {
+			latlng = layer;
+			layer = this;
+		}
+
+		if (layer instanceof L.FeatureGroup) {
+			for (var id in this._layers) {
+				layer = this._layers[id];
+				break;
+			}
+		}
+
+		if (!latlng) {
+			latlng = layer.getCenter ? layer.getCenter() : layer.getLatLng();
+		}
+
+		if (this._popup && this._map) {
+			// set popup source to this layer
+			this._popup._source = layer;
+
+			// update the popup (content, layout, ect...)
+			this._popup.update();
+
+			// open the popup on the map
+			this._map.openPopup(this._popup, latlng);
+		}
+
+		return this;
+	},
+
+	// @method closePopup(): this
+	// Closes the popup bound to this layer if it is open.
+	closePopup: function () {
+		if (this._popup) {
+			this._popup._close();
+		}
+		return this;
+	},
+
+	// @method togglePopup(): this
+	// Opens or closes the popup bound to this layer depending on its current state.
+	togglePopup: function (target) {
+		if (this._popup) {
+			if (this._popup._map) {
+				this.closePopup();
+			} else {
+				this.openPopup(target);
+			}
+		}
+		return this;
+	},
+
+	// @method isPopupOpen(): boolean
+	// Returns `true` if the popup bound to this layer is currently open.
+	isPopupOpen: function () {
+		return (this._popup ? this._popup.isOpen() : false);
+	},
+
+	// @method setPopupContent(content: String|HTMLElement|Popup): this
+	// Sets the content of the popup bound to this layer.
+	setPopupContent: function (content) {
+		if (this._popup) {
+			this._popup.setContent(content);
+		}
+		return this;
+	},
+
+	// @method getPopup(): Popup
+	// Returns the popup bound to this layer.
+	getPopup: function () {
+		return this._popup;
+	},
+
+	_openPopup: function (e) {
+		var layer = e.layer || e.target;
+
+		if (!this._popup) {
+			return;
+		}
+
+		if (!this._map) {
+			return;
+		}
+
+		// prevent map click
+		L.DomEvent.stop(e);
+
+		// if this inherits from Path its a vector and we can just
+		// open the popup at the new location
+		if (layer instanceof L.Path) {
+			this.openPopup(e.layer || e.target, e.latlng);
+			return;
+		}
+
+		// otherwise treat it like a marker and figure out
+		// if we should toggle it open/closed
+		if (this._map.hasLayer(this._popup) && this._popup._source === layer) {
+			this.closePopup();
+		} else {
+			this.openPopup(layer, e.latlng);
+		}
+	},
+
+	_movePopup: function (e) {
+		this._popup.setLatLng(e.latlng);
+	}
+});
+
+
+
+/*
+ * @class Tooltip
+ * @inherits DivOverlay
+ * @aka L.Tooltip
+ * Used to display small texts on top of map layers.
+ *
+ * @example
+ *
+ * ```js
+ * marker.bindTooltip("my tooltip text").openTooltip();
+ * ```
+ * Note about tooltip offset. Leaflet takes two options in consideration
+ * for computing tooltip offseting:
+ * - the `offset` Tooltip option: it defaults to [0, 0], and it's specific to one tooltip.
+ *   Add a positive x offset to move the tooltip to the right, and a positive y offset to
+ *   move it to the bottom. Negatives will move to the left and top.
+ * - the `tooltipAnchor` Icon option: this will only be considered for Marker. You
+ *   should adapt this value if you use a custom icon.
+ */
+
+
+// @namespace Tooltip
+L.Tooltip = L.DivOverlay.extend({
+
+	// @section
+	// @aka Tooltip options
+	options: {
+		// @option pane: String = 'tooltipPane'
+		// `Map pane` where the tooltip will be added.
+		pane: 'tooltipPane',
+
+		// @option offset: Point = Point(0, 0)
+		// Optional offset of the tooltip position.
+		offset: [0, 0],
+
+		// @option direction: String = 'auto'
+		// Direction where to open the tooltip. Possible values are: `right`, `left`,
+		// `top`, `bottom`, `center`, `auto`.
+		// `auto` will dynamicaly switch between `right` and `left` according to the tooltip
+		// position on the map.
+		direction: 'auto',
+
+		// @option permanent: Boolean = false
+		// Whether to open the tooltip permanently or only on mouseover.
+		permanent: false,
+
+		// @option sticky: Boolean = false
+		// If true, the tooltip will follow the mouse instead of being fixed at the feature center.
+		sticky: false,
+
+		// @option interactive: Boolean = false
+		// If true, the tooltip will listen to the feature events.
+		interactive: false,
+
+		// @option opacity: Number = 0.9
+		// Tooltip container opacity.
+		opacity: 0.9
+	},
+
+	onAdd: function (map) {
+		L.DivOverlay.prototype.onAdd.call(this, map);
+		this.setOpacity(this.options.opacity);
+
+		// @namespace Map
+		// @section Tooltip events
+		// @event tooltipopen: TooltipEvent
+		// Fired when a tooltip is opened in the map.
+		map.fire('tooltipopen', {tooltip: this});
+
+		if (this._source) {
+			// @namespace Layer
+			// @section Tooltip events
+			// @event tooltipopen: TooltipEvent
+			// Fired when a tooltip bound to this layer is opened.
+			this._source.fire('tooltipopen', {tooltip: this}, true);
+		}
+	},
+
+	onRemove: function (map) {
+		L.DivOverlay.prototype.onRemove.call(this, map);
+
+		// @namespace Map
+		// @section Tooltip events
+		// @event tooltipclose: TooltipEvent
+		// Fired when a tooltip in the map is closed.
+		map.fire('tooltipclose', {tooltip: this});
+
+		if (this._source) {
+			// @namespace Layer
+			// @section Tooltip events
+			// @event tooltipclose: TooltipEvent
+			// Fired when a tooltip bound to this layer is closed.
+			this._source.fire('tooltipclose', {tooltip: this}, true);
+		}
+	},
+
+	getEvents: function () {
+		var events = L.DivOverlay.prototype.getEvents.call(this);
+
+		if (L.Browser.touch && !this.options.permanent) {
+			events.preclick = this._close;
+		}
+
+		return events;
+	},
+
+	_close: function () {
+		if (this._map) {
+			this._map.closeTooltip(this);
+		}
+	},
+
+	_initLayout: function () {
+		var prefix = 'leaflet-tooltip',
+		    className = prefix + ' ' + (this.options.className || '') + ' leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');
+
+		this._contentNode = this._container = L.DomUtil.create('div', className);
+	},
+
+	_updateLayout: function () {},
+
+	_adjustPan: function () {},
+
+	_setPosition: function (pos) {
+		var map = this._map,
+		    container = this._container,
+		    centerPoint = map.latLngToContainerPoint(map.getCenter()),
+		    tooltipPoint = map.layerPointToContainerPoint(pos),
+		    direction = this.options.direction,
+		    tooltipWidth = container.offsetWidth,
+		    tooltipHeight = container.offsetHeight,
+		    offset = L.point(this.options.offset),
+		    anchor = this._getAnchor();
+
+		if (direction === 'top') {
+			pos = pos.add(L.point(-tooltipWidth / 2 + offset.x, -tooltipHeight + offset.y + anchor.y, true));
+		} else if (direction === 'bottom') {
+			pos = pos.subtract(L.point(tooltipWidth / 2 - offset.x, -offset.y, true));
+		} else if (direction === 'center') {
+			pos = pos.subtract(L.point(tooltipWidth / 2 + offset.x, tooltipHeight / 2 - anchor.y + offset.y, true));
+		} else if (direction === 'right' || direction === 'auto' && tooltipPoint.x < centerPoint.x) {
+			direction = 'right';
+			pos = pos.add(L.point(offset.x + anchor.x, anchor.y - tooltipHeight / 2 + offset.y, true));
+		} else {
+			direction = 'left';
+			pos = pos.subtract(L.point(tooltipWidth + anchor.x - offset.x, tooltipHeight / 2 - anchor.y - offset.y, true));
+		}
+
+		L.DomUtil.removeClass(container, 'leaflet-tooltip-right');
+		L.DomUtil.removeClass(container, 'leaflet-tooltip-left');
+		L.DomUtil.removeClass(container, 'leaflet-tooltip-top');
+		L.DomUtil.removeClass(container, 'leaflet-tooltip-bottom');
+		L.DomUtil.addClass(container, 'leaflet-tooltip-' + direction);
+		L.DomUtil.setPosition(container, pos);
+	},
+
+	_updatePosition: function () {
+		var pos = this._map.latLngToLayerPoint(this._latlng);
+		this._setPosition(pos);
+	},
+
+	setOpacity: function (opacity) {
+		this.options.opacity = opacity;
+
+		if (this._container) {
+			L.DomUtil.setOpacity(this._container, opacity);
+		}
+	},
+
+	_animateZoom: function (e) {
+		var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center);
+		this._setPosition(pos);
+	},
+
+	_getAnchor: function () {
+		// Where should we anchor the tooltip on the source layer?
+		return L.point(this._source && this._source._getTooltipAnchor && !this.options.sticky ? this._source._getTooltipAnchor() : [0, 0]);
+	}
+
+});
+
+// @namespace Tooltip
+// @factory L.tooltip(options?: Tooltip options, source?: Layer)
+// Instantiates a Tooltip object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the tooltip with a reference to the Layer to which it refers.
+L.tooltip = function (options, source) {
+	return new L.Tooltip(options, source);
+};
+
+// @namespace Map
+// @section Methods for Layers and Controls
+L.Map.include({
+
+	// @method openTooltip(tooltip: Tooltip): this
+	// Opens the specified tooltip.
+	// @alternative
+	// @method openTooltip(content: String|HTMLElement, latlng: LatLng, options?: Tooltip options): this
+	// Creates a tooltip with the specified content and options and open it.
+	openTooltip: function (tooltip, latlng, options) {
+		if (!(tooltip instanceof L.Tooltip)) {
+			tooltip = new L.Tooltip(options).setContent(tooltip);
+		}
+
+		if (latlng) {
+			tooltip.setLatLng(latlng);
+		}
+
+		if (this.hasLayer(tooltip)) {
+			return this;
+		}
+
+		return this.addLayer(tooltip);
+	},
+
+	// @method closeTooltip(tooltip?: Tooltip): this
+	// Closes the tooltip given as parameter.
+	closeTooltip: function (tooltip) {
+		if (tooltip) {
+			this.removeLayer(tooltip);
+		}
+		return this;
+	}
+
+});
+
+/*
+ * @namespace Layer
+ * @section Tooltip methods example
+ *
+ * All layers share a set of methods convenient for binding tooltips to it.
+ *
+ * ```js
+ * var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);
+ * layer.openTooltip();
+ * layer.closeTooltip();
+ * ```
+ */
+
+// @section Tooltip methods
+L.Layer.include({
+
+	// @method bindTooltip(content: String|HTMLElement|Function|Tooltip, options?: Tooltip options): this
+	// Binds a tooltip to the layer with the passed `content` and sets up the
+	// neccessary event listeners. If a `Function` is passed it will receive
+	// the layer as the first argument and should return a `String` or `HTMLElement`.
+	bindTooltip: function (content, options) {
+
+		if (content instanceof L.Tooltip) {
+			L.setOptions(content, options);
+			this._tooltip = content;
+			content._source = this;
+		} else {
+			if (!this._tooltip || options) {
+				this._tooltip = L.tooltip(options, this);
+			}
+			this._tooltip.setContent(content);
+
+		}
+
+		this._initTooltipInteractions();
+
+		if (this._tooltip.options.permanent && this._map && this._map.hasLayer(this)) {
+			this.openTooltip();
+		}
+
+		return this;
+	},
+
+	// @method unbindTooltip(): this
+	// Removes the tooltip previously bound with `bindTooltip`.
+	unbindTooltip: function () {
+		if (this._tooltip) {
+			this._initTooltipInteractions(true);
+			this.closeTooltip();
+			this._tooltip = null;
+		}
+		return this;
+	},
+
+	_initTooltipInteractions: function (remove) {
+		if (!remove && this._tooltipHandlersAdded) { return; }
+		var onOff = remove ? 'off' : 'on',
+		    events = {
+			remove: this.closeTooltip,
+			move: this._moveTooltip
+		    };
+		if (!this._tooltip.options.permanent) {
+			events.mouseover = this._openTooltip;
+			events.mouseout = this.closeTooltip;
+			if (this._tooltip.options.sticky) {
+				events.mousemove = this._moveTooltip;
+			}
+			if (L.Browser.touch) {
+				events.click = this._openTooltip;
+			}
+		} else {
+			events.add = this._openTooltip;
+		}
+		this[onOff](events);
+		this._tooltipHandlersAdded = !remove;
+	},
+
+	// @method openTooltip(latlng?: LatLng): this
+	// Opens the bound tooltip at the specificed `latlng` or at the default tooltip anchor if no `latlng` is passed.
+	openTooltip: function (layer, latlng) {
+		if (!(layer instanceof L.Layer)) {
+			latlng = layer;
+			layer = this;
+		}
+
+		if (layer instanceof L.FeatureGroup) {
+			for (var id in this._layers) {
+				layer = this._layers[id];
+				break;
+			}
+		}
+
+		if (!latlng) {
+			latlng = layer.getCenter ? layer.getCenter() : layer.getLatLng();
+		}
+
+		if (this._tooltip && this._map) {
+
+			// set tooltip source to this layer
+			this._tooltip._source = layer;
+
+			// update the tooltip (content, layout, ect...)
+			this._tooltip.update();
+
+			// open the tooltip on the map
+			this._map.openTooltip(this._tooltip, latlng);
+
+			// Tooltip container may not be defined if not permanent and never
+			// opened.
+			if (this._tooltip.options.interactive && this._tooltip._container) {
+				L.DomUtil.addClass(this._tooltip._container, 'leaflet-clickable');
+				this.addInteractiveTarget(this._tooltip._container);
+			}
+		}
+
+		return this;
+	},
+
+	// @method closeTooltip(): this
+	// Closes the tooltip bound to this layer if it is open.
+	closeTooltip: function () {
+		if (this._tooltip) {
+			this._tooltip._close();
+			if (this._tooltip.options.interactive && this._tooltip._container) {
+				L.DomUtil.removeClass(this._tooltip._container, 'leaflet-clickable');
+				this.removeInteractiveTarget(this._tooltip._container);
+			}
+		}
+		return this;
+	},
+
+	// @method toggleTooltip(): this
+	// Opens or closes the tooltip bound to this layer depending on its current state.
+	toggleTooltip: function (target) {
+		if (this._tooltip) {
+			if (this._tooltip._map) {
+				this.closeTooltip();
+			} else {
+				this.openTooltip(target);
+			}
+		}
+		return this;
+	},
+
+	// @method isTooltipOpen(): boolean
+	// Returns `true` if the tooltip bound to this layer is currently open.
+	isTooltipOpen: function () {
+		return this._tooltip.isOpen();
+	},
+
+	// @method setTooltipContent(content: String|HTMLElement|Tooltip): this
+	// Sets the content of the tooltip bound to this layer.
+	setTooltipContent: function (content) {
+		if (this._tooltip) {
+			this._tooltip.setContent(content);
+		}
+		return this;
+	},
+
+	// @method getTooltip(): Tooltip
+	// Returns the tooltip bound to this layer.
+	getTooltip: function () {
+		return this._tooltip;
+	},
+
+	_openTooltip: function (e) {
+		var layer = e.layer || e.target;
+
+		if (!this._tooltip || !this._map) {
+			return;
+		}
+		this.openTooltip(layer, this._tooltip.options.sticky ? e.latlng : undefined);
+	},
+
+	_moveTooltip: function (e) {
+		var latlng = e.latlng, containerPoint, layerPoint;
+		if (this._tooltip.options.sticky && e.originalEvent) {
+			containerPoint = this._map.mouseEventToContainerPoint(e.originalEvent);
+			layerPoint = this._map.containerPointToLayerPoint(containerPoint);
+			latlng = this._map.layerPointToLatLng(layerPoint);
+		}
+		this._tooltip.setLatLng(latlng);
+	}
+});
+
+
+
+/*
+ * @class LayerGroup
+ * @aka L.LayerGroup
+ * @inherits Layer
+ *
+ * Used to group several layers and handle them as one. If you add it to the map,
+ * any layers added or removed from the group will be added/removed on the map as
+ * well. Extends `Layer`.
+ *
+ * @example
+ *
+ * ```js
+ * L.layerGroup([marker1, marker2])
+ * 	.addLayer(polyline)
+ * 	.addTo(map);
+ * ```
+ */
+
+L.LayerGroup = L.Layer.extend({
+
+	initialize: function (layers) {
+		this._layers = {};
+
+		var i, len;
+
+		if (layers) {
+			for (i = 0, len = layers.length; i < len; i++) {
+				this.addLayer(layers[i]);
+			}
+		}
+	},
+
+	// @method addLayer(layer: Layer): this
+	// Adds the given layer to the group.
+	addLayer: function (layer) {
+		var id = this.getLayerId(layer);
+
+		this._layers[id] = layer;
+
+		if (this._map) {
+			this._map.addLayer(layer);
+		}
+
+		return this;
+	},
+
+	// @method removeLayer(layer: Layer): this
+	// Removes the given layer from the group.
+	// @alternative
+	// @method removeLayer(id: Number): this
+	// Removes the layer with the given internal ID from the group.
+	removeLayer: function (layer) {
+		var id = layer in this._layers ? layer : this.getLayerId(layer);
+
+		if (this._map && this._layers[id]) {
+			this._map.removeLayer(this._layers[id]);
+		}
+
+		delete this._layers[id];
+
+		return this;
+	},
+
+	// @method hasLayer(layer: Layer): Boolean
+	// Returns `true` if the given layer is currently added to the group.
+	hasLayer: function (layer) {
+		return !!layer && (layer in this._layers || this.getLayerId(layer) in this._layers);
+	},
+
+	// @method clearLayers(): this
+	// Removes all the layers from the group.
+	clearLayers: function () {
+		for (var i in this._layers) {
+			this.removeLayer(this._layers[i]);
+		}
+		return this;
+	},
+
+	// @method invoke(methodName: String, …): this
+	// Calls `methodName` on every layer contained in this group, passing any
+	// additional parameters. Has no effect if the layers contained do not
+	// implement `methodName`.
+	invoke: function (methodName) {
+		var args = Array.prototype.slice.call(arguments, 1),
+		    i, layer;
+
+		for (i in this._layers) {
+			layer = this._layers[i];
+
+			if (layer[methodName]) {
+				layer[methodName].apply(layer, args);
+			}
+		}
+
+		return this;
+	},
+
+	onAdd: function (map) {
+		for (var i in this._layers) {
+			map.addLayer(this._layers[i]);
+		}
+	},
+
+	onRemove: function (map) {
+		for (var i in this._layers) {
+			map.removeLayer(this._layers[i]);
+		}
+	},
+
+	// @method eachLayer(fn: Function, context?: Object): this
+	// Iterates over the layers of the group, optionally specifying context of the iterator function.
+	// ```js
+	// group.eachLayer(function (layer) {
+	// 	layer.bindPopup('Hello');
+	// });
+	// ```
+	eachLayer: function (method, context) {
+		for (var i in this._layers) {
+			method.call(context, this._layers[i]);
+		}
+		return this;
+	},
+
+	// @method getLayer(id: Number): Layer
+	// Returns the layer with the given internal ID.
+	getLayer: function (id) {
+		return this._layers[id];
+	},
+
+	// @method getLayers(): Layer[]
+	// Returns an array of all the layers added to the group.
+	getLayers: function () {
+		var layers = [];
+
+		for (var i in this._layers) {
+			layers.push(this._layers[i]);
+		}
+		return layers;
+	},
+
+	// @method setZIndex(zIndex: Number): this
+	// Calls `setZIndex` on every layer contained in this group, passing the z-index.
+	setZIndex: function (zIndex) {
+		return this.invoke('setZIndex', zIndex);
+	},
+
+	// @method getLayerId(layer: Layer): Number
+	// Returns the internal ID for a layer
+	getLayerId: function (layer) {
+		return L.stamp(layer);
+	}
+});
+
+
+// @factory L.layerGroup(layers: Layer[])
+// Create a layer group, optionally given an initial set of layers.
+L.layerGroup = function (layers) {
+	return new L.LayerGroup(layers);
+};
+
+
+
+/*
+ * @class FeatureGroup
+ * @aka L.FeatureGroup
+ * @inherits LayerGroup
+ *
+ * Extended `LayerGroup` that makes it easier to do the same thing to all its member layers:
+ *  * [`bindPopup`](#layer-bindpopup) binds a popup to all of the layers at once (likewise with [`bindTooltip`](#layer-bindtooltip))
+ *  * Events are propagated to the `FeatureGroup`, so if the group has an event
+ * handler, it will handle events from any of the layers. This includes mouse events
+ * and custom events.
+ *  * Has `layeradd` and `layerremove` events
+ *
+ * @example
+ *
+ * ```js
+ * L.featureGroup([marker1, marker2, polyline])
+ * 	.bindPopup('Hello world!')
+ * 	.on('click', function() { alert('Clicked on a member of the group!'); })
+ * 	.addTo(map);
+ * ```
+ */
+
+L.FeatureGroup = L.LayerGroup.extend({
+
+	addLayer: function (layer) {
+		if (this.hasLayer(layer)) {
+			return this;
+		}
+
+		layer.addEventParent(this);
+
+		L.LayerGroup.prototype.addLayer.call(this, layer);
+
+		// @event layeradd: LayerEvent
+		// Fired when a layer is added to this `FeatureGroup`
+		return this.fire('layeradd', {layer: layer});
+	},
+
+	removeLayer: function (layer) {
+		if (!this.hasLayer(layer)) {
+			return this;
+		}
+		if (layer in this._layers) {
+			layer = this._layers[layer];
+		}
+
+		layer.removeEventParent(this);
+
+		L.LayerGroup.prototype.removeLayer.call(this, layer);
+
+		// @event layerremove: LayerEvent
+		// Fired when a layer is removed from this `FeatureGroup`
+		return this.fire('layerremove', {layer: layer});
+	},
+
+	// @method setStyle(style: Path options): this
+	// Sets the given path options to each layer of the group that has a `setStyle` method.
+	setStyle: function (style) {
+		return this.invoke('setStyle', style);
+	},
+
+	// @method bringToFront(): this
+	// Brings the layer group to the top of all other layers
+	bringToFront: function () {
+		return this.invoke('bringToFront');
+	},
+
+	// @method bringToBack(): this
+	// Brings the layer group to the top of all other layers
+	bringToBack: function () {
+		return this.invoke('bringToBack');
+	},
+
+	// @method getBounds(): LatLngBounds
+	// Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).
+	getBounds: function () {
+		var bounds = new L.LatLngBounds();
+
+		for (var id in this._layers) {
+			var layer = this._layers[id];
+			bounds.extend(layer.getBounds ? layer.getBounds() : layer.getLatLng());
+		}
+		return bounds;
+	}
+});
+
+// @factory L.featureGroup(layers: Layer[])
+// Create a feature group, optionally given an initial set of layers.
+L.featureGroup = function (layers) {
+	return new L.FeatureGroup(layers);
+};
+
+
+
+/*
+ * @class Renderer
+ * @inherits Layer
+ * @aka L.Renderer
+ *
+ * Base class for vector renderer implementations (`SVG`, `Canvas`). Handles the
+ * DOM container of the renderer, its bounds, and its zoom animation.
+ *
+ * A `Renderer` works as an implicit layer group for all `Path`s - the renderer
+ * itself can be added or removed to the map. All paths use a renderer, which can
+ * be implicit (the map will decide the type of renderer and use it automatically)
+ * or explicit (using the [`renderer`](#path-renderer) option of the path).
+ *
+ * Do not use this class directly, use `SVG` and `Canvas` instead.
+ *
+ * @event update: Event
+ * Fired when the renderer updates its bounds, center and zoom, for example when
+ * its map has moved
+ */
+
+L.Renderer = L.Layer.extend({
+
+	// @section
+	// @aka Renderer options
+	options: {
+		// @option padding: Number = 0.1
+		// How much to extend the clip area around the map view (relative to its size)
+		// e.g. 0.1 would be 10% of map view in each direction
+		padding: 0.1
+	},
+
+	initialize: function (options) {
+		L.setOptions(this, options);
+		L.stamp(this);
+		this._layers = this._layers || {};
+	},
+
+	onAdd: function () {
+		if (!this._container) {
+			this._initContainer(); // defined by renderer implementations
+
+			if (this._zoomAnimated) {
+				L.DomUtil.addClass(this._container, 'leaflet-zoom-animated');
+			}
+		}
+
+		this.getPane().appendChild(this._container);
+		this._update();
+		this.on('update', this._updatePaths, this);
+	},
+
+	onRemove: function () {
+		L.DomUtil.remove(this._container);
+		this.off('update', this._updatePaths, this);
+	},
+
+	getEvents: function () {
+		var events = {
+			viewreset: this._reset,
+			zoom: this._onZoom,
+			moveend: this._update,
+			zoomend: this._onZoomEnd
+		};
+		if (this._zoomAnimated) {
+			events.zoomanim = this._onAnimZoom;
+		}
+		return events;
+	},
+
+	_onAnimZoom: function (ev) {
+		this._updateTransform(ev.center, ev.zoom);
+	},
+
+	_onZoom: function () {
+		this._updateTransform(this._map.getCenter(), this._map.getZoom());
+	},
+
+	_updateTransform: function (center, zoom) {
+		var scale = this._map.getZoomScale(zoom, this._zoom),
+		    position = L.DomUtil.getPosition(this._container),
+		    viewHalf = this._map.getSize().multiplyBy(0.5 + this.options.padding),
+		    currentCenterPoint = this._map.project(this._center, zoom),
+		    destCenterPoint = this._map.project(center, zoom),
+		    centerOffset = destCenterPoint.subtract(currentCenterPoint),
+
+		    topLeftOffset = viewHalf.multiplyBy(-scale).add(position).add(viewHalf).subtract(centerOffset);
+
+		if (L.Browser.any3d) {
+			L.DomUtil.setTransform(this._container, topLeftOffset, scale);
+		} else {
+			L.DomUtil.setPosition(this._container, topLeftOffset);
+		}
+	},
+
+	_reset: function () {
+		this._update();
+		this._updateTransform(this._center, this._zoom);
+
+		for (var id in this._layers) {
+			this._layers[id]._reset();
+		}
+	},
+
+	_onZoomEnd: function () {
+		for (var id in this._layers) {
+			this._layers[id]._project();
+		}
+	},
+
+	_updatePaths: function () {
+		for (var id in this._layers) {
+			this._layers[id]._update();
+		}
+	},
+
+	_update: function () {
+		// Update pixel bounds of renderer container (for positioning/sizing/clipping later)
+		// Subclasses are responsible of firing the 'update' event.
+		var p = this.options.padding,
+		    size = this._map.getSize(),
+		    min = this._map.containerPointToLayerPoint(size.multiplyBy(-p)).round();
+
+		this._bounds = new L.Bounds(min, min.add(size.multiplyBy(1 + p * 2)).round());
+
+		this._center = this._map.getCenter();
+		this._zoom = this._map.getZoom();
+	}
+});
+
+
+L.Map.include({
+	// @namespace Map; @method getRenderer(layer: Path): Renderer
+	// Returns the instance of `Renderer` that should be used to render the given
+	// `Path`. It will ensure that the `renderer` options of the map and paths
+	// are respected, and that the renderers do exist on the map.
+	getRenderer: function (layer) {
+		// @namespace Path; @option renderer: Renderer
+		// Use this specific instance of `Renderer` for this path. Takes
+		// precedence over the map's [default renderer](#map-renderer).
+		var renderer = layer.options.renderer || this._getPaneRenderer(layer.options.pane) || this.options.renderer || this._renderer;
+
+		if (!renderer) {
+			// @namespace Map; @option preferCanvas: Boolean = false
+			// Whether `Path`s should be rendered on a `Canvas` renderer.
+			// By default, all `Path`s are rendered in a `SVG` renderer.
+			renderer = this._renderer = (this.options.preferCanvas && L.canvas()) || L.svg();
+		}
+
+		if (!this.hasLayer(renderer)) {
+			this.addLayer(renderer);
+		}
+		return renderer;
+	},
+
+	_getPaneRenderer: function (name) {
+		if (name === 'overlayPane' || name === undefined) {
+			return false;
+		}
+
+		var renderer = this._paneRenderers[name];
+		if (renderer === undefined) {
+			renderer = (L.SVG && L.svg({pane: name})) || (L.Canvas && L.canvas({pane: name}));
+			this._paneRenderers[name] = renderer;
+		}
+		return renderer;
+	}
+});
+
+
+
+/*
+ * @class Path
+ * @aka L.Path
+ * @inherits Interactive layer
+ *
+ * An abstract class that contains options and constants shared between vector
+ * overlays (Polygon, Polyline, Circle). Do not use it directly. Extends `Layer`.
+ */
+
+L.Path = L.Layer.extend({
+
+	// @section
+	// @aka Path options
+	options: {
+		// @option stroke: Boolean = true
+		// Whether to draw stroke along the path. Set it to `false` to disable borders on polygons or circles.
+		stroke: true,
+
+		// @option color: String = '#3388ff'
+		// Stroke color
+		color: '#3388ff',
+
+		// @option weight: Number = 3
+		// Stroke width in pixels
+		weight: 3,
+
+		// @option opacity: Number = 1.0
+		// Stroke opacity
+		opacity: 1,
+
+		// @option lineCap: String= 'round'
+		// A string that defines [shape to be used at the end](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linecap) of the stroke.
+		lineCap: 'round',
+
+		// @option lineJoin: String = 'round'
+		// A string that defines [shape to be used at the corners](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linejoin) of the stroke.
+		lineJoin: 'round',
+
+		// @option dashArray: String = null
+		// A string that defines the stroke [dash pattern](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dasharray). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).
+		dashArray: null,
+
+		// @option dashOffset: String = null
+		// A string that defines the [distance into the dash pattern to start the dash](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dashoffset). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).
+		dashOffset: null,
+
+		// @option fill: Boolean = depends
+		// Whether to fill the path with color. Set it to `false` to disable filling on polygons or circles.
+		fill: false,
+
+		// @option fillColor: String = *
+		// Fill color. Defaults to the value of the [`color`](#path-color) option
+		fillColor: null,
+
+		// @option fillOpacity: Number = 0.2
+		// Fill opacity.
+		fillOpacity: 0.2,
+
+		// @option fillRule: String = 'evenodd'
+		// A string that defines [how the inside of a shape](https://developer.mozilla.org/docs/Web/SVG/Attribute/fill-rule) is determined.
+		fillRule: 'evenodd',
+
+		// className: '',
+
+		// Option inherited from "Interactive layer" abstract class
+		interactive: true
+	},
+
+	beforeAdd: function (map) {
+		// Renderer is set here because we need to call renderer.getEvents
+		// before this.getEvents.
+		this._renderer = map.getRenderer(this);
+	},
+
+	onAdd: function () {
+		this._renderer._initPath(this);
+		this._reset();
+		this._renderer._addPath(this);
+	},
+
+	onRemove: function () {
+		this._renderer._removePath(this);
+	},
+
+	// @method redraw(): this
+	// Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.
+	redraw: function () {
+		if (this._map) {
+			this._renderer._updatePath(this);
+		}
+		return this;
+	},
+
+	// @method setStyle(style: Path options): this
+	// Changes the appearance of a Path based on the options in the `Path options` object.
+	setStyle: function (style) {
+		L.setOptions(this, style);
+		if (this._renderer) {
+			this._renderer._updateStyle(this);
+		}
+		return this;
+	},
+
+	// @method bringToFront(): this
+	// Brings the layer to the top of all path layers.
+	bringToFront: function () {
+		if (this._renderer) {
+			this._renderer._bringToFront(this);
+		}
+		return this;
+	},
+
+	// @method bringToBack(): this
+	// Brings the layer to the bottom of all path layers.
+	bringToBack: function () {
+		if (this._renderer) {
+			this._renderer._bringToBack(this);
+		}
+		return this;
+	},
+
+	getElement: function () {
+		return this._path;
+	},
+
+	_reset: function () {
+		// defined in children classes
+		this._project();
+		this._update();
+	},
+
+	_clickTolerance: function () {
+		// used when doing hit detection for Canvas layers
+		return (this.options.stroke ? this.options.weight / 2 : 0) + (L.Browser.touch ? 10 : 0);
+	}
+});
+
+
+
+/*
+ * @namespace LineUtil
+ *
+ * Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.
+ */
+
+L.LineUtil = {
+
+	// Simplify polyline with vertex reduction and Douglas-Peucker simplification.
+	// Improves rendering performance dramatically by lessening the number of points to draw.
+
+	// @function simplify(points: Point[], tolerance: Number): Point[]
+	// Dramatically reduces the number of points in a polyline while retaining
+	// its shape and returns a new array of simplified points, using the
+	// [Douglas-Peucker algorithm](http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm).
+	// Used for a huge performance boost when processing/displaying Leaflet polylines for
+	// each zoom level and also reducing visual noise. tolerance affects the amount of
+	// simplification (lesser value means higher quality but slower and with more points).
+	// Also released as a separated micro-library [Simplify.js](http://mourner.github.com/simplify-js/).
+	simplify: function (points, tolerance) {
+		if (!tolerance || !points.length) {
+			return points.slice();
+		}
+
+		var sqTolerance = tolerance * tolerance;
+
+		// stage 1: vertex reduction
+		points = this._reducePoints(points, sqTolerance);
+
+		// stage 2: Douglas-Peucker simplification
+		points = this._simplifyDP(points, sqTolerance);
+
+		return points;
+	},
+
+	// @function pointToSegmentDistance(p: Point, p1: Point, p2: Point): Number
+	// Returns the distance between point `p` and segment `p1` to `p2`.
+	pointToSegmentDistance:  function (p, p1, p2) {
+		return Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true));
+	},
+
+	// @function closestPointOnSegment(p: Point, p1: Point, p2: Point): Number
+	// Returns the closest point from a point `p` on a segment `p1` to `p2`.
+	closestPointOnSegment: function (p, p1, p2) {
+		return this._sqClosestPointOnSegment(p, p1, p2);
+	},
+
+	// Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm
+	_simplifyDP: function (points, sqTolerance) {
+
+		var len = points.length,
+		    ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,
+		    markers = new ArrayConstructor(len);
+
+		markers[0] = markers[len - 1] = 1;
+
+		this._simplifyDPStep(points, markers, sqTolerance, 0, len - 1);
+
+		var i,
+		    newPoints = [];
+
+		for (i = 0; i < len; i++) {
+			if (markers[i]) {
+				newPoints.push(points[i]);
+			}
+		}
+
+		return newPoints;
+	},
+
+	_simplifyDPStep: function (points, markers, sqTolerance, first, last) {
+
+		var maxSqDist = 0,
+		    index, i, sqDist;
+
+		for (i = first + 1; i <= last - 1; i++) {
+			sqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true);
+
+			if (sqDist > maxSqDist) {
+				index = i;
+				maxSqDist = sqDist;
+			}
+		}
+
+		if (maxSqDist > sqTolerance) {
+			markers[index] = 1;
+
+			this._simplifyDPStep(points, markers, sqTolerance, first, index);
+			this._simplifyDPStep(points, markers, sqTolerance, index, last);
+		}
+	},
+
+	// reduce points that are too close to each other to a single point
+	_reducePoints: function (points, sqTolerance) {
+		var reducedPoints = [points[0]];
+
+		for (var i = 1, prev = 0, len = points.length; i < len; i++) {
+			if (this._sqDist(points[i], points[prev]) > sqTolerance) {
+				reducedPoints.push(points[i]);
+				prev = i;
+			}
+		}
+		if (prev < len - 1) {
+			reducedPoints.push(points[len - 1]);
+		}
+		return reducedPoints;
+	},
+
+
+	// @function clipSegment(a: Point, b: Point, bounds: Bounds, useLastCode?: Boolean, round?: Boolean): Point[]|Boolean
+	// Clips the segment a to b by rectangular bounds with the
+	// [Cohen-Sutherland algorithm](https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm)
+	// (modifying the segment points directly!). Used by Leaflet to only show polyline
+	// points that are on the screen or near, increasing performance.
+	clipSegment: function (a, b, bounds, useLastCode, round) {
+		var codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds),
+		    codeB = this._getBitCode(b, bounds),
+
+		    codeOut, p, newCode;
+
+		// save 2nd code to avoid calculating it on the next segment
+		this._lastCode = codeB;
+
+		while (true) {
+			// if a,b is inside the clip window (trivial accept)
+			if (!(codeA | codeB)) {
+				return [a, b];
+			}
+
+			// if a,b is outside the clip window (trivial reject)
+			if (codeA & codeB) {
+				return false;
+			}
+
+			// other cases
+			codeOut = codeA || codeB;
+			p = this._getEdgeIntersection(a, b, codeOut, bounds, round);
+			newCode = this._getBitCode(p, bounds);
+
+			if (codeOut === codeA) {
+				a = p;
+				codeA = newCode;
+			} else {
+				b = p;
+				codeB = newCode;
+			}
+		}
+	},
+
+	_getEdgeIntersection: function (a, b, code, bounds, round) {
+		var dx = b.x - a.x,
+		    dy = b.y - a.y,
+		    min = bounds.min,
+		    max = bounds.max,
+		    x, y;
+
+		if (code & 8) { // top
+			x = a.x + dx * (max.y - a.y) / dy;
+			y = max.y;
+
+		} else if (code & 4) { // bottom
+			x = a.x + dx * (min.y - a.y) / dy;
+			y = min.y;
+
+		} else if (code & 2) { // right
+			x = max.x;
+			y = a.y + dy * (max.x - a.x) / dx;
+
+		} else if (code & 1) { // left
+			x = min.x;
+			y = a.y + dy * (min.x - a.x) / dx;
+		}
+
+		return new L.Point(x, y, round);
+	},
+
+	_getBitCode: function (p, bounds) {
+		var code = 0;
+
+		if (p.x < bounds.min.x) { // left
+			code |= 1;
+		} else if (p.x > bounds.max.x) { // right
+			code |= 2;
+		}
+
+		if (p.y < bounds.min.y) { // bottom
+			code |= 4;
+		} else if (p.y > bounds.max.y) { // top
+			code |= 8;
+		}
+
+		return code;
+	},
+
+	// square distance (to avoid unnecessary Math.sqrt calls)
+	_sqDist: function (p1, p2) {
+		var dx = p2.x - p1.x,
+		    dy = p2.y - p1.y;
+		return dx * dx + dy * dy;
+	},
+
+	// return closest point on segment or distance to that point
+	_sqClosestPointOnSegment: function (p, p1, p2, sqDist) {
+		var x = p1.x,
+		    y = p1.y,
+		    dx = p2.x - x,
+		    dy = p2.y - y,
+		    dot = dx * dx + dy * dy,
+		    t;
+
+		if (dot > 0) {
+			t = ((p.x - x) * dx + (p.y - y) * dy) / dot;
+
+			if (t > 1) {
+				x = p2.x;
+				y = p2.y;
+			} else if (t > 0) {
+				x += dx * t;
+				y += dy * t;
+			}
+		}
+
+		dx = p.x - x;
+		dy = p.y - y;
+
+		return sqDist ? dx * dx + dy * dy : new L.Point(x, y);
+	}
+};
+
+
+
+/*
+ * @class Polyline
+ * @aka L.Polyline
+ * @inherits Path
+ *
+ * A class for drawing polyline overlays on a map. Extends `Path`.
+ *
+ * @example
+ *
+ * ```js
+ * // create a red polyline from an array of LatLng points
+ * var latlngs = [
+ * 	[45.51, -122.68],
+ * 	[37.77, -122.43],
+ * 	[34.04, -118.2]
+ * ];
+ *
+ * var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
+ *
+ * // zoom the map to the polyline
+ * map.fitBounds(polyline.getBounds());
+ * ```
+ *
+ * You can also pass a multi-dimensional array to represent a `MultiPolyline` shape:
+ *
+ * ```js
+ * // create a red polyline from an array of arrays of LatLng points
+ * var latlngs = [
+ * 	[[45.51, -122.68],
+ * 	 [37.77, -122.43],
+ * 	 [34.04, -118.2]],
+ * 	[[40.78, -73.91],
+ * 	 [41.83, -87.62],
+ * 	 [32.76, -96.72]]
+ * ];
+ * ```
+ */
+
+L.Polyline = L.Path.extend({
+
+	// @section
+	// @aka Polyline options
+	options: {
+		// @option smoothFactor: Number = 1.0
+		// How much to simplify the polyline on each zoom level. More means
+		// better performance and smoother look, and less means more accurate representation.
+		smoothFactor: 1.0,
+
+		// @option noClip: Boolean = false
+		// Disable polyline clipping.
+		noClip: false
+	},
+
+	initialize: function (latlngs, options) {
+		L.setOptions(this, options);
+		this._setLatLngs(latlngs);
+	},
+
+	// @method getLatLngs(): LatLng[]
+	// Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.
+	getLatLngs: function () {
+		return this._latlngs;
+	},
+
+	// @method setLatLngs(latlngs: LatLng[]): this
+	// Replaces all the points in the polyline with the given array of geographical points.
+	setLatLngs: function (latlngs) {
+		this._setLatLngs(latlngs);
+		return this.redraw();
+	},
+
+	// @method isEmpty(): Boolean
+	// Returns `true` if the Polyline has no LatLngs.
+	isEmpty: function () {
+		return !this._latlngs.length;
+	},
+
+	closestLayerPoint: function (p) {
+		var minDistance = Infinity,
+		    minPoint = null,
+		    closest = L.LineUtil._sqClosestPointOnSegment,
+		    p1, p2;
+
+		for (var j = 0, jLen = this._parts.length; j < jLen; j++) {
+			var points = this._parts[j];
+
+			for (var i = 1, len = points.length; i < len; i++) {
+				p1 = points[i - 1];
+				p2 = points[i];
+
+				var sqDist = closest(p, p1, p2, true);
+
+				if (sqDist < minDistance) {
+					minDistance = sqDist;
+					minPoint = closest(p, p1, p2);
+				}
+			}
+		}
+		if (minPoint) {
+			minPoint.distance = Math.sqrt(minDistance);
+		}
+		return minPoint;
+	},
+
+	// @method getCenter(): LatLng
+	// Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the polyline.
+	getCenter: function () {
+		// throws error when not yet added to map as this center calculation requires projected coordinates
+		if (!this._map) {
+			throw new Error('Must add layer to map before using getCenter()');
+		}
+
+		var i, halfDist, segDist, dist, p1, p2, ratio,
+		    points = this._rings[0],
+		    len = points.length;
+
+		if (!len) { return null; }
+
+		// polyline centroid algorithm; only uses the first ring if there are multiple
+
+		for (i = 0, halfDist = 0; i < len - 1; i++) {
+			halfDist += points[i].distanceTo(points[i + 1]) / 2;
+		}
+
+		// The line is so small in the current view that all points are on the same pixel.
+		if (halfDist === 0) {
+			return this._map.layerPointToLatLng(points[0]);
+		}
+
+		for (i = 0, dist = 0; i < len - 1; i++) {
+			p1 = points[i];
+			p2 = points[i + 1];
+			segDist = p1.distanceTo(p2);
+			dist += segDist;
+
+			if (dist > halfDist) {
+				ratio = (dist - halfDist) / segDist;
+				return this._map.layerPointToLatLng([
+					p2.x - ratio * (p2.x - p1.x),
+					p2.y - ratio * (p2.y - p1.y)
+				]);
+			}
+		}
+	},
+
+	// @method getBounds(): LatLngBounds
+	// Returns the `LatLngBounds` of the path.
+	getBounds: function () {
+		return this._bounds;
+	},
+
+	// @method addLatLng(latlng: LatLng, latlngs? LatLng[]): this
+	// Adds a given point to the polyline. By default, adds to the first ring of
+	// the polyline in case of a multi-polyline, but can be overridden by passing
+	// a specific ring as a LatLng array (that you can earlier access with [`getLatLngs`](#polyline-getlatlngs)).
+	addLatLng: function (latlng, latlngs) {
+		latlngs = latlngs || this._defaultShape();
+		latlng = L.latLng(latlng);
+		latlngs.push(latlng);
+		this._bounds.extend(latlng);
+		return this.redraw();
+	},
+
+	_setLatLngs: function (latlngs) {
+		this._bounds = new L.LatLngBounds();
+		this._latlngs = this._convertLatLngs(latlngs);
+	},
+
+	_defaultShape: function () {
+		return L.Polyline._flat(this._latlngs) ? this._latlngs : this._latlngs[0];
+	},
+
+	// recursively convert latlngs input into actual LatLng instances; calculate bounds along the way
+	_convertLatLngs: function (latlngs) {
+		var result = [],
+		    flat = L.Polyline._flat(latlngs);
+
+		for (var i = 0, len = latlngs.length; i < len; i++) {
+			if (flat) {
+				result[i] = L.latLng(latlngs[i]);
+				this._bounds.extend(result[i]);
+			} else {
+				result[i] = this._convertLatLngs(latlngs[i]);
+			}
+		}
+
+		return result;
+	},
+
+	_project: function () {
+		var pxBounds = new L.Bounds();
+		this._rings = [];
+		this._projectLatlngs(this._latlngs, this._rings, pxBounds);
+
+		var w = this._clickTolerance(),
+		    p = new L.Point(w, w);
+
+		if (this._bounds.isValid() && pxBounds.isValid()) {
+			pxBounds.min._subtract(p);
+			pxBounds.max._add(p);
+			this._pxBounds = pxBounds;
+		}
+	},
+
+	// recursively turns latlngs into a set of rings with projected coordinates
+	_projectLatlngs: function (latlngs, result, projectedBounds) {
+		var flat = latlngs[0] instanceof L.LatLng,
+		    len = latlngs.length,
+		    i, ring;
+
+		if (flat) {
+			ring = [];
+			for (i = 0; i < len; i++) {
+				ring[i] = this._map.latLngToLayerPoint(latlngs[i]);
+				projectedBounds.extend(ring[i]);
+			}
+			result.push(ring);
+		} else {
+			for (i = 0; i < len; i++) {
+				this._projectLatlngs(latlngs[i], result, projectedBounds);
+			}
+		}
+	},
+
+	// clip polyline by renderer bounds so that we have less to render for performance
+	_clipPoints: function () {
+		var bounds = this._renderer._bounds;
+
+		this._parts = [];
+		if (!this._pxBounds || !this._pxBounds.intersects(bounds)) {
+			return;
+		}
+
+		if (this.options.noClip) {
+			this._parts = this._rings;
+			return;
+		}
+
+		var parts = this._parts,
+		    i, j, k, len, len2, segment, points;
+
+		for (i = 0, k = 0, len = this._rings.length; i < len; i++) {
+			points = this._rings[i];
+
+			for (j = 0, len2 = points.length; j < len2 - 1; j++) {
+				segment = L.LineUtil.clipSegment(points[j], points[j + 1], bounds, j, true);
+
+				if (!segment) { continue; }
+
+				parts[k] = parts[k] || [];
+				parts[k].push(segment[0]);
+
+				// if segment goes out of screen, or it's the last one, it's the end of the line part
+				if ((segment[1] !== points[j + 1]) || (j === len2 - 2)) {
+					parts[k].push(segment[1]);
+					k++;
+				}
+			}
+		}
+	},
+
+	// simplify each clipped part of the polyline for performance
+	_simplifyPoints: function () {
+		var parts = this._parts,
+		    tolerance = this.options.smoothFactor;
+
+		for (var i = 0, len = parts.length; i < len; i++) {
+			parts[i] = L.LineUtil.simplify(parts[i], tolerance);
+		}
+	},
+
+	_update: function () {
+		if (!this._map) { return; }
+
+		this._clipPoints();
+		this._simplifyPoints();
+		this._updatePath();
+	},
+
+	_updatePath: function () {
+		this._renderer._updatePoly(this);
+	}
+});
+
+// @factory L.polyline(latlngs: LatLng[], options?: Polyline options)
+// Instantiates a polyline object given an array of geographical points and
+// optionally an options object. You can create a `Polyline` object with
+// multiple separate lines (`MultiPolyline`) by passing an array of arrays
+// of geographic points.
+L.polyline = function (latlngs, options) {
+	return new L.Polyline(latlngs, options);
+};
+
+L.Polyline._flat = function (latlngs) {
+	// true if it's a flat array of latlngs; false if nested
+	return !L.Util.isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined');
+};
+
+
+
+/*
+ * @namespace PolyUtil
+ * Various utility functions for polygon geometries.
+ */
+
+L.PolyUtil = {};
+
+/* @function clipPolygon(points: Point[], bounds: Bounds, round?: Boolean): Point[]
+ * Clips the polygon geometry defined by the given `points` by the given bounds (using the [Sutherland-Hodgeman algorithm](https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm)).
+ * Used by Leaflet to only show polygon points that are on the screen or near, increasing
+ * performance. Note that polygon points needs different algorithm for clipping
+ * than polyline, so there's a seperate method for it.
+ */
+L.PolyUtil.clipPolygon = function (points, bounds, round) {
+	var clippedPoints,
+	    edges = [1, 4, 2, 8],
+	    i, j, k,
+	    a, b,
+	    len, edge, p,
+	    lu = L.LineUtil;
+
+	for (i = 0, len = points.length; i < len; i++) {
+		points[i]._code = lu._getBitCode(points[i], bounds);
+	}
+
+	// for each edge (left, bottom, right, top)
+	for (k = 0; k < 4; k++) {
+		edge = edges[k];
+		clippedPoints = [];
+
+		for (i = 0, len = points.length, j = len - 1; i < len; j = i++) {
+			a = points[i];
+			b = points[j];
+
+			// if a is inside the clip window
+			if (!(a._code & edge)) {
+				// if b is outside the clip window (a->b goes out of screen)
+				if (b._code & edge) {
+					p = lu._getEdgeIntersection(b, a, edge, bounds, round);
+					p._code = lu._getBitCode(p, bounds);
+					clippedPoints.push(p);
+				}
+				clippedPoints.push(a);
+
+			// else if b is inside the clip window (a->b enters the screen)
+			} else if (!(b._code & edge)) {
+				p = lu._getEdgeIntersection(b, a, edge, bounds, round);
+				p._code = lu._getBitCode(p, bounds);
+				clippedPoints.push(p);
+			}
+		}
+		points = clippedPoints;
+	}
+
+	return points;
+};
+
+
+
+/*
+ * @class Polygon
+ * @aka L.Polygon
+ * @inherits Polyline
+ *
+ * A class for drawing polygon overlays on a map. Extends `Polyline`.
+ *
+ * Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.
+ *
+ *
+ * @example
+ *
+ * ```js
+ * // create a red polygon from an array of LatLng points
+ * var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];
+ *
+ * var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
+ *
+ * // zoom the map to the polygon
+ * map.fitBounds(polygon.getBounds());
+ * ```
+ *
+ * You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:
+ *
+ * ```js
+ * var latlngs = [
+ *   [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
+ *   [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
+ * ];
+ * ```
+ *
+ * Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.
+ *
+ * ```js
+ * var latlngs = [
+ *   [ // first polygon
+ *     [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
+ *     [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
+ *   ],
+ *   [ // second polygon
+ *     [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]
+ *   ]
+ * ];
+ * ```
+ */
+
+L.Polygon = L.Polyline.extend({
+
+	options: {
+		fill: true
+	},
+
+	isEmpty: function () {
+		return !this._latlngs.length || !this._latlngs[0].length;
+	},
+
+	getCenter: function () {
+		// throws error when not yet added to map as this center calculation requires projected coordinates
+		if (!this._map) {
+			throw new Error('Must add layer to map before using getCenter()');
+		}
+
+		var i, j, p1, p2, f, area, x, y, center,
+		    points = this._rings[0],
+		    len = points.length;
+
+		if (!len) { return null; }
+
+		// polygon centroid algorithm; only uses the first ring if there are multiple
+
+		area = x = y = 0;
+
+		for (i = 0, j = len - 1; i < len; j = i++) {
+			p1 = points[i];
+			p2 = points[j];
+
+			f = p1.y * p2.x - p2.y * p1.x;
+			x += (p1.x + p2.x) * f;
+			y += (p1.y + p2.y) * f;
+			area += f * 3;
+		}
+
+		if (area === 0) {
+			// Polygon is so small that all points are on same pixel.
+			center = points[0];
+		} else {
+			center = [x / area, y / area];
+		}
+		return this._map.layerPointToLatLng(center);
+	},
+
+	_convertLatLngs: function (latlngs) {
+		var result = L.Polyline.prototype._convertLatLngs.call(this, latlngs),
+		    len = result.length;
+
+		// remove last point if it equals first one
+		if (len >= 2 && result[0] instanceof L.LatLng && result[0].equals(result[len - 1])) {
+			result.pop();
+		}
+		return result;
+	},
+
+	_setLatLngs: function (latlngs) {
+		L.Polyline.prototype._setLatLngs.call(this, latlngs);
+		if (L.Polyline._flat(this._latlngs)) {
+			this._latlngs = [this._latlngs];
+		}
+	},
+
+	_defaultShape: function () {
+		return L.Polyline._flat(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0];
+	},
+
+	_clipPoints: function () {
+		// polygons need a different clipping algorithm so we redefine that
+
+		var bounds = this._renderer._bounds,
+		    w = this.options.weight,
+		    p = new L.Point(w, w);
+
+		// increase clip padding by stroke width to avoid stroke on clip edges
+		bounds = new L.Bounds(bounds.min.subtract(p), bounds.max.add(p));
+
+		this._parts = [];
+		if (!this._pxBounds || !this._pxBounds.intersects(bounds)) {
+			return;
+		}
+
+		if (this.options.noClip) {
+			this._parts = this._rings;
+			return;
+		}
+
+		for (var i = 0, len = this._rings.length, clipped; i < len; i++) {
+			clipped = L.PolyUtil.clipPolygon(this._rings[i], bounds, true);
+			if (clipped.length) {
+				this._parts.push(clipped);
+			}
+		}
+	},
+
+	_updatePath: function () {
+		this._renderer._updatePoly(this, true);
+	}
+});
+
+
+// @factory L.polygon(latlngs: LatLng[], options?: Polyline options)
+L.polygon = function (latlngs, options) {
+	return new L.Polygon(latlngs, options);
+};
+
+
+
+/*
+ * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.
+ */
+
+/*
+ * @class Rectangle
+ * @aka L.Retangle
+ * @inherits Polygon
+ *
+ * A class for drawing rectangle overlays on a map. Extends `Polygon`.
+ *
+ * @example
+ *
+ * ```js
+ * // define rectangle geographical bounds
+ * var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
+ *
+ * // create an orange rectangle
+ * L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);
+ *
+ * // zoom the map to the rectangle bounds
+ * map.fitBounds(bounds);
+ * ```
+ *
+ */
+
+
+L.Rectangle = L.Polygon.extend({
+	initialize: function (latLngBounds, options) {
+		L.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);
+	},
+
+	// @method setBounds(latLngBounds: LatLngBounds): this
+	// Redraws the rectangle with the passed bounds.
+	setBounds: function (latLngBounds) {
+		return this.setLatLngs(this._boundsToLatLngs(latLngBounds));
+	},
+
+	_boundsToLatLngs: function (latLngBounds) {
+		latLngBounds = L.latLngBounds(latLngBounds);
+		return [
+			latLngBounds.getSouthWest(),
+			latLngBounds.getNorthWest(),
+			latLngBounds.getNorthEast(),
+			latLngBounds.getSouthEast()
+		];
+	}
+});
+
+
+// @factory L.rectangle(latLngBounds: LatLngBounds, options?: Polyline options)
+L.rectangle = function (latLngBounds, options) {
+	return new L.Rectangle(latLngBounds, options);
+};
+
+
+
+/*
+ * @class CircleMarker
+ * @aka L.CircleMarker
+ * @inherits Path
+ *
+ * A circle of a fixed size with radius specified in pixels. Extends `Path`.
+ */
+
+L.CircleMarker = L.Path.extend({
+
+	// @section
+	// @aka CircleMarker options
+	options: {
+		fill: true,
+
+		// @option radius: Number = 10
+		// Radius of the circle marker, in pixels
+		radius: 10
+	},
+
+	initialize: function (latlng, options) {
+		L.setOptions(this, options);
+		this._latlng = L.latLng(latlng);
+		this._radius = this.options.radius;
+	},
+
+	// @method setLatLng(latLng: LatLng): this
+	// Sets the position of a circle marker to a new location.
+	setLatLng: function (latlng) {
+		this._latlng = L.latLng(latlng);
+		this.redraw();
+		return this.fire('move', {latlng: this._latlng});
+	},
+
+	// @method getLatLng(): LatLng
+	// Returns the current geographical position of the circle marker
+	getLatLng: function () {
+		return this._latlng;
+	},
+
+	// @method setRadius(radius: Number): this
+	// Sets the radius of a circle marker. Units are in pixels.
+	setRadius: function (radius) {
+		this.options.radius = this._radius = radius;
+		return this.redraw();
+	},
+
+	// @method getRadius(): Number
+	// Returns the current radius of the circle
+	getRadius: function () {
+		return this._radius;
+	},
+
+	setStyle : function (options) {
+		var radius = options && options.radius || this._radius;
+		L.Path.prototype.setStyle.call(this, options);
+		this.setRadius(radius);
+		return this;
+	},
+
+	_project: function () {
+		this._point = this._map.latLngToLayerPoint(this._latlng);
+		this._updateBounds();
+	},
+
+	_updateBounds: function () {
+		var r = this._radius,
+		    r2 = this._radiusY || r,
+		    w = this._clickTolerance(),
+		    p = [r + w, r2 + w];
+		this._pxBounds = new L.Bounds(this._point.subtract(p), this._point.add(p));
+	},
+
+	_update: function () {
+		if (this._map) {
+			this._updatePath();
+		}
+	},
+
+	_updatePath: function () {
+		this._renderer._updateCircle(this);
+	},
+
+	_empty: function () {
+		return this._radius && !this._renderer._bounds.intersects(this._pxBounds);
+	}
+});
+
+
+// @factory L.circleMarker(latlng: LatLng, options?: CircleMarker options)
+// Instantiates a circle marker object given a geographical point, and an optional options object.
+L.circleMarker = function (latlng, options) {
+	return new L.CircleMarker(latlng, options);
+};
+
+
+
+/*
+ * @class Circle
+ * @aka L.Circle
+ * @inherits CircleMarker
+ *
+ * A class for drawing circle overlays on a map. Extends `CircleMarker`.
+ *
+ * It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).
+ *
+ * @example
+ *
+ * ```js
+ * L.circle([50.5, 30.5], {radius: 200}).addTo(map);
+ * ```
+ */
+
+L.Circle = L.CircleMarker.extend({
+
+	initialize: function (latlng, options, legacyOptions) {
+		if (typeof options === 'number') {
+			// Backwards compatibility with 0.7.x factory (latlng, radius, options?)
+			options = L.extend({}, legacyOptions, {radius: options});
+		}
+		L.setOptions(this, options);
+		this._latlng = L.latLng(latlng);
+
+		if (isNaN(this.options.radius)) { throw new Error('Circle radius cannot be NaN'); }
+
+		// @section
+		// @aka Circle options
+		// @option radius: Number; Radius of the circle, in meters.
+		this._mRadius = this.options.radius;
+	},
+
+	// @method setRadius(radius: Number): this
+	// Sets the radius of a circle. Units are in meters.
+	setRadius: function (radius) {
+		this._mRadius = radius;
+		return this.redraw();
+	},
+
+	// @method getRadius(): Number
+	// Returns the current radius of a circle. Units are in meters.
+	getRadius: function () {
+		return this._mRadius;
+	},
+
+	// @method getBounds(): LatLngBounds
+	// Returns the `LatLngBounds` of the path.
+	getBounds: function () {
+		var half = [this._radius, this._radiusY || this._radius];
+
+		return new L.LatLngBounds(
+			this._map.layerPointToLatLng(this._point.subtract(half)),
+			this._map.layerPointToLatLng(this._point.add(half)));
+	},
+
+	setStyle: L.Path.prototype.setStyle,
+
+	_project: function () {
+
+		var lng = this._latlng.lng,
+		    lat = this._latlng.lat,
+		    map = this._map,
+		    crs = map.options.crs;
+
+		if (crs.distance === L.CRS.Earth.distance) {
+			var d = Math.PI / 180,
+			    latR = (this._mRadius / L.CRS.Earth.R) / d,
+			    top = map.project([lat + latR, lng]),
+			    bottom = map.project([lat - latR, lng]),
+			    p = top.add(bottom).divideBy(2),
+			    lat2 = map.unproject(p).lat,
+			    lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) /
+			            (Math.cos(lat * d) * Math.cos(lat2 * d))) / d;
+
+			if (isNaN(lngR) || lngR === 0) {
+				lngR = latR / Math.cos(Math.PI / 180 * lat); // Fallback for edge case, #2425
+			}
+
+			this._point = p.subtract(map.getPixelOrigin());
+			this._radius = isNaN(lngR) ? 0 : Math.max(Math.round(p.x - map.project([lat2, lng - lngR]).x), 1);
+			this._radiusY = Math.max(Math.round(p.y - top.y), 1);
+
+		} else {
+			var latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0]));
+
+			this._point = map.latLngToLayerPoint(this._latlng);
+			this._radius = this._point.x - map.latLngToLayerPoint(latlng2).x;
+		}
+
+		this._updateBounds();
+	}
+});
+
+// @factory L.circle(latlng: LatLng, options?: Circle options)
+// Instantiates a circle object given a geographical point, and an options object
+// which contains the circle radius.
+// @alternative
+// @factory L.circle(latlng: LatLng, radius: Number, options?: Circle options)
+// Obsolete way of instantiating a circle, for compatibility with 0.7.x code.
+// Do not use in new applications or plugins.
+L.circle = function (latlng, options, legacyOptions) {
+	return new L.Circle(latlng, options, legacyOptions);
+};
+
+
+
+/*
+ * @class SVG
+ * @inherits Renderer
+ * @aka L.SVG
+ *
+ * Allows vector layers to be displayed with [SVG](https://developer.mozilla.org/docs/Web/SVG).
+ * Inherits `Renderer`.
+ *
+ * Due to [technical limitations](http://caniuse.com/#search=svg), SVG is not
+ * available in all web browsers, notably Android 2.x and 3.x.
+ *
+ * Although SVG is not available on IE7 and IE8, these browsers support
+ * [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language)
+ * (a now deprecated technology), and the SVG renderer will fall back to VML in
+ * this case.
+ *
+ * @example
+ *
+ * Use SVG by default for all paths in the map:
+ *
+ * ```js
+ * var map = L.map('map', {
+ * 	renderer: L.svg()
+ * });
+ * ```
+ *
+ * Use a SVG renderer with extra padding for specific vector geometries:
+ *
+ * ```js
+ * var map = L.map('map');
+ * var myRenderer = L.svg({ padding: 0.5 });
+ * var line = L.polyline( coordinates, { renderer: myRenderer } );
+ * var circle = L.circle( center, { renderer: myRenderer } );
+ * ```
+ */
+
+L.SVG = L.Renderer.extend({
+
+	getEvents: function () {
+		var events = L.Renderer.prototype.getEvents.call(this);
+		events.zoomstart = this._onZoomStart;
+		return events;
+	},
+
+	_initContainer: function () {
+		this._container = L.SVG.create('svg');
+
+		// makes it possible to click through svg root; we'll reset it back in individual paths
+		this._container.setAttribute('pointer-events', 'none');
+
+		this._rootGroup = L.SVG.create('g');
+		this._container.appendChild(this._rootGroup);
+	},
+
+	_onZoomStart: function () {
+		// Drag-then-pinch interactions might mess up the center and zoom.
+		// In this case, the easiest way to prevent this is re-do the renderer
+		//   bounds and padding when the zooming starts.
+		this._update();
+	},
+
+	_update: function () {
+		if (this._map._animatingZoom && this._bounds) { return; }
+
+		L.Renderer.prototype._update.call(this);
+
+		var b = this._bounds,
+		    size = b.getSize(),
+		    container = this._container;
+
+		// set size of svg-container if changed
+		if (!this._svgSize || !this._svgSize.equals(size)) {
+			this._svgSize = size;
+			container.setAttribute('width', size.x);
+			container.setAttribute('height', size.y);
+		}
+
+		// movement: update container viewBox so that we don't have to change coordinates of individual layers
+		L.DomUtil.setPosition(container, b.min);
+		container.setAttribute('viewBox', [b.min.x, b.min.y, size.x, size.y].join(' '));
+
+		this.fire('update');
+	},
+
+	// methods below are called by vector layers implementations
+
+	_initPath: function (layer) {
+		var path = layer._path = L.SVG.create('path');
+
+		// @namespace Path
+		// @option className: String = null
+		// Custom class name set on an element. Only for SVG renderer.
+		if (layer.options.className) {
+			L.DomUtil.addClass(path, layer.options.className);
+		}
+
+		if (layer.options.interactive) {
+			L.DomUtil.addClass(path, 'leaflet-interactive');
+		}
+
+		this._updateStyle(layer);
+		this._layers[L.stamp(layer)] = layer;
+	},
+
+	_addPath: function (layer) {
+		this._rootGroup.appendChild(layer._path);
+		layer.addInteractiveTarget(layer._path);
+	},
+
+	_removePath: function (layer) {
+		L.DomUtil.remove(layer._path);
+		layer.removeInteractiveTarget(layer._path);
+		delete this._layers[L.stamp(layer)];
+	},
+
+	_updatePath: function (layer) {
+		layer._project();
+		layer._update();
+	},
+
+	_updateStyle: function (layer) {
+		var path = layer._path,
+		    options = layer.options;
+
+		if (!path) { return; }
+
+		if (options.stroke) {
+			path.setAttribute('stroke', options.color);
+			path.setAttribute('stroke-opacity', options.opacity);
+			path.setAttribute('stroke-width', options.weight);
+			path.setAttribute('stroke-linecap', options.lineCap);
+			path.setAttribute('stroke-linejoin', options.lineJoin);
+
+			if (options.dashArray) {
+				path.setAttribute('stroke-dasharray', options.dashArray);
+			} else {
+				path.removeAttribute('stroke-dasharray');
+			}
+
+			if (options.dashOffset) {
+				path.setAttribute('stroke-dashoffset', options.dashOffset);
+			} else {
+				path.removeAttribute('stroke-dashoffset');
+			}
+		} else {
+			path.setAttribute('stroke', 'none');
+		}
+
+		if (options.fill) {
+			path.setAttribute('fill', options.fillColor || options.color);
+			path.setAttribute('fill-opacity', options.fillOpacity);
+			path.setAttribute('fill-rule', options.fillRule || 'evenodd');
+		} else {
+			path.setAttribute('fill', 'none');
+		}
+	},
+
+	_updatePoly: function (layer, closed) {
+		this._setPath(layer, L.SVG.pointsToPath(layer._parts, closed));
+	},
+
+	_updateCircle: function (layer) {
+		var p = layer._point,
+		    r = layer._radius,
+		    r2 = layer._radiusY || r,
+		    arc = 'a' + r + ',' + r2 + ' 0 1,0 ';
+
+		// drawing a circle with two half-arcs
+		var d = layer._empty() ? 'M0 0' :
+				'M' + (p.x - r) + ',' + p.y +
+				arc + (r * 2) + ',0 ' +
+				arc + (-r * 2) + ',0 ';
+
+		this._setPath(layer, d);
+	},
+
+	_setPath: function (layer, path) {
+		layer._path.setAttribute('d', path);
+	},
+
+	// SVG does not have the concept of zIndex so we resort to changing the DOM order of elements
+	_bringToFront: function (layer) {
+		L.DomUtil.toFront(layer._path);
+	},
+
+	_bringToBack: function (layer) {
+		L.DomUtil.toBack(layer._path);
+	}
+});
+
+
+// @namespace SVG; @section
+// There are several static functions which can be called without instantiating L.SVG:
+L.extend(L.SVG, {
+	// @function create(name: String): SVGElement
+	// Returns a instance of [SVGElement](https://developer.mozilla.org/docs/Web/API/SVGElement),
+	// corresponding to the class name passed. For example, using 'line' will return
+	// an instance of [SVGLineElement](https://developer.mozilla.org/docs/Web/API/SVGLineElement).
+	create: function (name) {
+		return document.createElementNS('http://www.w3.org/2000/svg', name);
+	},
+
+	// @function pointsToPath(rings: Point[], closed: Boolean): String
+	// Generates a SVG path string for multiple rings, with each ring turning
+	// into "M..L..L.." instructions
+	pointsToPath: function (rings, closed) {
+		var str = '',
+		    i, j, len, len2, points, p;
+
+		for (i = 0, len = rings.length; i < len; i++) {
+			points = rings[i];
+
+			for (j = 0, len2 = points.length; j < len2; j++) {
+				p = points[j];
+				str += (j ? 'L' : 'M') + p.x + ' ' + p.y;
+			}
+
+			// closes the ring for polygons; "x" is VML syntax
+			str += closed ? (L.Browser.svg ? 'z' : 'x') : '';
+		}
+
+		// SVG complains about empty path strings
+		return str || 'M0 0';
+	}
+});
+
+// @namespace Browser; @property svg: Boolean
+// `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG).
+L.Browser.svg = !!(document.createElementNS && L.SVG.create('svg').createSVGRect);
+
+
+// @namespace SVG
+// @factory L.svg(options?: Renderer options)
+// Creates a SVG renderer with the given options.
+L.svg = function (options) {
+	return L.Browser.svg || L.Browser.vml ? new L.SVG(options) : null;
+};
+
+
+
+/*
+ * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!
+ */
+
+/*
+ * @class SVG
+ *
+ * Although SVG is not available on IE7 and IE8, these browsers support [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language), and the SVG renderer will fall back to VML in this case.
+ *
+ * VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility
+ * with old versions of Internet Explorer.
+ */
+
+// @namespace Browser; @property vml: Boolean
+// `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language).
+L.Browser.vml = !L.Browser.svg && (function () {
+	try {
+		var div = document.createElement('div');
+		div.innerHTML = '<v:shape adj="1"/>';
+
+		var shape = div.firstChild;
+		shape.style.behavior = 'url(#default#VML)';
+
+		return shape && (typeof shape.adj === 'object');
+
+	} catch (e) {
+		return false;
+	}
+}());
+
+// redefine some SVG methods to handle VML syntax which is similar but with some differences
+L.SVG.include(!L.Browser.vml ? {} : {
+
+	_initContainer: function () {
+		this._container = L.DomUtil.create('div', 'leaflet-vml-container');
+	},
+
+	_update: function () {
+		if (this._map._animatingZoom) { return; }
+		L.Renderer.prototype._update.call(this);
+		this.fire('update');
+	},
+
+	_initPath: function (layer) {
+		var container = layer._container = L.SVG.create('shape');
+
+		L.DomUtil.addClass(container, 'leaflet-vml-shape ' + (this.options.className || ''));
+
+		container.coordsize = '1 1';
+
+		layer._path = L.SVG.create('path');
+		container.appendChild(layer._path);
+
+		this._updateStyle(layer);
+		this._layers[L.stamp(layer)] = layer;
+	},
+
+	_addPath: function (layer) {
+		var container = layer._container;
+		this._container.appendChild(container);
+
+		if (layer.options.interactive) {
+			layer.addInteractiveTarget(container);
+		}
+	},
+
+	_removePath: function (layer) {
+		var container = layer._container;
+		L.DomUtil.remove(container);
+		layer.removeInteractiveTarget(container);
+		delete this._layers[L.stamp(layer)];
+	},
+
+	_updateStyle: function (layer) {
+		var stroke = layer._stroke,
+		    fill = layer._fill,
+		    options = layer.options,
+		    container = layer._container;
+
+		container.stroked = !!options.stroke;
+		container.filled = !!options.fill;
+
+		if (options.stroke) {
+			if (!stroke) {
+				stroke = layer._stroke = L.SVG.create('stroke');
+			}
+			container.appendChild(stroke);
+			stroke.weight = options.weight + 'px';
+			stroke.color = options.color;
+			stroke.opacity = options.opacity;
+
+			if (options.dashArray) {
+				stroke.dashStyle = L.Util.isArray(options.dashArray) ?
+				    options.dashArray.join(' ') :
+				    options.dashArray.replace(/( *, *)/g, ' ');
+			} else {
+				stroke.dashStyle = '';
+			}
+			stroke.endcap = options.lineCap.replace('butt', 'flat');
+			stroke.joinstyle = options.lineJoin;
+
+		} else if (stroke) {
+			container.removeChild(stroke);
+			layer._stroke = null;
+		}
+
+		if (options.fill) {
+			if (!fill) {
+				fill = layer._fill = L.SVG.create('fill');
+			}
+			container.appendChild(fill);
+			fill.color = options.fillColor || options.color;
+			fill.opacity = options.fillOpacity;
+
+		} else if (fill) {
+			container.removeChild(fill);
+			layer._fill = null;
+		}
+	},
+
+	_updateCircle: function (layer) {
+		var p = layer._point.round(),
+		    r = Math.round(layer._radius),
+		    r2 = Math.round(layer._radiusY || r);
+
+		this._setPath(layer, layer._empty() ? 'M0 0' :
+				'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r2 + ' 0,' + (65535 * 360));
+	},
+
+	_setPath: function (layer, path) {
+		layer._path.v = path;
+	},
+
+	_bringToFront: function (layer) {
+		L.DomUtil.toFront(layer._container);
+	},
+
+	_bringToBack: function (layer) {
+		L.DomUtil.toBack(layer._container);
+	}
+});
+
+if (L.Browser.vml) {
+	L.SVG.create = (function () {
+		try {
+			document.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');
+			return function (name) {
+				return document.createElement('<lvml:' + name + ' class="lvml">');
+			};
+		} catch (e) {
+			return function (name) {
+				return document.createElement('<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">');
+			};
+		}
+	})();
+}
+
+
+
+/*
+ * @class Canvas
+ * @inherits Renderer
+ * @aka L.Canvas
+ *
+ * Allows vector layers to be displayed with [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).
+ * Inherits `Renderer`.
+ *
+ * Due to [technical limitations](http://caniuse.com/#search=canvas), Canvas is not
+ * available in all web browsers, notably IE8, and overlapping geometries might
+ * not display properly in some edge cases.
+ *
+ * @example
+ *
+ * Use Canvas by default for all paths in the map:
+ *
+ * ```js
+ * var map = L.map('map', {
+ * 	renderer: L.canvas()
+ * });
+ * ```
+ *
+ * Use a Canvas renderer with extra padding for specific vector geometries:
+ *
+ * ```js
+ * var map = L.map('map');
+ * var myRenderer = L.canvas({ padding: 0.5 });
+ * var line = L.polyline( coordinates, { renderer: myRenderer } );
+ * var circle = L.circle( center, { renderer: myRenderer } );
+ * ```
+ */
+
+L.Canvas = L.Renderer.extend({
+	getEvents: function () {
+		var events = L.Renderer.prototype.getEvents.call(this);
+		events.viewprereset = this._onViewPreReset;
+		return events;
+	},
+
+	_onViewPreReset: function () {
+		// Set a flag so that a viewprereset+moveend+viewreset only updates&redraws once
+		this._postponeUpdatePaths = true;
+	},
+
+	onAdd: function () {
+		L.Renderer.prototype.onAdd.call(this);
+
+		// Redraw vectors since canvas is cleared upon removal,
+		// in case of removing the renderer itself from the map.
+		this._draw();
+	},
+
+	_initContainer: function () {
+		var container = this._container = document.createElement('canvas');
+
+		L.DomEvent
+			.on(container, 'mousemove', L.Util.throttle(this._onMouseMove, 32, this), this)
+			.on(container, 'click dblclick mousedown mouseup contextmenu', this._onClick, this)
+			.on(container, 'mouseout', this._handleMouseOut, this);
+
+		this._ctx = container.getContext('2d');
+	},
+
+	_updatePaths: function () {
+		if (this._postponeUpdatePaths) { return; }
+
+		var layer;
+		this._redrawBounds = null;
+		for (var id in this._layers) {
+			layer = this._layers[id];
+			layer._update();
+		}
+		this._redraw();
+	},
+
+	_update: function () {
+		if (this._map._animatingZoom && this._bounds) { return; }
+
+		this._drawnLayers = {};
+
+		L.Renderer.prototype._update.call(this);
+
+		var b = this._bounds,
+		    container = this._container,
+		    size = b.getSize(),
+		    m = L.Browser.retina ? 2 : 1;
+
+		L.DomUtil.setPosition(container, b.min);
+
+		// set canvas size (also clearing it); use double size on retina
+		container.width = m * size.x;
+		container.height = m * size.y;
+		container.style.width = size.x + 'px';
+		container.style.height = size.y + 'px';
+
+		if (L.Browser.retina) {
+			this._ctx.scale(2, 2);
+		}
+
+		// translate so we use the same path coordinates after canvas element moves
+		this._ctx.translate(-b.min.x, -b.min.y);
+
+		// Tell paths to redraw themselves
+		this.fire('update');
+	},
+
+	_reset: function () {
+		L.Renderer.prototype._reset.call(this);
+
+		if (this._postponeUpdatePaths) {
+			this._postponeUpdatePaths = false;
+			this._updatePaths();
+		}
+	},
+
+	_initPath: function (layer) {
+		this._updateDashArray(layer);
+		this._layers[L.stamp(layer)] = layer;
+
+		var order = layer._order = {
+			layer: layer,
+			prev: this._drawLast,
+			next: null
+		};
+		if (this._drawLast) { this._drawLast.next = order; }
+		this._drawLast = order;
+		this._drawFirst = this._drawFirst || this._drawLast;
+	},
+
+	_addPath: function (layer) {
+		this._requestRedraw(layer);
+	},
+
+	_removePath: function (layer) {
+		var order = layer._order;
+		var next = order.next;
+		var prev = order.prev;
+
+		if (next) {
+			next.prev = prev;
+		} else {
+			this._drawLast = prev;
+		}
+		if (prev) {
+			prev.next = next;
+		} else {
+			this._drawFirst = next;
+		}
+
+		delete layer._order;
+
+		delete this._layers[L.stamp(layer)];
+
+		this._requestRedraw(layer);
+	},
+
+	_updatePath: function (layer) {
+		// Redraw the union of the layer's old pixel
+		// bounds and the new pixel bounds.
+		this._extendRedrawBounds(layer);
+		layer._project();
+		layer._update();
+		// The redraw will extend the redraw bounds
+		// with the new pixel bounds.
+		this._requestRedraw(layer);
+	},
+
+	_updateStyle: function (layer) {
+		this._updateDashArray(layer);
+		this._requestRedraw(layer);
+	},
+
+	_updateDashArray: function (layer) {
+		if (layer.options.dashArray) {
+			var parts = layer.options.dashArray.split(','),
+			    dashArray = [],
+			    i;
+			for (i = 0; i < parts.length; i++) {
+				dashArray.push(Number(parts[i]));
+			}
+			layer.options._dashArray = dashArray;
+		}
+	},
+
+	_requestRedraw: function (layer) {
+		if (!this._map) { return; }
+
+		this._extendRedrawBounds(layer);
+		this._redrawRequest = this._redrawRequest || L.Util.requestAnimFrame(this._redraw, this);
+	},
+
+	_extendRedrawBounds: function (layer) {
+		var padding = (layer.options.weight || 0) + 1;
+		this._redrawBounds = this._redrawBounds || new L.Bounds();
+		this._redrawBounds.extend(layer._pxBounds.min.subtract([padding, padding]));
+		this._redrawBounds.extend(layer._pxBounds.max.add([padding, padding]));
+	},
+
+	_redraw: function () {
+		this._redrawRequest = null;
+
+		if (this._redrawBounds) {
+			this._redrawBounds.min._floor();
+			this._redrawBounds.max._ceil();
+		}
+
+		this._clear(); // clear layers in redraw bounds
+		this._draw(); // draw layers
+
+		this._redrawBounds = null;
+	},
+
+	_clear: function () {
+		var bounds = this._redrawBounds;
+		if (bounds) {
+			var size = bounds.getSize();
+			this._ctx.clearRect(bounds.min.x, bounds.min.y, size.x, size.y);
+		} else {
+			this._ctx.clearRect(0, 0, this._container.width, this._container.height);
+		}
+	},
+
+	_draw: function () {
+		var layer, bounds = this._redrawBounds;
+		this._ctx.save();
+		if (bounds) {
+			var size = bounds.getSize();
+			this._ctx.beginPath();
+			this._ctx.rect(bounds.min.x, bounds.min.y, size.x, size.y);
+			this._ctx.clip();
+		}
+
+		this._drawing = true;
+
+		for (var order = this._drawFirst; order; order = order.next) {
+			layer = order.layer;
+			if (!bounds || (layer._pxBounds && layer._pxBounds.intersects(bounds))) {
+				layer._updatePath();
+			}
+		}
+
+		this._drawing = false;
+
+		this._ctx.restore();  // Restore state before clipping.
+	},
+
+	_updatePoly: function (layer, closed) {
+		if (!this._drawing) { return; }
+
+		var i, j, len2, p,
+		    parts = layer._parts,
+		    len = parts.length,
+		    ctx = this._ctx;
+
+		if (!len) { return; }
+
+		this._drawnLayers[layer._leaflet_id] = layer;
+
+		ctx.beginPath();
+
+		if (ctx.setLineDash) {
+			ctx.setLineDash(layer.options && layer.options._dashArray || []);
+		}
+
+		for (i = 0; i < len; i++) {
+			for (j = 0, len2 = parts[i].length; j < len2; j++) {
+				p = parts[i][j];
+				ctx[j ? 'lineTo' : 'moveTo'](p.x, p.y);
+			}
+			if (closed) {
+				ctx.closePath();
+			}
+		}
+
+		this._fillStroke(ctx, layer);
+
+		// TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature
+	},
+
+	_updateCircle: function (layer) {
+
+		if (!this._drawing || layer._empty()) { return; }
+
+		var p = layer._point,
+		    ctx = this._ctx,
+		    r = layer._radius,
+		    s = (layer._radiusY || r) / r;
+
+		this._drawnLayers[layer._leaflet_id] = layer;
+
+		if (s !== 1) {
+			ctx.save();
+			ctx.scale(1, s);
+		}
+
+		ctx.beginPath();
+		ctx.arc(p.x, p.y / s, r, 0, Math.PI * 2, false);
+
+		if (s !== 1) {
+			ctx.restore();
+		}
+
+		this._fillStroke(ctx, layer);
+	},
+
+	_fillStroke: function (ctx, layer) {
+		var options = layer.options;
+
+		if (options.fill) {
+			ctx.globalAlpha = options.fillOpacity;
+			ctx.fillStyle = options.fillColor || options.color;
+			ctx.fill(options.fillRule || 'evenodd');
+		}
+
+		if (options.stroke && options.weight !== 0) {
+			ctx.globalAlpha = options.opacity;
+			ctx.lineWidth = options.weight;
+			ctx.strokeStyle = options.color;
+			ctx.lineCap = options.lineCap;
+			ctx.lineJoin = options.lineJoin;
+			ctx.stroke();
+		}
+	},
+
+	// Canvas obviously doesn't have mouse events for individual drawn objects,
+	// so we emulate that by calculating what's under the mouse on mousemove/click manually
+
+	_onClick: function (e) {
+		var point = this._map.mouseEventToLayerPoint(e), layer, clickedLayer;
+
+		for (var order = this._drawFirst; order; order = order.next) {
+			layer = order.layer;
+			if (layer.options.interactive && layer._containsPoint(point) && !this._map._draggableMoved(layer)) {
+				clickedLayer = layer;
+			}
+		}
+		if (clickedLayer)  {
+			L.DomEvent._fakeStop(e);
+			this._fireEvent([clickedLayer], e);
+		}
+	},
+
+	_onMouseMove: function (e) {
+		if (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { return; }
+
+		var point = this._map.mouseEventToLayerPoint(e);
+		this._handleMouseHover(e, point);
+	},
+
+
+	_handleMouseOut: function (e) {
+		var layer = this._hoveredLayer;
+		if (layer) {
+			// if we're leaving the layer, fire mouseout
+			L.DomUtil.removeClass(this._container, 'leaflet-interactive');
+			this._fireEvent([layer], e, 'mouseout');
+			this._hoveredLayer = null;
+		}
+	},
+
+	_handleMouseHover: function (e, point) {
+		var layer, candidateHoveredLayer;
+
+		for (var order = this._drawFirst; order; order = order.next) {
+			layer = order.layer;
+			if (layer.options.interactive && layer._containsPoint(point)) {
+				candidateHoveredLayer = layer;
+			}
+		}
+
+		if (candidateHoveredLayer !== this._hoveredLayer) {
+			this._handleMouseOut(e);
+
+			if (candidateHoveredLayer) {
+				L.DomUtil.addClass(this._container, 'leaflet-interactive'); // change cursor
+				this._fireEvent([candidateHoveredLayer], e, 'mouseover');
+				this._hoveredLayer = candidateHoveredLayer;
+			}
+		}
+
+		if (this._hoveredLayer) {
+			this._fireEvent([this._hoveredLayer], e);
+		}
+	},
+
+	_fireEvent: function (layers, e, type) {
+		this._map._fireDOMEvent(e, type || e.type, layers);
+	},
+
+	_bringToFront: function (layer) {
+		var order = layer._order;
+		var next = order.next;
+		var prev = order.prev;
+
+		if (next) {
+			next.prev = prev;
+		} else {
+			// Already last
+			return;
+		}
+		if (prev) {
+			prev.next = next;
+		} else if (next) {
+			// Update first entry unless this is the
+			// signle entry
+			this._drawFirst = next;
+		}
+
+		order.prev = this._drawLast;
+		this._drawLast.next = order;
+
+		order.next = null;
+		this._drawLast = order;
+
+		this._requestRedraw(layer);
+	},
+
+	_bringToBack: function (layer) {
+		var order = layer._order;
+		var next = order.next;
+		var prev = order.prev;
+
+		if (prev) {
+			prev.next = next;
+		} else {
+			// Already first
+			return;
+		}
+		if (next) {
+			next.prev = prev;
+		} else if (prev) {
+			// Update last entry unless this is the
+			// signle entry
+			this._drawLast = prev;
+		}
+
+		order.prev = null;
+
+		order.next = this._drawFirst;
+		this._drawFirst.prev = order;
+		this._drawFirst = order;
+
+		this._requestRedraw(layer);
+	}
+});
+
+// @namespace Browser; @property canvas: Boolean
+// `true` when the browser supports [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).
+L.Browser.canvas = (function () {
+	return !!document.createElement('canvas').getContext;
+}());
+
+// @namespace Canvas
+// @factory L.canvas(options?: Renderer options)
+// Creates a Canvas renderer with the given options.
+L.canvas = function (options) {
+	return L.Browser.canvas ? new L.Canvas(options) : null;
+};
+
+L.Polyline.prototype._containsPoint = function (p, closed) {
+	var i, j, k, len, len2, part,
+	    w = this._clickTolerance();
+
+	if (!this._pxBounds.contains(p)) { return false; }
+
+	// hit detection for polylines
+	for (i = 0, len = this._parts.length; i < len; i++) {
+		part = this._parts[i];
+
+		for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {
+			if (!closed && (j === 0)) { continue; }
+
+			if (L.LineUtil.pointToSegmentDistance(p, part[k], part[j]) <= w) {
+				return true;
+			}
+		}
+	}
+	return false;
+};
+
+L.Polygon.prototype._containsPoint = function (p) {
+	var inside = false,
+	    part, p1, p2, i, j, k, len, len2;
+
+	if (!this._pxBounds.contains(p)) { return false; }
+
+	// ray casting algorithm for detecting if point is in polygon
+	for (i = 0, len = this._parts.length; i < len; i++) {
+		part = this._parts[i];
+
+		for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {
+			p1 = part[j];
+			p2 = part[k];
+
+			if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {
+				inside = !inside;
+			}
+		}
+	}
+
+	// also check if it's on polygon stroke
+	return inside || L.Polyline.prototype._containsPoint.call(this, p, true);
+};
+
+L.CircleMarker.prototype._containsPoint = function (p) {
+	return p.distanceTo(this._point) <= this._radius + this._clickTolerance();
+};
+
+
+
+/*
+ * @class GeoJSON
+ * @aka L.GeoJSON
+ * @inherits FeatureGroup
+ *
+ * Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse
+ * GeoJSON data and display it on the map. Extends `FeatureGroup`.
+ *
+ * @example
+ *
+ * ```js
+ * L.geoJSON(data, {
+ * 	style: function (feature) {
+ * 		return {color: feature.properties.color};
+ * 	}
+ * }).bindPopup(function (layer) {
+ * 	return layer.feature.properties.description;
+ * }).addTo(map);
+ * ```
+ */
+
+L.GeoJSON = L.FeatureGroup.extend({
+
+	/* @section
+	 * @aka GeoJSON options
+	 *
+	 * @option pointToLayer: Function = *
+	 * A `Function` defining how GeoJSON points spawn Leaflet layers. It is internally
+	 * called when data is added, passing the GeoJSON point feature and its `LatLng`.
+	 * The default is to spawn a default `Marker`:
+	 * ```js
+	 * function(geoJsonPoint, latlng) {
+	 * 	return L.marker(latlng);
+	 * }
+	 * ```
+	 *
+	 * @option style: Function = *
+	 * A `Function` defining the `Path options` for styling GeoJSON lines and polygons,
+	 * called internally when data is added.
+	 * The default value is to not override any defaults:
+	 * ```js
+	 * function (geoJsonFeature) {
+	 * 	return {}
+	 * }
+	 * ```
+	 *
+	 * @option onEachFeature: Function = *
+	 * A `Function` that will be called once for each created `Feature`, after it has
+	 * been created and styled. Useful for attaching events and popups to features.
+	 * The default is to do nothing with the newly created layers:
+	 * ```js
+	 * function (feature, layer) {}
+	 * ```
+	 *
+	 * @option filter: Function = *
+	 * A `Function` that will be used to decide whether to include a feature or not.
+	 * The default is to include all features:
+	 * ```js
+	 * function (geoJsonFeature) {
+	 * 	return true;
+	 * }
+	 * ```
+	 * Note: dynamically changing the `filter` option will have effect only on newly
+	 * added data. It will _not_ re-evaluate already included features.
+	 *
+	 * @option coordsToLatLng: Function = *
+	 * A `Function` that will be used for converting GeoJSON coordinates to `LatLng`s.
+	 * The default is the `coordsToLatLng` static method.
+	 */
+
+	initialize: function (geojson, options) {
+		L.setOptions(this, options);
+
+		this._layers = {};
+
+		if (geojson) {
+			this.addData(geojson);
+		}
+	},
+
+	// @method addData( <GeoJSON> data ): this
+	// Adds a GeoJSON object to the layer.
+	addData: function (geojson) {
+		var features = L.Util.isArray(geojson) ? geojson : geojson.features,
+		    i, len, feature;
+
+		if (features) {
+			for (i = 0, len = features.length; i < len; i++) {
+				// only add this if geometry or geometries are set and not null
+				feature = features[i];
+				if (feature.geometries || feature.geometry || feature.features || feature.coordinates) {
+					this.addData(feature);
+				}
+			}
+			return this;
+		}
+
+		var options = this.options;
+
+		if (options.filter && !options.filter(geojson)) { return this; }
+
+		var layer = L.GeoJSON.geometryToLayer(geojson, options);
+		if (!layer) {
+			return this;
+		}
+		layer.feature = L.GeoJSON.asFeature(geojson);
+
+		layer.defaultOptions = layer.options;
+		this.resetStyle(layer);
+
+		if (options.onEachFeature) {
+			options.onEachFeature(geojson, layer);
+		}
+
+		return this.addLayer(layer);
+	},
+
+	// @method resetStyle( <Path> layer ): this
+	// Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.
+	resetStyle: function (layer) {
+		// reset any custom styles
+		layer.options = L.Util.extend({}, layer.defaultOptions);
+		this._setLayerStyle(layer, this.options.style);
+		return this;
+	},
+
+	// @method setStyle( <Function> style ): this
+	// Changes styles of GeoJSON vector layers with the given style function.
+	setStyle: function (style) {
+		return this.eachLayer(function (layer) {
+			this._setLayerStyle(layer, style);
+		}, this);
+	},
+
+	_setLayerStyle: function (layer, style) {
+		if (typeof style === 'function') {
+			style = style(layer.feature);
+		}
+		if (layer.setStyle) {
+			layer.setStyle(style);
+		}
+	}
+});
+
+// @section
+// There are several static functions which can be called without instantiating L.GeoJSON:
+L.extend(L.GeoJSON, {
+	// @function geometryToLayer(featureData: Object, options?: GeoJSON options): Layer
+	// Creates a `Layer` from a given GeoJSON feature. Can use a custom
+	// [`pointToLayer`](#geojson-pointtolayer) and/or [`coordsToLatLng`](#geojson-coordstolatlng)
+	// functions if provided as options.
+	geometryToLayer: function (geojson, options) {
+
+		var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,
+		    coords = geometry ? geometry.coordinates : null,
+		    layers = [],
+		    pointToLayer = options && options.pointToLayer,
+		    coordsToLatLng = options && options.coordsToLatLng || this.coordsToLatLng,
+		    latlng, latlngs, i, len;
+
+		if (!coords && !geometry) {
+			return null;
+		}
+
+		switch (geometry.type) {
+		case 'Point':
+			latlng = coordsToLatLng(coords);
+			return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);
+
+		case 'MultiPoint':
+			for (i = 0, len = coords.length; i < len; i++) {
+				latlng = coordsToLatLng(coords[i]);
+				layers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng));
+			}
+			return new L.FeatureGroup(layers);
+
+		case 'LineString':
+		case 'MultiLineString':
+			latlngs = this.coordsToLatLngs(coords, geometry.type === 'LineString' ? 0 : 1, coordsToLatLng);
+			return new L.Polyline(latlngs, options);
+
+		case 'Polygon':
+		case 'MultiPolygon':
+			latlngs = this.coordsToLatLngs(coords, geometry.type === 'Polygon' ? 1 : 2, coordsToLatLng);
+			return new L.Polygon(latlngs, options);
+
+		case 'GeometryCollection':
+			for (i = 0, len = geometry.geometries.length; i < len; i++) {
+				var layer = this.geometryToLayer({
+					geometry: geometry.geometries[i],
+					type: 'Feature',
+					properties: geojson.properties
+				}, options);
+
+				if (layer) {
+					layers.push(layer);
+				}
+			}
+			return new L.FeatureGroup(layers);
+
+		default:
+			throw new Error('Invalid GeoJSON object.');
+		}
+	},
+
+	// @function coordsToLatLng(coords: Array): LatLng
+	// Creates a `LatLng` object from an array of 2 numbers (longitude, latitude)
+	// or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.
+	coordsToLatLng: function (coords) {
+		return new L.LatLng(coords[1], coords[0], coords[2]);
+	},
+
+	// @function coordsToLatLngs(coords: Array, levelsDeep?: Number, coordsToLatLng?: Function): Array
+	// Creates a multidimensional array of `LatLng`s from a GeoJSON coordinates array.
+	// `levelsDeep` specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default).
+	// Can use a custom [`coordsToLatLng`](#geojson-coordstolatlng) function.
+	coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) {
+		var latlngs = [];
+
+		for (var i = 0, len = coords.length, latlng; i < len; i++) {
+			latlng = levelsDeep ?
+			        this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) :
+			        (coordsToLatLng || this.coordsToLatLng)(coords[i]);
+
+			latlngs.push(latlng);
+		}
+
+		return latlngs;
+	},
+
+	// @function latLngToCoords(latlng: LatLng): Array
+	// Reverse of [`coordsToLatLng`](#geojson-coordstolatlng)
+	latLngToCoords: function (latlng) {
+		return latlng.alt !== undefined ?
+				[latlng.lng, latlng.lat, latlng.alt] :
+				[latlng.lng, latlng.lat];
+	},
+
+	// @function latLngsToCoords(latlngs: Array, levelsDeep?: Number, closed?: Boolean): Array
+	// Reverse of [`coordsToLatLngs`](#geojson-coordstolatlngs)
+	// `closed` determines whether the first point should be appended to the end of the array to close the feature, only used when `levelsDeep` is 0. False by default.
+	latLngsToCoords: function (latlngs, levelsDeep, closed) {
+		var coords = [];
+
+		for (var i = 0, len = latlngs.length; i < len; i++) {
+			coords.push(levelsDeep ?
+				L.GeoJSON.latLngsToCoords(latlngs[i], levelsDeep - 1, closed) :
+				L.GeoJSON.latLngToCoords(latlngs[i]));
+		}
+
+		if (!levelsDeep && closed) {
+			coords.push(coords[0]);
+		}
+
+		return coords;
+	},
+
+	getFeature: function (layer, newGeometry) {
+		return layer.feature ?
+				L.extend({}, layer.feature, {geometry: newGeometry}) :
+				L.GeoJSON.asFeature(newGeometry);
+	},
+
+	// @function asFeature(geojson: Object): Object
+	// Normalize GeoJSON geometries/features into GeoJSON features.
+	asFeature: function (geojson) {
+		if (geojson.type === 'Feature' || geojson.type === 'FeatureCollection') {
+			return geojson;
+		}
+
+		return {
+			type: 'Feature',
+			properties: {},
+			geometry: geojson
+		};
+	}
+});
+
+var PointToGeoJSON = {
+	toGeoJSON: function () {
+		return L.GeoJSON.getFeature(this, {
+			type: 'Point',
+			coordinates: L.GeoJSON.latLngToCoords(this.getLatLng())
+		});
+	}
+};
+
+// @namespace Marker
+// @method toGeoJSON(): Object
+// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON `Point` Feature).
+L.Marker.include(PointToGeoJSON);
+
+// @namespace CircleMarker
+// @method toGeoJSON(): Object
+// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON `Point` Feature).
+L.Circle.include(PointToGeoJSON);
+L.CircleMarker.include(PointToGeoJSON);
+
+
+// @namespace Polyline
+// @method toGeoJSON(): Object
+// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON `LineString` or `MultiLineString` Feature).
+L.Polyline.prototype.toGeoJSON = function () {
+	var multi = !L.Polyline._flat(this._latlngs);
+
+	var coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 1 : 0);
+
+	return L.GeoJSON.getFeature(this, {
+		type: (multi ? 'Multi' : '') + 'LineString',
+		coordinates: coords
+	});
+};
+
+// @namespace Polygon
+// @method toGeoJSON(): Object
+// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON `Polygon` or `MultiPolygon` Feature).
+L.Polygon.prototype.toGeoJSON = function () {
+	var holes = !L.Polyline._flat(this._latlngs),
+	    multi = holes && !L.Polyline._flat(this._latlngs[0]);
+
+	var coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 2 : holes ? 1 : 0, true);
+
+	if (!holes) {
+		coords = [coords];
+	}
+
+	return L.GeoJSON.getFeature(this, {
+		type: (multi ? 'Multi' : '') + 'Polygon',
+		coordinates: coords
+	});
+};
+
+
+// @namespace LayerGroup
+L.LayerGroup.include({
+	toMultiPoint: function () {
+		var coords = [];
+
+		this.eachLayer(function (layer) {
+			coords.push(layer.toGeoJSON().geometry.coordinates);
+		});
+
+		return L.GeoJSON.getFeature(this, {
+			type: 'MultiPoint',
+			coordinates: coords
+		});
+	},
+
+	// @method toGeoJSON(): Object
+	// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON `GeometryCollection`).
+	toGeoJSON: function () {
+
+		var type = this.feature && this.feature.geometry && this.feature.geometry.type;
+
+		if (type === 'MultiPoint') {
+			return this.toMultiPoint();
+		}
+
+		var isGeometryCollection = type === 'GeometryCollection',
+		    jsons = [];
+
+		this.eachLayer(function (layer) {
+			if (layer.toGeoJSON) {
+				var json = layer.toGeoJSON();
+				jsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json));
+			}
+		});
+
+		if (isGeometryCollection) {
+			return L.GeoJSON.getFeature(this, {
+				geometries: jsons,
+				type: 'GeometryCollection'
+			});
+		}
+
+		return {
+			type: 'FeatureCollection',
+			features: jsons
+		};
+	}
+});
+
+// @namespace GeoJSON
+// @factory L.geoJSON(geojson?: Object, options?: GeoJSON options)
+// Creates a GeoJSON layer. Optionally accepts an object in
+// [GeoJSON format](http://geojson.org/geojson-spec.html) to display on the map
+// (you can alternatively add it later with `addData` method) and an `options` object.
+L.geoJSON = function (geojson, options) {
+	return new L.GeoJSON(geojson, options);
+};
+// Backward compatibility.
+L.geoJson = L.geoJSON;
+
+
+
+/*
+ * @class Draggable
+ * @aka L.Draggable
+ * @inherits Evented
+ *
+ * A class for making DOM elements draggable (including touch support).
+ * Used internally for map and marker dragging. Only works for elements
+ * that were positioned with [`L.DomUtil.setPosition`](#domutil-setposition).
+ *
+ * @example
+ * ```js
+ * var draggable = new L.Draggable(elementToDrag);
+ * draggable.enable();
+ * ```
+ */
+
+L.Draggable = L.Evented.extend({
+
+	options: {
+		// @option clickTolerance: Number = 3
+		// The max number of pixels a user can shift the mouse pointer during a click
+		// for it to be considered a valid click (as opposed to a mouse drag).
+		clickTolerance: 3
+	},
+
+	statics: {
+		START: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'],
+		END: {
+			mousedown: 'mouseup',
+			touchstart: 'touchend',
+			pointerdown: 'touchend',
+			MSPointerDown: 'touchend'
+		},
+		MOVE: {
+			mousedown: 'mousemove',
+			touchstart: 'touchmove',
+			pointerdown: 'touchmove',
+			MSPointerDown: 'touchmove'
+		}
+	},
+
+	// @constructor L.Draggable(el: HTMLElement, dragHandle?: HTMLElement, preventOutline: Boolean)
+	// Creates a `Draggable` object for moving `el` when you start dragging the `dragHandle` element (equals `el` itself by default).
+	initialize: function (element, dragStartTarget, preventOutline) {
+		this._element = element;
+		this._dragStartTarget = dragStartTarget || element;
+		this._preventOutline = preventOutline;
+	},
+
+	// @method enable()
+	// Enables the dragging ability
+	enable: function () {
+		if (this._enabled) { return; }
+
+		L.DomEvent.on(this._dragStartTarget, L.Draggable.START.join(' '), this._onDown, this);
+
+		this._enabled = true;
+	},
+
+	// @method disable()
+	// Disables the dragging ability
+	disable: function () {
+		if (!this._enabled) { return; }
+
+		// If we're currently dragging this draggable,
+		// disabling it counts as first ending the drag.
+		if (L.Draggable._dragging === this) {
+			this.finishDrag();
+		}
+
+		L.DomEvent.off(this._dragStartTarget, L.Draggable.START.join(' '), this._onDown, this);
+
+		this._enabled = false;
+		this._moved = false;
+	},
+
+	_onDown: function (e) {
+		// Ignore simulated events, since we handle both touch and
+		// mouse explicitly; otherwise we risk getting duplicates of
+		// touch events, see #4315.
+		// Also ignore the event if disabled; this happens in IE11
+		// under some circumstances, see #3666.
+		if (e._simulated || !this._enabled) { return; }
+
+		this._moved = false;
+
+		if (L.DomUtil.hasClass(this._element, 'leaflet-zoom-anim')) { return; }
+
+		if (L.Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }
+		L.Draggable._dragging = this;  // Prevent dragging multiple objects at once.
+
+		if (this._preventOutline) {
+			L.DomUtil.preventOutline(this._element);
+		}
+
+		L.DomUtil.disableImageDrag();
+		L.DomUtil.disableTextSelection();
+
+		if (this._moving) { return; }
+
+		// @event down: Event
+		// Fired when a drag is about to start.
+		this.fire('down');
+
+		var first = e.touches ? e.touches[0] : e;
+
+		this._startPoint = new L.Point(first.clientX, first.clientY);
+
+		L.DomEvent
+			.on(document, L.Draggable.MOVE[e.type], this._onMove, this)
+			.on(document, L.Draggable.END[e.type], this._onUp, this);
+	},
+
+	_onMove: function (e) {
+		// Ignore simulated events, since we handle both touch and
+		// mouse explicitly; otherwise we risk getting duplicates of
+		// touch events, see #4315.
+		// Also ignore the event if disabled; this happens in IE11
+		// under some circumstances, see #3666.
+		if (e._simulated || !this._enabled) { return; }
+
+		if (e.touches && e.touches.length > 1) {
+			this._moved = true;
+			return;
+		}
+
+		var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),
+		    newPoint = new L.Point(first.clientX, first.clientY),
+		    offset = newPoint.subtract(this._startPoint);
+
+		if (!offset.x && !offset.y) { return; }
+		if (Math.abs(offset.x) + Math.abs(offset.y) < this.options.clickTolerance) { return; }
+
+		L.DomEvent.preventDefault(e);
+
+		if (!this._moved) {
+			// @event dragstart: Event
+			// Fired when a drag starts
+			this.fire('dragstart');
+
+			this._moved = true;
+			this._startPos = L.DomUtil.getPosition(this._element).subtract(offset);
+
+			L.DomUtil.addClass(document.body, 'leaflet-dragging');
+
+			this._lastTarget = e.target || e.srcElement;
+			// IE and Edge do not give the <use> element, so fetch it
+			// if necessary
+			if ((window.SVGElementInstance) && (this._lastTarget instanceof SVGElementInstance)) {
+				this._lastTarget = this._lastTarget.correspondingUseElement;
+			}
+			L.DomUtil.addClass(this._lastTarget, 'leaflet-drag-target');
+		}
+
+		this._newPos = this._startPos.add(offset);
+		this._moving = true;
+
+		L.Util.cancelAnimFrame(this._animRequest);
+		this._lastEvent = e;
+		this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true);
+	},
+
+	_updatePosition: function () {
+		var e = {originalEvent: this._lastEvent};
+
+		// @event predrag: Event
+		// Fired continuously during dragging *before* each corresponding
+		// update of the element's position.
+		this.fire('predrag', e);
+		L.DomUtil.setPosition(this._element, this._newPos);
+
+		// @event drag: Event
+		// Fired continuously during dragging.
+		this.fire('drag', e);
+	},
+
+	_onUp: function (e) {
+		// Ignore simulated events, since we handle both touch and
+		// mouse explicitly; otherwise we risk getting duplicates of
+		// touch events, see #4315.
+		// Also ignore the event if disabled; this happens in IE11
+		// under some circumstances, see #3666.
+		if (e._simulated || !this._enabled) { return; }
+		this.finishDrag();
+	},
+
+	finishDrag: function () {
+		L.DomUtil.removeClass(document.body, 'leaflet-dragging');
+
+		if (this._lastTarget) {
+			L.DomUtil.removeClass(this._lastTarget, 'leaflet-drag-target');
+			this._lastTarget = null;
+		}
+
+		for (var i in L.Draggable.MOVE) {
+			L.DomEvent
+				.off(document, L.Draggable.MOVE[i], this._onMove, this)
+				.off(document, L.Draggable.END[i], this._onUp, this);
+		}
+
+		L.DomUtil.enableImageDrag();
+		L.DomUtil.enableTextSelection();
+
+		if (this._moved && this._moving) {
+			// ensure drag is not fired after dragend
+			L.Util.cancelAnimFrame(this._animRequest);
+
+			// @event dragend: DragEndEvent
+			// Fired when the drag ends.
+			this.fire('dragend', {
+				distance: this._newPos.distanceTo(this._startPos)
+			});
+		}
+
+		this._moving = false;
+		L.Draggable._dragging = false;
+	}
+
+});
+
+
+
+/*
+	L.Handler is a base class for handler classes that are used internally to inject
+	interaction features like dragging to classes like Map and Marker.
+*/
+
+// @class Handler
+// @aka L.Handler
+// Abstract class for map interaction handlers
+
+L.Handler = L.Class.extend({
+	initialize: function (map) {
+		this._map = map;
+	},
+
+	// @method enable(): this
+	// Enables the handler
+	enable: function () {
+		if (this._enabled) { return this; }
+
+		this._enabled = true;
+		this.addHooks();
+		return this;
+	},
+
+	// @method disable(): this
+	// Disables the handler
+	disable: function () {
+		if (!this._enabled) { return this; }
+
+		this._enabled = false;
+		this.removeHooks();
+		return this;
+	},
+
+	// @method enabled(): Boolean
+	// Returns `true` if the handler is enabled
+	enabled: function () {
+		return !!this._enabled;
+	}
+
+	// @section Extension methods
+	// Classes inheriting from `Handler` must implement the two following methods:
+	// @method addHooks()
+	// Called when the handler is enabled, should add event hooks.
+	// @method removeHooks()
+	// Called when the handler is disabled, should remove the event hooks added previously.
+});
+
+
+
+/*
+ * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.
+ */
+
+// @namespace Map
+// @section Interaction Options
+L.Map.mergeOptions({
+	// @option dragging: Boolean = true
+	// Whether the map be draggable with mouse/touch or not.
+	dragging: true,
+
+	// @section Panning Inertia Options
+	// @option inertia: Boolean = *
+	// If enabled, panning of the map will have an inertia effect where
+	// the map builds momentum while dragging and continues moving in
+	// the same direction for some time. Feels especially nice on touch
+	// devices. Enabled by default unless running on old Android devices.
+	inertia: !L.Browser.android23,
+
+	// @option inertiaDeceleration: Number = 3000
+	// The rate with which the inertial movement slows down, in pixels/second².
+	inertiaDeceleration: 3400, // px/s^2
+
+	// @option inertiaMaxSpeed: Number = Infinity
+	// Max speed of the inertial movement, in pixels/second.
+	inertiaMaxSpeed: Infinity, // px/s
+
+	// @option easeLinearity: Number = 0.2
+	easeLinearity: 0.2,
+
+	// TODO refactor, move to CRS
+	// @option worldCopyJump: Boolean = false
+	// With this option enabled, the map tracks when you pan to another "copy"
+	// of the world and seamlessly jumps to the original one so that all overlays
+	// like markers and vector layers are still visible.
+	worldCopyJump: false,
+
+	// @option maxBoundsViscosity: Number = 0.0
+	// If `maxBounds` is set, this option will control how solid the bounds
+	// are when dragging the map around. The default value of `0.0` allows the
+	// user to drag outside the bounds at normal speed, higher values will
+	// slow down map dragging outside bounds, and `1.0` makes the bounds fully
+	// solid, preventing the user from dragging outside the bounds.
+	maxBoundsViscosity: 0.0
+});
+
+L.Map.Drag = L.Handler.extend({
+	addHooks: function () {
+		if (!this._draggable) {
+			var map = this._map;
+
+			this._draggable = new L.Draggable(map._mapPane, map._container);
+
+			this._draggable.on({
+				down: this._onDown,
+				dragstart: this._onDragStart,
+				drag: this._onDrag,
+				dragend: this._onDragEnd
+			}, this);
+
+			this._draggable.on('predrag', this._onPreDragLimit, this);
+			if (map.options.worldCopyJump) {
+				this._draggable.on('predrag', this._onPreDragWrap, this);
+				map.on('zoomend', this._onZoomEnd, this);
+
+				map.whenReady(this._onZoomEnd, this);
+			}
+		}
+		L.DomUtil.addClass(this._map._container, 'leaflet-grab leaflet-touch-drag');
+		this._draggable.enable();
+		this._positions = [];
+		this._times = [];
+	},
+
+	removeHooks: function () {
+		L.DomUtil.removeClass(this._map._container, 'leaflet-grab');
+		L.DomUtil.removeClass(this._map._container, 'leaflet-touch-drag');
+		this._draggable.disable();
+	},
+
+	moved: function () {
+		return this._draggable && this._draggable._moved;
+	},
+
+	moving: function () {
+		return this._draggable && this._draggable._moving;
+	},
+
+	_onDown: function () {
+		this._map._stop();
+	},
+
+	_onDragStart: function () {
+		var map = this._map;
+
+		if (this._map.options.maxBounds && this._map.options.maxBoundsViscosity) {
+			var bounds = L.latLngBounds(this._map.options.maxBounds);
+
+			this._offsetLimit = L.bounds(
+				this._map.latLngToContainerPoint(bounds.getNorthWest()).multiplyBy(-1),
+				this._map.latLngToContainerPoint(bounds.getSouthEast()).multiplyBy(-1)
+					.add(this._map.getSize()));
+
+			this._viscosity = Math.min(1.0, Math.max(0.0, this._map.options.maxBoundsViscosity));
+		} else {
+			this._offsetLimit = null;
+		}
+
+		map
+		    .fire('movestart')
+		    .fire('dragstart');
+
+		if (map.options.inertia) {
+			this._positions = [];
+			this._times = [];
+		}
+	},
+
+	_onDrag: function (e) {
+		if (this._map.options.inertia) {
+			var time = this._lastTime = +new Date(),
+			    pos = this._lastPos = this._draggable._absPos || this._draggable._newPos;
+
+			this._positions.push(pos);
+			this._times.push(time);
+
+			if (time - this._times[0] > 50) {
+				this._positions.shift();
+				this._times.shift();
+			}
+		}
+
+		this._map
+		    .fire('move', e)
+		    .fire('drag', e);
+	},
+
+	_onZoomEnd: function () {
+		var pxCenter = this._map.getSize().divideBy(2),
+		    pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);
+
+		this._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;
+		this._worldWidth = this._map.getPixelWorldBounds().getSize().x;
+	},
+
+	_viscousLimit: function (value, threshold) {
+		return value - (value - threshold) * this._viscosity;
+	},
+
+	_onPreDragLimit: function () {
+		if (!this._viscosity || !this._offsetLimit) { return; }
+
+		var offset = this._draggable._newPos.subtract(this._draggable._startPos);
+
+		var limit = this._offsetLimit;
+		if (offset.x < limit.min.x) { offset.x = this._viscousLimit(offset.x, limit.min.x); }
+		if (offset.y < limit.min.y) { offset.y = this._viscousLimit(offset.y, limit.min.y); }
+		if (offset.x > limit.max.x) { offset.x = this._viscousLimit(offset.x, limit.max.x); }
+		if (offset.y > limit.max.y) { offset.y = this._viscousLimit(offset.y, limit.max.y); }
+
+		this._draggable._newPos = this._draggable._startPos.add(offset);
+	},
+
+	_onPreDragWrap: function () {
+		// TODO refactor to be able to adjust map pane position after zoom
+		var worldWidth = this._worldWidth,
+		    halfWidth = Math.round(worldWidth / 2),
+		    dx = this._initialWorldOffset,
+		    x = this._draggable._newPos.x,
+		    newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,
+		    newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,
+		    newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;
+
+		this._draggable._absPos = this._draggable._newPos.clone();
+		this._draggable._newPos.x = newX;
+	},
+
+	_onDragEnd: function (e) {
+		var map = this._map,
+		    options = map.options,
+
+		    noInertia = !options.inertia || this._times.length < 2;
+
+		map.fire('dragend', e);
+
+		if (noInertia) {
+			map.fire('moveend');
+
+		} else {
+
+			var direction = this._lastPos.subtract(this._positions[0]),
+			    duration = (this._lastTime - this._times[0]) / 1000,
+			    ease = options.easeLinearity,
+
+			    speedVector = direction.multiplyBy(ease / duration),
+			    speed = speedVector.distanceTo([0, 0]),
+
+			    limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),
+			    limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),
+
+			    decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),
+			    offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();
+
+			if (!offset.x && !offset.y) {
+				map.fire('moveend');
+
+			} else {
+				offset = map._limitOffset(offset, map.options.maxBounds);
+
+				L.Util.requestAnimFrame(function () {
+					map.panBy(offset, {
+						duration: decelerationDuration,
+						easeLinearity: ease,
+						noMoveStart: true,
+						animate: true
+					});
+				});
+			}
+		}
+	}
+});
+
+// @section Handlers
+// @property dragging: Handler
+// Map dragging handler (by both mouse and touch).
+L.Map.addInitHook('addHandler', 'dragging', L.Map.Drag);
+
+
+
+/*
+ * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.
+ */
+
+// @namespace Map
+// @section Interaction Options
+
+L.Map.mergeOptions({
+	// @option doubleClickZoom: Boolean|String = true
+	// Whether the map can be zoomed in by double clicking on it and
+	// zoomed out by double clicking while holding shift. If passed
+	// `'center'`, double-click zoom will zoom to the center of the
+	//  view regardless of where the mouse was.
+	doubleClickZoom: true
+});
+
+L.Map.DoubleClickZoom = L.Handler.extend({
+	addHooks: function () {
+		this._map.on('dblclick', this._onDoubleClick, this);
+	},
+
+	removeHooks: function () {
+		this._map.off('dblclick', this._onDoubleClick, this);
+	},
+
+	_onDoubleClick: function (e) {
+		var map = this._map,
+		    oldZoom = map.getZoom(),
+		    delta = map.options.zoomDelta,
+		    zoom = e.originalEvent.shiftKey ? oldZoom - delta : oldZoom + delta;
+
+		if (map.options.doubleClickZoom === 'center') {
+			map.setZoom(zoom);
+		} else {
+			map.setZoomAround(e.containerPoint, zoom);
+		}
+	}
+});
+
+// @section Handlers
+//
+// Map properties include interaction handlers that allow you to control
+// interaction behavior in runtime, enabling or disabling certain features such
+// as dragging or touch zoom (see `Handler` methods). For example:
+//
+// ```js
+// map.doubleClickZoom.disable();
+// ```
+//
+// @property doubleClickZoom: Handler
+// Double click zoom handler.
+L.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom);
+
+
+
+/*
+ * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.
+ */
+
+// @namespace Map
+// @section Interaction Options
+L.Map.mergeOptions({
+	// @section Mousewheel options
+	// @option scrollWheelZoom: Boolean|String = true
+	// Whether the map can be zoomed by using the mouse wheel. If passed `'center'`,
+	// it will zoom to the center of the view regardless of where the mouse was.
+	scrollWheelZoom: true,
+
+	// @option wheelDebounceTime: Number = 40
+	// Limits the rate at which a wheel can fire (in milliseconds). By default
+	// user can't zoom via wheel more often than once per 40 ms.
+	wheelDebounceTime: 40,
+
+	// @option wheelPxPerZoomLevel: Number = 60
+	// How many scroll pixels (as reported by [L.DomEvent.getWheelDelta](#domevent-getwheeldelta))
+	// mean a change of one full zoom level. Smaller values will make wheel-zooming
+	// faster (and vice versa).
+	wheelPxPerZoomLevel: 60
+});
+
+L.Map.ScrollWheelZoom = L.Handler.extend({
+	addHooks: function () {
+		L.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this);
+
+		this._delta = 0;
+	},
+
+	removeHooks: function () {
+		L.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll, this);
+	},
+
+	_onWheelScroll: function (e) {
+		var delta = L.DomEvent.getWheelDelta(e);
+
+		var debounce = this._map.options.wheelDebounceTime;
+
+		this._delta += delta;
+		this._lastMousePos = this._map.mouseEventToContainerPoint(e);
+
+		if (!this._startTime) {
+			this._startTime = +new Date();
+		}
+
+		var left = Math.max(debounce - (+new Date() - this._startTime), 0);
+
+		clearTimeout(this._timer);
+		this._timer = setTimeout(L.bind(this._performZoom, this), left);
+
+		L.DomEvent.stop(e);
+	},
+
+	_performZoom: function () {
+		var map = this._map,
+		    zoom = map.getZoom(),
+		    snap = this._map.options.zoomSnap || 0;
+
+		map._stop(); // stop panning and fly animations if any
+
+		// map the delta with a sigmoid function to -4..4 range leaning on -1..1
+		var d2 = this._delta / (this._map.options.wheelPxPerZoomLevel * 4),
+		    d3 = 4 * Math.log(2 / (1 + Math.exp(-Math.abs(d2)))) / Math.LN2,
+		    d4 = snap ? Math.ceil(d3 / snap) * snap : d3,
+		    delta = map._limitZoom(zoom + (this._delta > 0 ? d4 : -d4)) - zoom;
+
+		this._delta = 0;
+		this._startTime = null;
+
+		if (!delta) { return; }
+
+		if (map.options.scrollWheelZoom === 'center') {
+			map.setZoom(zoom + delta);
+		} else {
+			map.setZoomAround(this._lastMousePos, zoom + delta);
+		}
+	}
+});
+
+// @section Handlers
+// @property scrollWheelZoom: Handler
+// Scroll wheel zoom handler.
+L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom);
+
+
+
+/*
+ * Extends the event handling code with double tap support for mobile browsers.
+ */
+
+L.extend(L.DomEvent, {
+
+	_touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',
+	_touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',
+
+	// inspired by Zepto touch code by Thomas Fuchs
+	addDoubleTapListener: function (obj, handler, id) {
+		var last, touch,
+		    doubleTap = false,
+		    delay = 250;
+
+		function onTouchStart(e) {
+			var count;
+
+			if (L.Browser.pointer) {
+				if ((!L.Browser.edge) || e.pointerType === 'mouse') { return; }
+				count = L.DomEvent._pointersCount;
+			} else {
+				count = e.touches.length;
+			}
+
+			if (count > 1) { return; }
+
+			var now = Date.now(),
+			    delta = now - (last || now);
+
+			touch = e.touches ? e.touches[0] : e;
+			doubleTap = (delta > 0 && delta <= delay);
+			last = now;
+		}
+
+		function onTouchEnd(e) {
+			if (doubleTap && !touch.cancelBubble) {
+				if (L.Browser.pointer) {
+					if ((!L.Browser.edge) || e.pointerType === 'mouse') { return; }
+
+					// work around .type being readonly with MSPointer* events
+					var newTouch = {},
+					    prop, i;
+
+					for (i in touch) {
+						prop = touch[i];
+						newTouch[i] = prop && prop.bind ? prop.bind(touch) : prop;
+					}
+					touch = newTouch;
+				}
+				touch.type = 'dblclick';
+				handler(touch);
+				last = null;
+			}
+		}
+
+		var pre = '_leaflet_',
+		    touchstart = this._touchstart,
+		    touchend = this._touchend;
+
+		obj[pre + touchstart + id] = onTouchStart;
+		obj[pre + touchend + id] = onTouchEnd;
+		obj[pre + 'dblclick' + id] = handler;
+
+		obj.addEventListener(touchstart, onTouchStart, false);
+		obj.addEventListener(touchend, onTouchEnd, false);
+
+		// On some platforms (notably, chrome<55 on win10 + touchscreen + mouse),
+		// the browser doesn't fire touchend/pointerup events but does fire
+		// native dblclicks. See #4127.
+		// Edge 14 also fires native dblclicks, but only for pointerType mouse, see #5180.
+		obj.addEventListener('dblclick', handler, false);
+
+		return this;
+	},
+
+	removeDoubleTapListener: function (obj, id) {
+		var pre = '_leaflet_',
+		    touchstart = obj[pre + this._touchstart + id],
+		    touchend = obj[pre + this._touchend + id],
+		    dblclick = obj[pre + 'dblclick' + id];
+
+		obj.removeEventListener(this._touchstart, touchstart, false);
+		obj.removeEventListener(this._touchend, touchend, false);
+		if (!L.Browser.edge) {
+			obj.removeEventListener('dblclick', dblclick, false);
+		}
+
+		return this;
+	}
+});
+
+
+
+/*
+ * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.
+ */
+
+L.extend(L.DomEvent, {
+
+	POINTER_DOWN:   L.Browser.msPointer ? 'MSPointerDown'   : 'pointerdown',
+	POINTER_MOVE:   L.Browser.msPointer ? 'MSPointerMove'   : 'pointermove',
+	POINTER_UP:     L.Browser.msPointer ? 'MSPointerUp'     : 'pointerup',
+	POINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel',
+	TAG_WHITE_LIST: ['INPUT', 'SELECT', 'OPTION'],
+
+	_pointers: {},
+	_pointersCount: 0,
+
+	// Provides a touch events wrapper for (ms)pointer events.
+	// ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890
+
+	addPointerListener: function (obj, type, handler, id) {
+
+		if (type === 'touchstart') {
+			this._addPointerStart(obj, handler, id);
+
+		} else if (type === 'touchmove') {
+			this._addPointerMove(obj, handler, id);
+
+		} else if (type === 'touchend') {
+			this._addPointerEnd(obj, handler, id);
+		}
+
+		return this;
+	},
+
+	removePointerListener: function (obj, type, id) {
+		var handler = obj['_leaflet_' + type + id];
+
+		if (type === 'touchstart') {
+			obj.removeEventListener(this.POINTER_DOWN, handler, false);
+
+		} else if (type === 'touchmove') {
+			obj.removeEventListener(this.POINTER_MOVE, handler, false);
+
+		} else if (type === 'touchend') {
+			obj.removeEventListener(this.POINTER_UP, handler, false);
+			obj.removeEventListener(this.POINTER_CANCEL, handler, false);
+		}
+
+		return this;
+	},
+
+	_addPointerStart: function (obj, handler, id) {
+		var onDown = L.bind(function (e) {
+			if (e.pointerType !== 'mouse' && e.MSPOINTER_TYPE_MOUSE && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {
+				// In IE11, some touch events needs to fire for form controls, or
+				// the controls will stop working. We keep a whitelist of tag names that
+				// need these events. For other target tags, we prevent default on the event.
+				if (this.TAG_WHITE_LIST.indexOf(e.target.tagName) < 0) {
+					L.DomEvent.preventDefault(e);
+				} else {
+					return;
+				}
+			}
+
+			this._handlePointer(e, handler);
+		}, this);
+
+		obj['_leaflet_touchstart' + id] = onDown;
+		obj.addEventListener(this.POINTER_DOWN, onDown, false);
+
+		// need to keep track of what pointers and how many are active to provide e.touches emulation
+		if (!this._pointerDocListener) {
+			var pointerUp = L.bind(this._globalPointerUp, this);
+
+			// we listen documentElement as any drags that end by moving the touch off the screen get fired there
+			document.documentElement.addEventListener(this.POINTER_DOWN, L.bind(this._globalPointerDown, this), true);
+			document.documentElement.addEventListener(this.POINTER_MOVE, L.bind(this._globalPointerMove, this), true);
+			document.documentElement.addEventListener(this.POINTER_UP, pointerUp, true);
+			document.documentElement.addEventListener(this.POINTER_CANCEL, pointerUp, true);
+
+			this._pointerDocListener = true;
+		}
+	},
+
+	_globalPointerDown: function (e) {
+		this._pointers[e.pointerId] = e;
+		this._pointersCount++;
+	},
+
+	_globalPointerMove: function (e) {
+		if (this._pointers[e.pointerId]) {
+			this._pointers[e.pointerId] = e;
+		}
+	},
+
+	_globalPointerUp: function (e) {
+		delete this._pointers[e.pointerId];
+		this._pointersCount--;
+	},
+
+	_handlePointer: function (e, handler) {
+		e.touches = [];
+		for (var i in this._pointers) {
+			e.touches.push(this._pointers[i]);
+		}
+		e.changedTouches = [e];
+
+		handler(e);
+	},
+
+	_addPointerMove: function (obj, handler, id) {
+		var onMove = L.bind(function (e) {
+			// don't fire touch moves when mouse isn't down
+			if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; }
+
+			this._handlePointer(e, handler);
+		}, this);
+
+		obj['_leaflet_touchmove' + id] = onMove;
+		obj.addEventListener(this.POINTER_MOVE, onMove, false);
+	},
+
+	_addPointerEnd: function (obj, handler, id) {
+		var onUp = L.bind(function (e) {
+			this._handlePointer(e, handler);
+		}, this);
+
+		obj['_leaflet_touchend' + id] = onUp;
+		obj.addEventListener(this.POINTER_UP, onUp, false);
+		obj.addEventListener(this.POINTER_CANCEL, onUp, false);
+	}
+});
+
+
+
+/*
+ * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.
+ */
+
+// @namespace Map
+// @section Interaction Options
+L.Map.mergeOptions({
+	// @section Touch interaction options
+	// @option touchZoom: Boolean|String = *
+	// Whether the map can be zoomed by touch-dragging with two fingers. If
+	// passed `'center'`, it will zoom to the center of the view regardless of
+	// where the touch events (fingers) were. Enabled for touch-capable web
+	// browsers except for old Androids.
+	touchZoom: L.Browser.touch && !L.Browser.android23,
+
+	// @option bounceAtZoomLimits: Boolean = true
+	// Set it to false if you don't want the map to zoom beyond min/max zoom
+	// and then bounce back when pinch-zooming.
+	bounceAtZoomLimits: true
+});
+
+L.Map.TouchZoom = L.Handler.extend({
+	addHooks: function () {
+		L.DomUtil.addClass(this._map._container, 'leaflet-touch-zoom');
+		L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);
+	},
+
+	removeHooks: function () {
+		L.DomUtil.removeClass(this._map._container, 'leaflet-touch-zoom');
+		L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);
+	},
+
+	_onTouchStart: function (e) {
+		var map = this._map;
+		if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }
+
+		var p1 = map.mouseEventToContainerPoint(e.touches[0]),
+		    p2 = map.mouseEventToContainerPoint(e.touches[1]);
+
+		this._centerPoint = map.getSize()._divideBy(2);
+		this._startLatLng = map.containerPointToLatLng(this._centerPoint);
+		if (map.options.touchZoom !== 'center') {
+			this._pinchStartLatLng = map.containerPointToLatLng(p1.add(p2)._divideBy(2));
+		}
+
+		this._startDist = p1.distanceTo(p2);
+		this._startZoom = map.getZoom();
+
+		this._moved = false;
+		this._zooming = true;
+
+		map._stop();
+
+		L.DomEvent
+		    .on(document, 'touchmove', this._onTouchMove, this)
+		    .on(document, 'touchend', this._onTouchEnd, this);
+
+		L.DomEvent.preventDefault(e);
+	},
+
+	_onTouchMove: function (e) {
+		if (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }
+
+		var map = this._map,
+		    p1 = map.mouseEventToContainerPoint(e.touches[0]),
+		    p2 = map.mouseEventToContainerPoint(e.touches[1]),
+		    scale = p1.distanceTo(p2) / this._startDist;
+
+
+		this._zoom = map.getScaleZoom(scale, this._startZoom);
+
+		if (!map.options.bounceAtZoomLimits && (
+			(this._zoom < map.getMinZoom() && scale < 1) ||
+			(this._zoom > map.getMaxZoom() && scale > 1))) {
+			this._zoom = map._limitZoom(this._zoom);
+		}
+
+		if (map.options.touchZoom === 'center') {
+			this._center = this._startLatLng;
+			if (scale === 1) { return; }
+		} else {
+			// Get delta from pinch to center, so centerLatLng is delta applied to initial pinchLatLng
+			var delta = p1._add(p2)._divideBy(2)._subtract(this._centerPoint);
+			if (scale === 1 && delta.x === 0 && delta.y === 0) { return; }
+			this._center = map.unproject(map.project(this._pinchStartLatLng, this._zoom).subtract(delta), this._zoom);
+		}
+
+		if (!this._moved) {
+			map._moveStart(true);
+			this._moved = true;
+		}
+
+		L.Util.cancelAnimFrame(this._animRequest);
+
+		var moveFn = L.bind(map._move, map, this._center, this._zoom, {pinch: true, round: false});
+		this._animRequest = L.Util.requestAnimFrame(moveFn, this, true);
+
+		L.DomEvent.preventDefault(e);
+	},
+
+	_onTouchEnd: function () {
+		if (!this._moved || !this._zooming) {
+			this._zooming = false;
+			return;
+		}
+
+		this._zooming = false;
+		L.Util.cancelAnimFrame(this._animRequest);
+
+		L.DomEvent
+		    .off(document, 'touchmove', this._onTouchMove)
+		    .off(document, 'touchend', this._onTouchEnd);
+
+		// Pinch updates GridLayers' levels only when zoomSnap is off, so zoomSnap becomes noUpdate.
+		if (this._map.options.zoomAnimation) {
+			this._map._animateZoom(this._center, this._map._limitZoom(this._zoom), true, this._map.options.zoomSnap);
+		} else {
+			this._map._resetView(this._center, this._map._limitZoom(this._zoom));
+		}
+	}
+});
+
+// @section Handlers
+// @property touchZoom: Handler
+// Touch zoom handler.
+L.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom);
+
+
+
+/*
+ * L.Map.Tap is used to enable mobile hacks like quick taps and long hold.
+ */
+
+// @namespace Map
+// @section Interaction Options
+L.Map.mergeOptions({
+	// @section Touch interaction options
+	// @option tap: Boolean = true
+	// Enables mobile hacks for supporting instant taps (fixing 200ms click
+	// delay on iOS/Android) and touch holds (fired as `contextmenu` events).
+	tap: true,
+
+	// @option tapTolerance: Number = 15
+	// The max number of pixels a user can shift his finger during touch
+	// for it to be considered a valid tap.
+	tapTolerance: 15
+});
+
+L.Map.Tap = L.Handler.extend({
+	addHooks: function () {
+		L.DomEvent.on(this._map._container, 'touchstart', this._onDown, this);
+	},
+
+	removeHooks: function () {
+		L.DomEvent.off(this._map._container, 'touchstart', this._onDown, this);
+	},
+
+	_onDown: function (e) {
+		if (!e.touches) { return; }
+
+		L.DomEvent.preventDefault(e);
+
+		this._fireClick = true;
+
+		// don't simulate click or track longpress if more than 1 touch
+		if (e.touches.length > 1) {
+			this._fireClick = false;
+			clearTimeout(this._holdTimeout);
+			return;
+		}
+
+		var first = e.touches[0],
+		    el = first.target;
+
+		this._startPos = this._newPos = new L.Point(first.clientX, first.clientY);
+
+		// if touching a link, highlight it
+		if (el.tagName && el.tagName.toLowerCase() === 'a') {
+			L.DomUtil.addClass(el, 'leaflet-active');
+		}
+
+		// simulate long hold but setting a timeout
+		this._holdTimeout = setTimeout(L.bind(function () {
+			if (this._isTapValid()) {
+				this._fireClick = false;
+				this._onUp();
+				this._simulateEvent('contextmenu', first);
+			}
+		}, this), 1000);
+
+		this._simulateEvent('mousedown', first);
+
+		L.DomEvent.on(document, {
+			touchmove: this._onMove,
+			touchend: this._onUp
+		}, this);
+	},
+
+	_onUp: function (e) {
+		clearTimeout(this._holdTimeout);
+
+		L.DomEvent.off(document, {
+			touchmove: this._onMove,
+			touchend: this._onUp
+		}, this);
+
+		if (this._fireClick && e && e.changedTouches) {
+
+			var first = e.changedTouches[0],
+			    el = first.target;
+
+			if (el && el.tagName && el.tagName.toLowerCase() === 'a') {
+				L.DomUtil.removeClass(el, 'leaflet-active');
+			}
+
+			this._simulateEvent('mouseup', first);
+
+			// simulate click if the touch didn't move too much
+			if (this._isTapValid()) {
+				this._simulateEvent('click', first);
+			}
+		}
+	},
+
+	_isTapValid: function () {
+		return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;
+	},
+
+	_onMove: function (e) {
+		var first = e.touches[0];
+		this._newPos = new L.Point(first.clientX, first.clientY);
+		this._simulateEvent('mousemove', first);
+	},
+
+	_simulateEvent: function (type, e) {
+		var simulatedEvent = document.createEvent('MouseEvents');
+
+		simulatedEvent._simulated = true;
+		e.target._simulatedClick = true;
+
+		simulatedEvent.initMouseEvent(
+		        type, true, true, window, 1,
+		        e.screenX, e.screenY,
+		        e.clientX, e.clientY,
+		        false, false, false, false, 0, null);
+
+		e.target.dispatchEvent(simulatedEvent);
+	}
+});
+
+// @section Handlers
+// @property tap: Handler
+// Mobile touch hacks (quick tap and touch hold) handler.
+if (L.Browser.touch && !L.Browser.pointer) {
+	L.Map.addInitHook('addHandler', 'tap', L.Map.Tap);
+}
+
+
+
+/*
+ * L.Handler.BoxZoom is used to add shift-drag zoom interaction to the map
+ * (zoom to a selected bounding box), enabled by default.
+ */
+
+// @namespace Map
+// @section Interaction Options
+L.Map.mergeOptions({
+	// @option boxZoom: Boolean = true
+	// Whether the map can be zoomed to a rectangular area specified by
+	// dragging the mouse while pressing the shift key.
+	boxZoom: true
+});
+
+L.Map.BoxZoom = L.Handler.extend({
+	initialize: function (map) {
+		this._map = map;
+		this._container = map._container;
+		this._pane = map._panes.overlayPane;
+	},
+
+	addHooks: function () {
+		L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);
+	},
+
+	removeHooks: function () {
+		L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this);
+	},
+
+	moved: function () {
+		return this._moved;
+	},
+
+	_resetState: function () {
+		this._moved = false;
+	},
+
+	_onMouseDown: function (e) {
+		if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }
+
+		this._resetState();
+
+		L.DomUtil.disableTextSelection();
+		L.DomUtil.disableImageDrag();
+
+		this._startPoint = this._map.mouseEventToContainerPoint(e);
+
+		L.DomEvent.on(document, {
+			contextmenu: L.DomEvent.stop,
+			mousemove: this._onMouseMove,
+			mouseup: this._onMouseUp,
+			keydown: this._onKeyDown
+		}, this);
+	},
+
+	_onMouseMove: function (e) {
+		if (!this._moved) {
+			this._moved = true;
+
+			this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container);
+			L.DomUtil.addClass(this._container, 'leaflet-crosshair');
+
+			this._map.fire('boxzoomstart');
+		}
+
+		this._point = this._map.mouseEventToContainerPoint(e);
+
+		var bounds = new L.Bounds(this._point, this._startPoint),
+		    size = bounds.getSize();
+
+		L.DomUtil.setPosition(this._box, bounds.min);
+
+		this._box.style.width  = size.x + 'px';
+		this._box.style.height = size.y + 'px';
+	},
+
+	_finish: function () {
+		if (this._moved) {
+			L.DomUtil.remove(this._box);
+			L.DomUtil.removeClass(this._container, 'leaflet-crosshair');
+		}
+
+		L.DomUtil.enableTextSelection();
+		L.DomUtil.enableImageDrag();
+
+		L.DomEvent.off(document, {
+			contextmenu: L.DomEvent.stop,
+			mousemove: this._onMouseMove,
+			mouseup: this._onMouseUp,
+			keydown: this._onKeyDown
+		}, this);
+	},
+
+	_onMouseUp: function (e) {
+		if ((e.which !== 1) && (e.button !== 1)) { return; }
+
+		this._finish();
+
+		if (!this._moved) { return; }
+		// Postpone to next JS tick so internal click event handling
+		// still see it as "moved".
+		setTimeout(L.bind(this._resetState, this), 0);
+
+		var bounds = new L.LatLngBounds(
+		        this._map.containerPointToLatLng(this._startPoint),
+		        this._map.containerPointToLatLng(this._point));
+
+		this._map
+			.fitBounds(bounds)
+			.fire('boxzoomend', {boxZoomBounds: bounds});
+	},
+
+	_onKeyDown: function (e) {
+		if (e.keyCode === 27) {
+			this._finish();
+		}
+	}
+});
+
+// @section Handlers
+// @property boxZoom: Handler
+// Box (shift-drag with mouse) zoom handler.
+L.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom);
+
+
+
+/*
+ * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.
+ */
+
+// @namespace Map
+// @section Keyboard Navigation Options
+L.Map.mergeOptions({
+	// @option keyboard: Boolean = true
+	// Makes the map focusable and allows users to navigate the map with keyboard
+	// arrows and `+`/`-` keys.
+	keyboard: true,
+
+	// @option keyboardPanDelta: Number = 80
+	// Amount of pixels to pan when pressing an arrow key.
+	keyboardPanDelta: 80
+});
+
+L.Map.Keyboard = L.Handler.extend({
+
+	keyCodes: {
+		left:    [37],
+		right:   [39],
+		down:    [40],
+		up:      [38],
+		zoomIn:  [187, 107, 61, 171],
+		zoomOut: [189, 109, 54, 173]
+	},
+
+	initialize: function (map) {
+		this._map = map;
+
+		this._setPanDelta(map.options.keyboardPanDelta);
+		this._setZoomDelta(map.options.zoomDelta);
+	},
+
+	addHooks: function () {
+		var container = this._map._container;
+
+		// make the container focusable by tabbing
+		if (container.tabIndex <= 0) {
+			container.tabIndex = '0';
+		}
+
+		L.DomEvent.on(container, {
+			focus: this._onFocus,
+			blur: this._onBlur,
+			mousedown: this._onMouseDown
+		}, this);
+
+		this._map.on({
+			focus: this._addHooks,
+			blur: this._removeHooks
+		}, this);
+	},
+
+	removeHooks: function () {
+		this._removeHooks();
+
+		L.DomEvent.off(this._map._container, {
+			focus: this._onFocus,
+			blur: this._onBlur,
+			mousedown: this._onMouseDown
+		}, this);
+
+		this._map.off({
+			focus: this._addHooks,
+			blur: this._removeHooks
+		}, this);
+	},
+
+	_onMouseDown: function () {
+		if (this._focused) { return; }
+
+		var body = document.body,
+		    docEl = document.documentElement,
+		    top = body.scrollTop || docEl.scrollTop,
+		    left = body.scrollLeft || docEl.scrollLeft;
+
+		this._map._container.focus();
+
+		window.scrollTo(left, top);
+	},
+
+	_onFocus: function () {
+		this._focused = true;
+		this._map.fire('focus');
+	},
+
+	_onBlur: function () {
+		this._focused = false;
+		this._map.fire('blur');
+	},
+
+	_setPanDelta: function (panDelta) {
+		var keys = this._panKeys = {},
+		    codes = this.keyCodes,
+		    i, len;
+
+		for (i = 0, len = codes.left.length; i < len; i++) {
+			keys[codes.left[i]] = [-1 * panDelta, 0];
+		}
+		for (i = 0, len = codes.right.length; i < len; i++) {
+			keys[codes.right[i]] = [panDelta, 0];
+		}
+		for (i = 0, len = codes.down.length; i < len; i++) {
+			keys[codes.down[i]] = [0, panDelta];
+		}
+		for (i = 0, len = codes.up.length; i < len; i++) {
+			keys[codes.up[i]] = [0, -1 * panDelta];
+		}
+	},
+
+	_setZoomDelta: function (zoomDelta) {
+		var keys = this._zoomKeys = {},
+		    codes = this.keyCodes,
+		    i, len;
+
+		for (i = 0, len = codes.zoomIn.length; i < len; i++) {
+			keys[codes.zoomIn[i]] = zoomDelta;
+		}
+		for (i = 0, len = codes.zoomOut.length; i < len; i++) {
+			keys[codes.zoomOut[i]] = -zoomDelta;
+		}
+	},
+
+	_addHooks: function () {
+		L.DomEvent.on(document, 'keydown', this._onKeyDown, this);
+	},
+
+	_removeHooks: function () {
+		L.DomEvent.off(document, 'keydown', this._onKeyDown, this);
+	},
+
+	_onKeyDown: function (e) {
+		if (e.altKey || e.ctrlKey || e.metaKey) { return; }
+
+		var key = e.keyCode,
+		    map = this._map,
+		    offset;
+
+		if (key in this._panKeys) {
+
+			if (map._panAnim && map._panAnim._inProgress) { return; }
+
+			offset = this._panKeys[key];
+			if (e.shiftKey) {
+				offset = L.point(offset).multiplyBy(3);
+			}
+
+			map.panBy(offset);
+
+			if (map.options.maxBounds) {
+				map.panInsideBounds(map.options.maxBounds);
+			}
+
+		} else if (key in this._zoomKeys) {
+			map.setZoom(map.getZoom() + (e.shiftKey ? 3 : 1) * this._zoomKeys[key]);
+
+		} else if (key === 27) {
+			map.closePopup();
+
+		} else {
+			return;
+		}
+
+		L.DomEvent.stop(e);
+	}
+});
+
+// @section Handlers
+// @section Handlers
+// @property keyboard: Handler
+// Keyboard navigation handler.
+L.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard);
+
+
+
+/*
+ * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.
+ */
+
+
+/* @namespace Marker
+ * @section Interaction handlers
+ *
+ * Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see `Handler` methods). Example:
+ *
+ * ```js
+ * marker.dragging.disable();
+ * ```
+ *
+ * @property dragging: Handler
+ * Marker dragging handler (by both mouse and touch).
+ */
+
+L.Handler.MarkerDrag = L.Handler.extend({
+	initialize: function (marker) {
+		this._marker = marker;
+	},
+
+	addHooks: function () {
+		var icon = this._marker._icon;
+
+		if (!this._draggable) {
+			this._draggable = new L.Draggable(icon, icon, true);
+		}
+
+		this._draggable.on({
+			dragstart: this._onDragStart,
+			drag: this._onDrag,
+			dragend: this._onDragEnd
+		}, this).enable();
+
+		L.DomUtil.addClass(icon, 'leaflet-marker-draggable');
+	},
+
+	removeHooks: function () {
+		this._draggable.off({
+			dragstart: this._onDragStart,
+			drag: this._onDrag,
+			dragend: this._onDragEnd
+		}, this).disable();
+
+		if (this._marker._icon) {
+			L.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');
+		}
+	},
+
+	moved: function () {
+		return this._draggable && this._draggable._moved;
+	},
+
+	_onDragStart: function () {
+		// @section Dragging events
+		// @event dragstart: Event
+		// Fired when the user starts dragging the marker.
+
+		// @event movestart: Event
+		// Fired when the marker starts moving (because of dragging).
+
+		this._oldLatLng = this._marker.getLatLng();
+		this._marker
+		    .closePopup()
+		    .fire('movestart')
+		    .fire('dragstart');
+	},
+
+	_onDrag: function (e) {
+		var marker = this._marker,
+		    shadow = marker._shadow,
+		    iconPos = L.DomUtil.getPosition(marker._icon),
+		    latlng = marker._map.layerPointToLatLng(iconPos);
+
+		// update shadow position
+		if (shadow) {
+			L.DomUtil.setPosition(shadow, iconPos);
+		}
+
+		marker._latlng = latlng;
+		e.latlng = latlng;
+		e.oldLatLng = this._oldLatLng;
+
+		// @event drag: Event
+		// Fired repeatedly while the user drags the marker.
+		marker
+		    .fire('move', e)
+		    .fire('drag', e);
+	},
+
+	_onDragEnd: function (e) {
+		// @event dragend: DragEndEvent
+		// Fired when the user stops dragging the marker.
+
+		// @event moveend: Event
+		// Fired when the marker stops moving (because of dragging).
+		delete this._oldLatLng;
+		this._marker
+		    .fire('moveend')
+		    .fire('dragend', e);
+	}
+});
+
+
+
+/*
+ * @class Control
+ * @aka L.Control
+ * @inherits Class
+ *
+ * L.Control is a base class for implementing map controls. Handles positioning.
+ * All other controls extend from this class.
+ */
+
+L.Control = L.Class.extend({
+	// @section
+	// @aka Control options
+	options: {
+		// @option position: String = 'topright'
+		// The position of the control (one of the map corners). Possible values are `'topleft'`,
+		// `'topright'`, `'bottomleft'` or `'bottomright'`
+		position: 'topright'
+	},
+
+	initialize: function (options) {
+		L.setOptions(this, options);
+	},
+
+	/* @section
+	 * Classes extending L.Control will inherit the following methods:
+	 *
+	 * @method getPosition: string
+	 * Returns the position of the control.
+	 */
+	getPosition: function () {
+		return this.options.position;
+	},
+
+	// @method setPosition(position: string): this
+	// Sets the position of the control.
+	setPosition: function (position) {
+		var map = this._map;
+
+		if (map) {
+			map.removeControl(this);
+		}
+
+		this.options.position = position;
+
+		if (map) {
+			map.addControl(this);
+		}
+
+		return this;
+	},
+
+	// @method getContainer: HTMLElement
+	// Returns the HTMLElement that contains the control.
+	getContainer: function () {
+		return this._container;
+	},
+
+	// @method addTo(map: Map): this
+	// Adds the control to the given map.
+	addTo: function (map) {
+		this.remove();
+		this._map = map;
+
+		var container = this._container = this.onAdd(map),
+		    pos = this.getPosition(),
+		    corner = map._controlCorners[pos];
+
+		L.DomUtil.addClass(container, 'leaflet-control');
+
+		if (pos.indexOf('bottom') !== -1) {
+			corner.insertBefore(container, corner.firstChild);
+		} else {
+			corner.appendChild(container);
+		}
+
+		return this;
+	},
+
+	// @method remove: this
+	// Removes the control from the map it is currently active on.
+	remove: function () {
+		if (!this._map) {
+			return this;
+		}
+
+		L.DomUtil.remove(this._container);
+
+		if (this.onRemove) {
+			this.onRemove(this._map);
+		}
+
+		this._map = null;
+
+		return this;
+	},
+
+	_refocusOnMap: function (e) {
+		// if map exists and event is not a keyboard event
+		if (this._map && e && e.screenX > 0 && e.screenY > 0) {
+			this._map.getContainer().focus();
+		}
+	}
+});
+
+L.control = function (options) {
+	return new L.Control(options);
+};
+
+/* @section Extension methods
+ * @uninheritable
+ *
+ * Every control should extend from `L.Control` and (re-)implement the following methods.
+ *
+ * @method onAdd(map: Map): HTMLElement
+ * Should return the container DOM element for the control and add listeners on relevant map events. Called on [`control.addTo(map)`](#control-addTo).
+ *
+ * @method onRemove(map: Map)
+ * Optional method. Should contain all clean up code that removes the listeners previously added in [`onAdd`](#control-onadd). Called on [`control.remove()`](#control-remove).
+ */
+
+/* @namespace Map
+ * @section Methods for Layers and Controls
+ */
+L.Map.include({
+	// @method addControl(control: Control): this
+	// Adds the given control to the map
+	addControl: function (control) {
+		control.addTo(this);
+		return this;
+	},
+
+	// @method removeControl(control: Control): this
+	// Removes the given control from the map
+	removeControl: function (control) {
+		control.remove();
+		return this;
+	},
+
+	_initControlPos: function () {
+		var corners = this._controlCorners = {},
+		    l = 'leaflet-',
+		    container = this._controlContainer =
+		            L.DomUtil.create('div', l + 'control-container', this._container);
+
+		function createCorner(vSide, hSide) {
+			var className = l + vSide + ' ' + l + hSide;
+
+			corners[vSide + hSide] = L.DomUtil.create('div', className, container);
+		}
+
+		createCorner('top', 'left');
+		createCorner('top', 'right');
+		createCorner('bottom', 'left');
+		createCorner('bottom', 'right');
+	},
+
+	_clearControlPos: function () {
+		L.DomUtil.remove(this._controlContainer);
+	}
+});
+
+
+
+/*
+ * @class Control.Zoom
+ * @aka L.Control.Zoom
+ * @inherits Control
+ *
+ * A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its [`zoomControl` option](#map-zoomcontrol) to `false`. Extends `Control`.
+ */
+
+L.Control.Zoom = L.Control.extend({
+	// @section
+	// @aka Control.Zoom options
+	options: {
+		position: 'topleft',
+
+		// @option zoomInText: String = '+'
+		// The text set on the 'zoom in' button.
+		zoomInText: '+',
+
+		// @option zoomInTitle: String = 'Zoom in'
+		// The title set on the 'zoom in' button.
+		zoomInTitle: 'Zoom in',
+
+		// @option zoomOutText: String = '-'
+		// The text set on the 'zoom out' button.
+		zoomOutText: '-',
+
+		// @option zoomOutTitle: String = 'Zoom out'
+		// The title set on the 'zoom out' button.
+		zoomOutTitle: 'Zoom out'
+	},
+
+	onAdd: function (map) {
+		var zoomName = 'leaflet-control-zoom',
+		    container = L.DomUtil.create('div', zoomName + ' leaflet-bar'),
+		    options = this.options;
+
+		this._zoomInButton  = this._createButton(options.zoomInText, options.zoomInTitle,
+		        zoomName + '-in',  container, this._zoomIn);
+		this._zoomOutButton = this._createButton(options.zoomOutText, options.zoomOutTitle,
+		        zoomName + '-out', container, this._zoomOut);
+
+		this._updateDisabled();
+		map.on('zoomend zoomlevelschange', this._updateDisabled, this);
+
+		return container;
+	},
+
+	onRemove: function (map) {
+		map.off('zoomend zoomlevelschange', this._updateDisabled, this);
+	},
+
+	disable: function () {
+		this._disabled = true;
+		this._updateDisabled();
+		return this;
+	},
+
+	enable: function () {
+		this._disabled = false;
+		this._updateDisabled();
+		return this;
+	},
+
+	_zoomIn: function (e) {
+		if (!this._disabled && this._map._zoom < this._map.getMaxZoom()) {
+			this._map.zoomIn(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));
+		}
+	},
+
+	_zoomOut: function (e) {
+		if (!this._disabled && this._map._zoom > this._map.getMinZoom()) {
+			this._map.zoomOut(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));
+		}
+	},
+
+	_createButton: function (html, title, className, container, fn) {
+		var link = L.DomUtil.create('a', className, container);
+		link.innerHTML = html;
+		link.href = '#';
+		link.title = title;
+
+		/*
+		 * Will force screen readers like VoiceOver to read this as "Zoom in - button"
+		 */
+		link.setAttribute('role', 'button');
+		link.setAttribute('aria-label', title);
+
+		L.DomEvent
+		    .on(link, 'mousedown dblclick', L.DomEvent.stopPropagation)
+		    .on(link, 'click', L.DomEvent.stop)
+		    .on(link, 'click', fn, this)
+		    .on(link, 'click', this._refocusOnMap, this);
+
+		return link;
+	},
+
+	_updateDisabled: function () {
+		var map = this._map,
+		    className = 'leaflet-disabled';
+
+		L.DomUtil.removeClass(this._zoomInButton, className);
+		L.DomUtil.removeClass(this._zoomOutButton, className);
+
+		if (this._disabled || map._zoom === map.getMinZoom()) {
+			L.DomUtil.addClass(this._zoomOutButton, className);
+		}
+		if (this._disabled || map._zoom === map.getMaxZoom()) {
+			L.DomUtil.addClass(this._zoomInButton, className);
+		}
+	}
+});
+
+// @namespace Map
+// @section Control options
+// @option zoomControl: Boolean = true
+// Whether a [zoom control](#control-zoom) is added to the map by default.
+L.Map.mergeOptions({
+	zoomControl: true
+});
+
+L.Map.addInitHook(function () {
+	if (this.options.zoomControl) {
+		this.zoomControl = new L.Control.Zoom();
+		this.addControl(this.zoomControl);
+	}
+});
+
+// @namespace Control.Zoom
+// @factory L.control.zoom(options: Control.Zoom options)
+// Creates a zoom control
+L.control.zoom = function (options) {
+	return new L.Control.Zoom(options);
+};
+
+
+
+/*
+ * @class Control.Attribution
+ * @aka L.Control.Attribution
+ * @inherits Control
+ *
+ * The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its [`attributionControl` option](#map-attributioncontrol) to `false`, and it fetches attribution texts from layers with the [`getAttribution` method](#layer-getattribution) automatically. Extends Control.
+ */
+
+L.Control.Attribution = L.Control.extend({
+	// @section
+	// @aka Control.Attribution options
+	options: {
+		position: 'bottomright',
+
+		// @option prefix: String = 'Leaflet'
+		// The HTML text shown before the attributions. Pass `false` to disable.
+		prefix: '<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'
+	},
+
+	initialize: function (options) {
+		L.setOptions(this, options);
+
+		this._attributions = {};
+	},
+
+	onAdd: function (map) {
+		map.attributionControl = this;
+		this._container = L.DomUtil.create('div', 'leaflet-control-attribution');
+		if (L.DomEvent) {
+			L.DomEvent.disableClickPropagation(this._container);
+		}
+
+		// TODO ugly, refactor
+		for (var i in map._layers) {
+			if (map._layers[i].getAttribution) {
+				this.addAttribution(map._layers[i].getAttribution());
+			}
+		}
+
+		this._update();
+
+		return this._container;
+	},
+
+	// @method setPrefix(prefix: String): this
+	// Sets the text before the attributions.
+	setPrefix: function (prefix) {
+		this.options.prefix = prefix;
+		this._update();
+		return this;
+	},
+
+	// @method addAttribution(text: String): this
+	// Adds an attribution text (e.g. `'Vector data &copy; Mapbox'`).
+	addAttribution: function (text) {
+		if (!text) { return this; }
+
+		if (!this._attributions[text]) {
+			this._attributions[text] = 0;
+		}
+		this._attributions[text]++;
+
+		this._update();
+
+		return this;
+	},
+
+	// @method removeAttribution(text: String): this
+	// Removes an attribution text.
+	removeAttribution: function (text) {
+		if (!text) { return this; }
+
+		if (this._attributions[text]) {
+			this._attributions[text]--;
+			this._update();
+		}
+
+		return this;
+	},
+
+	_update: function () {
+		if (!this._map) { return; }
+
+		var attribs = [];
+
+		for (var i in this._attributions) {
+			if (this._attributions[i]) {
+				attribs.push(i);
+			}
+		}
+
+		var prefixAndAttribs = [];
+
+		if (this.options.prefix) {
+			prefixAndAttribs.push(this.options.prefix);
+		}
+		if (attribs.length) {
+			prefixAndAttribs.push(attribs.join(', '));
+		}
+
+		this._container.innerHTML = prefixAndAttribs.join(' | ');
+	}
+});
+
+// @namespace Map
+// @section Control options
+// @option attributionControl: Boolean = true
+// Whether a [attribution control](#control-attribution) is added to the map by default.
+L.Map.mergeOptions({
+	attributionControl: true
+});
+
+L.Map.addInitHook(function () {
+	if (this.options.attributionControl) {
+		new L.Control.Attribution().addTo(this);
+	}
+});
+
+// @namespace Control.Attribution
+// @factory L.control.attribution(options: Control.Attribution options)
+// Creates an attribution control.
+L.control.attribution = function (options) {
+	return new L.Control.Attribution(options);
+};
+
+
+
+/*
+ * @class Control.Scale
+ * @aka L.Control.Scale
+ * @inherits Control
+ *
+ * A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends `Control`.
+ *
+ * @example
+ *
+ * ```js
+ * L.control.scale().addTo(map);
+ * ```
+ */
+
+L.Control.Scale = L.Control.extend({
+	// @section
+	// @aka Control.Scale options
+	options: {
+		position: 'bottomleft',
+
+		// @option maxWidth: Number = 100
+		// Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).
+		maxWidth: 100,
+
+		// @option metric: Boolean = True
+		// Whether to show the metric scale line (m/km).
+		metric: true,
+
+		// @option imperial: Boolean = True
+		// Whether to show the imperial scale line (mi/ft).
+		imperial: true
+
+		// @option updateWhenIdle: Boolean = false
+		// If `true`, the control is updated on [`moveend`](#map-moveend), otherwise it's always up-to-date (updated on [`move`](#map-move)).
+	},
+
+	onAdd: function (map) {
+		var className = 'leaflet-control-scale',
+		    container = L.DomUtil.create('div', className),
+		    options = this.options;
+
+		this._addScales(options, className + '-line', container);
+
+		map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);
+		map.whenReady(this._update, this);
+
+		return container;
+	},
+
+	onRemove: function (map) {
+		map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);
+	},
+
+	_addScales: function (options, className, container) {
+		if (options.metric) {
+			this._mScale = L.DomUtil.create('div', className, container);
+		}
+		if (options.imperial) {
+			this._iScale = L.DomUtil.create('div', className, container);
+		}
+	},
+
+	_update: function () {
+		var map = this._map,
+		    y = map.getSize().y / 2;
+
+		var maxMeters = map.distance(
+				map.containerPointToLatLng([0, y]),
+				map.containerPointToLatLng([this.options.maxWidth, y]));
+
+		this._updateScales(maxMeters);
+	},
+
+	_updateScales: function (maxMeters) {
+		if (this.options.metric && maxMeters) {
+			this._updateMetric(maxMeters);
+		}
+		if (this.options.imperial && maxMeters) {
+			this._updateImperial(maxMeters);
+		}
+	},
+
+	_updateMetric: function (maxMeters) {
+		var meters = this._getRoundNum(maxMeters),
+		    label = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';
+
+		this._updateScale(this._mScale, label, meters / maxMeters);
+	},
+
+	_updateImperial: function (maxMeters) {
+		var maxFeet = maxMeters * 3.2808399,
+		    maxMiles, miles, feet;
+
+		if (maxFeet > 5280) {
+			maxMiles = maxFeet / 5280;
+			miles = this._getRoundNum(maxMiles);
+			this._updateScale(this._iScale, miles + ' mi', miles / maxMiles);
+
+		} else {
+			feet = this._getRoundNum(maxFeet);
+			this._updateScale(this._iScale, feet + ' ft', feet / maxFeet);
+		}
+	},
+
+	_updateScale: function (scale, text, ratio) {
+		scale.style.width = Math.round(this.options.maxWidth * ratio) + 'px';
+		scale.innerHTML = text;
+	},
+
+	_getRoundNum: function (num) {
+		var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),
+		    d = num / pow10;
+
+		d = d >= 10 ? 10 :
+		    d >= 5 ? 5 :
+		    d >= 3 ? 3 :
+		    d >= 2 ? 2 : 1;
+
+		return pow10 * d;
+	}
+});
+
+
+// @factory L.control.scale(options?: Control.Scale options)
+// Creates an scale control with the given options.
+L.control.scale = function (options) {
+	return new L.Control.Scale(options);
+};
+
+
+
+/*
+ * @class Control.Layers
+ * @aka L.Control.Layers
+ * @inherits Control
+ *
+ * The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the [detailed example](http://leafletjs.com/examples/layers-control.html)). Extends `Control`.
+ *
+ * @example
+ *
+ * ```js
+ * var baseLayers = {
+ * 	"Mapbox": mapbox,
+ * 	"OpenStreetMap": osm
+ * };
+ *
+ * var overlays = {
+ * 	"Marker": marker,
+ * 	"Roads": roadsLayer
+ * };
+ *
+ * L.control.layers(baseLayers, overlays).addTo(map);
+ * ```
+ *
+ * The `baseLayers` and `overlays` parameters are object literals with layer names as keys and `Layer` objects as values:
+ *
+ * ```js
+ * {
+ *     "<someName1>": layer1,
+ *     "<someName2>": layer2
+ * }
+ * ```
+ *
+ * The layer names can contain HTML, which allows you to add additional styling to the items:
+ *
+ * ```js
+ * {"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>": myLayer}
+ * ```
+ */
+
+
+L.Control.Layers = L.Control.extend({
+	// @section
+	// @aka Control.Layers options
+	options: {
+		// @option collapsed: Boolean = true
+		// If `true`, the control will be collapsed into an icon and expanded on mouse hover or touch.
+		collapsed: true,
+		position: 'topright',
+
+		// @option autoZIndex: Boolean = true
+		// If `true`, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.
+		autoZIndex: true,
+
+		// @option hideSingleBase: Boolean = false
+		// If `true`, the base layers in the control will be hidden when there is only one.
+		hideSingleBase: false,
+
+		// @option sortLayers: Boolean = false
+		// Whether to sort the layers. When `false`, layers will keep the order
+		// in which they were added to the control.
+		sortLayers: false,
+
+		// @option sortFunction: Function = *
+		// A [compare function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)
+		// that will be used for sorting the layers, when `sortLayers` is `true`.
+		// The function receives both the `L.Layer` instances and their names, as in
+		// `sortFunction(layerA, layerB, nameA, nameB)`.
+		// By default, it sorts layers alphabetically by their name.
+		sortFunction: function (layerA, layerB, nameA, nameB) {
+			return nameA < nameB ? -1 : (nameB < nameA ? 1 : 0);
+		}
+	},
+
+	initialize: function (baseLayers, overlays, options) {
+		L.setOptions(this, options);
+
+		this._layers = [];
+		this._lastZIndex = 0;
+		this._handlingClick = false;
+
+		for (var i in baseLayers) {
+			this._addLayer(baseLayers[i], i);
+		}
+
+		for (i in overlays) {
+			this._addLayer(overlays[i], i, true);
+		}
+	},
+
+	onAdd: function (map) {
+		this._initLayout();
+		this._update();
+
+		this._map = map;
+		map.on('zoomend', this._checkDisabledLayers, this);
+
+		return this._container;
+	},
+
+	onRemove: function () {
+		this._map.off('zoomend', this._checkDisabledLayers, this);
+
+		for (var i = 0; i < this._layers.length; i++) {
+			this._layers[i].layer.off('add remove', this._onLayerChange, this);
+		}
+	},
+
+	// @method addBaseLayer(layer: Layer, name: String): this
+	// Adds a base layer (radio button entry) with the given name to the control.
+	addBaseLayer: function (layer, name) {
+		this._addLayer(layer, name);
+		return (this._map) ? this._update() : this;
+	},
+
+	// @method addOverlay(layer: Layer, name: String): this
+	// Adds an overlay (checkbox entry) with the given name to the control.
+	addOverlay: function (layer, name) {
+		this._addLayer(layer, name, true);
+		return (this._map) ? this._update() : this;
+	},
+
+	// @method removeLayer(layer: Layer): this
+	// Remove the given layer from the control.
+	removeLayer: function (layer) {
+		layer.off('add remove', this._onLayerChange, this);
+
+		var obj = this._getLayer(L.stamp(layer));
+		if (obj) {
+			this._layers.splice(this._layers.indexOf(obj), 1);
+		}
+		return (this._map) ? this._update() : this;
+	},
+
+	// @method expand(): this
+	// Expand the control container if collapsed.
+	expand: function () {
+		L.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded');
+		this._form.style.height = null;
+		var acceptableHeight = this._map.getSize().y - (this._container.offsetTop + 50);
+		if (acceptableHeight < this._form.clientHeight) {
+			L.DomUtil.addClass(this._form, 'leaflet-control-layers-scrollbar');
+			this._form.style.height = acceptableHeight + 'px';
+		} else {
+			L.DomUtil.removeClass(this._form, 'leaflet-control-layers-scrollbar');
+		}
+		this._checkDisabledLayers();
+		return this;
+	},
+
+	// @method collapse(): this
+	// Collapse the control container if expanded.
+	collapse: function () {
+		L.DomUtil.removeClass(this._container, 'leaflet-control-layers-expanded');
+		return this;
+	},
+
+	_initLayout: function () {
+		var className = 'leaflet-control-layers',
+		    container = this._container = L.DomUtil.create('div', className),
+		    collapsed = this.options.collapsed;
+
+		// makes this work on IE touch devices by stopping it from firing a mouseout event when the touch is released
+		container.setAttribute('aria-haspopup', true);
+
+		L.DomEvent.disableClickPropagation(container);
+		if (!L.Browser.touch) {
+			L.DomEvent.disableScrollPropagation(container);
+		}
+
+		var form = this._form = L.DomUtil.create('form', className + '-list');
+
+		if (collapsed) {
+			this._map.on('click', this.collapse, this);
+
+			if (!L.Browser.android) {
+				L.DomEvent.on(container, {
+					mouseenter: this.expand,
+					mouseleave: this.collapse
+				}, this);
+			}
+		}
+
+		var link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container);
+		link.href = '#';
+		link.title = 'Layers';
+
+		if (L.Browser.touch) {
+			L.DomEvent
+			    .on(link, 'click', L.DomEvent.stop)
+			    .on(link, 'click', this.expand, this);
+		} else {
+			L.DomEvent.on(link, 'focus', this.expand, this);
+		}
+
+		// work around for Firefox Android issue https://github.com/Leaflet/Leaflet/issues/2033
+		L.DomEvent.on(form, 'click', function () {
+			setTimeout(L.bind(this._onInputClick, this), 0);
+		}, this);
+
+		// TODO keyboard accessibility
+
+		if (!collapsed) {
+			this.expand();
+		}
+
+		this._baseLayersList = L.DomUtil.create('div', className + '-base', form);
+		this._separator = L.DomUtil.create('div', className + '-separator', form);
+		this._overlaysList = L.DomUtil.create('div', className + '-overlays', form);
+
+		container.appendChild(form);
+	},
+
+	_getLayer: function (id) {
+		for (var i = 0; i < this._layers.length; i++) {
+
+			if (this._layers[i] && L.stamp(this._layers[i].layer) === id) {
+				return this._layers[i];
+			}
+		}
+	},
+
+	_addLayer: function (layer, name, overlay) {
+		layer.on('add remove', this._onLayerChange, this);
+
+		this._layers.push({
+			layer: layer,
+			name: name,
+			overlay: overlay
+		});
+
+		if (this.options.sortLayers) {
+			this._layers.sort(L.bind(function (a, b) {
+				return this.options.sortFunction(a.layer, b.layer, a.name, b.name);
+			}, this));
+		}
+
+		if (this.options.autoZIndex && layer.setZIndex) {
+			this._lastZIndex++;
+			layer.setZIndex(this._lastZIndex);
+		}
+	},
+
+	_update: function () {
+		if (!this._container) { return this; }
+
+		L.DomUtil.empty(this._baseLayersList);
+		L.DomUtil.empty(this._overlaysList);
+
+		var baseLayersPresent, overlaysPresent, i, obj, baseLayersCount = 0;
+
+		for (i = 0; i < this._layers.length; i++) {
+			obj = this._layers[i];
+			this._addItem(obj);
+			overlaysPresent = overlaysPresent || obj.overlay;
+			baseLayersPresent = baseLayersPresent || !obj.overlay;
+			baseLayersCount += !obj.overlay ? 1 : 0;
+		}
+
+		// Hide base layers section if there's only one layer.
+		if (this.options.hideSingleBase) {
+			baseLayersPresent = baseLayersPresent && baseLayersCount > 1;
+			this._baseLayersList.style.display = baseLayersPresent ? '' : 'none';
+		}
+
+		this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';
+
+		return this;
+	},
+
+	_onLayerChange: function (e) {
+		if (!this._handlingClick) {
+			this._update();
+		}
+
+		var obj = this._getLayer(L.stamp(e.target));
+
+		// @namespace Map
+		// @section Layer events
+		// @event baselayerchange: LayersControlEvent
+		// Fired when the base layer is changed through the [layer control](#control-layers).
+		// @event overlayadd: LayersControlEvent
+		// Fired when an overlay is selected through the [layer control](#control-layers).
+		// @event overlayremove: LayersControlEvent
+		// Fired when an overlay is deselected through the [layer control](#control-layers).
+		// @namespace Control.Layers
+		var type = obj.overlay ?
+			(e.type === 'add' ? 'overlayadd' : 'overlayremove') :
+			(e.type === 'add' ? 'baselayerchange' : null);
+
+		if (type) {
+			this._map.fire(type, obj);
+		}
+	},
+
+	// IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe)
+	_createRadioElement: function (name, checked) {
+
+		var radioHtml = '<input type="radio" class="leaflet-control-layers-selector" name="' +
+				name + '"' + (checked ? ' checked="checked"' : '') + '/>';
+
+		var radioFragment = document.createElement('div');
+		radioFragment.innerHTML = radioHtml;
+
+		return radioFragment.firstChild;
+	},
+
+	_addItem: function (obj) {
+		var label = document.createElement('label'),
+		    checked = this._map.hasLayer(obj.layer),
+		    input;
+
+		if (obj.overlay) {
+			input = document.createElement('input');
+			input.type = 'checkbox';
+			input.className = 'leaflet-control-layers-selector';
+			input.defaultChecked = checked;
+		} else {
+			input = this._createRadioElement('leaflet-base-layers', checked);
+		}
+
+		input.layerId = L.stamp(obj.layer);
+
+		L.DomEvent.on(input, 'click', this._onInputClick, this);
+
+		var name = document.createElement('span');
+		name.innerHTML = ' ' + obj.name;
+
+		// Helps from preventing layer control flicker when checkboxes are disabled
+		// https://github.com/Leaflet/Leaflet/issues/2771
+		var holder = document.createElement('div');
+
+		label.appendChild(holder);
+		holder.appendChild(input);
+		holder.appendChild(name);
+
+		var container = obj.overlay ? this._overlaysList : this._baseLayersList;
+		container.appendChild(label);
+
+		this._checkDisabledLayers();
+		return label;
+	},
+
+	_onInputClick: function () {
+		var inputs = this._form.getElementsByTagName('input'),
+		    input, layer, hasLayer;
+		var addedLayers = [],
+		    removedLayers = [];
+
+		this._handlingClick = true;
+
+		for (var i = inputs.length - 1; i >= 0; i--) {
+			input = inputs[i];
+			layer = this._getLayer(input.layerId).layer;
+			hasLayer = this._map.hasLayer(layer);
+
+			if (input.checked && !hasLayer) {
+				addedLayers.push(layer);
+
+			} else if (!input.checked && hasLayer) {
+				removedLayers.push(layer);
+			}
+		}
+
+		// Bugfix issue 2318: Should remove all old layers before readding new ones
+		for (i = 0; i < removedLayers.length; i++) {
+			this._map.removeLayer(removedLayers[i]);
+		}
+		for (i = 0; i < addedLayers.length; i++) {
+			this._map.addLayer(addedLayers[i]);
+		}
+
+		this._handlingClick = false;
+
+		this._refocusOnMap();
+	},
+
+	_checkDisabledLayers: function () {
+		var inputs = this._form.getElementsByTagName('input'),
+		    input,
+		    layer,
+		    zoom = this._map.getZoom();
+
+		for (var i = inputs.length - 1; i >= 0; i--) {
+			input = inputs[i];
+			layer = this._getLayer(input.layerId).layer;
+			input.disabled = (layer.options.minZoom !== undefined && zoom < layer.options.minZoom) ||
+			                 (layer.options.maxZoom !== undefined && zoom > layer.options.maxZoom);
+
+		}
+	},
+
+	_expand: function () {
+		// Backward compatibility, remove me in 1.1.
+		return this.expand();
+	},
+
+	_collapse: function () {
+		// Backward compatibility, remove me in 1.1.
+		return this.collapse();
+	}
+
+});
+
+
+// @factory L.control.layers(baselayers?: Object, overlays?: Object, options?: Control.Layers options)
+// Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.
+L.control.layers = function (baseLayers, overlays, options) {
+	return new L.Control.Layers(baseLayers, overlays, options);
+};
+
+
+
+}(window, document));
+//# sourceMappingURL=leaflet-src.map
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-1.0.3.min.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+(function(f,b,h){var a={version:"1.0.3+ed36a04"};function d(){var i=f.L;a.noConflict=function(){f.L=i;return this};f.L=a}if(typeof module==="object"&&typeof module.exports==="object"){module.exports=a}else{if(typeof define==="function"&&define.amd){define(a)}}if(typeof f!=="undefined"){d()}a.Util={extend:function(m){var n,l,k,o;for(l=1,k=arguments.length;l<k;l++){o=arguments[l];for(n in o){m[n]=o[n]}}return m},create:Object.create||(function(){function i(){}return function(j){i.prototype=j;return new i()}})(),bind:function(j,k){var l=Array.prototype.slice;if(j.bind){return j.bind.apply(j,l.call(arguments,1))}var i=l.call(arguments,2);return function(){return j.apply(k,i.length?i.concat(l.call(arguments)):arguments)}},stamp:function(i){i._leaflet_id=i._leaflet_id||++a.Util.lastId;return i._leaflet_id},lastId:0,throttle:function(n,o,m){var l,k,j,i;i=function(){l=false;if(k){j.apply(m,k);k=false}};j=function(){if(l){k=arguments}else{n.apply(m,arguments);setTimeout(i,o);l=true}};return j},wrapNum:function(j,k,m){var i=k[1],l=k[0],n=i-l;return j===i&&m?j:((j-l)%n+n)%n+l},falseFn:function(){return false},formatNum:function(i,k){var j=Math.pow(10,k||5);return Math.round(i*j)/j},trim:function(i){return i.trim?i.trim():i.replace(/^\s+|\s+$/g,"")},splitWords:function(i){return a.Util.trim(i).split(/\s+/)},setOptions:function(l,j){if(!l.hasOwnProperty("options")){l.options=l.options?a.Util.create(l.options):{}}for(var k in j){l.options[k]=j[k]}return l.options},getParamString:function(m,j,k){var n=[];for(var l in m){n.push(encodeURIComponent(k?l.toUpperCase():l)+"="+encodeURIComponent(m[l]))}return((!j||j.indexOf("?")===-1)?"?":"&")+n.join("&")},template:function(j,i){return j.replace(a.Util.templateRe,function(m,k){var l=i[k];if(l===h){throw new Error("No value provided for variable "+m)}else{if(typeof l==="function"){l=l(i)}}return l})},templateRe:/\{ *([\w_\-]+) *\}/g,isArray:Array.isArray||function(i){return(Object.prototype.toString.call(i)==="[object Array]")},indexOf:function(l,k){for(var j=0;j<l.length;j++){if(l[j]===k){return j}}return -1},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="};(function(){function l(n){return f["webkit"+n]||f["moz"+n]||f["ms"+n]}var m=0;function j(n){var p=+new Date(),o=Math.max(0,16-(p-m));m=p+o;return f.setTimeout(n,o)}var i=f.requestAnimationFrame||l("RequestAnimationFrame")||j,k=f.cancelAnimationFrame||l("CancelAnimationFrame")||l("CancelRequestAnimationFrame")||function(n){f.clearTimeout(n)};a.Util.requestAnimFrame=function(p,o,n){if(n&&i===j){p.call(o)}else{return i.call(f,a.bind(p,o))}};a.Util.cancelAnimFrame=function(n){if(n){k.call(f,n)}}})();a.extend=a.Util.extend;a.bind=a.Util.bind;a.stamp=a.Util.stamp;a.setOptions=a.Util.setOptions;a.Class=function(){};a.Class.extend=function(k){var n=function(){if(this.initialize){this.initialize.apply(this,arguments)}this.callInitHooks()};var m=n.__super__=this.prototype;var l=a.Util.create(m);l.constructor=n;n.prototype=l;for(var j in this){if(this.hasOwnProperty(j)&&j!=="prototype"){n[j]=this[j]}}if(k.statics){a.extend(n,k.statics);delete k.statics}if(k.includes){a.Util.extend.apply(null,[l].concat(k.includes));delete k.includes}if(l.options){k.options=a.Util.extend(a.Util.create(l.options),k.options)}a.extend(l,k);l._initHooks=[];l.callInitHooks=function(){if(this._initHooksCalled){return}if(m.callInitHooks){m.callInitHooks.call(this)}this._initHooksCalled=true;for(var p=0,o=l._initHooks.length;p<o;p++){l._initHooks[p].call(this)}};return n};a.Class.include=function(i){a.extend(this.prototype,i);return this};a.Class.mergeOptions=function(i){a.extend(this.prototype.options,i);return this};a.Class.addInitHook=function(j){var i=Array.prototype.slice.call(arguments,1);var k=typeof j==="function"?j:function(){this[j].apply(this,i)};this.prototype._initHooks=this.prototype._initHooks||[];this.prototype._initHooks.push(k);return this};a.Evented=a.Class.extend({on:function(m,o,l){if(typeof m==="object"){for(var n in m){this._on(n,m[n],o)}}else{m=a.Util.splitWords(m);for(var k=0,j=m.length;k<j;k++){this._on(m[k],o,l)}}return this},off:function(m,o,l){if(!m){delete this._events}else{if(typeof m==="object"){for(var n in m){this._off(n,m[n],o)}}else{m=a.Util.splitWords(m);for(var k=0,j=m.length;k<j;k++){this._off(m[k],o,l)}}}return this},_on:function(q,p,n){this._events=this._events||{};var k=this._events[q];if(!k){k=[];this._events[q]=k}if(n===this){n=h}var l={fn:p,ctx:n},o=k;for(var m=0,j=o.length;m<j;m++){if(o[m].fn===p&&o[m].ctx===n){return}}o.push(l)},_off:function(q,p,n){var o,m,j;if(!this._events){return}o=this._events[q];if(!o){return}if(!p){for(m=0,j=o.length;m<j;m++){o[m].fn=a.Util.falseFn}delete this._events[q];return}if(n===this){n=h}if(o){for(m=0,j=o.length;m<j;m++){var k=o[m];if(k.ctx!==n){continue}if(k.fn===p){k.fn=a.Util.falseFn;if(this._firingCount){this._events[q]=o=o.slice()}o.splice(m,1);return}}}},fire:function(p,r,k){if(!this.listens(p,k)){return this}var q=a.Util.extend({},r,{type:p,target:this});if(this._events){var o=this._events[p];if(o){this._firingCount=(this._firingCount+1)||1;for(var n=0,j=o.length;n<j;n++){var m=o[n];m.fn.call(m.ctx||this,q)}this._firingCount--}}if(k){this._propagateEvent(q)}return this},listens:function(k,i){var j=this._events&&this._events[k];if(j&&j.length){return true}if(i){for(var l in this._eventParents){if(this._eventParents[l].listens(k,i)){return true}}}return false},once:function(j,m,i){if(typeof j==="object"){for(var l in j){this.once(l,j[l],m)}return this}var k=a.bind(function(){this.off(j,m,i).off(j,k,i)},this);return this.on(j,m,i).on(j,k,i)},addEventParent:function(i){this._eventParents=this._eventParents||{};this._eventParents[a.stamp(i)]=i;return this},removeEventParent:function(i){if(this._eventParents){delete this._eventParents[a.stamp(i)]}return this},_propagateEvent:function(i){for(var j in this._eventParents){this._eventParents[j].fire(i.type,a.extend({layer:i.target},i),true)}}});var e=a.Evented.prototype;e.addEventListener=e.on;e.removeEventListener=e.clearAllEventListeners=e.off;e.addOneTimeEventListener=e.once;e.fireEvent=e.fire;e.hasEventListeners=e.listens;a.Mixin={Events:e};(function(){var l=navigator.userAgent.toLowerCase(),u=b.documentElement,k="ActiveXObject" in f,v=l.indexOf("webkit")!==-1,x=l.indexOf("phantom")!==-1,s=l.search("android [23]")!==-1,q=l.indexOf("chrome")!==-1,m=l.indexOf("gecko")!==-1&&!v&&!f.opera&&!k,t=navigator.platform.indexOf("Win")===0,j=typeof orientation!=="undefined"||l.indexOf("mobile")!==-1,o=!f.PointerEvent&&f.MSPointerEvent,i=f.PointerEvent||o,r=k&&("transition" in u.style),w=("WebKitCSSMatrix" in f)&&("m11" in new f.WebKitCSSMatrix())&&!s,n="MozPerspective" in u.style,y="OTransition" in u.style;var p=!f.L_NO_TOUCH&&(i||"ontouchstart" in f||(f.DocumentTouch&&b instanceof f.DocumentTouch));a.Browser={ie:k,ielt9:k&&!b.addEventListener,edge:"msLaunchUri" in navigator&&!("documentMode" in b),webkit:v,gecko:m,android:l.indexOf("android")!==-1,android23:s,chrome:q,safari:!q&&l.indexOf("safari")!==-1,win:t,ie3d:r,webkit3d:w,gecko3d:n,opera12:y,any3d:!f.L_DISABLE_3D&&(r||w||n)&&!y&&!x,mobile:j,mobileWebkit:j&&v,mobileWebkit3d:j&&w,mobileOpera:j&&f.opera,mobileGecko:j&&m,touch:!!p,msPointer:!!o,pointer:!!i,retina:(f.devicePixelRatio||(f.screen.deviceXDPI/f.screen.logicalXDPI))>1}}());a.Point=function(i,k,j){this.x=(j?Math.round(i):i);this.y=(j?Math.round(k):k)};a.Point.prototype={clone:function(){return new a.Point(this.x,this.y)},add:function(i){return this.clone()._add(a.point(i))},_add:function(i){this.x+=i.x;this.y+=i.y;return this},subtract:function(i){return this.clone()._subtract(a.point(i))},_subtract:function(i){this.x-=i.x;this.y-=i.y;return this},divideBy:function(i){return this.clone()._divideBy(i)},_divideBy:function(i){this.x/=i;this.y/=i;return this},multiplyBy:function(i){return this.clone()._multiplyBy(i)},_multiplyBy:function(i){this.x*=i;this.y*=i;return this},scaleBy:function(i){return new a.Point(this.x*i.x,this.y*i.y)},unscaleBy:function(i){return new a.Point(this.x/i.x,this.y/i.y)},round:function(){return this.clone()._round()},_round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},floor:function(){return this.clone()._floor()},_floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){return this.clone()._ceil()},_ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},distanceTo:function(j){j=a.point(j);var i=j.x-this.x,k=j.y-this.y;return Math.sqrt(i*i+k*k)},equals:function(i){i=a.point(i);return i.x===this.x&&i.y===this.y},contains:function(i){i=a.point(i);return Math.abs(i.x)<=Math.abs(this.x)&&Math.abs(i.y)<=Math.abs(this.y)},toString:function(){return"Point("+a.Util.formatNum(this.x)+", "+a.Util.formatNum(this.y)+")"}};a.point=function(i,k,j){if(i instanceof a.Point){return i}if(a.Util.isArray(i)){return new a.Point(i[0],i[1])}if(i===h||i===null){return i}if(typeof i==="object"&&"x" in i&&"y" in i){return new a.Point(i.x,i.y)}return new a.Point(i,k,j)};a.Bounds=function(l,k){if(!l){return}var n=k?[l,k]:l;for(var m=0,j=n.length;m<j;m++){this.extend(n[m])}};a.Bounds.prototype={extend:function(i){i=a.point(i);if(!this.min&&!this.max){this.min=i.clone();this.max=i.clone()}else{this.min.x=Math.min(i.x,this.min.x);this.max.x=Math.max(i.x,this.max.x);this.min.y=Math.min(i.y,this.min.y);this.max.y=Math.max(i.y,this.max.y)}return this},getCenter:function(i){return new a.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,i)},getBottomLeft:function(){return new a.Point(this.min.x,this.max.y)},getTopRight:function(){return new a.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(k){var j,i;if(typeof k[0]==="number"||k instanceof a.Point){k=a.point(k)}else{k=a.bounds(k)}if(k instanceof a.Bounds){j=k.min;i=k.max}else{j=i=k}return(j.x>=this.min.x)&&(i.x<=this.max.x)&&(j.y>=this.min.y)&&(i.y<=this.max.y)},intersects:function(n){n=a.bounds(n);var l=this.min,i=this.max,m=n.min,j=n.max,k=(j.x>=l.x)&&(m.x<=i.x),o=(j.y>=l.y)&&(m.y<=i.y);return k&&o},overlaps:function(o){o=a.bounds(o);var l=this.min,i=this.max,n=o.min,j=o.max,m=(j.x>l.x)&&(n.x<i.x),k=(j.y>l.y)&&(n.y<i.y);return m&&k},isValid:function(){return !!(this.min&&this.max)}};a.bounds=function(j,i){if(!j||j instanceof a.Bounds){return j}return new a.Bounds(j,i)};a.Transformation=function(j,i,l,k){this._a=j;this._b=i;this._c=l;this._d=k};a.Transformation.prototype={transform:function(i,j){return this._transform(i.clone(),j)},_transform:function(i,j){j=j||1;i.x=j*(this._a*i.x+this._b);i.y=j*(this._c*i.y+this._d);return i},untransform:function(i,j){j=j||1;return new a.Point((i.x/j-this._b)/this._a,(i.y/j-this._d)/this._c)}};a.DomUtil={get:function(i){return typeof i==="string"?b.getElementById(i):i},getStyle:function(k,j){var l=k.style[j]||(k.currentStyle&&k.currentStyle[j]);if((!l||l==="auto")&&b.defaultView){var i=b.defaultView.getComputedStyle(k,null);l=i?i[j]:null}return l==="auto"?null:l},create:function(j,l,i){var k=b.createElement(j);k.className=l||"";if(i){i.appendChild(k)}return k},remove:function(j){var i=j.parentNode;if(i){i.removeChild(j)}},empty:function(i){while(i.firstChild){i.removeChild(i.firstChild)}},toFront:function(i){i.parentNode.appendChild(i)},toBack:function(j){var i=j.parentNode;i.insertBefore(j,i.firstChild)},hasClass:function(k,i){if(k.classList!==h){return k.classList.contains(i)}var j=a.DomUtil.getClass(k);return j.length>0&&new RegExp("(^|\\s)"+i+"(\\s|$)").test(j)},addClass:function(o,k){if(o.classList!==h){var m=a.Util.splitWords(k);for(var l=0,j=m.length;l<j;l++){o.classList.add(m[l])}}else{if(!a.DomUtil.hasClass(o,k)){var n=a.DomUtil.getClass(o);a.DomUtil.setClass(o,(n?n+" ":"")+k)}}},removeClass:function(j,i){if(j.classList!==h){j.classList.remove(i)}else{a.DomUtil.setClass(j,a.Util.trim((" "+a.DomUtil.getClass(j)+" ").replace(" "+i+" "," ")))}},setClass:function(j,i){if(j.className.baseVal===h){j.className=i}else{j.className.baseVal=i}},getClass:function(i){return i.className.baseVal===h?i.className:i.className.baseVal},setOpacity:function(i,j){if("opacity" in i.style){i.style.opacity=j}else{if("filter" in i.style){a.DomUtil._setOpacityIE(i,j)}}},_setOpacityIE:function(k,l){var j=false,i="DXImageTransform.Microsoft.Alpha";try{j=k.filters.item(i)}catch(m){if(l===1){return}}l=Math.round(l*100);if(j){j.Enabled=(l!==100);j.Opacity=l}else{k.style.filter+=" progid:"+i+"(opacity="+l+")"}},testProp:function(l){var k=b.documentElement.style;for(var j=0;j<l.length;j++){if(l[j] in k){return l[j]}}return false},setTransform:function(i,k,j){var l=k||new a.Point(0,0);i.style[a.DomUtil.TRANSFORM]=(a.Browser.ie3d?"translate("+l.x+"px,"+l.y+"px)":"translate3d("+l.x+"px,"+l.y+"px,0)")+(j?" scale("+j+")":"")},setPosition:function(j,i){j._leaflet_pos=i;if(a.Browser.any3d){a.DomUtil.setTransform(j,i)}else{j.style.left=i.x+"px";j.style.top=i.y+"px"}},getPosition:function(i){return i._leaflet_pos||new a.Point(0,0)}};(function(){a.DomUtil.TRANSFORM=a.DomUtil.testProp(["transform","WebkitTransform","OTransform","MozTransform","msTransform"]);var j=a.DomUtil.TRANSITION=a.DomUtil.testProp(["webkitTransition","transition","OTransition","MozTransition","msTransition"]);a.DomUtil.TRANSITION_END=j==="webkitTransition"||j==="OTransition"?j+"End":"transitionend";if("onselectstart" in b){a.DomUtil.disableTextSelection=function(){a.DomEvent.on(f,"selectstart",a.DomEvent.preventDefault)};a.DomUtil.enableTextSelection=function(){a.DomEvent.off(f,"selectstart",a.DomEvent.preventDefault)}}else{var i=a.DomUtil.testProp(["userSelect","WebkitUserSelect","OUserSelect","MozUserSelect","msUserSelect"]);a.DomUtil.disableTextSelection=function(){if(i){var k=b.documentElement.style;this._userSelect=k[i];k[i]="none"}};a.DomUtil.enableTextSelection=function(){if(i){b.documentElement.style[i]=this._userSelect;delete this._userSelect}}}a.DomUtil.disableImageDrag=function(){a.DomEvent.on(f,"dragstart",a.DomEvent.preventDefault)};a.DomUtil.enableImageDrag=function(){a.DomEvent.off(f,"dragstart",a.DomEvent.preventDefault)};a.DomUtil.preventOutline=function(k){while(k.tabIndex===-1){k=k.parentNode}if(!k||!k.style){return}a.DomUtil.restoreOutline();this._outlineElement=k;this._outlineStyle=k.style.outline;k.style.outline="none";a.DomEvent.on(f,"keydown",a.DomUtil.restoreOutline,this)};a.DomUtil.restoreOutline=function(){if(!this._outlineElement){return}this._outlineElement.style.outline=this._outlineStyle;delete this._outlineElement;delete this._outlineStyle;a.DomEvent.off(f,"keydown",a.DomUtil.restoreOutline,this)}})();a.LatLng=function(k,i,j){if(isNaN(k)||isNaN(i)){throw new Error("Invalid LatLng object: ("+k+", "+i+")")}this.lat=+k;this.lng=+i;if(j!==h){this.alt=+j}};a.LatLng.prototype={equals:function(k,i){if(!k){return false}k=a.latLng(k);var j=Math.max(Math.abs(this.lat-k.lat),Math.abs(this.lng-k.lng));return j<=(i===h?1e-9:i)},toString:function(i){return"LatLng("+a.Util.formatNum(this.lat,i)+", "+a.Util.formatNum(this.lng,i)+")"},distanceTo:function(i){return a.CRS.Earth.distance(this,a.latLng(i))},wrap:function(){return a.CRS.Earth.wrapLatLng(this)},toBounds:function(j){var k=180*j/40075017,i=k/Math.cos((Math.PI/180)*this.lat);return a.latLngBounds([this.lat-k,this.lng-i],[this.lat+k,this.lng+i])},clone:function(){return new a.LatLng(this.lat,this.lng,this.alt)}};a.latLng=function(j,i,k){if(j instanceof a.LatLng){return j}if(a.Util.isArray(j)&&typeof j[0]!=="object"){if(j.length===3){return new a.LatLng(j[0],j[1],j[2])}if(j.length===2){return new a.LatLng(j[0],j[1])}return null}if(j===h||j===null){return j}if(typeof j==="object"&&"lat" in j){return new a.LatLng(j.lat,"lng" in j?j.lng:j.lon,j.alt)}if(i===h){return null}return new a.LatLng(j,i,k)};a.LatLngBounds=function(m,l){if(!m){return}var k=l?[m,l]:m;for(var n=0,j=k.length;n<j;n++){this.extend(k[n])}};a.LatLngBounds.prototype={extend:function(m){var i=this._southWest,l=this._northEast,j,k;if(m instanceof a.LatLng){j=m;k=m}else{if(m instanceof a.LatLngBounds){j=m._southWest;k=m._northEast;if(!j||!k){return this}}else{return m?this.extend(a.latLng(m)||a.latLngBounds(m)):this}}if(!i&&!l){this._southWest=new a.LatLng(j.lat,j.lng);this._northEast=new a.LatLng(k.lat,k.lng)}else{i.lat=Math.min(j.lat,i.lat);i.lng=Math.min(j.lng,i.lng);l.lat=Math.max(k.lat,l.lat);l.lng=Math.max(k.lng,l.lng)}return this},pad:function(l){var j=this._southWest,m=this._northEast,i=Math.abs(j.lat-m.lat)*l,k=Math.abs(j.lng-m.lng)*l;return new a.LatLngBounds(new a.LatLng(j.lat-i,j.lng-k),new a.LatLng(m.lat+i,m.lng+k))},getCenter:function(){return new a.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new a.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new a.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(m){if(typeof m[0]==="number"||m instanceof a.LatLng||"lat" in m){m=a.latLng(m)}else{m=a.latLngBounds(m)}var i=this._southWest,l=this._northEast,j,k;if(m instanceof a.LatLngBounds){j=m.getSouthWest();k=m.getNorthEast()}else{j=k=m}return(j.lat>=i.lat)&&(k.lat<=l.lat)&&(j.lng>=i.lng)&&(k.lng<=l.lng)},intersects:function(l){l=a.latLngBounds(l);var i=this._southWest,o=this._northEast,j=l.getSouthWest(),n=l.getNorthEast(),m=(n.lat>=i.lat)&&(j.lat<=o.lat),k=(n.lng>=i.lng)&&(j.lng<=o.lng);return m&&k},overlaps:function(m){m=a.latLngBounds(m);var i=this._southWest,o=this._northEast,j=m.getSouthWest(),n=m.getNorthEast(),l=(n.lat>i.lat)&&(j.lat<o.lat),k=(n.lng>i.lng)&&(j.lng<o.lng);return l&&k},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(i){if(!i){return false}i=a.latLngBounds(i);return this._southWest.equals(i.getSouthWest())&&this._northEast.equals(i.getNorthEast())},isValid:function(){return !!(this._southWest&&this._northEast)}};a.latLngBounds=function(j,i){if(j instanceof a.LatLngBounds){return j}return new a.LatLngBounds(j,i)};a.Projection={};a.Projection.LonLat={project:function(i){return new a.Point(i.lng,i.lat)},unproject:function(i){return new a.LatLng(i.y,i.x)},bounds:a.bounds([-180,-90],[180,90])};a.Projection.SphericalMercator={R:6378137,MAX_LATITUDE:85.0511287798,project:function(m){var l=Math.PI/180,i=this.MAX_LATITUDE,k=Math.max(Math.min(i,m.lat),-i),j=Math.sin(k*l);return new a.Point(this.R*m.lng*l,this.R*Math.log((1+j)/(1-j))/2)},unproject:function(i){var j=180/Math.PI;return new a.LatLng((2*Math.atan(Math.exp(i.y/this.R))-(Math.PI/2))*j,i.x*j/this.R)},bounds:(function(){var i=6378137*Math.PI;return a.bounds([-i,-i],[i,i])})()};a.CRS={latLngToPoint:function(l,j){var i=this.projection.project(l),k=this.scale(j);return this.transformation._transform(i,k)},pointToLatLng:function(i,k){var l=this.scale(k),j=this.transformation.untransform(i,l);return this.projection.unproject(j)},project:function(i){return this.projection.project(i)},unproject:function(i){return this.projection.unproject(i)},scale:function(i){return 256*Math.pow(2,i)},zoom:function(i){return Math.log(i/256)/Math.LN2},getProjectedBounds:function(m){if(this.infinite){return null}var j=this.projection.bounds,l=this.scale(m),k=this.transformation.transform(j.min,l),i=this.transformation.transform(j.max,l);return a.bounds(k,i)},infinite:false,wrapLatLng:function(l){var i=this.wrapLng?a.Util.wrapNum(l.lng,this.wrapLng,true):l.lng,k=this.wrapLat?a.Util.wrapNum(l.lat,this.wrapLat,true):l.lat,j=l.alt;return a.latLng(k,i,j)},wrapLatLngBounds:function(i){var j=i.getCenter(),k=this.wrapLatLng(j),n=j.lat-k.lat,o=j.lng-k.lng;if(n===0&&o===0){return i}var p=i.getSouthWest(),l=i.getNorthEast(),q=a.latLng({lat:p.lat-n,lng:p.lng-o}),m=a.latLng({lat:l.lat-n,lng:l.lng-o});return new a.LatLngBounds(q,m)}};a.CRS.Simple=a.extend({},a.CRS,{projection:a.Projection.LonLat,transformation:new a.Transformation(1,0,-1,0),scale:function(i){return Math.pow(2,i)},zoom:function(i){return Math.log(i)/Math.LN2},distance:function(i,l){var k=l.lng-i.lng,j=l.lat-i.lat;return Math.sqrt(k*k+j*j)},infinite:true});a.CRS.Earth=a.extend({},a.CRS,{wrapLng:[-180,180],R:6371000,distance:function(j,n){var i=Math.PI/180,m=j.lat*i,l=n.lat*i,k=Math.sin(m)*Math.sin(l)+Math.cos(m)*Math.cos(l)*Math.cos((n.lng-j.lng)*i);return this.R*Math.acos(Math.min(k,1))}});a.CRS.EPSG3857=a.extend({},a.CRS.Earth,{code:"EPSG:3857",projection:a.Projection.SphericalMercator,transformation:(function(){var i=0.5/(Math.PI*a.Projection.SphericalMercator.R);return new a.Transformation(i,0.5,-i,0.5)}())});a.CRS.EPSG900913=a.extend({},a.CRS.EPSG3857,{code:"EPSG:900913"});a.CRS.EPSG4326=a.extend({},a.CRS.Earth,{code:"EPSG:4326",projection:a.Projection.LonLat,transformation:new a.Transformation(1/180,1,-1/180,0.5)});a.Map=a.Evented.extend({options:{crs:a.CRS.EPSG3857,center:h,zoom:h,minZoom:h,maxZoom:h,layers:[],maxBounds:h,renderer:h,zoomAnimation:true,zoomAnimationThreshold:4,fadeAnimation:true,markerZoomAnimation:true,transform3DLimit:8388608,zoomSnap:1,zoomDelta:1,trackResize:true},initialize:function(j,i){i=a.setOptions(this,i);this._initContainer(j);this._initLayout();this._onResize=a.bind(this._onResize,this);this._initEvents();if(i.maxBounds){this.setMaxBounds(i.maxBounds)}if(i.zoom!==h){this._zoom=this._limitZoom(i.zoom)}if(i.center&&i.zoom!==h){this.setView(a.latLng(i.center),i.zoom,{reset:true})}this._handlers=[];this._layers={};this._zoomBoundLayers={};this._sizeChanged=true;this.callInitHooks();this._zoomAnimated=a.DomUtil.TRANSITION&&a.Browser.any3d&&!a.Browser.mobileOpera&&this.options.zoomAnimation;if(this._zoomAnimated){this._createAnimProxy();a.DomEvent.on(this._proxy,a.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}this._addLayers(this.options.layers)},setView:function(i,l,j){l=l===h?this._zoom:this._limitZoom(l);i=this._limitCenter(a.latLng(i),l,this.options.maxBounds);j=j||{};this._stop();if(this._loaded&&!j.reset&&j!==true){if(j.animate!==h){j.zoom=a.extend({animate:j.animate},j.zoom);j.pan=a.extend({animate:j.animate,duration:j.duration},j.pan)}var k=(this._zoom!==l)?this._tryAnimatedZoom&&this._tryAnimatedZoom(i,l,j.zoom):this._tryAnimatedPan(i,j.pan);if(k){clearTimeout(this._sizeTimer);return this}}this._resetView(i,l);return this},setZoom:function(j,i){if(!this._loaded){this._zoom=j;return this}return this.setView(this.getCenter(),j,{zoom:i})},zoomIn:function(j,i){j=j||(a.Browser.any3d?this.options.zoomDelta:1);return this.setZoom(this._zoom+j,i)},zoomOut:function(j,i){j=j||(a.Browser.any3d?this.options.zoomDelta:1);return this.setZoom(this._zoom-j,i)},setZoomAround:function(p,n,m){var o=this.getZoomScale(n),l=this.getSize().divideBy(2),k=p instanceof a.Point?p:this.latLngToContainerPoint(p),i=k.subtract(l).multiplyBy(1-1/o),j=this.containerPointToLatLng(l.add(i));return this.setView(j,n,{zoom:m})},_getBoundsCenterZoom:function(j,q){q=q||{};j=j.getBounds?j.getBounds():a.latLngBounds(j);var l=a.point(q.paddingTopLeft||q.padding||[0,0]),k=a.point(q.paddingBottomRight||q.padding||[0,0]),p=this.getBoundsZoom(j,false,l.add(k));p=(typeof q.maxZoom==="number")?Math.min(q.maxZoom,p):p;var n=k.subtract(l).divideBy(2),o=this.project(j.getSouthWest(),p),m=this.project(j.getNorthEast(),p),i=this.unproject(o.add(m).divideBy(2).add(n),p);return{center:i,zoom:p}},fitBounds:function(j,i){j=a.latLngBounds(j);if(!j.isValid()){throw new Error("Bounds are not valid.")}var k=this._getBoundsCenterZoom(j,i);return this.setView(k.center,k.zoom,i)},fitWorld:function(i){return this.fitBounds([[-90,-180],[90,180]],i)},panTo:function(i,j){return this.setView(i,this._zoom,{pan:j})},panBy:function(k,i){k=a.point(k).round();i=i||{};if(!k.x&&!k.y){return this.fire("moveend")}if(i.animate!==true&&!this.getSize().contains(k)){this._resetView(this.unproject(this.project(this.getCenter()).add(k)),this.getZoom());return this}if(!this._panAnim){this._panAnim=new a.PosAnimation();this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)}if(!i.noMoveStart){this.fire("movestart")}if(i.animate!==false){a.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var j=this._getMapPanePos().subtract(k).round();this._panAnim.run(this._mapPane,j,i.duration||0.25,i.easeLinearity)}else{this._rawPanBy(k);this.fire("move").fire("moveend")}return this},flyTo:function(F,C,n){n=n||{};if(n.animate===false||!a.Browser.any3d){return this.setView(F,C,n)}this._stop();var G=this.project(this.getCenter()),l=this.project(F),E=this.getSize(),s=this._zoom;F=a.latLng(F);C=C===h?s:C;var z=Math.max(E.x,E.y),y=z*this.getZoomScale(s,C),I=(l.distanceTo(G))||1,k=1.42,q=k*k;function D(K){var J=K?-1:1,w=K?y:z,N=y*y-z*z+J*q*q*I*I,u=2*w*q*I,r=N/u,M=Math.sqrt(r*r+1)-r;var L=M<1e-9?-18:Math.log(M);return L}function v(r){return(Math.exp(r)-Math.exp(-r))/2}function j(r){return(Math.exp(r)+Math.exp(-r))/2}function m(r){return v(r)/j(r)}var H=D(0);function x(r){return z*(j(H)/j(H+k*r))}function A(r){return z*(j(H)*m(H+k*r)-v(H))/q}function t(r){return 1-Math.pow(1-r,1.5)}var p=Date.now(),o=(D(1)-H)/k,i=n.duration?1000*n.duration:1000*o*0.8;function B(){var r=(Date.now()-p)/i,u=t(r)*o;if(r<=1){this._flyToFrame=a.Util.requestAnimFrame(B,this);this._move(this.unproject(G.add(l.subtract(G).multiplyBy(A(u)/I)),s),this.getScaleZoom(z/x(u),s),{flyTo:true})}else{this._move(F,C)._moveEnd(true)}}this._moveStart(true);B.call(this);return this},flyToBounds:function(j,i){var k=this._getBoundsCenterZoom(j,i);return this.flyTo(k.center,k.zoom,i)},setMaxBounds:function(i){i=a.latLngBounds(i);if(!i.isValid()){this.options.maxBounds=null;return this.off("moveend",this._panInsideMaxBounds)}else{if(this.options.maxBounds){this.off("moveend",this._panInsideMaxBounds)}}this.options.maxBounds=i;if(this._loaded){this._panInsideMaxBounds()}return this.on("moveend",this._panInsideMaxBounds)},setMinZoom:function(i){this.options.minZoom=i;if(this._loaded&&this.getZoom()<this.options.minZoom){return this.setZoom(i)}return this},setMaxZoom:function(i){this.options.maxZoom=i;if(this._loaded&&(this.getZoom()>this.options.maxZoom)){return this.setZoom(i)}return this},panInsideBounds:function(l,k){this._enforcingBounds=true;var i=this.getCenter(),j=this._limitCenter(i,this._zoom,a.latLngBounds(l));if(!i.equals(j)){this.panTo(j,k)}this._enforcingBounds=false;return this},invalidateSize:function(k){if(!this._loaded){return this}k=a.extend({animate:false,pan:true},k===true?{animate:true}:k);var l=this.getSize();this._sizeChanged=true;this._lastCenter=null;var j=this.getSize(),n=l.divideBy(2).round(),i=j.divideBy(2).round(),m=n.subtract(i);if(!m.x&&!m.y){return this}if(k.animate&&k.pan){this.panBy(m)}else{if(k.pan){this._rawPanBy(m)}this.fire("move");if(k.debounceMoveend){clearTimeout(this._sizeTimer);this._sizeTimer=setTimeout(a.bind(this.fire,this,"moveend"),200)}else{this.fire("moveend")}}return this.fire("resize",{oldSize:l,newSize:j})},stop:function(){this.setZoom(this._limitZoom(this._zoom));if(!this.options.zoomSnap){this.fire("viewreset")}return this._stop()},locate:function(i){i=this._locateOptions=a.extend({timeout:10000,watch:false},i);if(!("geolocation" in navigator)){this._handleGeolocationError({code:0,message:"Geolocation not supported."});return this}var k=a.bind(this._handleGeolocationResponse,this),j=a.bind(this._handleGeolocationError,this);if(i.watch){this._locationWatchId=navigator.geolocation.watchPosition(k,j,i)}else{navigator.geolocation.getCurrentPosition(k,j,i)}return this},stopLocate:function(){if(navigator.geolocation&&navigator.geolocation.clearWatch){navigator.geolocation.clearWatch(this._locationWatchId)}if(this._locateOptions){this._locateOptions.setView=false}return this},_handleGeolocationError:function(i){var k=i.code,j=i.message||(k===1?"permission denied":(k===2?"position unavailable":"timeout"));if(this._locateOptions.setView&&!this._loaded){this.fitWorld()}this.fire("locationerror",{code:k,message:"Geolocation error: "+j+"."})},_handleGeolocationResponse:function(o){var n=o.coords.latitude,p=o.coords.longitude,k=new a.LatLng(n,p),j=k.toBounds(o.coords.accuracy),r=this._locateOptions;if(r.setView){var q=this.getBoundsZoom(j);this.setView(k,r.maxZoom?Math.min(q,r.maxZoom):q)}var m={latlng:k,bounds:j,timestamp:o.timestamp};for(var l in o.coords){if(typeof o.coords[l]==="number"){m[l]=o.coords[l]}}this.fire("locationfound",m)},addHandler:function(i,k){if(!k){return this}var j=this[i]=new k(this);this._handlers.push(j);if(this.options[i]){j.enable()}return this},remove:function(){this._initEvents(true);if(this._containerId!==this._container._leaflet_id){throw new Error("Map container is being reused by another instance")}try{delete this._container._leaflet_id;delete this._containerId}catch(k){this._container._leaflet_id=h;this._containerId=h}a.DomUtil.remove(this._mapPane);if(this._clearControlPos){this._clearControlPos()}this._clearHandlers();if(this._loaded){this.fire("unload")}for(var j in this._layers){this._layers[j].remove()}return this},createPane:function(j,i){var k="leaflet-pane"+(j?" leaflet-"+j.replace("Pane","")+"-pane":""),l=a.DomUtil.create("div",k,i||this._mapPane);if(j){this._panes[j]=l}return l},getCenter:function(){this._checkIfLoaded();if(this._lastCenter&&!this._moved()){return this._lastCenter}return this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var j=this.getPixelBounds(),i=this.unproject(j.getBottomLeft()),k=this.unproject(j.getTopRight());return new a.LatLngBounds(i,k)},getMinZoom:function(){return this.options.minZoom===h?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===h?(this._layersMaxZoom===h?Infinity:this._layersMaxZoom):this.options.maxZoom},getBoundsZoom:function(i,l,q){i=a.latLngBounds(i);q=a.point(q||[0,0]);var r=this.getZoom()||0,m=this.getMinZoom(),p=this.getMaxZoom(),n=i.getNorthWest(),o=i.getSouthEast(),t=this.getSize().subtract(q),s=a.bounds(this.project(o,r),this.project(n,r)).getSize(),k=a.Browser.any3d?this.options.zoomSnap:1;var j=Math.min(t.x/s.x,t.y/s.y);r=this.getScaleZoom(j,r);if(k){r=Math.round(r/(k/100))*(k/100);r=l?Math.ceil(r/k)*k:Math.floor(r/k)*k}return Math.max(m,Math.min(p,r))},getSize:function(){if(!this._size||this._sizeChanged){this._size=new a.Point(this._container.clientWidth||0,this._container.clientHeight||0);this._sizeChanged=false}return this._size.clone()},getPixelBounds:function(i,k){var j=this._getTopLeftPoint(i,k);return new a.Bounds(j,j.add(this.getSize()))},getPixelOrigin:function(){this._checkIfLoaded();return this._pixelOrigin},getPixelWorldBounds:function(i){return this.options.crs.getProjectedBounds(i===h?this.getZoom():i)},getPane:function(i){return typeof i==="string"?this._panes[i]:i},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(j,k){var i=this.options.crs;k=k===h?this._zoom:k;return i.scale(j)/i.scale(k)},getScaleZoom:function(l,k){var i=this.options.crs;k=k===h?this._zoom:k;var j=i.zoom(l*i.scale(k));return isNaN(j)?Infinity:j},project:function(j,i){i=i===h?this._zoom:i;return this.options.crs.latLngToPoint(a.latLng(j),i)},unproject:function(i,j){j=j===h?this._zoom:j;return this.options.crs.pointToLatLng(a.point(i),j)},layerPointToLatLng:function(i){var j=a.point(i).add(this.getPixelOrigin());return this.unproject(j)},latLngToLayerPoint:function(j){var i=this.project(a.latLng(j))._round();return i._subtract(this.getPixelOrigin())},wrapLatLng:function(i){return this.options.crs.wrapLatLng(a.latLng(i))},wrapLatLngBounds:function(i){return this.options.crs.wrapLatLngBounds(a.latLngBounds(i))},distance:function(i,j){return this.options.crs.distance(a.latLng(i),a.latLng(j))},containerPointToLayerPoint:function(i){return a.point(i).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(i){return a.point(i).add(this._getMapPanePos())},containerPointToLatLng:function(i){var j=this.containerPointToLayerPoint(a.point(i));return this.layerPointToLatLng(j)},latLngToContainerPoint:function(i){return this.layerPointToContainerPoint(this.latLngToLayerPoint(a.latLng(i)))},mouseEventToContainerPoint:function(i){return a.DomEvent.getMousePosition(i,this._container)},mouseEventToLayerPoint:function(i){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(i))},mouseEventToLatLng:function(i){return this.layerPointToLatLng(this.mouseEventToLayerPoint(i))},_initContainer:function(j){var i=this._container=a.DomUtil.get(j);if(!i){throw new Error("Map container not found.")}else{if(i._leaflet_id){throw new Error("Map container is already initialized.")}}a.DomEvent.addListener(i,"scroll",this._onScroll,this);this._containerId=a.Util.stamp(i)},_initLayout:function(){var j=this._container;this._fadeAnimated=this.options.fadeAnimation&&a.Browser.any3d;a.DomUtil.addClass(j,"leaflet-container"+(a.Browser.touch?" leaflet-touch":"")+(a.Browser.retina?" leaflet-retina":"")+(a.Browser.ielt9?" leaflet-oldie":"")+(a.Browser.safari?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":""));var i=a.DomUtil.getStyle(j,"position");if(i!=="absolute"&&i!=="relative"&&i!=="fixed"){j.style.position="relative"}this._initPanes();if(this._initControlPos){this._initControlPos()}},_initPanes:function(){var i=this._panes={};this._paneRenderers={};this._mapPane=this.createPane("mapPane",this._container);a.DomUtil.setPosition(this._mapPane,new a.Point(0,0));this.createPane("tilePane");this.createPane("shadowPane");this.createPane("overlayPane");this.createPane("markerPane");this.createPane("tooltipPane");this.createPane("popupPane");if(!this.options.markerZoomAnimation){a.DomUtil.addClass(i.markerPane,"leaflet-zoom-hide");a.DomUtil.addClass(i.shadowPane,"leaflet-zoom-hide")}},_resetView:function(j,k){a.DomUtil.setPosition(this._mapPane,new a.Point(0,0));var l=!this._loaded;this._loaded=true;k=this._limitZoom(k);this.fire("viewprereset");var i=this._zoom!==k;this._moveStart(i)._move(j,k)._moveEnd(i);this.fire("viewreset");if(l){this.fire("load")}},_moveStart:function(i){if(i){this.fire("zoomstart")}return this.fire("movestart")},_move:function(j,k,l){if(k===h){k=this._zoom}var i=this._zoom!==k;this._zoom=k;this._lastCenter=j;this._pixelOrigin=this._getNewPixelOrigin(j);if(i||(l&&l.pinch)){this.fire("zoom",l)}return this.fire("move",l)},_moveEnd:function(i){if(i){this.fire("zoomend")}return this.fire("moveend")},_stop:function(){a.Util.cancelAnimFrame(this._flyToFrame);if(this._panAnim){this._panAnim.stop()}return this},_rawPanBy:function(i){a.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(i))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){if(!this._enforcingBounds){this.panInsideBounds(this.options.maxBounds)}},_checkIfLoaded:function(){if(!this._loaded){throw new Error("Set map center and zoom first.")}},_initEvents:function(j){if(!a.DomEvent){return}this._targets={};this._targets[a.stamp(this._container)]=this;var i=j?"off":"on";a.DomEvent[i](this._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress",this._handleDOMEvent,this);if(this.options.trackResize){a.DomEvent[i](f,"resize",this._onResize,this)}if(a.Browser.any3d&&this.options.transform3DLimit){this[i]("moveend",this._onMoveEnd)}},_onResize:function(){a.Util.cancelAnimFrame(this._resizeRequest);this._resizeRequest=a.Util.requestAnimFrame(function(){this.invalidateSize({debounceMoveend:true})},this)},_onScroll:function(){this._container.scrollTop=0;this._container.scrollLeft=0},_onMoveEnd:function(){var i=this._getMapPanePos();if(Math.max(Math.abs(i.x),Math.abs(i.y))>=this.options.transform3DLimit){this._resetView(this.getCenter(),this.getZoom())}},_findEventTargets:function(n,j){var i=[],m,l=j==="mouseout"||j==="mouseover",o=n.target||n.srcElement,k=false;while(o){m=this._targets[a.stamp(o)];if(m&&(j==="click"||j==="preclick")&&!n._simulated&&this._draggableMoved(m)){k=true;break}if(m&&m.listens(j,true)){if(l&&!a.DomEvent._isExternalTarget(o,n)){break}i.push(m);if(l){break}}if(o===this._container){break}o=o.parentNode}if(!i.length&&!k&&!l&&a.DomEvent._isExternalTarget(o,n)){i=[this]}return i},_handleDOMEvent:function(j){if(!this._loaded||a.DomEvent._skipped(j)){return}var i=j.type==="keypress"&&j.keyCode===13?"click":j.type;if(i==="mousedown"){a.DomUtil.preventOutline(j.target||j.srcElement)}this._fireDOMEvent(j,i)},_fireDOMEvent:function(p,m,j){if(p.type==="click"){var k=a.Util.extend({},p);k.type="preclick";this._fireDOMEvent(k,k.type,j)}if(p._stopped){return}j=(j||[]).concat(this._findEventTargets(p,m));if(!j.length){return}var o=j[0];if(m==="contextmenu"&&o.listens(m,true)){a.DomEvent.preventDefault(p)}var n={originalEvent:p};if(p.type!=="keypress"){var q=o instanceof a.Marker;n.containerPoint=q?this.latLngToContainerPoint(o.getLatLng()):this.mouseEventToContainerPoint(p);n.layerPoint=this.containerPointToLayerPoint(n.containerPoint);n.latlng=q?o.getLatLng():this.layerPointToLatLng(n.layerPoint)}for(var l=0;l<j.length;l++){j[l].fire(m,n,true);if(n.originalEvent._stopped||(j[l].options.nonBubblingEvents&&a.Util.indexOf(j[l].options.nonBubblingEvents,m)!==-1)){return}}},_draggableMoved:function(i){i=i.dragging&&i.dragging.enabled()?i:this;return(i.dragging&&i.dragging.moved())||(this.boxZoom&&this.boxZoom.moved())},_clearHandlers:function(){for(var k=0,j=this._handlers.length;k<j;k++){this._handlers[k].disable()}},whenReady:function(j,i){if(this._loaded){j.call(i||this,{target:this})}else{this.on("load",j,i)}return this},_getMapPanePos:function(){return a.DomUtil.getPosition(this._mapPane)||new a.Point(0,0)},_moved:function(){var i=this._getMapPanePos();return i&&!i.equals([0,0])},_getTopLeftPoint:function(i,k){var j=i&&k!==h?this._getNewPixelOrigin(i,k):this.getPixelOrigin();return j.subtract(this._getMapPanePos())},_getNewPixelOrigin:function(i,k){var j=this.getSize()._divideBy(2);return this.project(i,k)._subtract(j)._add(this._getMapPanePos())._round()},_latLngToNewLayerPoint:function(l,k,i){var j=this._getNewPixelOrigin(i,k);return this.project(l,k)._subtract(j)},_latLngBoundsToNewLayerBounds:function(l,k,i){var j=this._getNewPixelOrigin(i,k);return a.bounds([this.project(l.getSouthWest(),k)._subtract(j),this.project(l.getNorthWest(),k)._subtract(j),this.project(l.getSouthEast(),k)._subtract(j),this.project(l.getNorthEast(),k)._subtract(j)])},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(i){return this.latLngToLayerPoint(i).subtract(this._getCenterLayerPoint())},_limitCenter:function(i,l,k){if(!k){return i}var o=this.project(i,l),j=this.getSize().divideBy(2),m=new a.Bounds(o.subtract(j),o.add(j)),n=this._getBoundsOffset(m,k,l);if(n.round().equals([0,0])){return i}return this.unproject(o.add(n),l)},_limitOffset:function(l,i){if(!i){return l}var k=this.getPixelBounds(),j=new a.Bounds(k.min.add(l),k.max.add(l));return l.add(this._getBoundsOffset(j,i))},_getBoundsOffset:function(n,k,o){var j=a.bounds(this.project(k.getNorthEast(),o),this.project(k.getSouthWest(),o)),p=j.min.subtract(n.min),m=j.max.subtract(n.max),l=this._rebound(p.x,-m.x),i=this._rebound(p.y,-m.y);return new a.Point(l,i)},_rebound:function(j,i){return j+i>0?Math.round(j-i)/2:Math.max(0,Math.ceil(j))-Math.max(0,Math.floor(i))},_limitZoom:function(l){var k=this.getMinZoom(),j=this.getMaxZoom(),i=a.Browser.any3d?this.options.zoomSnap:1;if(i){l=Math.round(l/i)*i}return Math.max(k,Math.min(j,l))},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){a.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim");this.fire("moveend")},_tryAnimatedPan:function(i,j){var k=this._getCenterOffset(i)._floor();if((j&&j.animate)!==true&&!this.getSize().contains(k)){return false}this.panBy(k,j);return true},_createAnimProxy:function(){var i=this._proxy=a.DomUtil.create("div","leaflet-proxy leaflet-zoom-animated");this._panes.mapPane.appendChild(i);this.on("zoomanim",function(k){var l=a.DomUtil.TRANSFORM,j=i.style[l];a.DomUtil.setTransform(i,this.project(k.center,k.zoom),this.getZoomScale(k.zoom,1));if(j===i.style[l]&&this._animatingZoom){this._onZoomTransitionEnd()}},this);this.on("load moveend",function(){var k=this.getCenter(),j=this.getZoom();a.DomUtil.setTransform(i,this.project(k,j),this.getZoomScale(j,1))},this)},_catchTransitionEnd:function(i){if(this._animatingZoom&&i.propertyName.indexOf("transform")>=0){this._onZoomTransitionEnd()}},_nothingToAnimate:function(){return !this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(i,k,j){if(this._animatingZoom){return true}j=j||{};if(!this._zoomAnimated||j.animate===false||this._nothingToAnimate()||Math.abs(k-this._zoom)>this.options.zoomAnimationThreshold){return false}var m=this.getZoomScale(k),l=this._getCenterOffset(i)._divideBy(1-1/m);if(j.animate!==true&&!this.getSize().contains(l)){return false}a.Util.requestAnimFrame(function(){this._moveStart(true)._animateZoom(i,k,true)},this);return true},_animateZoom:function(i,l,j,k){if(j){this._animatingZoom=true;this._animateToCenter=i;this._animateToZoom=l;a.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim")}this.fire("zoomanim",{center:i,zoom:l,noUpdate:k});setTimeout(a.bind(this._onZoomTransitionEnd,this),250)},_onZoomTransitionEnd:function(){if(!this._animatingZoom){return}a.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim");this._animatingZoom=false;this._move(this._animateToCenter,this._animateToZoom);a.Util.requestAnimFrame(function(){this._moveEnd(true)},this)}});a.map=function(j,i){return new a.Map(j,i)};a.Layer=a.Evented.extend({options:{pane:"overlayPane",nonBubblingEvents:[],attribution:null},addTo:function(i){i.addLayer(this);return this},remove:function(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom:function(i){if(i){i.removeLayer(this)}return this},getPane:function(i){return this._map.getPane(i?(this.options[i]||i):this.options.pane)},addInteractiveTarget:function(i){this._map._targets[a.stamp(i)]=this;return this},removeInteractiveTarget:function(i){delete this._map._targets[a.stamp(i)];return this},getAttribution:function(){return this.options.attribution},_layerAdd:function(k){var j=k.target;if(!j.hasLayer(this)){return}this._map=j;this._zoomAnimated=j._zoomAnimated;if(this.getEvents){var i=this.getEvents();j.on(i,this);this.once("remove",function(){j.off(i,this)},this)}this.onAdd(j);if(this.getAttribution&&j.attributionControl){j.attributionControl.addAttribution(this.getAttribution())}this.fire("add");j.fire("layeradd",{layer:this})}});a.Map.include({addLayer:function(i){var j=a.stamp(i);if(this._layers[j]){return this}this._layers[j]=i;i._mapToAdd=this;if(i.beforeAdd){i.beforeAdd(this)}this.whenReady(i._layerAdd,i);return this},removeLayer:function(i){var j=a.stamp(i);if(!this._layers[j]){return this}if(this._loaded){i.onRemove(this)}if(i.getAttribution&&this.attributionControl){this.attributionControl.removeAttribution(i.getAttribution())}delete this._layers[j];if(this._loaded){this.fire("layerremove",{layer:i});i.fire("remove")}i._map=i._mapToAdd=null;return this},hasLayer:function(i){return !!i&&(a.stamp(i) in this._layers)},eachLayer:function(l,k){for(var j in this._layers){l.call(k,this._layers[j])}return this},_addLayers:function(l){l=l?(a.Util.isArray(l)?l:[l]):[];for(var k=0,j=l.length;k<j;k++){this.addLayer(l[k])}},_addZoomLimit:function(i){if(isNaN(i.options.maxZoom)||!isNaN(i.options.minZoom)){this._zoomBoundLayers[a.stamp(i)]=i;this._updateZoomLevels()}},_removeZoomLimit:function(i){var j=a.stamp(i);if(this._zoomBoundLayers[j]){delete this._zoomBoundLayers[j];this._updateZoomLevels()}},_updateZoomLevels:function(){var n=Infinity,j=-Infinity,m=this._getZoomSpan();for(var l in this._zoomBoundLayers){var k=this._zoomBoundLayers[l].options;n=k.minZoom===h?n:Math.min(n,k.minZoom);j=k.maxZoom===h?j:Math.max(j,k.maxZoom)}this._layersMaxZoom=j===-Infinity?h:j;this._layersMinZoom=n===Infinity?h:n;if(m!==this._getZoomSpan()){this.fire("zoomlevelschange")}if(this.options.maxZoom===h&&this._layersMaxZoom&&this.getZoom()>this._layersMaxZoom){this.setZoom(this._layersMaxZoom)}if(this.options.minZoom===h&&this._layersMinZoom&&this.getZoom()<this._layersMinZoom){this.setZoom(this._layersMinZoom)}}});var g="_leaflet_events";a.DomEvent={on:function(p,m,o,l){if(typeof m==="object"){for(var n in m){this._on(p,n,m[n],o)}}else{m=a.Util.splitWords(m);for(var k=0,j=m.length;k<j;k++){this._on(p,m[k],o,l)}}return this},off:function(p,m,o,l){if(typeof m==="object"){for(var n in m){this._off(p,n,m[n],o)}}else{m=a.Util.splitWords(m);for(var k=0,j=m.length;k<j;k++){this._off(p,m[k],o,l)}}return this},_on:function(n,m,l,j){var o=m+a.stamp(l)+(j?"_"+a.stamp(j):"");if(n[g]&&n[g][o]){return this}var k=function(p){return l.call(j||n,p||f.event)};var i=k;if(a.Browser.pointer&&m.indexOf("touch")===0){this.addPointerListener(n,m,k,o)}else{if(a.Browser.touch&&(m==="dblclick")&&this.addDoubleTapListener&&!(a.Browser.pointer&&a.Browser.chrome)){this.addDoubleTapListener(n,k,o)}else{if("addEventListener" in n){if(m==="mousewheel"){n.addEventListener("onwheel" in n?"wheel":"mousewheel",k,false)}else{if((m==="mouseenter")||(m==="mouseleave")){k=function(p){p=p||f.event;if(a.DomEvent._isExternalTarget(n,p)){i(p)}};n.addEventListener(m==="mouseenter"?"mouseover":"mouseout",k,false)}else{if(m==="click"&&a.Browser.android){k=function(p){return a.DomEvent._filterClick(p,i)}}n.addEventListener(m,k,false)}}}else{if("attachEvent" in n){n.attachEvent("on"+m,k)}}}}n[g]=n[g]||{};n[g][o]=k;return this},_off:function(m,l,k,i){var n=l+a.stamp(k)+(i?"_"+a.stamp(i):""),j=m[g]&&m[g][n];if(!j){return this}if(a.Browser.pointer&&l.indexOf("touch")===0){this.removePointerListener(m,l,n)}else{if(a.Browser.touch&&(l==="dblclick")&&this.removeDoubleTapListener){this.removeDoubleTapListener(m,n)}else{if("removeEventListener" in m){if(l==="mousewheel"){m.removeEventListener("onwheel" in m?"wheel":"mousewheel",j,false)}else{m.removeEventListener(l==="mouseenter"?"mouseover":l==="mouseleave"?"mouseout":l,j,false)}}else{if("detachEvent" in m){m.detachEvent("on"+l,j)}}}}m[g][n]=null;return this},stopPropagation:function(i){if(i.stopPropagation){i.stopPropagation()}else{if(i.originalEvent){i.originalEvent._stopped=true}else{i.cancelBubble=true}}a.DomEvent._skipped(i);return this},disableScrollPropagation:function(i){return a.DomEvent.on(i,"mousewheel",a.DomEvent.stopPropagation)},disableClickPropagation:function(j){var i=a.DomEvent.stopPropagation;a.DomEvent.on(j,a.Draggable.START.join(" "),i);return a.DomEvent.on(j,{click:a.DomEvent._fakeStop,dblclick:i})},preventDefault:function(i){if(i.preventDefault){i.preventDefault()}else{i.returnValue=false}return this},stop:function(i){return a.DomEvent.preventDefault(i).stopPropagation(i)},getMousePosition:function(k,i){if(!i){return new a.Point(k.clientX,k.clientY)}var j=i.getBoundingClientRect();return new a.Point(k.clientX-j.left-i.clientLeft,k.clientY-j.top-i.clientTop)},_wheelPxFactor:(a.Browser.win&&a.Browser.chrome)?2:a.Browser.gecko?f.devicePixelRatio:1,getWheelDelta:function(i){return(a.Browser.edge)?i.wheelDeltaY/2:(i.deltaY&&i.deltaMode===0)?-i.deltaY/a.DomEvent._wheelPxFactor:(i.deltaY&&i.deltaMode===1)?-i.deltaY*20:(i.deltaY&&i.deltaMode===2)?-i.deltaY*60:(i.deltaX||i.deltaZ)?0:i.wheelDelta?(i.wheelDeltaY||i.wheelDelta)/2:(i.detail&&Math.abs(i.detail)<32765)?-i.detail*20:i.detail?i.detail/-32765*60:0},_skipEvents:{},_fakeStop:function(i){a.DomEvent._skipEvents[i.type]=true},_skipped:function(j){var i=this._skipEvents[j.type];this._skipEvents[j.type]=false;return i},_isExternalTarget:function(i,l){var k=l.relatedTarget;if(!k){return true}try{while(k&&(k!==i)){k=k.parentNode}}catch(j){return false}return(k!==i)},_filterClick:function(l,k){var j=(l.timeStamp||(l.originalEvent&&l.originalEvent.timeStamp)),i=a.DomEvent._lastClick&&(j-a.DomEvent._lastClick);if((i&&i>100&&i<500)||(l.target._simulatedClick&&!l._simulated)){a.DomEvent.stop(l);return}a.DomEvent._lastClick=j;k(l)}};a.DomEvent.addListener=a.DomEvent.on;a.DomEvent.removeListener=a.DomEvent.off;a.PosAnimation=a.Evented.extend({run:function(j,i,k,l){this.stop();this._el=j;this._inProgress=true;this._duration=k||0.25;this._easeOutPower=1/Math.max(l||0.5,0.2);this._startPos=a.DomUtil.getPosition(j);this._offset=i.subtract(this._startPos);this._startTime=+new Date();this.fire("start");this._animate()},stop:function(){if(!this._inProgress){return}this._step(true);this._complete()},_animate:function(){this._animId=a.Util.requestAnimFrame(this._animate,this);this._step()},_step:function(j){var i=(+new Date())-this._startTime,k=this._duration*1000;if(i<k){this._runFrame(this._easeOut(i/k),j)}else{this._runFrame(1);this._complete()}},_runFrame:function(j,i){var k=this._startPos.add(this._offset.multiplyBy(j));if(i){k._round()}a.DomUtil.setPosition(this._el,k);this.fire("step")},_complete:function(){a.Util.cancelAnimFrame(this._animId);this._inProgress=false;this.fire("end")},_easeOut:function(i){return 1-Math.pow(1-i,this._easeOutPower)}});a.Projection.Mercator={R:6378137,R_MINOR:6356752.314245179,bounds:a.bounds([-20037508.34279,-15496570.73972],[20037508.34279,18764656.23138]),project:function(p){var n=Math.PI/180,l=this.R,o=p.lat*n,j=this.R_MINOR/l,m=Math.sqrt(1-j*j),i=m*Math.sin(o);var k=Math.tan(Math.PI/4-o/2)/Math.pow((1-i)/(1+i),m/2);o=-l*Math.log(Math.max(k,1e-10));return new a.Point(p.lng*n*l,o)},unproject:function(t){var q=180/Math.PI,j=this.R,l=this.R_MINOR/j,o=Math.sqrt(1-l*l),s=Math.exp(-t.y/j),p=Math.PI/2-2*Math.atan(s);for(var m=0,n=0.1,k;m<15&&Math.abs(n)>1e-7;m++){k=o*Math.sin(p);k=Math.pow((1-k)/(1+k),o/2);n=Math.PI/2-2*Math.atan(s*k)-p;p+=n}return new a.LatLng(p*q,t.x*q/j)}};a.CRS.EPSG3395=a.extend({},a.CRS.Earth,{code:"EPSG:3395",projection:a.Projection.Mercator,transformation:(function(){var i=0.5/(Math.PI*a.Projection.Mercator.R);return new a.Transformation(i,0.5,-i,0.5)}())});a.GridLayer=a.Layer.extend({options:{tileSize:256,opacity:1,updateWhenIdle:a.Browser.mobile,updateWhenZooming:true,updateInterval:200,zIndex:1,bounds:null,minZoom:0,maxZoom:h,noWrap:false,pane:"tilePane",className:"",keepBuffer:2},initialize:function(i){a.setOptions(this,i)},onAdd:function(){this._initContainer();this._levels={};this._tiles={};this._resetView();this._update()},beforeAdd:function(i){i._addZoomLimit(this)},onRemove:function(i){this._removeAllTiles();a.DomUtil.remove(this._container);i._removeZoomLimit(this);this._container=null;this._tileZoom=null},bringToFront:function(){if(this._map){a.DomUtil.toFront(this._container);this._setAutoZIndex(Math.max)}return this},bringToBack:function(){if(this._map){a.DomUtil.toBack(this._container);this._setAutoZIndex(Math.min)}return this},getContainer:function(){return this._container},setOpacity:function(i){this.options.opacity=i;this._updateOpacity();return this},setZIndex:function(i){this.options.zIndex=i;this._updateZIndex();return this},isLoading:function(){return this._loading},redraw:function(){if(this._map){this._removeAllTiles();this._update()}return this},getEvents:function(){var i={viewprereset:this._invalidateAll,viewreset:this._resetView,zoom:this._resetView,moveend:this._onMoveEnd};if(!this.options.updateWhenIdle){if(!this._onMove){this._onMove=a.Util.throttle(this._onMoveEnd,this.options.updateInterval,this)}i.move=this._onMove}if(this._zoomAnimated){i.zoomanim=this._animateZoom}return i},createTile:function(){return b.createElement("div")},getTileSize:function(){var i=this.options.tileSize;return i instanceof a.Point?i:new a.Point(i,i)},_updateZIndex:function(){if(this._container&&this.options.zIndex!==h&&this.options.zIndex!==null){this._container.style.zIndex=this.options.zIndex}},_setAutoZIndex:function(m){var n=this.getPane().children,l=-m(-Infinity,Infinity);for(var k=0,j=n.length,o;k<j;k++){o=n[k].style.zIndex;if(n[k]!==this._container&&o){l=m(l,+o)}}if(isFinite(l)){this.options.zIndex=l+m(-1,1);this._updateZIndex()}},_updateOpacity:function(){if(!this._map){return}if(a.Browser.ielt9){return}a.DomUtil.setOpacity(this._container,this.options.opacity);var i=+new Date(),l=false,n=false;for(var j in this._tiles){var k=this._tiles[j];if(!k.current||!k.loaded){continue}var m=Math.min(1,(i-k.loaded)/200);a.DomUtil.setOpacity(k.el,m);if(m<1){l=true}else{if(k.active){n=true}k.active=true}}if(n&&!this._noPrune){this._pruneTiles()}if(l){a.Util.cancelAnimFrame(this._fadeFrame);this._fadeFrame=a.Util.requestAnimFrame(this._updateOpacity,this)}},_initContainer:function(){if(this._container){return}this._container=a.DomUtil.create("div","leaflet-layer "+(this.options.className||""));this._updateZIndex();if(this.options.opacity<1){this._updateOpacity()}this.getPane().appendChild(this._container)},_updateLevels:function(){var j=this._tileZoom,i=this.options.maxZoom;if(j===h){return h}for(var l in this._levels){if(this._levels[l].el.children.length||l===j){this._levels[l].el.style.zIndex=i-Math.abs(j-l)}else{a.DomUtil.remove(this._levels[l].el);this._removeTilesAtZoom(l);delete this._levels[l]}}var m=this._levels[j],k=this._map;if(!m){m=this._levels[j]={};m.el=a.DomUtil.create("div","leaflet-tile-container leaflet-zoom-animated",this._container);m.el.style.zIndex=i;m.origin=k.project(k.unproject(k.getPixelOrigin()),j).round();m.zoom=j;this._setZoomTransform(m,k.getCenter(),k.getZoom());a.Util.falseFn(m.el.offsetWidth)}this._level=m;return m},_pruneTiles:function(){if(!this._map){return}var i,k;var j=this._map.getZoom();if(j>this.options.maxZoom||j<this.options.minZoom){this._removeAllTiles();return}for(i in this._tiles){k=this._tiles[i];k.retain=k.current}for(i in this._tiles){k=this._tiles[i];if(k.current&&!k.active){var l=k.coords;if(!this._retainParent(l.x,l.y,l.z,l.z-5)){this._retainChildren(l.x,l.y,l.z,l.z+2)}}}for(i in this._tiles){if(!this._tiles[i].retain){this._removeTile(i)}}},_removeTilesAtZoom:function(j){for(var i in this._tiles){if(this._tiles[i].coords.z!==j){continue}this._removeTile(i)}},_removeAllTiles:function(){for(var i in this._tiles){this._removeTile(i)}},_invalidateAll:function(){for(var i in this._levels){a.DomUtil.remove(this._levels[i].el);delete this._levels[i]}this._removeAllTiles();this._tileZoom=null},_retainParent:function(p,n,m,i){var j=Math.floor(p/2),o=Math.floor(n/2),k=m-1,r=new a.Point(+j,+o);r.z=+k;var q=this._tileCoordsToKey(r),l=this._tiles[q];if(l&&l.active){l.retain=true;return true}else{if(l&&l.loaded){l.retain=true}}if(k>i){return this._retainParent(j,o,k,i)}return false},_retainChildren:function(r,o,n,q){for(var l=2*r;l<2*r+2;l++){for(var k=2*o;k<2*o+2;k++){var p=new a.Point(l,k);p.z=n+1;var s=this._tileCoordsToKey(p),m=this._tiles[s];if(m&&m.active){m.retain=true;continue}else{if(m&&m.loaded){m.retain=true}}if(n+1<q){this._retainChildren(l,k,n+1,q)}}}},_resetView:function(j){var i=j&&(j.pinch||j.flyTo);this._setView(this._map.getCenter(),this._map.getZoom(),i,i)},_animateZoom:function(i){this._setView(i.center,i.zoom,true,i.noUpdate)},_setView:function(j,l,i,k){var n=Math.round(l);if((this.options.maxZoom!==h&&n>this.options.maxZoom)||(this.options.minZoom!==h&&n<this.options.minZoom)){n=h}var m=this.options.updateWhenZooming&&(n!==this._tileZoom);if(!k||m){this._tileZoom=n;if(this._abortLoading){this._abortLoading()}this._updateLevels();this._resetGrid();if(n!==h){this._update(j)}if(!i){this._pruneTiles()}this._noPrune=!!i}this._setZoomTransforms(j,l)},_setZoomTransforms:function(j,l){for(var k in this._levels){this._setZoomTransform(this._levels[k],j,l)}},_setZoomTransform:function(m,i,j){var l=this._map.getZoomScale(j,m.zoom),k=m.origin.multiplyBy(l).subtract(this._map._getNewPixelOrigin(i,j)).round();if(a.Browser.any3d){a.DomUtil.setTransform(m.el,k,l)}else{a.DomUtil.setPosition(m.el,k)}},_resetGrid:function(){var l=this._map,i=l.options.crs,k=this._tileSize=this.getTileSize(),m=this._tileZoom;var j=this._map.getPixelWorldBounds(this._tileZoom);if(j){this._globalTileRange=this._pxBoundsToTileRange(j)}this._wrapX=i.wrapLng&&!this.options.noWrap&&[Math.floor(l.project([0,i.wrapLng[0]],m).x/k.x),Math.ceil(l.project([0,i.wrapLng[1]],m).x/k.y)];this._wrapY=i.wrapLat&&!this.options.noWrap&&[Math.floor(l.project([i.wrapLat[0],0],m).y/k.x),Math.ceil(l.project([i.wrapLat[1],0],m).y/k.y)]},_onMoveEnd:function(){if(!this._map||this._map._animatingZoom){return}this._update()},_getTiledPixelBounds:function(i){var m=this._map,l=m._animatingZoom?Math.max(m._animateToZoom,m.getZoom()):m.getZoom(),n=m.getZoomScale(l,this._tileZoom),k=m.project(i,this._tileZoom).floor(),j=m.getSize().divideBy(n*2);return new a.Bounds(k.subtract(j),k.add(j))},_update:function(k){var l=this._map;if(!l){return}var z=l.getZoom();if(k===h){k=l.getCenter()}if(this._tileZoom===h){return}var q=this._getTiledPixelBounds(k),m=this._pxBoundsToTileRange(q),w=m.getCenter(),s=[],n=this.options.keepBuffer,r=new a.Bounds(m.getBottomLeft().subtract([n,-n]),m.getTopRight().add([n,-n]));for(var y in this._tiles){var v=this._tiles[y].coords;if(v.z!==this._tileZoom||!r.contains(a.point(v.x,v.y))){this._tiles[y].current=false}}if(Math.abs(z-this._tileZoom)>1){this._setView(k,z);return}for(var o=m.min.y;o<=m.max.y;o++){for(var p=m.min.x;p<=m.max.x;p++){var x=new a.Point(p,o);x.z=this._tileZoom;if(!this._isValidTile(x)){continue}var u=this._tiles[this._tileCoordsToKey(x)];if(u){u.current=true}else{s.push(x)}}}s.sort(function(j,i){return j.distanceTo(w)-i.distanceTo(w)});if(s.length!==0){if(!this._loading){this._loading=true;this.fire("loading")}var t=b.createDocumentFragment();for(p=0;p<s.length;p++){this._addTile(s[p],t)}this._level.el.appendChild(t)}},_isValidTile:function(k){var i=this._map.options.crs;if(!i.infinite){var j=this._globalTileRange;if((!i.wrapLng&&(k.x<j.min.x||k.x>j.max.x))||(!i.wrapLat&&(k.y<j.min.y||k.y>j.max.y))){return false}}if(!this.options.bounds){return true}var l=this._tileCoordsToBounds(k);return a.latLngBounds(this.options.bounds).overlaps(l)},_keyToBounds:function(i){return this._tileCoordsToBounds(this._keyToTileCoords(i))},_tileCoordsToBounds:function(o){var p=this._map,n=this.getTileSize(),k=o.scaleBy(n),i=k.add(n),j=p.unproject(k,o.z),m=p.unproject(i,o.z),l=new a.LatLngBounds(j,m);if(!this.options.noWrap){p.wrapLatLngBounds(l)}return l},_tileCoordsToKey:function(i){return i.x+":"+i.y+":"+i.z},_keyToTileCoords:function(j){var i=j.split(":"),l=new a.Point(+i[0],+i[1]);l.z=+i[2];return l},_removeTile:function(i){var j=this._tiles[i];if(!j){return}a.DomUtil.remove(j.el);delete this._tiles[i];this.fire("tileunload",{tile:j.el,coords:this._keyToTileCoords(i)})},_initTile:function(i){a.DomUtil.addClass(i,"leaflet-tile");var j=this.getTileSize();i.style.width=j.x+"px";i.style.height=j.y+"px";i.onselectstart=a.Util.falseFn;i.onmousemove=a.Util.falseFn;if(a.Browser.ielt9&&this.options.opacity<1){a.DomUtil.setOpacity(i,this.options.opacity)}if(a.Browser.android&&!a.Browser.android23){i.style.WebkitBackfaceVisibility="hidden"}},_addTile:function(m,i){var k=this._getTilePos(m),j=this._tileCoordsToKey(m);var l=this.createTile(this._wrapCoords(m),a.bind(this._tileReady,this,m));this._initTile(l);if(this.createTile.length<2){a.Util.requestAnimFrame(a.bind(this._tileReady,this,m,null,l))}a.DomUtil.setPosition(l,k);this._tiles[j]={el:l,coords:m,current:true};i.appendChild(l);this.fire("tileloadstart",{tile:l,coords:m})},_tileReady:function(l,k,j){if(!this._map){return}if(k){this.fire("tileerror",{error:k,tile:j,coords:l})}var i=this._tileCoordsToKey(l);j=this._tiles[i];if(!j){return}j.loaded=+new Date();if(this._map._fadeAnimated){a.DomUtil.setOpacity(j.el,0);a.Util.cancelAnimFrame(this._fadeFrame);this._fadeFrame=a.Util.requestAnimFrame(this._updateOpacity,this)}else{j.active=true;this._pruneTiles()}if(!k){a.DomUtil.addClass(j.el,"leaflet-tile-loaded");this.fire("tileload",{tile:j.el,coords:l})}if(this._noTilesToLoad()){this._loading=false;this.fire("load");if(a.Browser.ielt9||!this._map._fadeAnimated){a.Util.requestAnimFrame(this._pruneTiles,this)}else{setTimeout(a.bind(this._pruneTiles,this),250)}}},_getTilePos:function(i){return i.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(i){var j=new a.Point(this._wrapX?a.Util.wrapNum(i.x,this._wrapX):i.x,this._wrapY?a.Util.wrapNum(i.y,this._wrapY):i.y);j.z=i.z;return j},_pxBoundsToTileRange:function(i){var j=this.getTileSize();return new a.Bounds(i.min.unscaleBy(j).floor(),i.max.unscaleBy(j).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var i in this._tiles){if(!this._tiles[i].loaded){return false}}return true}});a.gridLayer=function(i){return new a.GridLayer(i)};a.TileLayer=a.GridLayer.extend({options:{minZoom:0,maxZoom:18,maxNativeZoom:null,minNativeZoom:null,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:false,zoomReverse:false,detectRetina:false,crossOrigin:false},initialize:function(j,i){this._url=j;i=a.setOptions(this,i);if(i.detectRetina&&a.Browser.retina&&i.maxZoom>0){i.tileSize=Math.floor(i.tileSize/2);if(!i.zoomReverse){i.zoomOffset++;i.maxZoom--}else{i.zoomOffset--;i.minZoom++}i.minZoom=Math.max(0,i.minZoom)}if(typeof i.subdomains==="string"){i.subdomains=i.subdomains.split("")}if(!a.Browser.android){this.on("tileunload",this._onTileRemove)}},setUrl:function(i,j){this._url=i;if(!j){this.redraw()}return this},createTile:function(k,i){var j=b.createElement("img");a.DomEvent.on(j,"load",a.bind(this._tileOnLoad,this,i,j));a.DomEvent.on(j,"error",a.bind(this._tileOnError,this,i,j));if(this.options.crossOrigin){j.crossOrigin=""}j.alt="";j.setAttribute("role","presentation");j.src=this.getTileUrl(k);return j},getTileUrl:function(j){var i={r:a.Browser.retina?"@2x":"",s:this._getSubdomain(j),x:j.x,y:j.y,z:this._getZoomForUrl()};if(this._map&&!this._map.options.crs.infinite){var k=this._globalTileRange.max.y-j.y;if(this.options.tms){i.y=k}i["-y"]=k}return a.Util.template(this._url,a.extend(i,this.options))},_tileOnLoad:function(i,j){if(a.Browser.ielt9){setTimeout(a.bind(i,this,null,j),0)}else{i(null,j)}},_tileOnError:function(j,k,l){var i=this.options.errorTileUrl;if(i&&k.src!==i){k.src=i}j(l,k)},getTileSize:function(){var k=this._map,j=a.GridLayer.prototype.getTileSize.call(this),i=this._tileZoom+this.options.zoomOffset,m=this.options.minNativeZoom,l=this.options.maxNativeZoom;if(m!==null&&i<m){return j.divideBy(k.getZoomScale(m,i)).round()}if(l!==null&&i>l){return j.divideBy(k.getZoomScale(l,i)).round()}return j},_onTileRemove:function(i){i.tile.onload=null},_getZoomForUrl:function(){var k=this._tileZoom,j=this.options.maxZoom,l=this.options.zoomReverse,i=this.options.zoomOffset,n=this.options.minNativeZoom,m=this.options.maxNativeZoom;if(l){k=j-k}k+=i;if(n!==null&&k<n){return n}if(m!==null&&k>m){return m}return k},_getSubdomain:function(j){var i=Math.abs(j.x+j.y)%this.options.subdomains.length;return this.options.subdomains[i]},_abortLoading:function(){var j,k;for(j in this._tiles){if(this._tiles[j].coords.z!==this._tileZoom){k=this._tiles[j].el;k.onload=a.Util.falseFn;k.onerror=a.Util.falseFn;if(!k.complete){k.src=a.Util.emptyImageUrl;a.DomUtil.remove(k)}}}}});a.tileLayer=function(j,i){return new a.TileLayer(j,i)};a.TileLayer.WMS=a.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",layers:"",styles:"",format:"image/jpeg",transparent:false,version:"1.1.1"},options:{crs:null,uppercase:false},initialize:function(l,k){this._url=l;var j=a.extend({},this.defaultWmsParams);for(var m in k){if(!(m in this.options)){j[m]=k[m]}}k=a.setOptions(this,k);j.width=j.height=k.tileSize*(k.detectRetina&&a.Browser.retina?2:1);this.wmsParams=j},onAdd:function(i){this._crs=this.options.crs||i.options.crs;this._wmsVersion=parseFloat(this.wmsParams.version);var j=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[j]=this._crs.code;a.TileLayer.prototype.onAdd.call(this,i)},getTileUrl:function(l){var m=this._tileCoordsToBounds(l),i=this._crs.project(m.getNorthWest()),k=this._crs.project(m.getSouthEast()),n=(this._wmsVersion>=1.3&&this._crs===a.CRS.EPSG4326?[k.y,i.x,i.y,k.x]:[i.x,k.y,k.x,i.y]).join(","),j=a.TileLayer.prototype.getTileUrl.call(this,l);return j+a.Util.getParamString(this.wmsParams,j,this.options.uppercase)+(this.options.uppercase?"&BBOX=":"&bbox=")+n},setParams:function(j,i){a.extend(this.wmsParams,j);if(!i){this.redraw()}return this}});a.tileLayer.wms=function(j,i){return new a.TileLayer.WMS(j,i)};a.ImageOverlay=a.Layer.extend({options:{opacity:1,alt:"",interactive:false,crossOrigin:false},initialize:function(j,k,i){this._url=j;this._bounds=a.latLngBounds(k);a.setOptions(this,i)},onAdd:function(){if(!this._image){this._initImage();if(this.options.opacity<1){this._updateOpacity()}}if(this.options.interactive){a.DomUtil.addClass(this._image,"leaflet-interactive");this.addInteractiveTarget(this._image)}this.getPane().appendChild(this._image);this._reset()},onRemove:function(){a.DomUtil.remove(this._image);if(this.options.interactive){this.removeInteractiveTarget(this._image)}},setOpacity:function(i){this.options.opacity=i;if(this._image){this._updateOpacity()}return this},setStyle:function(i){if(i.opacity){this.setOpacity(i.opacity)}return this},bringToFront:function(){if(this._map){a.DomUtil.toFront(this._image)}return this},bringToBack:function(){if(this._map){a.DomUtil.toBack(this._image)}return this},setUrl:function(i){this._url=i;if(this._image){this._image.src=i}return this},setBounds:function(i){this._bounds=i;if(this._map){this._reset()}return this},getEvents:function(){var i={zoom:this._reset,viewreset:this._reset};if(this._zoomAnimated){i.zoomanim=this._animateZoom}return i},getBounds:function(){return this._bounds},getElement:function(){return this._image},_initImage:function(){var i=this._image=a.DomUtil.create("img","leaflet-image-layer "+(this._zoomAnimated?"leaflet-zoom-animated":""));i.onselectstart=a.Util.falseFn;i.onmousemove=a.Util.falseFn;i.onload=a.bind(this.fire,this,"load");if(this.options.crossOrigin){i.crossOrigin=""}i.src=this._url;i.alt=this.options.alt},_animateZoom:function(i){var k=this._map.getZoomScale(i.zoom),j=this._map._latLngBoundsToNewLayerBounds(this._bounds,i.zoom,i.center).min;a.DomUtil.setTransform(this._image,j,k)},_reset:function(){var k=this._image,j=new a.Bounds(this._map.latLngToLayerPoint(this._bounds.getNorthWest()),this._map.latLngToLayerPoint(this._bounds.getSouthEast())),i=j.getSize();a.DomUtil.setPosition(k,j.min);k.style.width=i.x+"px";k.style.height=i.y+"px"},_updateOpacity:function(){a.DomUtil.setOpacity(this._image,this.options.opacity)}});a.imageOverlay=function(j,k,i){return new a.ImageOverlay(j,k,i)};a.Icon=a.Class.extend({initialize:function(i){a.setOptions(this,i)},createIcon:function(i){return this._createIcon("icon",i)},createShadow:function(i){return this._createIcon("shadow",i)},_createIcon:function(j,k){var l=this._getIconUrl(j);if(!l){if(j==="icon"){throw new Error("iconUrl not set in Icon options (see the docs).")}return null}var i=this._createImg(l,k&&k.tagName==="IMG"?k:null);this._setIconStyles(i,j);return i},_setIconStyles:function(j,m){var l=this.options;var i=l[m+"Size"];if(typeof i==="number"){i=[i,i]}var n=a.point(i),k=a.point(m==="shadow"&&l.shadowAnchor||l.iconAnchor||n&&n.divideBy(2,true));j.className="leaflet-marker-"+m+" "+(l.className||"");if(k){j.style.marginLeft=(-k.x)+"px";j.style.marginTop=(-k.y)+"px"}if(n){j.style.width=n.x+"px";j.style.height=n.y+"px"}},_createImg:function(j,i){i=i||b.createElement("img");i.src=j;return i},_getIconUrl:function(i){return a.Browser.retina&&this.options[i+"RetinaUrl"]||this.options[i+"Url"]}});a.icon=function(i){return new a.Icon(i)};a.Icon.Default=a.Icon.extend({options:{iconUrl:"marker-icon.png",iconRetinaUrl:"marker-icon-2x.png",shadowUrl:"marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],tooltipAnchor:[16,-28],shadowSize:[41,41]},_getIconUrl:function(i){if(!a.Icon.Default.imagePath){a.Icon.Default.imagePath=this._detectIconPath()}return(this.options.imagePath||a.Icon.Default.imagePath)+a.Icon.prototype._getIconUrl.call(this,i)},_detectIconPath:function(){var i=a.DomUtil.create("div","leaflet-default-icon-path",b.body);var j=a.DomUtil.getStyle(i,"background-image")||a.DomUtil.getStyle(i,"backgroundImage");b.body.removeChild(i);return j.indexOf("url")===0?j.replace(/^url\([\"\']?/,"").replace(/marker-icon\.png[\"\']?\)$/,""):""}});a.Marker=a.Layer.extend({options:{icon:new a.Icon.Default(),interactive:true,draggable:false,keyboard:true,title:"",alt:"",zIndexOffset:0,opacity:1,riseOnHover:false,riseOffset:250,pane:"markerPane",nonBubblingEvents:["click","dblclick","mouseover","mouseout","contextmenu"]},initialize:function(j,i){a.setOptions(this,i);this._latlng=a.latLng(j)},onAdd:function(i){this._zoomAnimated=this._zoomAnimated&&i.options.markerZoomAnimation;if(this._zoomAnimated){i.on("zoomanim",this._animateZoom,this)}this._initIcon();this.update()},onRemove:function(i){if(this.dragging&&this.dragging.enabled()){this.options.draggable=true;this.dragging.removeHooks()}if(this._zoomAnimated){i.off("zoomanim",this._animateZoom,this)}this._removeIcon();this._removeShadow()},getEvents:function(){return{zoom:this.update,viewreset:this.update}},getLatLng:function(){return this._latlng},setLatLng:function(j){var i=this._latlng;this._latlng=a.latLng(j);this.update();return this.fire("move",{oldLatLng:i,latlng:this._latlng})},setZIndexOffset:function(i){this.options.zIndexOffset=i;return this.update()},setIcon:function(i){this.options.icon=i;if(this._map){this._initIcon();this.update()}if(this._popup){this.bindPopup(this._popup,this._popup.options)}return this},getElement:function(){return this._icon},update:function(){if(this._icon){var i=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(i)}return this},_initIcon:function(){var j=this.options,l="leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");var k=j.icon.createIcon(this._icon),m=false;if(k!==this._icon){if(this._icon){this._removeIcon()}m=true;if(j.title){k.title=j.title}if(j.alt){k.alt=j.alt}}a.DomUtil.addClass(k,l);if(j.keyboard){k.tabIndex="0"}this._icon=k;if(j.riseOnHover){this.on({mouseover:this._bringToFront,mouseout:this._resetZIndex})}var i=j.icon.createShadow(this._shadow),n=false;if(i!==this._shadow){this._removeShadow();n=true}if(i){a.DomUtil.addClass(i,l);i.alt=""}this._shadow=i;if(j.opacity<1){this._updateOpacity()}if(m){this.getPane().appendChild(this._icon)}this._initInteraction();if(i&&n){this.getPane("shadowPane").appendChild(this._shadow)}},_removeIcon:function(){if(this.options.riseOnHover){this.off({mouseover:this._bringToFront,mouseout:this._resetZIndex})}a.DomUtil.remove(this._icon);this.removeInteractiveTarget(this._icon);this._icon=null},_removeShadow:function(){if(this._shadow){a.DomUtil.remove(this._shadow)}this._shadow=null},_setPos:function(i){a.DomUtil.setPosition(this._icon,i);if(this._shadow){a.DomUtil.setPosition(this._shadow,i)}this._zIndex=i.y+this.options.zIndexOffset;this._resetZIndex()},_updateZIndex:function(i){this._icon.style.zIndex=this._zIndex+i},_animateZoom:function(i){var j=this._map._latLngToNewLayerPoint(this._latlng,i.zoom,i.center).round();this._setPos(j)},_initInteraction:function(){if(!this.options.interactive){return}a.DomUtil.addClass(this._icon,"leaflet-interactive");this.addInteractiveTarget(this._icon);if(a.Handler.MarkerDrag){var i=this.options.draggable;if(this.dragging){i=this.dragging.enabled();this.dragging.disable()}this.dragging=new a.Handler.MarkerDrag(this);if(i){this.dragging.enable()}}},setOpacity:function(i){this.options.opacity=i;if(this._map){this._updateOpacity()}return this},_updateOpacity:function(){var i=this.options.opacity;a.DomUtil.setOpacity(this._icon,i);if(this._shadow){a.DomUtil.setOpacity(this._shadow,i)}},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)},_getPopupAnchor:function(){return this.options.icon.options.popupAnchor||[0,0]},_getTooltipAnchor:function(){return this.options.icon.options.tooltipAnchor||[0,0]}});a.marker=function(j,i){return new a.Marker(j,i)};a.DivIcon=a.Icon.extend({options:{iconSize:[12,12],html:false,bgPos:null,className:"leaflet-div-icon"},createIcon:function(j){var l=(j&&j.tagName==="DIV")?j:b.createElement("div"),i=this.options;l.innerHTML=i.html!==false?i.html:"";if(i.bgPos){var k=a.point(i.bgPos);l.style.backgroundPosition=(-k.x)+"px "+(-k.y)+"px"}this._setIconStyles(l,"icon");return l},createShadow:function(){return null}});a.divIcon=function(i){return new a.DivIcon(i)};a.DivOverlay=a.Layer.extend({options:{offset:[0,7],className:"",pane:"popupPane"},initialize:function(i,j){a.setOptions(this,i);this._source=j},onAdd:function(i){this._zoomAnimated=i._zoomAnimated;if(!this._container){this._initLayout()}if(i._fadeAnimated){a.DomUtil.setOpacity(this._container,0)}clearTimeout(this._removeTimeout);this.getPane().appendChild(this._container);this.update();if(i._fadeAnimated){a.DomUtil.setOpacity(this._container,1)}this.bringToFront()},onRemove:function(i){if(i._fadeAnimated){a.DomUtil.setOpacity(this._container,0);this._removeTimeout=setTimeout(a.bind(a.DomUtil.remove,a.DomUtil,this._container),200)}else{a.DomUtil.remove(this._container)}},getLatLng:function(){return this._latlng},setLatLng:function(i){this._latlng=a.latLng(i);if(this._map){this._updatePosition();this._adjustPan()}return this},getContent:function(){return this._content},setContent:function(i){this._content=i;this.update();return this},getElement:function(){return this._container},update:function(){if(!this._map){return}this._container.style.visibility="hidden";this._updateContent();this._updateLayout();this._updatePosition();this._container.style.visibility="";this._adjustPan()},getEvents:function(){var i={zoom:this._updatePosition,viewreset:this._updatePosition};if(this._zoomAnimated){i.zoomanim=this._animateZoom}return i},isOpen:function(){return !!this._map&&this._map.hasLayer(this)},bringToFront:function(){if(this._map){a.DomUtil.toFront(this._container)}return this},bringToBack:function(){if(this._map){a.DomUtil.toBack(this._container)}return this},_updateContent:function(){if(!this._content){return}var j=this._contentNode;var i=(typeof this._content==="function")?this._content(this._source||this):this._content;if(typeof i==="string"){j.innerHTML=i}else{while(j.hasChildNodes()){j.removeChild(j.firstChild)}j.appendChild(i)}this.fire("contentupdate")},_updatePosition:function(){if(!this._map){return}var m=this._map.latLngToLayerPoint(this._latlng),l=a.point(this.options.offset),j=this._getAnchor();if(this._zoomAnimated){a.DomUtil.setPosition(this._container,m.add(j))}else{l=l.add(m).add(j)}var i=this._containerBottom=-l.y,k=this._containerLeft=-Math.round(this._containerWidth/2)+l.x;this._container.style.bottom=i+"px";this._container.style.left=k+"px"},_getAnchor:function(){return[0,0]}});a.Popup=a.DivOverlay.extend({options:{maxWidth:300,minWidth:50,maxHeight:null,autoPan:true,autoPanPaddingTopLeft:null,autoPanPaddingBottomRight:null,autoPanPadding:[5,5],keepInView:false,closeButton:true,autoClose:true,className:""},openOn:function(i){i.openPopup(this);return this},onAdd:function(i){a.DivOverlay.prototype.onAdd.call(this,i);i.fire("popupopen",{popup:this});if(this._source){this._source.fire("popupopen",{popup:this},true);if(!(this._source instanceof a.Path)){this._source.on("preclick",a.DomEvent.stopPropagation)}}},onRemove:function(i){a.DivOverlay.prototype.onRemove.call(this,i);i.fire("popupclose",{popup:this});if(this._source){this._source.fire("popupclose",{popup:this},true);if(!(this._source instanceof a.Path)){this._source.off("preclick",a.DomEvent.stopPropagation)}}},getEvents:function(){var i=a.DivOverlay.prototype.getEvents.call(this);if("closeOnClick" in this.options?this.options.closeOnClick:this._map.options.closePopupOnClick){i.preclick=this._close}if(this.options.keepInView){i.moveend=this._adjustPan}return i},_close:function(){if(this._map){this._map.closePopup(this)}},_initLayout:function(){var k="leaflet-popup",i=this._container=a.DomUtil.create("div",k+" "+(this.options.className||"")+" leaflet-zoom-animated");if(this.options.closeButton){var j=this._closeButton=a.DomUtil.create("a",k+"-close-button",i);j.href="#close";j.innerHTML="&#215;";a.DomEvent.on(j,"click",this._onCloseButtonClick,this)}var l=this._wrapper=a.DomUtil.create("div",k+"-content-wrapper",i);this._contentNode=a.DomUtil.create("div",k+"-content",l);a.DomEvent.disableClickPropagation(l).disableScrollPropagation(this._contentNode).on(l,"contextmenu",a.DomEvent.stopPropagation);this._tipContainer=a.DomUtil.create("div",k+"-tip-container",i);this._tip=a.DomUtil.create("div",k+"-tip",this._tipContainer)},_updateLayout:function(){var j=this._contentNode,l=j.style;l.width="";l.whiteSpace="nowrap";var k=j.offsetWidth;k=Math.min(k,this.options.maxWidth);k=Math.max(k,this.options.minWidth);l.width=(k+1)+"px";l.whiteSpace="";l.height="";var i=j.offsetHeight,m=this.options.maxHeight,n="leaflet-popup-scrolled";if(m&&i>m){l.height=m+"px";a.DomUtil.addClass(j,n)}else{a.DomUtil.removeClass(j,n)}this._containerWidth=this._container.offsetWidth},_animateZoom:function(j){var k=this._map._latLngToNewLayerPoint(this._latlng,j.zoom,j.center),i=this._getAnchor();a.DomUtil.setPosition(this._container,k.add(i))},_adjustPan:function(){if(!this.options.autoPan||(this._map._panAnim&&this._map._panAnim._inProgress)){return}var j=this._map,m=parseInt(a.DomUtil.getStyle(this._container,"marginBottom"),10)||0,t=this._container.offsetHeight+m,p=this._containerWidth,n=new a.Point(this._containerLeft,-t-this._containerBottom);n._add(a.DomUtil.getPosition(this._container));var l=j.layerPointToContainerPoint(n),o=a.point(this.options.autoPanPadding),k=a.point(this.options.autoPanPaddingTopLeft||o),i=a.point(this.options.autoPanPaddingBottomRight||o),s=j.getSize(),r=0,q=0;if(l.x+p+i.x>s.x){r=l.x+p-s.x+i.x}if(l.x-r-k.x<0){r=l.x-k.x}if(l.y+t+i.y>s.y){q=l.y+t-s.y+i.y}if(l.y-q-k.y<0){q=l.y-k.y}if(r||q){j.fire("autopanstart").panBy([r,q])}},_onCloseButtonClick:function(i){this._close();a.DomEvent.stop(i)},_getAnchor:function(){return a.point(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}});a.popup=function(i,j){return new a.Popup(i,j)};a.Map.mergeOptions({closePopupOnClick:true});a.Map.include({openPopup:function(i,k,j){if(!(i instanceof a.Popup)){i=new a.Popup(j).setContent(i)}if(k){i.setLatLng(k)}if(this.hasLayer(i)){return this}if(this._popup&&this._popup.options.autoClose){this.closePopup()}this._popup=i;return this.addLayer(i)},closePopup:function(i){if(!i||i===this._popup){i=this._popup;this._popup=null}if(i){this.removeLayer(i)}return this}});a.Layer.include({bindPopup:function(j,i){if(j instanceof a.Popup){a.setOptions(j,i);this._popup=j;j._source=this}else{if(!this._popup||i){this._popup=new a.Popup(i,this)}this._popup.setContent(j)}if(!this._popupHandlersAdded){this.on({click:this._openPopup,remove:this.closePopup,move:this._movePopup});this._popupHandlersAdded=true}return this},unbindPopup:function(){if(this._popup){this.off({click:this._openPopup,remove:this.closePopup,move:this._movePopup});this._popupHandlersAdded=false;this._popup=null}return this},openPopup:function(i,k){if(!(i instanceof a.Layer)){k=i;i=this}if(i instanceof a.FeatureGroup){for(var j in this._layers){i=this._layers[j];break}}if(!k){k=i.getCenter?i.getCenter():i.getLatLng()}if(this._popup&&this._map){this._popup._source=i;this._popup.update();this._map.openPopup(this._popup,k)}return this},closePopup:function(){if(this._popup){this._popup._close()}return this},togglePopup:function(i){if(this._popup){if(this._popup._map){this.closePopup()}else{this.openPopup(i)}}return this},isPopupOpen:function(){return(this._popup?this._popup.isOpen():false)},setPopupContent:function(i){if(this._popup){this._popup.setContent(i)}return this},getPopup:function(){return this._popup},_openPopup:function(j){var i=j.layer||j.target;if(!this._popup){return}if(!this._map){return}a.DomEvent.stop(j);if(i instanceof a.Path){this.openPopup(j.layer||j.target,j.latlng);return}if(this._map.hasLayer(this._popup)&&this._popup._source===i){this.closePopup()}else{this.openPopup(i,j.latlng)}},_movePopup:function(i){this._popup.setLatLng(i.latlng)}});a.Tooltip=a.DivOverlay.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:false,sticky:false,interactive:false,opacity:0.9},onAdd:function(i){a.DivOverlay.prototype.onAdd.call(this,i);this.setOpacity(this.options.opacity);i.fire("tooltipopen",{tooltip:this});if(this._source){this._source.fire("tooltipopen",{tooltip:this},true)}},onRemove:function(i){a.DivOverlay.prototype.onRemove.call(this,i);i.fire("tooltipclose",{tooltip:this});if(this._source){this._source.fire("tooltipclose",{tooltip:this},true)}},getEvents:function(){var i=a.DivOverlay.prototype.getEvents.call(this);if(a.Browser.touch&&!this.options.permanent){i.preclick=this._close}return i},_close:function(){if(this._map){this._map.closeTooltip(this)}},_initLayout:function(){var j="leaflet-tooltip",i=j+" "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=a.DomUtil.create("div",i)},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(p){var i=this._map,j=this._container,o=i.latLngToContainerPoint(i.getCenter()),k=i.layerPointToContainerPoint(p),q=this.options.direction,n=j.offsetWidth,r=j.offsetHeight,l=a.point(this.options.offset),m=this._getAnchor();if(q==="top"){p=p.add(a.point(-n/2+l.x,-r+l.y+m.y,true))}else{if(q==="bottom"){p=p.subtract(a.point(n/2-l.x,-l.y,true))}else{if(q==="center"){p=p.subtract(a.point(n/2+l.x,r/2-m.y+l.y,true))}else{if(q==="right"||q==="auto"&&k.x<o.x){q="right";p=p.add(a.point(l.x+m.x,m.y-r/2+l.y,true))}else{q="left";p=p.subtract(a.point(n+m.x-l.x,r/2-m.y-l.y,true))}}}}a.DomUtil.removeClass(j,"leaflet-tooltip-right");a.DomUtil.removeClass(j,"leaflet-tooltip-left");a.DomUtil.removeClass(j,"leaflet-tooltip-top");a.DomUtil.removeClass(j,"leaflet-tooltip-bottom");a.DomUtil.addClass(j,"leaflet-tooltip-"+q);a.DomUtil.setPosition(j,p)},_updatePosition:function(){var i=this._map.latLngToLayerPoint(this._latlng);this._setPosition(i)},setOpacity:function(i){this.options.opacity=i;if(this._container){a.DomUtil.setOpacity(this._container,i)}},_animateZoom:function(i){var j=this._map._latLngToNewLayerPoint(this._latlng,i.zoom,i.center);this._setPosition(j)},_getAnchor:function(){return a.point(this._source&&this._source._getTooltipAnchor&&!this.options.sticky?this._source._getTooltipAnchor():[0,0])}});a.tooltip=function(i,j){return new a.Tooltip(i,j)};a.Map.include({openTooltip:function(j,k,i){if(!(j instanceof a.Tooltip)){j=new a.Tooltip(i).setContent(j)}if(k){j.setLatLng(k)}if(this.hasLayer(j)){return this}return this.addLayer(j)},closeTooltip:function(i){if(i){this.removeLayer(i)}return this}});a.Layer.include({bindTooltip:function(j,i){if(j instanceof a.Tooltip){a.setOptions(j,i);this._tooltip=j;j._source=this}else{if(!this._tooltip||i){this._tooltip=a.tooltip(i,this)}this._tooltip.setContent(j)}this._initTooltipInteractions();if(this._tooltip.options.permanent&&this._map&&this._map.hasLayer(this)){this.openTooltip()}return this},unbindTooltip:function(){if(this._tooltip){this._initTooltipInteractions(true);this.closeTooltip();this._tooltip=null}return this},_initTooltipInteractions:function(j){if(!j&&this._tooltipHandlersAdded){return}var i=j?"off":"on",k={remove:this.closeTooltip,move:this._moveTooltip};if(!this._tooltip.options.permanent){k.mouseover=this._openTooltip;k.mouseout=this.closeTooltip;if(this._tooltip.options.sticky){k.mousemove=this._moveTooltip}if(a.Browser.touch){k.click=this._openTooltip}}else{k.add=this._openTooltip}this[i](k);this._tooltipHandlersAdded=!j},openTooltip:function(i,k){if(!(i instanceof a.Layer)){k=i;i=this}if(i instanceof a.FeatureGroup){for(var j in this._layers){i=this._layers[j];break}}if(!k){k=i.getCenter?i.getCenter():i.getLatLng()}if(this._tooltip&&this._map){this._tooltip._source=i;this._tooltip.update();this._map.openTooltip(this._tooltip,k);if(this._tooltip.options.interactive&&this._tooltip._container){a.DomUtil.addClass(this._tooltip._container,"leaflet-clickable");this.addInteractiveTarget(this._tooltip._container)}}return this},closeTooltip:function(){if(this._tooltip){this._tooltip._close();if(this._tooltip.options.interactive&&this._tooltip._container){a.DomUtil.removeClass(this._tooltip._container,"leaflet-clickable");this.removeInteractiveTarget(this._tooltip._container)}}return this},toggleTooltip:function(i){if(this._tooltip){if(this._tooltip._map){this.closeTooltip()}else{this.openTooltip(i)}}return this},isTooltipOpen:function(){return this._tooltip.isOpen()},setTooltipContent:function(i){if(this._tooltip){this._tooltip.setContent(i)}return this},getTooltip:function(){return this._tooltip},_openTooltip:function(j){var i=j.layer||j.target;if(!this._tooltip||!this._map){return}this.openTooltip(i,this._tooltip.options.sticky?j.latlng:h)},_moveTooltip:function(k){var l=k.latlng,j,i;if(this._tooltip.options.sticky&&k.originalEvent){j=this._map.mouseEventToContainerPoint(k.originalEvent);i=this._map.containerPointToLayerPoint(j);l=this._map.layerPointToLatLng(i)}this._tooltip.setLatLng(l)}});a.LayerGroup=a.Layer.extend({initialize:function(l){this._layers={};var k,j;if(l){for(k=0,j=l.length;k<j;k++){this.addLayer(l[k])}}},addLayer:function(i){var j=this.getLayerId(i);this._layers[j]=i;if(this._map){this._map.addLayer(i)}return this},removeLayer:function(i){var j=i in this._layers?i:this.getLayerId(i);if(this._map&&this._layers[j]){this._map.removeLayer(this._layers[j])}delete this._layers[j];return this},hasLayer:function(i){return !!i&&(i in this._layers||this.getLayerId(i) in this._layers)},clearLayers:function(){for(var j in this._layers){this.removeLayer(this._layers[j])}return this},invoke:function(j){var k=Array.prototype.slice.call(arguments,1),m,l;for(m in this._layers){l=this._layers[m];if(l[j]){l[j].apply(l,k)}}return this},onAdd:function(k){for(var j in this._layers){k.addLayer(this._layers[j])}},onRemove:function(k){for(var j in this._layers){k.removeLayer(this._layers[j])}},eachLayer:function(l,k){for(var j in this._layers){l.call(k,this._layers[j])}return this},getLayer:function(i){return this._layers[i]},getLayers:function(){var k=[];for(var j in this._layers){k.push(this._layers[j])}return k},setZIndex:function(i){return this.invoke("setZIndex",i)},getLayerId:function(i){return a.stamp(i)}});a.layerGroup=function(i){return new a.LayerGroup(i)};a.FeatureGroup=a.LayerGroup.extend({addLayer:function(i){if(this.hasLayer(i)){return this}i.addEventParent(this);a.LayerGroup.prototype.addLayer.call(this,i);return this.fire("layeradd",{layer:i})},removeLayer:function(i){if(!this.hasLayer(i)){return this}if(i in this._layers){i=this._layers[i]}i.removeEventParent(this);a.LayerGroup.prototype.removeLayer.call(this,i);return this.fire("layerremove",{layer:i})},setStyle:function(i){return this.invoke("setStyle",i)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var j=new a.LatLngBounds();for(var k in this._layers){var i=this._layers[k];j.extend(i.getBounds?i.getBounds():i.getLatLng())}return j}});a.featureGroup=function(i){return new a.FeatureGroup(i)};a.Renderer=a.Layer.extend({options:{padding:0.1},initialize:function(i){a.setOptions(this,i);a.stamp(this);this._layers=this._layers||{}},onAdd:function(){if(!this._container){this._initContainer();if(this._zoomAnimated){a.DomUtil.addClass(this._container,"leaflet-zoom-animated")}}this.getPane().appendChild(this._container);this._update();this.on("update",this._updatePaths,this)},onRemove:function(){a.DomUtil.remove(this._container);this.off("update",this._updatePaths,this)},getEvents:function(){var i={viewreset:this._reset,zoom:this._onZoom,moveend:this._update,zoomend:this._onZoomEnd};if(this._zoomAnimated){i.zoomanim=this._onAnimZoom}return i},_onAnimZoom:function(i){this._updateTransform(i.center,i.zoom)},_onZoom:function(){this._updateTransform(this._map.getCenter(),this._map.getZoom())},_updateTransform:function(i,q){var l=this._map.getZoomScale(q,this._zoom),n=a.DomUtil.getPosition(this._container),o=this._map.getSize().multiplyBy(0.5+this.options.padding),j=this._map.project(this._center,q),m=this._map.project(i,q),p=m.subtract(j),k=o.multiplyBy(-l).add(n).add(o).subtract(p);if(a.Browser.any3d){a.DomUtil.setTransform(this._container,k,l)}else{a.DomUtil.setPosition(this._container,k)}},_reset:function(){this._update();this._updateTransform(this._center,this._zoom);for(var i in this._layers){this._layers[i]._reset()}},_onZoomEnd:function(){for(var i in this._layers){this._layers[i]._project()}},_updatePaths:function(){for(var i in this._layers){this._layers[i]._update()}},_update:function(){var k=this.options.padding,j=this._map.getSize(),i=this._map.containerPointToLayerPoint(j.multiplyBy(-k)).round();this._bounds=new a.Bounds(i,i.add(j.multiplyBy(1+k*2)).round());this._center=this._map.getCenter();this._zoom=this._map.getZoom()}});a.Map.include({getRenderer:function(i){var j=i.options.renderer||this._getPaneRenderer(i.options.pane)||this.options.renderer||this._renderer;if(!j){j=this._renderer=(this.options.preferCanvas&&a.canvas())||a.svg()}if(!this.hasLayer(j)){this.addLayer(j)}return j},_getPaneRenderer:function(i){if(i==="overlayPane"||i===h){return false}var j=this._paneRenderers[i];if(j===h){j=(a.SVG&&a.svg({pane:i}))||(a.Canvas&&a.canvas({pane:i}));this._paneRenderers[i]=j}return j}});a.Path=a.Layer.extend({options:{stroke:true,color:"#3388ff",weight:3,opacity:1,lineCap:"round",lineJoin:"round",dashArray:null,dashOffset:null,fill:false,fillColor:null,fillOpacity:0.2,fillRule:"evenodd",interactive:true},beforeAdd:function(i){this._renderer=i.getRenderer(this)},onAdd:function(){this._renderer._initPath(this);this._reset();this._renderer._addPath(this)},onRemove:function(){this._renderer._removePath(this)},redraw:function(){if(this._map){this._renderer._updatePath(this)}return this},setStyle:function(i){a.setOptions(this,i);if(this._renderer){this._renderer._updateStyle(this)}return this},bringToFront:function(){if(this._renderer){this._renderer._bringToFront(this)}return this},bringToBack:function(){if(this._renderer){this._renderer._bringToBack(this)}return this},getElement:function(){return this._path},_reset:function(){this._project();this._update()},_clickTolerance:function(){return(this.options.stroke?this.options.weight/2:0)+(a.Browser.touch?10:0)}});a.LineUtil={simplify:function(k,i){if(!i||!k.length){return k.slice()}var j=i*i;k=this._reducePoints(k,j);k=this._simplifyDP(k,j);return k},pointToSegmentDistance:function(j,k,i){return Math.sqrt(this._sqClosestPointOnSegment(j,k,i,true))},closestPointOnSegment:function(j,k,i){return this._sqClosestPointOnSegment(j,k,i)},_simplifyDP:function(n,k){var j=n.length,m=typeof Uint8Array!==h+""?Uint8Array:Array,p=new m(j);p[0]=p[j-1]=1;this._simplifyDPStep(n,p,k,0,j-1);var l,o=[];for(l=0;l<j;l++){if(p[l]){o.push(n[l])}}return o},_simplifyDPStep:function(r,k,j,o,q){var l=0,p,m,n;for(m=o+1;m<=q-1;m++){n=this._sqClosestPointOnSegment(r[m],r[o],r[q],true);if(n>l){p=m;l=n}}if(l>j){k[p]=1;this._simplifyDPStep(r,k,j,o,p);this._simplifyDPStep(r,k,j,p,q)}},_reducePoints:function(m,k){var o=[m[0]];for(var l=1,n=0,j=m.length;l<j;l++){if(this._sqDist(m[l],m[n])>k){o.push(m[l]);n=l}}if(n<j-1){o.push(m[j-1])}return o},clipSegment:function(q,o,i,r,s){var m=r?this._lastCode:this._getBitCode(q,i),k=this._getBitCode(o,i),l,j,n;this._lastCode=k;while(true){if(!(m|k)){return[q,o]}if(m&k){return false}l=m||k;j=this._getEdgeIntersection(q,o,l,i,s);n=this._getBitCode(j,i);if(l===m){q=j;m=n}else{o=j;k=n}}},_getEdgeIntersection:function(p,n,j,i,q){var s=n.x-p.x,r=n.y-p.y,k=i.min,m=i.max,o,l;if(j&8){o=p.x+s*(m.y-p.y)/r;l=m.y}else{if(j&4){o=p.x+s*(k.y-p.y)/r;l=k.y}else{if(j&2){o=m.x;l=p.y+r*(m.x-p.x)/s}else{if(j&1){o=k.x;l=p.y+r*(k.x-p.x)/s}}}}return new a.Point(o,l,q)},_getBitCode:function(k,j){var i=0;if(k.x<j.min.x){i|=1}else{if(k.x>j.max.x){i|=2}}if(k.y<j.min.y){i|=4}else{if(k.y>j.max.y){i|=8}}return i},_sqDist:function(l,k){var j=k.x-l.x,i=k.y-l.y;return j*j+i*i},_sqClosestPointOnSegment:function(j,o,n,k){var m=o.x,l=o.y,s=n.x-m,r=n.y-l,i=s*s+r*r,q;if(i>0){q=((j.x-m)*s+(j.y-l)*r)/i;if(q>1){m=n.x;l=n.y}else{if(q>0){m+=s*q;l+=r*q}}}s=j.x-m;r=j.y-l;return k?s*s+r*r:new a.Point(m,l)}};a.Polyline=a.Path.extend({options:{smoothFactor:1,noClip:false},initialize:function(i,j){a.setOptions(this,j);this._setLatLngs(i)},getLatLngs:function(){return this._latlngs},setLatLngs:function(i){this._setLatLngs(i);return this.redraw()},isEmpty:function(){return !this._latlngs.length},closestLayerPoint:function(k){var t=Infinity,r=null,l=a.LineUtil._sqClosestPointOnSegment,v,u;for(var m=0,w=this._parts.length;m<w;m++){var s=this._parts[m];for(var n=1,q=s.length;n<q;n++){v=s[n-1];u=s[n];var o=l(k,v,u,true);if(o<t){t=o;r=l(k,v,u)}}}if(r){r.distance=Math.sqrt(t)}return r},getCenter:function(){if(!this._map){throw new Error("Must add layer to map before using getCenter()")}var l,j,k,o,r,p,n,q=this._rings[0],m=q.length;if(!m){return null}for(l=0,j=0;l<m-1;l++){j+=q[l].distanceTo(q[l+1])/2}if(j===0){return this._map.layerPointToLatLng(q[0])}for(l=0,o=0;l<m-1;l++){r=q[l];p=q[l+1];k=r.distanceTo(p);o+=k;if(o>j){n=(o-j)/k;return this._map.layerPointToLatLng([p.x-n*(p.x-r.x),p.y-n*(p.y-r.y)])}}},getBounds:function(){return this._bounds},addLatLng:function(j,i){i=i||this._defaultShape();j=a.latLng(j);i.push(j);this._bounds.extend(j);return this.redraw()},_setLatLngs:function(i){this._bounds=new a.LatLngBounds();this._latlngs=this._convertLatLngs(i)},_defaultShape:function(){return a.Polyline._flat(this._latlngs)?this._latlngs:this._latlngs[0]},_convertLatLngs:function(l){var k=[],n=a.Polyline._flat(l);for(var m=0,j=l.length;m<j;m++){if(n){k[m]=a.latLng(l[m]);this._bounds.extend(k[m])}else{k[m]=this._convertLatLngs(l[m])}}return k},_project:function(){var j=new a.Bounds();this._rings=[];this._projectLatlngs(this._latlngs,this._rings,j);var i=this._clickTolerance(),k=new a.Point(i,i);if(this._bounds.isValid()&&j.isValid()){j.min._subtract(k);j.max._add(k);this._pxBounds=j}},_projectLatlngs:function(l,k,o){var p=l[0] instanceof a.LatLng,j=l.length,n,m;if(p){m=[];for(n=0;n<j;n++){m[n]=this._map.latLngToLayerPoint(l[n]);o.extend(m[n])}k.push(m)}else{for(n=0;n<j;n++){this._projectLatlngs(l[n],k,o)}}},_clipPoints:function(){var l=this._renderer._bounds;this._parts=[];if(!this._pxBounds||!this._pxBounds.intersects(l)){return}if(this.options.noClip){this._parts=this._rings;return}var o=this._parts,q,p,m,s,n,r,t;for(q=0,m=0,s=this._rings.length;q<s;q++){t=this._rings[q];for(p=0,n=t.length;p<n-1;p++){r=a.LineUtil.clipSegment(t[p],t[p+1],l,p,true);if(!r){continue}o[m]=o[m]||[];o[m].push(r[0]);if((r[1]!==t[p+1])||(p===n-2)){o[m].push(r[1]);m++}}}},_simplifyPoints:function(){var m=this._parts,k=this.options.smoothFactor;for(var l=0,j=m.length;l<j;l++){m[l]=a.LineUtil.simplify(m[l],k)}},_update:function(){if(!this._map){return}this._clipPoints();this._simplifyPoints();this._updatePath()},_updatePath:function(){this._renderer._updatePoly(this)}});a.polyline=function(i,j){return new a.Polyline(i,j)};a.Polyline._flat=function(i){return !a.Util.isArray(i[0])||(typeof i[0][0]!=="object"&&typeof i[0][0]!=="undefined")};a.PolyUtil={};a.PolyUtil.clipPolygon=function(y,l,z){var v,s=[1,4,2,8],t,r,q,x,w,u,n,m,o=a.LineUtil;for(t=0,u=y.length;t<u;t++){y[t]._code=o._getBitCode(y[t],l)}for(q=0;q<4;q++){n=s[q];v=[];for(t=0,u=y.length,r=u-1;t<u;r=t++){x=y[t];w=y[r];if(!(x._code&n)){if(w._code&n){m=o._getEdgeIntersection(w,x,n,l,z);m._code=o._getBitCode(m,l);v.push(m)}v.push(x)}else{if(!(w._code&n)){m=o._getEdgeIntersection(w,x,n,l,z);m._code=o._getBitCode(m,l);v.push(m)}}}y=v}return y};a.Polygon=a.Polyline.extend({options:{fill:true},isEmpty:function(){return !this._latlngs.length||!this._latlngs[0].length},getCenter:function(){if(!this._map){throw new Error("Must add layer to map before using getCenter()")}var n,m,u,t,p,l,r,q,k,s=this._rings[0],o=s.length;if(!o){return null}l=r=q=0;for(n=0,m=o-1;n<o;m=n++){u=s[n];t=s[m];p=u.y*t.x-t.y*u.x;r+=(u.x+t.x)*p;q+=(u.y+t.y)*p;l+=p*3}if(l===0){k=s[0]}else{k=[r/l,q/l]}return this._map.layerPointToLatLng(k)},_convertLatLngs:function(k){var j=a.Polyline.prototype._convertLatLngs.call(this,k),i=j.length;if(i>=2&&j[0] instanceof a.LatLng&&j[0].equals(j[i-1])){j.pop()}return j},_setLatLngs:function(i){a.Polyline.prototype._setLatLngs.call(this,i);if(a.Polyline._flat(this._latlngs)){this._latlngs=[this._latlngs]}},_defaultShape:function(){return a.Polyline._flat(this._latlngs[0])?this._latlngs[0]:this._latlngs[0][0]},_clipPoints:function(){var n=this._renderer._bounds,l=this.options.weight,o=new a.Point(l,l);n=new a.Bounds(n.min.subtract(o),n.max.add(o));this._parts=[];if(!this._pxBounds||!this._pxBounds.intersects(n)){return}if(this.options.noClip){this._parts=this._rings;return}for(var m=0,k=this._rings.length,j;m<k;m++){j=a.PolyUtil.clipPolygon(this._rings[m],n,true);if(j.length){this._parts.push(j)}}},_updatePath:function(){this._renderer._updatePoly(this,true)}});a.polygon=function(i,j){return new a.Polygon(i,j)};a.Rectangle=a.Polygon.extend({initialize:function(j,i){a.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(j),i)},setBounds:function(i){return this.setLatLngs(this._boundsToLatLngs(i))},_boundsToLatLngs:function(i){i=a.latLngBounds(i);return[i.getSouthWest(),i.getNorthWest(),i.getNorthEast(),i.getSouthEast()]}});a.rectangle=function(j,i){return new a.Rectangle(j,i)};a.CircleMarker=a.Path.extend({options:{fill:true,radius:10},initialize:function(j,i){a.setOptions(this,i);this._latlng=a.latLng(j);this._radius=this.options.radius},setLatLng:function(i){this._latlng=a.latLng(i);this.redraw();return this.fire("move",{latlng:this._latlng})},getLatLng:function(){return this._latlng},setRadius:function(i){this.options.radius=this._radius=i;return this.redraw()},getRadius:function(){return this._radius},setStyle:function(j){var i=j&&j.radius||this._radius;a.Path.prototype.setStyle.call(this,j);this.setRadius(i);return this},_project:function(){this._point=this._map.latLngToLayerPoint(this._latlng);this._updateBounds()},_updateBounds:function(){var k=this._radius,j=this._radiusY||k,i=this._clickTolerance(),l=[k+i,j+i];this._pxBounds=new a.Bounds(this._point.subtract(l),this._point.add(l))},_update:function(){if(this._map){this._updatePath()}},_updatePath:function(){this._renderer._updateCircle(this)},_empty:function(){return this._radius&&!this._renderer._bounds.intersects(this._pxBounds)}});a.circleMarker=function(j,i){return new a.CircleMarker(j,i)};a.Circle=a.CircleMarker.extend({initialize:function(k,j,i){if(typeof j==="number"){j=a.extend({},i,{radius:j})}a.setOptions(this,j);this._latlng=a.latLng(k);if(isNaN(this.options.radius)){throw new Error("Circle radius cannot be NaN")}this._mRadius=this.options.radius},setRadius:function(i){this._mRadius=i;return this.redraw()},getRadius:function(){return this._mRadius},getBounds:function(){var i=[this._radius,this._radiusY||this._radius];return new a.LatLngBounds(this._map.layerPointToLatLng(this._point.subtract(i)),this._map.layerPointToLatLng(this._point.add(i)))},setStyle:a.Path.prototype.setStyle,_project:function(){var r=this._latlng.lng,o=this._latlng.lat,j=this._map,t=j.options.crs;if(t.distance===a.CRS.Earth.distance){var n=Math.PI/180,u=(this._mRadius/a.CRS.Earth.R)/n,q=j.project([o+u,r]),i=j.project([o-u,r]),k=q.add(i).divideBy(2),m=j.unproject(k).lat,l=Math.acos((Math.cos(u*n)-Math.sin(o*n)*Math.sin(m*n))/(Math.cos(o*n)*Math.cos(m*n)))/n;if(isNaN(l)||l===0){l=u/Math.cos(Math.PI/180*o)}this._point=k.subtract(j.getPixelOrigin());this._radius=isNaN(l)?0:Math.max(Math.round(k.x-j.project([m,r-l]).x),1);this._radiusY=Math.max(Math.round(k.y-q.y),1)}else{var s=t.unproject(t.project(this._latlng).subtract([this._mRadius,0]));this._point=j.latLngToLayerPoint(this._latlng);this._radius=this._point.x-j.latLngToLayerPoint(s).x}this._updateBounds()}});a.circle=function(k,j,i){return new a.Circle(k,j,i)};a.SVG=a.Renderer.extend({getEvents:function(){var i=a.Renderer.prototype.getEvents.call(this);i.zoomstart=this._onZoomStart;return i},_initContainer:function(){this._container=a.SVG.create("svg");this._container.setAttribute("pointer-events","none");this._rootGroup=a.SVG.create("g");this._container.appendChild(this._rootGroup)},_onZoomStart:function(){this._update()},_update:function(){if(this._map._animatingZoom&&this._bounds){return}a.Renderer.prototype._update.call(this);var i=this._bounds,k=i.getSize(),j=this._container;if(!this._svgSize||!this._svgSize.equals(k)){this._svgSize=k;j.setAttribute("width",k.x);j.setAttribute("height",k.y)}a.DomUtil.setPosition(j,i.min);j.setAttribute("viewBox",[i.min.x,i.min.y,k.x,k.y].join(" "));this.fire("update")},_initPath:function(i){var j=i._path=a.SVG.create("path");if(i.options.className){a.DomUtil.addClass(j,i.options.className)}if(i.options.interactive){a.DomUtil.addClass(j,"leaflet-interactive")}this._updateStyle(i);this._layers[a.stamp(i)]=i},_addPath:function(i){this._rootGroup.appendChild(i._path);i.addInteractiveTarget(i._path)},_removePath:function(i){a.DomUtil.remove(i._path);i.removeInteractiveTarget(i._path);delete this._layers[a.stamp(i)]},_updatePath:function(i){i._project();i._update()},_updateStyle:function(j){var k=j._path,i=j.options;if(!k){return}if(i.stroke){k.setAttribute("stroke",i.color);k.setAttribute("stroke-opacity",i.opacity);k.setAttribute("stroke-width",i.weight);k.setAttribute("stroke-linecap",i.lineCap);k.setAttribute("stroke-linejoin",i.lineJoin);if(i.dashArray){k.setAttribute("stroke-dasharray",i.dashArray)}else{k.removeAttribute("stroke-dasharray")}if(i.dashOffset){k.setAttribute("stroke-dashoffset",i.dashOffset)}else{k.removeAttribute("stroke-dashoffset")}}else{k.setAttribute("stroke","none")}if(i.fill){k.setAttribute("fill",i.fillColor||i.color);k.setAttribute("fill-opacity",i.fillOpacity);k.setAttribute("fill-rule",i.fillRule||"evenodd")}else{k.setAttribute("fill","none")}},_updatePoly:function(j,i){this._setPath(j,a.SVG.pointsToPath(j._parts,i))},_updateCircle:function(k){var m=k._point,l=k._radius,i=k._radiusY||l,j="a"+l+","+i+" 0 1,0 ";var n=k._empty()?"M0 0":"M"+(m.x-l)+","+m.y+j+(l*2)+",0 "+j+(-l*2)+",0 ";this._setPath(k,n)},_setPath:function(i,j){i._path.setAttribute("d",j)},_bringToFront:function(i){a.DomUtil.toFront(i._path)},_bringToBack:function(i){a.DomUtil.toBack(i._path)}});a.extend(a.SVG,{create:function(i){return b.createElementNS("http://www.w3.org/2000/svg",i)},pointsToPath:function(s,o){var r="",n,m,q,l,t,k;for(n=0,q=s.length;n<q;n++){t=s[n];for(m=0,l=t.length;m<l;m++){k=t[m];r+=(m?"L":"M")+k.x+" "+k.y}r+=o?(a.Browser.svg?"z":"x"):""}return r||"M0 0"}});a.Browser.svg=!!(b.createElementNS&&a.SVG.create("svg").createSVGRect);a.svg=function(i){return a.Browser.svg||a.Browser.vml?new a.SVG(i):null};a.Browser.vml=!a.Browser.svg&&(function(){try{var k=b.createElement("div");k.innerHTML='<v:shape adj="1"/>';var i=k.firstChild;i.style.behavior="url(#default#VML)";return i&&(typeof i.adj==="object")}catch(j){return false}}());a.SVG.include(!a.Browser.vml?{}:{_initContainer:function(){this._container=a.DomUtil.create("div","leaflet-vml-container")},_update:function(){if(this._map._animatingZoom){return}a.Renderer.prototype._update.call(this);this.fire("update")},_initPath:function(j){var i=j._container=a.SVG.create("shape");a.DomUtil.addClass(i,"leaflet-vml-shape "+(this.options.className||""));i.coordsize="1 1";j._path=a.SVG.create("path");i.appendChild(j._path);this._updateStyle(j);this._layers[a.stamp(j)]=j},_addPath:function(j){var i=j._container;this._container.appendChild(i);if(j.options.interactive){j.addInteractiveTarget(i)}},_removePath:function(j){var i=j._container;a.DomUtil.remove(i);j.removeInteractiveTarget(i);delete this._layers[a.stamp(j)]},_updateStyle:function(k){var m=k._stroke,l=k._fill,j=k.options,i=k._container;i.stroked=!!j.stroke;i.filled=!!j.fill;if(j.stroke){if(!m){m=k._stroke=a.SVG.create("stroke")}i.appendChild(m);m.weight=j.weight+"px";m.color=j.color;m.opacity=j.opacity;if(j.dashArray){m.dashStyle=a.Util.isArray(j.dashArray)?j.dashArray.join(" "):j.dashArray.replace(/( *, *)/g," ")}else{m.dashStyle=""}m.endcap=j.lineCap.replace("butt","flat");m.joinstyle=j.lineJoin}else{if(m){i.removeChild(m);k._stroke=null}}if(j.fill){if(!l){l=k._fill=a.SVG.create("fill")}i.appendChild(l);l.color=j.fillColor||j.color;l.opacity=j.fillOpacity}else{if(l){i.removeChild(l);k._fill=null}}},_updateCircle:function(j){var l=j._point.round(),k=Math.round(j._radius),i=Math.round(j._radiusY||k);this._setPath(j,j._empty()?"M0 0":"AL "+l.x+","+l.y+" "+k+","+i+" 0,"+(65535*360))},_setPath:function(i,j){i._path.v=j},_bringToFront:function(i){a.DomUtil.toFront(i._container)},_bringToBack:function(i){a.DomUtil.toBack(i._container)}});if(a.Browser.vml){a.SVG.create=(function(){try{b.namespaces.add("lvml","urn:schemas-microsoft-com:vml");return function(j){return b.createElement("<lvml:"+j+' class="lvml">')}}catch(i){return function(j){return b.createElement("<"+j+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}})()}a.Canvas=a.Renderer.extend({getEvents:function(){var i=a.Renderer.prototype.getEvents.call(this);i.viewprereset=this._onViewPreReset;return i},_onViewPreReset:function(){this._postponeUpdatePaths=true},onAdd:function(){a.Renderer.prototype.onAdd.call(this);this._draw()},_initContainer:function(){var i=this._container=b.createElement("canvas");a.DomEvent.on(i,"mousemove",a.Util.throttle(this._onMouseMove,32,this),this).on(i,"click dblclick mousedown mouseup contextmenu",this._onClick,this).on(i,"mouseout",this._handleMouseOut,this);this._ctx=i.getContext("2d")},_updatePaths:function(){if(this._postponeUpdatePaths){return}var i;this._redrawBounds=null;for(var j in this._layers){i=this._layers[j];i._update()}this._redraw()},_update:function(){if(this._map._animatingZoom&&this._bounds){return}this._drawnLayers={};a.Renderer.prototype._update.call(this);var j=this._bounds,k=this._container,l=j.getSize(),i=a.Browser.retina?2:1;a.DomUtil.setPosition(k,j.min);k.width=i*l.x;k.height=i*l.y;k.style.width=l.x+"px";k.style.height=l.y+"px";if(a.Browser.retina){this._ctx.scale(2,2)}this._ctx.translate(-j.min.x,-j.min.y);this.fire("update")},_reset:function(){a.Renderer.prototype._reset.call(this);if(this._postponeUpdatePaths){this._postponeUpdatePaths=false;this._updatePaths()}},_initPath:function(j){this._updateDashArray(j);this._layers[a.stamp(j)]=j;var i=j._order={layer:j,prev:this._drawLast,next:null};if(this._drawLast){this._drawLast.next=i}this._drawLast=i;this._drawFirst=this._drawFirst||this._drawLast},_addPath:function(i){this._requestRedraw(i)},_removePath:function(j){var i=j._order;var k=i.next;var l=i.prev;if(k){k.prev=l}else{this._drawLast=l}if(l){l.next=k}else{this._drawFirst=k}delete j._order;delete this._layers[a.stamp(j)];this._requestRedraw(j)},_updatePath:function(i){this._extendRedrawBounds(i);i._project();i._update();this._requestRedraw(i)},_updateStyle:function(i){this._updateDashArray(i);this._requestRedraw(i)},_updateDashArray:function(l){if(l.options.dashArray){var m=l.options.dashArray.split(","),j=[],k;for(k=0;k<m.length;k++){j.push(Number(m[k]))}l.options._dashArray=j}},_requestRedraw:function(i){if(!this._map){return}this._extendRedrawBounds(i);this._redrawRequest=this._redrawRequest||a.Util.requestAnimFrame(this._redraw,this)},_extendRedrawBounds:function(i){var j=(i.options.weight||0)+1;this._redrawBounds=this._redrawBounds||new a.Bounds();this._redrawBounds.extend(i._pxBounds.min.subtract([j,j]));this._redrawBounds.extend(i._pxBounds.max.add([j,j]))},_redraw:function(){this._redrawRequest=null;if(this._redrawBounds){this._redrawBounds.min._floor();this._redrawBounds.max._ceil()}this._clear();this._draw();this._redrawBounds=null},_clear:function(){var j=this._redrawBounds;if(j){var i=j.getSize();this._ctx.clearRect(j.min.x,j.min.y,i.x,i.y)}else{this._ctx.clearRect(0,0,this._container.width,this._container.height)}},_draw:function(){var k,l=this._redrawBounds;this._ctx.save();if(l){var j=l.getSize();this._ctx.beginPath();this._ctx.rect(l.min.x,l.min.y,j.x,j.y);this._ctx.clip()}this._drawing=true;for(var i=this._drawFirst;i;i=i.next){k=i.layer;if(!l||(k._pxBounds&&k._pxBounds.intersects(l))){k._updatePath()}}this._drawing=false;this._ctx.restore()},_updatePoly:function(q,r){if(!this._drawing){return}var o,n,l,k,m=q._parts,s=m.length,t=this._ctx;if(!s){return}this._drawnLayers[q._leaflet_id]=q;t.beginPath();if(t.setLineDash){t.setLineDash(q.options&&q.options._dashArray||[])}for(o=0;o<s;o++){for(n=0,l=m[o].length;n<l;n++){k=m[o][n];t[n?"lineTo":"moveTo"](k.x,k.y)}if(r){t.closePath()}}this._fillStroke(t,q)},_updateCircle:function(j){if(!this._drawing||j._empty()){return}var m=j._point,i=this._ctx,l=j._radius,k=(j._radiusY||l)/l;this._drawnLayers[j._leaflet_id]=j;if(k!==1){i.save();i.scale(1,k)}i.beginPath();i.arc(m.x,m.y/k,l,0,Math.PI*2,false);if(k!==1){i.restore()}this._fillStroke(i,j)},_fillStroke:function(i,k){var j=k.options;if(j.fill){i.globalAlpha=j.fillOpacity;i.fillStyle=j.fillColor||j.color;i.fill(j.fillRule||"evenodd")}if(j.stroke&&j.weight!==0){i.globalAlpha=j.opacity;i.lineWidth=j.weight;i.strokeStyle=j.color;i.lineCap=j.lineCap;i.lineJoin=j.lineJoin;i.stroke()}},_onClick:function(m){var j=this._map.mouseEventToLayerPoint(m),k,l;for(var i=this._drawFirst;i;i=i.next){k=i.layer;if(k.options.interactive&&k._containsPoint(j)&&!this._map._draggableMoved(k)){l=k}}if(l){a.DomEvent._fakeStop(m);this._fireEvent([l],m)}},_onMouseMove:function(j){if(!this._map||this._map.dragging.moving()||this._map._animatingZoom){return}var i=this._map.mouseEventToLayerPoint(j);this._handleMouseHover(j,i)},_handleMouseOut:function(j){var i=this._hoveredLayer;if(i){a.DomUtil.removeClass(this._container,"leaflet-interactive");this._fireEvent([i],j,"mouseout");this._hoveredLayer=null}},_handleMouseHover:function(m,j){var l,k;for(var i=this._drawFirst;i;i=i.next){l=i.layer;if(l.options.interactive&&l._containsPoint(j)){k=l}}if(k!==this._hoveredLayer){this._handleMouseOut(m);if(k){a.DomUtil.addClass(this._container,"leaflet-interactive");this._fireEvent([k],m,"mouseover");this._hoveredLayer=k}}if(this._hoveredLayer){this._fireEvent([this._hoveredLayer],m)}},_fireEvent:function(k,j,i){this._map._fireDOMEvent(j,i||j.type,k)},_bringToFront:function(j){var i=j._order;var k=i.next;var l=i.prev;if(k){k.prev=l}else{return}if(l){l.next=k}else{if(k){this._drawFirst=k}}i.prev=this._drawLast;this._drawLast.next=i;i.next=null;this._drawLast=i;this._requestRedraw(j)},_bringToBack:function(j){var i=j._order;var k=i.next;var l=i.prev;if(l){l.next=k}else{return}if(k){k.prev=l}else{if(l){this._drawLast=l}}i.prev=null;i.next=this._drawFirst;this._drawFirst.prev=i;this._drawFirst=i;this._requestRedraw(j)}});a.Browser.canvas=(function(){return !!b.createElement("canvas").getContext}());a.canvas=function(i){return a.Browser.canvas?new a.Canvas(i):null};a.Polyline.prototype._containsPoint=function(l,s){var r,q,n,t,o,m,u=this._clickTolerance();if(!this._pxBounds.contains(l)){return false}for(r=0,t=this._parts.length;r<t;r++){m=this._parts[r];for(q=0,o=m.length,n=o-1;q<o;n=q++){if(!s&&(q===0)){continue}if(a.LineUtil.pointToSegmentDistance(l,m[n],m[q])<=u){return true}}}return false};a.Polygon.prototype._containsPoint=function(l){var n=false,m,v,u,s,r,q,t,o;if(!this._pxBounds.contains(l)){return false}for(s=0,t=this._parts.length;s<t;s++){m=this._parts[s];for(r=0,o=m.length,q=o-1;r<o;q=r++){v=m[r];u=m[q];if(((v.y>l.y)!==(u.y>l.y))&&(l.x<(u.x-v.x)*(l.y-v.y)/(u.y-v.y)+v.x)){n=!n}}}return n||a.Polyline.prototype._containsPoint.call(this,l,true)};a.CircleMarker.prototype._containsPoint=function(i){return i.distanceTo(this._point)<=this._radius+this._clickTolerance()};a.GeoJSON=a.FeatureGroup.extend({initialize:function(j,i){a.setOptions(this,i);this._layers={};if(j){this.addData(j)}},addData:function(l){var p=a.Util.isArray(l)?l:l.features,o,j,n;if(p){for(o=0,j=p.length;o<j;o++){n=p[o];if(n.geometries||n.geometry||n.features||n.coordinates){this.addData(n)}}return this}var k=this.options;if(k.filter&&!k.filter(l)){return this}var m=a.GeoJSON.geometryToLayer(l,k);if(!m){return this}m.feature=a.GeoJSON.asFeature(l);m.defaultOptions=m.options;this.resetStyle(m);if(k.onEachFeature){k.onEachFeature(l,m)}return this.addLayer(m)},resetStyle:function(i){i.options=a.Util.extend({},i.defaultOptions);this._setLayerStyle(i,this.options.style);return this},setStyle:function(i){return this.eachLayer(function(j){this._setLayerStyle(j,i)},this)},_setLayerStyle:function(i,j){if(typeof j==="function"){j=j(i.feature)}if(i.setStyle){i.setStyle(j)}}});a.extend(a.GeoJSON,{geometryToLayer:function(k,u){var s=k.type==="Feature"?k.geometry:k,t=s?s.coordinates:null,p=[],l=u&&u.pointToLayer,m=u&&u.coordsToLatLng||this.coordsToLatLng,n,j,o,r;if(!t&&!s){return null}switch(s.type){case"Point":n=m(t);return l?l(k,n):new a.Marker(n);case"MultiPoint":for(o=0,r=t.length;o<r;o++){n=m(t[o]);p.push(l?l(k,n):new a.Marker(n))}return new a.FeatureGroup(p);case"LineString":case"MultiLineString":j=this.coordsToLatLngs(t,s.type==="LineString"?0:1,m);return new a.Polyline(j,u);case"Polygon":case"MultiPolygon":j=this.coordsToLatLngs(t,s.type==="Polygon"?1:2,m);return new a.Polygon(j,u);case"GeometryCollection":for(o=0,r=s.geometries.length;o<r;o++){var q=this.geometryToLayer({geometry:s.geometries[o],type:"Feature",properties:k.properties},u);if(q){p.push(q)}}return new a.FeatureGroup(p);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(i){return new a.LatLng(i[1],i[0],i[2])},coordsToLatLngs:function(n,m,p){var k=[];for(var l=0,j=n.length,o;l<j;l++){o=m?this.coordsToLatLngs(n[l],m-1,p):(p||this.coordsToLatLng)(n[l]);k.push(o)}return k},latLngToCoords:function(i){return i.alt!==h?[i.lng,i.lat,i.alt]:[i.lng,i.lat]},latLngsToCoords:function(k,o,l){var n=[];for(var m=0,j=k.length;m<j;m++){n.push(o?a.GeoJSON.latLngsToCoords(k[m],o-1,l):a.GeoJSON.latLngToCoords(k[m]))}if(!o&&l){n.push(n[0])}return n},getFeature:function(j,i){return j.feature?a.extend({},j.feature,{geometry:i}):a.GeoJSON.asFeature(i)},asFeature:function(i){if(i.type==="Feature"||i.type==="FeatureCollection"){return i}return{type:"Feature",properties:{},geometry:i}}});var c={toGeoJSON:function(){return a.GeoJSON.getFeature(this,{type:"Point",coordinates:a.GeoJSON.latLngToCoords(this.getLatLng())})}};a.Marker.include(c);a.Circle.include(c);a.CircleMarker.include(c);a.Polyline.prototype.toGeoJSON=function(){var j=!a.Polyline._flat(this._latlngs);var i=a.GeoJSON.latLngsToCoords(this._latlngs,j?1:0);return a.GeoJSON.getFeature(this,{type:(j?"Multi":"")+"LineString",coordinates:i})};a.Polygon.prototype.toGeoJSON=function(){var i=!a.Polyline._flat(this._latlngs),k=i&&!a.Polyline._flat(this._latlngs[0]);var j=a.GeoJSON.latLngsToCoords(this._latlngs,k?2:i?1:0,true);if(!i){j=[j]}return a.GeoJSON.getFeature(this,{type:(k?"Multi":"")+"Polygon",coordinates:j})};a.LayerGroup.include({toMultiPoint:function(){var i=[];this.eachLayer(function(j){i.push(j.toGeoJSON().geometry.coordinates)});return a.GeoJSON.getFeature(this,{type:"MultiPoint",coordinates:i})},toGeoJSON:function(){var j=this.feature&&this.feature.geometry&&this.feature.geometry.type;if(j==="MultiPoint"){return this.toMultiPoint()}var i=j==="GeometryCollection",k=[];this.eachLayer(function(m){if(m.toGeoJSON){var l=m.toGeoJSON();k.push(i?l.geometry:a.GeoJSON.asFeature(l))}});if(i){return a.GeoJSON.getFeature(this,{geometries:k,type:"GeometryCollection"})}return{type:"FeatureCollection",features:k}}});a.geoJSON=function(j,i){return new a.GeoJSON(j,i)};a.geoJson=a.geoJSON;a.Draggable=a.Evented.extend({options:{clickTolerance:3},statics:{START:a.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"}},initialize:function(j,k,i){this._element=j;this._dragStartTarget=k||j;this._preventOutline=i},enable:function(){if(this._enabled){return}a.DomEvent.on(this._dragStartTarget,a.Draggable.START.join(" "),this._onDown,this);this._enabled=true},disable:function(){if(!this._enabled){return}if(a.Draggable._dragging===this){this.finishDrag()}a.DomEvent.off(this._dragStartTarget,a.Draggable.START.join(" "),this._onDown,this);this._enabled=false;this._moved=false},_onDown:function(i){if(i._simulated||!this._enabled){return}this._moved=false;if(a.DomUtil.hasClass(this._element,"leaflet-zoom-anim")){return}if(a.Draggable._dragging||i.shiftKey||((i.which!==1)&&(i.button!==1)&&!i.touches)){return}a.Draggable._dragging=this;if(this._preventOutline){a.DomUtil.preventOutline(this._element)}a.DomUtil.disableImageDrag();a.DomUtil.disableTextSelection();if(this._moving){return}this.fire("down");var j=i.touches?i.touches[0]:i;this._startPoint=new a.Point(j.clientX,j.clientY);a.DomEvent.on(b,a.Draggable.MOVE[i.type],this._onMove,this).on(b,a.Draggable.END[i.type],this._onUp,this)},_onMove:function(j){if(j._simulated||!this._enabled){return}if(j.touches&&j.touches.length>1){this._moved=true;return}var l=(j.touches&&j.touches.length===1?j.touches[0]:j),i=new a.Point(l.clientX,l.clientY),k=i.subtract(this._startPoint);if(!k.x&&!k.y){return}if(Math.abs(k.x)+Math.abs(k.y)<this.options.clickTolerance){return}a.DomEvent.preventDefault(j);if(!this._moved){this.fire("dragstart");this._moved=true;this._startPos=a.DomUtil.getPosition(this._element).subtract(k);a.DomUtil.addClass(b.body,"leaflet-dragging");this._lastTarget=j.target||j.srcElement;if((f.SVGElementInstance)&&(this._lastTarget instanceof SVGElementInstance)){this._lastTarget=this._lastTarget.correspondingUseElement}a.DomUtil.addClass(this._lastTarget,"leaflet-drag-target")}this._newPos=this._startPos.add(k);this._moving=true;a.Util.cancelAnimFrame(this._animRequest);this._lastEvent=j;this._animRequest=a.Util.requestAnimFrame(this._updatePosition,this,true)},_updatePosition:function(){var i={originalEvent:this._lastEvent};this.fire("predrag",i);a.DomUtil.setPosition(this._element,this._newPos);this.fire("drag",i)},_onUp:function(i){if(i._simulated||!this._enabled){return}this.finishDrag()},finishDrag:function(){a.DomUtil.removeClass(b.body,"leaflet-dragging");if(this._lastTarget){a.DomUtil.removeClass(this._lastTarget,"leaflet-drag-target");this._lastTarget=null}for(var j in a.Draggable.MOVE){a.DomEvent.off(b,a.Draggable.MOVE[j],this._onMove,this).off(b,a.Draggable.END[j],this._onUp,this)}a.DomUtil.enableImageDrag();a.DomUtil.enableTextSelection();if(this._moved&&this._moving){a.Util.cancelAnimFrame(this._animRequest);this.fire("dragend",{distance:this._newPos.distanceTo(this._startPos)})}this._moving=false;a.Draggable._dragging=false}});a.Handler=a.Class.extend({initialize:function(i){this._map=i},enable:function(){if(this._enabled){return this}this._enabled=true;this.addHooks();return this},disable:function(){if(!this._enabled){return this}this._enabled=false;this.removeHooks();return this},enabled:function(){return !!this._enabled}});a.Map.mergeOptions({dragging:true,inertia:!a.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:Infinity,easeLinearity:0.2,worldCopyJump:false,maxBoundsViscosity:0});a.Map.Drag=a.Handler.extend({addHooks:function(){if(!this._draggable){var i=this._map;this._draggable=new a.Draggable(i._mapPane,i._container);this._draggable.on({down:this._onDown,dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this);this._draggable.on("predrag",this._onPreDragLimit,this);if(i.options.worldCopyJump){this._draggable.on("predrag",this._onPreDragWrap,this);i.on("zoomend",this._onZoomEnd,this);i.whenReady(this._onZoomEnd,this)}}a.DomUtil.addClass(this._map._container,"leaflet-grab leaflet-touch-drag");this._draggable.enable();this._positions=[];this._times=[]},removeHooks:function(){a.DomUtil.removeClass(this._map._container,"leaflet-grab");a.DomUtil.removeClass(this._map._container,"leaflet-touch-drag");this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDown:function(){this._map._stop()},_onDragStart:function(){var j=this._map;if(this._map.options.maxBounds&&this._map.options.maxBoundsViscosity){var i=a.latLngBounds(this._map.options.maxBounds);this._offsetLimit=a.bounds(this._map.latLngToContainerPoint(i.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(i.getSouthEast()).multiplyBy(-1).add(this._map.getSize()));this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))}else{this._offsetLimit=null}j.fire("movestart").fire("dragstart");if(j.options.inertia){this._positions=[];this._times=[]}},_onDrag:function(j){if(this._map.options.inertia){var i=this._lastTime=+new Date(),k=this._lastPos=this._draggable._absPos||this._draggable._newPos;this._positions.push(k);this._times.push(i);if(i-this._times[0]>50){this._positions.shift();this._times.shift()}}this._map.fire("move",j).fire("drag",j)},_onZoomEnd:function(){var j=this._map.getSize().divideBy(2),i=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=i.subtract(j).x;this._worldWidth=this._map.getPixelWorldBounds().getSize().x},_viscousLimit:function(j,i){return j-(j-i)*this._viscosity},_onPreDragLimit:function(){if(!this._viscosity||!this._offsetLimit){return}var j=this._draggable._newPos.subtract(this._draggable._startPos);var i=this._offsetLimit;if(j.x<i.min.x){j.x=this._viscousLimit(j.x,i.min.x)}if(j.y<i.min.y){j.y=this._viscousLimit(j.y,i.min.y)}if(j.x>i.max.x){j.x=this._viscousLimit(j.x,i.max.x)}if(j.y>i.max.y){j.y=this._viscousLimit(j.y,i.max.y)}this._draggable._newPos=this._draggable._startPos.add(j)},_onPreDragWrap:function(){var o=this._worldWidth,n=Math.round(o/2),j=this._initialWorldOffset,i=this._draggable._newPos.x,l=(i-n+j)%o+n-j,k=(i+n+j)%o-n-j,m=Math.abs(l+j)<Math.abs(k+j)?l:k;this._draggable._absPos=this._draggable._newPos.clone();this._draggable._newPos.x=m},_onDragEnd:function(q){var j=this._map,u=j.options,i=!u.inertia||this._times.length<2;j.fire("dragend",q);if(i){j.fire("moveend")}else{var r=this._lastPos.subtract(this._positions[0]),o=(this._lastTime-this._times[0])/1000,n=u.easeLinearity,m=r.multiplyBy(n/o),l=m.distanceTo([0,0]),t=Math.min(u.inertiaMaxSpeed,l),s=m.multiplyBy(t/l),k=t/(u.inertiaDeceleration*n),p=s.multiplyBy(-k/2).round();if(!p.x&&!p.y){j.fire("moveend")}else{p=j._limitOffset(p,j.options.maxBounds);a.Util.requestAnimFrame(function(){j.panBy(p,{duration:k,easeLinearity:n,noMoveStart:true,animate:true})})}}}});a.Map.addInitHook("addHandler","dragging",a.Map.Drag);a.Map.mergeOptions({doubleClickZoom:true});a.Map.DoubleClickZoom=a.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(l){var k=this._map,j=k.getZoom(),m=k.options.zoomDelta,i=l.originalEvent.shiftKey?j-m:j+m;if(k.options.doubleClickZoom==="center"){k.setZoom(i)}else{k.setZoomAround(l.containerPoint,i)}}});a.Map.addInitHook("addHandler","doubleClickZoom",a.Map.DoubleClickZoom);a.Map.mergeOptions({scrollWheelZoom:true,wheelDebounceTime:40,wheelPxPerZoomLevel:60});a.Map.ScrollWheelZoom=a.Handler.extend({addHooks:function(){a.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this);this._delta=0},removeHooks:function(){a.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll,this)},_onWheelScroll:function(k){var l=a.DomEvent.getWheelDelta(k);var i=this._map.options.wheelDebounceTime;this._delta+=l;this._lastMousePos=this._map.mouseEventToContainerPoint(k);if(!this._startTime){this._startTime=+new Date()}var j=Math.max(i-(+new Date()-this._startTime),0);clearTimeout(this._timer);this._timer=setTimeout(a.bind(this._performZoom,this),j);a.DomEvent.stop(k)},_performZoom:function(){var n=this._map,m=n.getZoom(),i=this._map.options.zoomSnap||0;n._stop();var l=this._delta/(this._map.options.wheelPxPerZoomLevel*4),k=4*Math.log(2/(1+Math.exp(-Math.abs(l))))/Math.LN2,j=i?Math.ceil(k/i)*i:k,o=n._limitZoom(m+(this._delta>0?j:-j))-m;this._delta=0;this._startTime=null;if(!o){return}if(n.options.scrollWheelZoom==="center"){n.setZoom(m+o)}else{n.setZoomAround(this._lastMousePos,m+o)}}});a.Map.addInitHook("addHandler","scrollWheelZoom",a.Map.ScrollWheelZoom);a.extend(a.DomEvent,{_touchstart:a.Browser.msPointer?"MSPointerDown":a.Browser.pointer?"pointerdown":"touchstart",_touchend:a.Browser.msPointer?"MSPointerUp":a.Browser.pointer?"pointerup":"touchend",addDoubleTapListener:function(l,t,i){var s,k,p=false,n=250;function m(w){var v;if(a.Browser.pointer){if((!a.Browser.edge)||w.pointerType==="mouse"){return}v=a.DomEvent._pointersCount}else{v=w.touches.length}if(v>1){return}var u=Date.now(),x=u-(s||u);k=w.touches?w.touches[0]:w;p=(x>0&&x<=n);s=u}function q(w){if(p&&!k.cancelBubble){if(a.Browser.pointer){if((!a.Browser.edge)||w.pointerType==="mouse"){return}var u={},x,v;for(v in k){x=k[v];u[v]=x&&x.bind?x.bind(k):x}k=u}k.type="dblclick";t(k);s=null}}var j="_leaflet_",o=this._touchstart,r=this._touchend;l[j+o+i]=m;l[j+r+i]=q;l[j+"dblclick"+i]=t;l.addEventListener(o,m,false);l.addEventListener(r,q,false);l.addEventListener("dblclick",t,false);return this},removeDoubleTapListener:function(k,n){var j="_leaflet_",m=k[j+this._touchstart+n],l=k[j+this._touchend+n],i=k[j+"dblclick"+n];k.removeEventListener(this._touchstart,m,false);k.removeEventListener(this._touchend,l,false);if(!a.Browser.edge){k.removeEventListener("dblclick",i,false)}return this}});a.extend(a.DomEvent,{POINTER_DOWN:a.Browser.msPointer?"MSPointerDown":"pointerdown",POINTER_MOVE:a.Browser.msPointer?"MSPointerMove":"pointermove",POINTER_UP:a.Browser.msPointer?"MSPointerUp":"pointerup",POINTER_CANCEL:a.Browser.msPointer?"MSPointerCancel":"pointercancel",TAG_WHITE_LIST:["INPUT","SELECT","OPTION"],_pointers:{},_pointersCount:0,addPointerListener:function(k,j,i,l){if(j==="touchstart"){this._addPointerStart(k,i,l)}else{if(j==="touchmove"){this._addPointerMove(k,i,l)}else{if(j==="touchend"){this._addPointerEnd(k,i,l)}}}return this},removePointerListener:function(k,j,l){var i=k["_leaflet_"+j+l];if(j==="touchstart"){k.removeEventListener(this.POINTER_DOWN,i,false)}else{if(j==="touchmove"){k.removeEventListener(this.POINTER_MOVE,i,false)}else{if(j==="touchend"){k.removeEventListener(this.POINTER_UP,i,false);k.removeEventListener(this.POINTER_CANCEL,i,false)}}}return this},_addPointerStart:function(k,i,m){var j=a.bind(function(n){if(n.pointerType!=="mouse"&&n.MSPOINTER_TYPE_MOUSE&&n.pointerType!==n.MSPOINTER_TYPE_MOUSE){if(this.TAG_WHITE_LIST.indexOf(n.target.tagName)<0){a.DomEvent.preventDefault(n)}else{return}}this._handlePointer(n,i)},this);k["_leaflet_touchstart"+m]=j;k.addEventListener(this.POINTER_DOWN,j,false);if(!this._pointerDocListener){var l=a.bind(this._globalPointerUp,this);b.documentElement.addEventListener(this.POINTER_DOWN,a.bind(this._globalPointerDown,this),true);b.documentElement.addEventListener(this.POINTER_MOVE,a.bind(this._globalPointerMove,this),true);b.documentElement.addEventListener(this.POINTER_UP,l,true);b.documentElement.addEventListener(this.POINTER_CANCEL,l,true);this._pointerDocListener=true}},_globalPointerDown:function(i){this._pointers[i.pointerId]=i;this._pointersCount++},_globalPointerMove:function(i){if(this._pointers[i.pointerId]){this._pointers[i.pointerId]=i}},_globalPointerUp:function(i){delete this._pointers[i.pointerId];this._pointersCount--},_handlePointer:function(l,k){l.touches=[];for(var j in this._pointers){l.touches.push(this._pointers[j])}l.changedTouches=[l];k(l)},_addPointerMove:function(j,i,l){var k=a.bind(function(m){if((m.pointerType===m.MSPOINTER_TYPE_MOUSE||m.pointerType==="mouse")&&m.buttons===0){return}this._handlePointer(m,i)},this);j["_leaflet_touchmove"+l]=k;j.addEventListener(this.POINTER_MOVE,k,false)},_addPointerEnd:function(j,i,l){var k=a.bind(function(m){this._handlePointer(m,i)},this);j["_leaflet_touchend"+l]=k;j.addEventListener(this.POINTER_UP,k,false);j.addEventListener(this.POINTER_CANCEL,k,false)}});a.Map.mergeOptions({touchZoom:a.Browser.touch&&!a.Browser.android23,bounceAtZoomLimits:true});a.Map.TouchZoom=a.Handler.extend({addHooks:function(){a.DomUtil.addClass(this._map._container,"leaflet-touch-zoom");a.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){a.DomUtil.removeClass(this._map._container,"leaflet-touch-zoom");a.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(k){var j=this._map;if(!k.touches||k.touches.length!==2||j._animatingZoom||this._zooming){return}var l=j.mouseEventToContainerPoint(k.touches[0]),i=j.mouseEventToContainerPoint(k.touches[1]);this._centerPoint=j.getSize()._divideBy(2);this._startLatLng=j.containerPointToLatLng(this._centerPoint);if(j.options.touchZoom!=="center"){this._pinchStartLatLng=j.containerPointToLatLng(l.add(i)._divideBy(2))}this._startDist=l.distanceTo(i);this._startZoom=j.getZoom();this._moved=false;this._zooming=true;j._stop();a.DomEvent.on(b,"touchmove",this._onTouchMove,this).on(b,"touchend",this._onTouchEnd,this);a.DomEvent.preventDefault(k)},_onTouchMove:function(l){if(!l.touches||l.touches.length!==2||!this._zooming){return}var k=this._map,n=k.mouseEventToContainerPoint(l.touches[0]),j=k.mouseEventToContainerPoint(l.touches[1]),m=n.distanceTo(j)/this._startDist;this._zoom=k.getScaleZoom(m,this._startZoom);if(!k.options.bounceAtZoomLimits&&((this._zoom<k.getMinZoom()&&m<1)||(this._zoom>k.getMaxZoom()&&m>1))){this._zoom=k._limitZoom(this._zoom)}if(k.options.touchZoom==="center"){this._center=this._startLatLng;if(m===1){return}}else{var o=n._add(j)._divideBy(2)._subtract(this._centerPoint);if(m===1&&o.x===0&&o.y===0){return}this._center=k.unproject(k.project(this._pinchStartLatLng,this._zoom).subtract(o),this._zoom)}if(!this._moved){k._moveStart(true);this._moved=true}a.Util.cancelAnimFrame(this._animRequest);var i=a.bind(k._move,k,this._center,this._zoom,{pinch:true,round:false});this._animRequest=a.Util.requestAnimFrame(i,this,true);a.DomEvent.preventDefault(l)},_onTouchEnd:function(){if(!this._moved||!this._zooming){this._zooming=false;return}this._zooming=false;a.Util.cancelAnimFrame(this._animRequest);a.DomEvent.off(b,"touchmove",this._onTouchMove).off(b,"touchend",this._onTouchEnd);if(this._map.options.zoomAnimation){this._map._animateZoom(this._center,this._map._limitZoom(this._zoom),true,this._map.options.zoomSnap)}else{this._map._resetView(this._center,this._map._limitZoom(this._zoom))}}});a.Map.addInitHook("addHandler","touchZoom",a.Map.TouchZoom);a.Map.mergeOptions({tap:true,tapTolerance:15});a.Map.Tap=a.Handler.extend({addHooks:function(){a.DomEvent.on(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){a.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(j){if(!j.touches){return}a.DomEvent.preventDefault(j);this._fireClick=true;if(j.touches.length>1){this._fireClick=false;clearTimeout(this._holdTimeout);return}var k=j.touches[0],i=k.target;this._startPos=this._newPos=new a.Point(k.clientX,k.clientY);if(i.tagName&&i.tagName.toLowerCase()==="a"){a.DomUtil.addClass(i,"leaflet-active")}this._holdTimeout=setTimeout(a.bind(function(){if(this._isTapValid()){this._fireClick=false;this._onUp();this._simulateEvent("contextmenu",k)}},this),1000);this._simulateEvent("mousedown",k);a.DomEvent.on(b,{touchmove:this._onMove,touchend:this._onUp},this)},_onUp:function(j){clearTimeout(this._holdTimeout);a.DomEvent.off(b,{touchmove:this._onMove,touchend:this._onUp},this);if(this._fireClick&&j&&j.changedTouches){var k=j.changedTouches[0],i=k.target;if(i&&i.tagName&&i.tagName.toLowerCase()==="a"){a.DomUtil.removeClass(i,"leaflet-active")}this._simulateEvent("mouseup",k);if(this._isTapValid()){this._simulateEvent("click",k)}}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(i){var j=i.touches[0];this._newPos=new a.Point(j.clientX,j.clientY);this._simulateEvent("mousemove",j)},_simulateEvent:function(i,k){var j=b.createEvent("MouseEvents");j._simulated=true;k.target._simulatedClick=true;j.initMouseEvent(i,true,true,f,1,k.screenX,k.screenY,k.clientX,k.clientY,false,false,false,false,0,null);k.target.dispatchEvent(j)}});if(a.Browser.touch&&!a.Browser.pointer){a.Map.addInitHook("addHandler","tap",a.Map.Tap)}a.Map.mergeOptions({boxZoom:true});a.Map.BoxZoom=a.Handler.extend({initialize:function(i){this._map=i;this._container=i._container;this._pane=i._panes.overlayPane},addHooks:function(){a.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){a.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_resetState:function(){this._moved=false},_onMouseDown:function(i){if(!i.shiftKey||((i.which!==1)&&(i.button!==1))){return false}this._resetState();a.DomUtil.disableTextSelection();a.DomUtil.disableImageDrag();this._startPoint=this._map.mouseEventToContainerPoint(i);a.DomEvent.on(b,{contextmenu:a.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(k){if(!this._moved){this._moved=true;this._box=a.DomUtil.create("div","leaflet-zoom-box",this._container);a.DomUtil.addClass(this._container,"leaflet-crosshair");this._map.fire("boxzoomstart")}this._point=this._map.mouseEventToContainerPoint(k);var j=new a.Bounds(this._point,this._startPoint),i=j.getSize();a.DomUtil.setPosition(this._box,j.min);this._box.style.width=i.x+"px";this._box.style.height=i.y+"px"},_finish:function(){if(this._moved){a.DomUtil.remove(this._box);a.DomUtil.removeClass(this._container,"leaflet-crosshair")}a.DomUtil.enableTextSelection();a.DomUtil.enableImageDrag();a.DomEvent.off(b,{contextmenu:a.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(j){if((j.which!==1)&&(j.button!==1)){return}this._finish();if(!this._moved){return}setTimeout(a.bind(this._resetState,this),0);var i=new a.LatLngBounds(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point));this._map.fitBounds(i).fire("boxzoomend",{boxZoomBounds:i})},_onKeyDown:function(i){if(i.keyCode===27){this._finish()}}});a.Map.addInitHook("addHandler","boxZoom",a.Map.BoxZoom);a.Map.mergeOptions({keyboard:true,keyboardPanDelta:80});a.Map.Keyboard=a.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,54,173]},initialize:function(i){this._map=i;this._setPanDelta(i.options.keyboardPanDelta);this._setZoomDelta(i.options.zoomDelta)},addHooks:function(){var i=this._map._container;if(i.tabIndex<=0){i.tabIndex="0"}a.DomEvent.on(i,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this);this._map.on({focus:this._addHooks,blur:this._removeHooks},this)},removeHooks:function(){this._removeHooks();a.DomEvent.off(this._map._container,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this);this._map.off({focus:this._addHooks,blur:this._removeHooks},this)},_onMouseDown:function(){if(this._focused){return}var i=b.body,l=b.documentElement,k=i.scrollTop||l.scrollTop,j=i.scrollLeft||l.scrollLeft;this._map._container.focus();f.scrollTo(j,k)},_onFocus:function(){this._focused=true;this._map.fire("focus")},_onBlur:function(){this._focused=false;this._map.fire("blur")},_setPanDelta:function(n){var m=this._panKeys={},k=this.keyCodes,l,j;for(l=0,j=k.left.length;l<j;l++){m[k.left[l]]=[-1*n,0]}for(l=0,j=k.right.length;l<j;l++){m[k.right[l]]=[n,0]}for(l=0,j=k.down.length;l<j;l++){m[k.down[l]]=[0,n]}for(l=0,j=k.up.length;l<j;l++){m[k.up[l]]=[0,-1*n]}},_setZoomDelta:function(n){var m=this._zoomKeys={},k=this.keyCodes,l,j;for(l=0,j=k.zoomIn.length;l<j;l++){m[k.zoomIn[l]]=n}for(l=0,j=k.zoomOut.length;l<j;l++){m[k.zoomOut[l]]=-n}},_addHooks:function(){a.DomEvent.on(b,"keydown",this._onKeyDown,this)},_removeHooks:function(){a.DomEvent.off(b,"keydown",this._onKeyDown,this)},_onKeyDown:function(k){if(k.altKey||k.ctrlKey||k.metaKey){return}var i=k.keyCode,j=this._map,l;if(i in this._panKeys){if(j._panAnim&&j._panAnim._inProgress){return}l=this._panKeys[i];if(k.shiftKey){l=a.point(l).multiplyBy(3)}j.panBy(l);if(j.options.maxBounds){j.panInsideBounds(j.options.maxBounds)}}else{if(i in this._zoomKeys){j.setZoom(j.getZoom()+(k.shiftKey?3:1)*this._zoomKeys[i])}else{if(i===27){j.closePopup()}else{return}}}a.DomEvent.stop(k)}});a.Map.addInitHook("addHandler","keyboard",a.Map.Keyboard);a.Handler.MarkerDrag=a.Handler.extend({initialize:function(i){this._marker=i},addHooks:function(){var i=this._marker._icon;if(!this._draggable){this._draggable=new a.Draggable(i,i,true)}this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this).enable();a.DomUtil.addClass(i,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this).disable();if(this._marker._icon){a.DomUtil.removeClass(this._marker._icon,"leaflet-marker-draggable")}},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._oldLatLng=this._marker.getLatLng();this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(k){var i=this._marker,m=i._shadow,j=a.DomUtil.getPosition(i._icon),l=i._map.layerPointToLatLng(j);if(m){a.DomUtil.setPosition(m,j)}i._latlng=l;k.latlng=l;k.oldLatLng=this._oldLatLng;i.fire("move",k).fire("drag",k)},_onDragEnd:function(i){delete this._oldLatLng;this._marker.fire("moveend").fire("dragend",i)}});a.Control=a.Class.extend({options:{position:"topright"},initialize:function(i){a.setOptions(this,i)},getPosition:function(){return this.options.position},setPosition:function(i){var j=this._map;if(j){j.removeControl(this)}this.options.position=i;if(j){j.addControl(this)}return this},getContainer:function(){return this._container},addTo:function(k){this.remove();this._map=k;var i=this._container=this.onAdd(k),l=this.getPosition(),j=k._controlCorners[l];a.DomUtil.addClass(i,"leaflet-control");if(l.indexOf("bottom")!==-1){j.insertBefore(i,j.firstChild)}else{j.appendChild(i)}return this},remove:function(){if(!this._map){return this}a.DomUtil.remove(this._container);if(this.onRemove){this.onRemove(this._map)}this._map=null;return this},_refocusOnMap:function(i){if(this._map&&i&&i.screenX>0&&i.screenY>0){this._map.getContainer().focus()}}});a.control=function(i){return new a.Control(i)};a.Map.include({addControl:function(i){i.addTo(this);return this},removeControl:function(i){i.remove();return this},_initControlPos:function(){var k=this._controlCorners={},j="leaflet-",i=this._controlContainer=a.DomUtil.create("div",j+"control-container",this._container);function m(n,o){var l=j+n+" "+j+o;k[n+o]=a.DomUtil.create("div",l,i)}m("top","left");m("top","right");m("bottom","left");m("bottom","right")},_clearControlPos:function(){a.DomUtil.remove(this._controlContainer)}});a.Control.Zoom=a.Control.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"-",zoomOutTitle:"Zoom out"},onAdd:function(k){var l="leaflet-control-zoom",i=a.DomUtil.create("div",l+" leaflet-bar"),j=this.options;this._zoomInButton=this._createButton(j.zoomInText,j.zoomInTitle,l+"-in",i,this._zoomIn);this._zoomOutButton=this._createButton(j.zoomOutText,j.zoomOutTitle,l+"-out",i,this._zoomOut);this._updateDisabled();k.on("zoomend zoomlevelschange",this._updateDisabled,this);return i},onRemove:function(i){i.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){this._disabled=true;this._updateDisabled();return this},enable:function(){this._disabled=false;this._updateDisabled();return this},_zoomIn:function(i){if(!this._disabled&&this._map._zoom<this._map.getMaxZoom()){this._map.zoomIn(this._map.options.zoomDelta*(i.shiftKey?3:1))}},_zoomOut:function(i){if(!this._disabled&&this._map._zoom>this._map.getMinZoom()){this._map.zoomOut(this._map.options.zoomDelta*(i.shiftKey?3:1))}},_createButton:function(j,n,l,i,k){var m=a.DomUtil.create("a",l,i);m.innerHTML=j;m.href="#";m.title=n;m.setAttribute("role","button");m.setAttribute("aria-label",n);a.DomEvent.on(m,"mousedown dblclick",a.DomEvent.stopPropagation).on(m,"click",a.DomEvent.stop).on(m,"click",k,this).on(m,"click",this._refocusOnMap,this);return m},_updateDisabled:function(){var j=this._map,i="leaflet-disabled";a.DomUtil.removeClass(this._zoomInButton,i);a.DomUtil.removeClass(this._zoomOutButton,i);if(this._disabled||j._zoom===j.getMinZoom()){a.DomUtil.addClass(this._zoomOutButton,i)}if(this._disabled||j._zoom===j.getMaxZoom()){a.DomUtil.addClass(this._zoomInButton,i)}}});a.Map.mergeOptions({zoomControl:true});a.Map.addInitHook(function(){if(this.options.zoomControl){this.zoomControl=new a.Control.Zoom();this.addControl(this.zoomControl)}});a.control.zoom=function(i){return new a.Control.Zoom(i)};a.Control.Attribution=a.Control.extend({options:{position:"bottomright",prefix:'<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'},initialize:function(i){a.setOptions(this,i);this._attributions={}},onAdd:function(k){k.attributionControl=this;this._container=a.DomUtil.create("div","leaflet-control-attribution");if(a.DomEvent){a.DomEvent.disableClickPropagation(this._container)}for(var j in k._layers){if(k._layers[j].getAttribution){this.addAttribution(k._layers[j].getAttribution())}}this._update();return this._container},setPrefix:function(i){this.options.prefix=i;this._update();return this},addAttribution:function(i){if(!i){return this}if(!this._attributions[i]){this._attributions[i]=0}this._attributions[i]++;this._update();return this},removeAttribution:function(i){if(!i){return this}if(this._attributions[i]){this._attributions[i]--;this._update()}return this},_update:function(){if(!this._map){return}var l=[];for(var j in this._attributions){if(this._attributions[j]){l.push(j)}}var k=[];if(this.options.prefix){k.push(this.options.prefix)}if(l.length){k.push(l.join(", "))}this._container.innerHTML=k.join(" | ")}});a.Map.mergeOptions({attributionControl:true});a.Map.addInitHook(function(){if(this.options.attributionControl){new a.Control.Attribution().addTo(this)}});a.control.attribution=function(i){return new a.Control.Attribution(i)};a.Control.Scale=a.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:true,imperial:true},onAdd:function(l){var k="leaflet-control-scale",i=a.DomUtil.create("div",k),j=this.options;this._addScales(j,k+"-line",i);l.on(j.updateWhenIdle?"moveend":"move",this._update,this);l.whenReady(this._update,this);return i},onRemove:function(i){i.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(j,k,i){if(j.metric){this._mScale=a.DomUtil.create("div",k,i)}if(j.imperial){this._iScale=a.DomUtil.create("div",k,i)}},_update:function(){var j=this._map,k=j.getSize().y/2;var i=j.distance(j.containerPointToLatLng([0,k]),j.containerPointToLatLng([this.options.maxWidth,k]));this._updateScales(i)},_updateScales:function(i){if(this.options.metric&&i){this._updateMetric(i)}if(this.options.imperial&&i){this._updateImperial(i)}},_updateMetric:function(k){var i=this._getRoundNum(k),j=i<1000?i+" m":(i/1000)+" km";this._updateScale(this._mScale,j,i/k)},_updateImperial:function(m){var l=m*3.2808399,k,j,i;if(l>5280){k=l/5280;j=this._getRoundNum(k);this._updateScale(this._iScale,j+" mi",j/k)}else{i=this._getRoundNum(l);this._updateScale(this._iScale,i+" ft",i/l)}},_updateScale:function(k,j,i){k.style.width=Math.round(this.options.maxWidth*i)+"px";k.innerHTML=j},_getRoundNum:function(j){var i=Math.pow(10,(Math.floor(j)+"").length-1),k=j/i;k=k>=10?10:k>=5?5:k>=3?3:k>=2?2:1;return i*k}});a.control.scale=function(i){return new a.Control.Scale(i)};a.Control.Layers=a.Control.extend({options:{collapsed:true,position:"topright",autoZIndex:true,hideSingleBase:false,sortLayers:false,sortFunction:function(l,j,k,i){return k<i?-1:(i<k?1:0)}},initialize:function(m,l,j){a.setOptions(this,j);this._layers=[];this._lastZIndex=0;this._handlingClick=false;for(var k in m){this._addLayer(m[k],k)}for(k in l){this._addLayer(l[k],k,true)}},onAdd:function(i){this._initLayout();this._update();this._map=i;i.on("zoomend",this._checkDisabledLayers,this);return this._container},onRemove:function(){this._map.off("zoomend",this._checkDisabledLayers,this);for(var j=0;j<this._layers.length;j++){this._layers[j].layer.off("add remove",this._onLayerChange,this)}},addBaseLayer:function(j,i){this._addLayer(j,i);return(this._map)?this._update():this},addOverlay:function(j,i){this._addLayer(j,i,true);return(this._map)?this._update():this},removeLayer:function(i){i.off("add remove",this._onLayerChange,this);var j=this._getLayer(a.stamp(i));if(j){this._layers.splice(this._layers.indexOf(j),1)}return(this._map)?this._update():this},expand:function(){a.DomUtil.addClass(this._container,"leaflet-control-layers-expanded");this._form.style.height=null;var i=this._map.getSize().y-(this._container.offsetTop+50);if(i<this._form.clientHeight){a.DomUtil.addClass(this._form,"leaflet-control-layers-scrollbar");this._form.style.height=i+"px"}else{a.DomUtil.removeClass(this._form,"leaflet-control-layers-scrollbar")}this._checkDisabledLayers();return this},collapse:function(){a.DomUtil.removeClass(this._container,"leaflet-control-layers-expanded");return this},_initLayout:function(){var j="leaflet-control-layers",i=this._container=a.DomUtil.create("div",j),m=this.options.collapsed;i.setAttribute("aria-haspopup",true);a.DomEvent.disableClickPropagation(i);if(!a.Browser.touch){a.DomEvent.disableScrollPropagation(i)}var l=this._form=a.DomUtil.create("form",j+"-list");if(m){this._map.on("click",this.collapse,this);if(!a.Browser.android){a.DomEvent.on(i,{mouseenter:this.expand,mouseleave:this.collapse},this)}}var k=this._layersLink=a.DomUtil.create("a",j+"-toggle",i);k.href="#";k.title="Layers";if(a.Browser.touch){a.DomEvent.on(k,"click",a.DomEvent.stop).on(k,"click",this.expand,this)}else{a.DomEvent.on(k,"focus",this.expand,this)}a.DomEvent.on(l,"click",function(){setTimeout(a.bind(this._onInputClick,this),0)},this);if(!m){this.expand()}this._baseLayersList=a.DomUtil.create("div",j+"-base",l);this._separator=a.DomUtil.create("div",j+"-separator",l);this._overlaysList=a.DomUtil.create("div",j+"-overlays",l);i.appendChild(l)},_getLayer:function(k){for(var j=0;j<this._layers.length;j++){if(this._layers[j]&&a.stamp(this._layers[j].layer)===k){return this._layers[j]}}},_addLayer:function(k,j,i){k.on("add remove",this._onLayerChange,this);this._layers.push({layer:k,name:j,overlay:i});if(this.options.sortLayers){this._layers.sort(a.bind(function(m,l){return this.options.sortFunction(m.layer,l.layer,m.name,l.name)},this))}if(this.options.autoZIndex&&k.setZIndex){this._lastZIndex++;k.setZIndex(this._lastZIndex)}},_update:function(){if(!this._container){return this}a.DomUtil.empty(this._baseLayersList);a.DomUtil.empty(this._overlaysList);var j,m,l,n,k=0;for(l=0;l<this._layers.length;l++){n=this._layers[l];this._addItem(n);m=m||n.overlay;j=j||!n.overlay;k+=!n.overlay?1:0}if(this.options.hideSingleBase){j=j&&k>1;this._baseLayersList.style.display=j?"":"none"}this._separator.style.display=m&&j?"":"none";return this},_onLayerChange:function(k){if(!this._handlingClick){this._update()}var j=this._getLayer(a.stamp(k.target));var i=j.overlay?(k.type==="add"?"overlayadd":"overlayremove"):(k.type==="add"?"baselayerchange":null);if(i){this._map.fire(i,j)}},_createRadioElement:function(i,l){var k='<input type="radio" class="leaflet-control-layers-selector" name="'+i+'"'+(l?' checked="checked"':"")+"/>";var j=b.createElement("div");j.innerHTML=k;return j.firstChild},_addItem:function(o){var l=b.createElement("label"),n=this._map.hasLayer(o.layer),j;if(o.overlay){j=b.createElement("input");j.type="checkbox";j.className="leaflet-control-layers-selector";j.defaultChecked=n}else{j=this._createRadioElement("leaflet-base-layers",n)}j.layerId=a.stamp(o.layer);a.DomEvent.on(j,"click",this._onInputClick,this);var k=b.createElement("span");k.innerHTML=" "+o.name;var m=b.createElement("div");l.appendChild(m);m.appendChild(j);m.appendChild(k);var i=o.overlay?this._overlaysList:this._baseLayersList;i.appendChild(l);this._checkDisabledLayers();return l},_onInputClick:function(){var k=this._form.getElementsByTagName("input"),l,p,j;var n=[],m=[];this._handlingClick=true;for(var o=k.length-1;o>=0;o--){l=k[o];p=this._getLayer(l.layerId).layer;j=this._map.hasLayer(p);if(l.checked&&!j){n.push(p)}else{if(!l.checked&&j){m.push(p)}}}for(o=0;o<m.length;o++){this._map.removeLayer(m[o])}for(o=0;o<n.length;o++){this._map.addLayer(n[o])}this._handlingClick=false;this._refocusOnMap()},_checkDisabledLayers:function(){var j=this._form.getElementsByTagName("input"),k,m,n=this._map.getZoom();for(var l=j.length-1;l>=0;l--){k=j[l];m=this._getLayer(k.layerId).layer;k.disabled=(m.options.minZoom!==h&&n<m.options.minZoom)||(m.options.maxZoom!==h&&n>m.options.maxZoom)}},_expand:function(){return this.expand()},_collapse:function(){return this.collapse()}});a.control.layers=function(k,j,i){return new a.Control.Layers(k,j,i)}}(window,document));
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-2.0.8.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,3967 @@
+/* esri-leaflet - v2.0.8 - Tue Mar 21 2017 16:10:14 GMT-0700 (PDT)
+ * Copyright (c) 2017 Environmental Systems Research Institute, Inc.
+ * Apache-2.0 */
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet')) :
+	typeof define === 'function' && define.amd ? define(['exports', 'leaflet'], factory) :
+	(factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}),global.L));
+}(this, function (exports,L$1) { 'use strict';
+
+	var L$1__default = 'default' in L$1 ? L$1['default'] : L$1;
+
+	var version = "2.0.8";
+
+	var cors = ((window.XMLHttpRequest && 'withCredentials' in new window.XMLHttpRequest()));
+	var pointerEvents = document.documentElement.style.pointerEvents === '';
+
+	var Support = {
+	  cors: cors,
+	  pointerEvents: pointerEvents
+	};
+
+	var options = {
+	  attributionWidthOffset: 55
+	};
+
+	var callbacks = 0;
+
+	function serialize (params) {
+	  var data = '';
+
+	  params.f = params.f || 'json';
+
+	  for (var key in params) {
+	    if (params.hasOwnProperty(key)) {
+	      var param = params[key];
+	      var type = Object.prototype.toString.call(param);
+	      var value;
+
+	      if (data.length) {
+	        data += '&';
+	      }
+
+	      if (type === '[object Array]') {
+	        value = (Object.prototype.toString.call(param[0]) === '[object Object]') ? JSON.stringify(param) : param.join(',');
+	      } else if (type === '[object Object]') {
+	        value = JSON.stringify(param);
+	      } else if (type === '[object Date]') {
+	        value = param.valueOf();
+	      } else {
+	        value = param;
+	      }
+
+	      data += encodeURIComponent(key) + '=' + encodeURIComponent(value);
+	    }
+	  }
+
+	  return data;
+	}
+
+	function createRequest (callback, context) {
+	  var httpRequest = new window.XMLHttpRequest();
+
+	  httpRequest.onerror = function (e) {
+	    httpRequest.onreadystatechange = L$1.Util.falseFn;
+
+	    callback.call(context, {
+	      error: {
+	        code: 500,
+	        message: 'XMLHttpRequest error'
+	      }
+	    }, null);
+	  };
+
+	  httpRequest.onreadystatechange = function () {
+	    var response;
+	    var error;
+
+	    if (httpRequest.readyState === 4) {
+	      try {
+	        response = JSON.parse(httpRequest.responseText);
+	      } catch (e) {
+	        response = null;
+	        error = {
+	          code: 500,
+	          message: 'Could not parse response as JSON. This could also be caused by a CORS or XMLHttpRequest error.'
+	        };
+	      }
+
+	      if (!error && response.error) {
+	        error = response.error;
+	        response = null;
+	      }
+
+	      httpRequest.onerror = L$1.Util.falseFn;
+
+	      callback.call(context, error, response);
+	    }
+	  };
+
+	  httpRequest.ontimeout = function () {
+	    this.onerror();
+	  };
+
+	  return httpRequest;
+	}
+
+	function xmlHttpPost (url, params, callback, context) {
+	  var httpRequest = createRequest(callback, context);
+	  httpRequest.open('POST', url);
+
+	  if (typeof context !== 'undefined' && context !== null) {
+	    if (typeof context.options !== 'undefined') {
+	      httpRequest.timeout = context.options.timeout;
+	    }
+	  }
+	  httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+	  httpRequest.send(serialize(params));
+
+	  return httpRequest;
+	}
+
+	function xmlHttpGet (url, params, callback, context) {
+	  var httpRequest = createRequest(callback, context);
+	  httpRequest.open('GET', url + '?' + serialize(params), true);
+
+	  if (typeof context !== 'undefined' && context !== null) {
+	    if (typeof context.options !== 'undefined') {
+	      httpRequest.timeout = context.options.timeout;
+	    }
+	  }
+	  httpRequest.send(null);
+
+	  return httpRequest;
+	}
+
+	// AJAX handlers for CORS (modern browsers) or JSONP (older browsers)
+	function request (url, params, callback, context) {
+	  var paramString = serialize(params);
+	  var httpRequest = createRequest(callback, context);
+	  var requestLength = (url + '?' + paramString).length;
+
+	  // ie10/11 require the request be opened before a timeout is applied
+	  if (requestLength <= 2000 && Support.cors) {
+	    httpRequest.open('GET', url + '?' + paramString);
+	  } else if (requestLength > 2000 && Support.cors) {
+	    httpRequest.open('POST', url);
+	    httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+	  }
+
+	  if (typeof context !== 'undefined' && context !== null) {
+	    if (typeof context.options !== 'undefined') {
+	      httpRequest.timeout = context.options.timeout;
+	    }
+	  }
+
+	  // request is less than 2000 characters and the browser supports CORS, make GET request with XMLHttpRequest
+	  if (requestLength <= 2000 && Support.cors) {
+	    httpRequest.send(null);
+
+	  // request is more than 2000 characters and the browser supports CORS, make POST request with XMLHttpRequest
+	  } else if (requestLength > 2000 && Support.cors) {
+	    httpRequest.send(paramString);
+
+	  // request is less  than 2000 characters and the browser does not support CORS, make a JSONP request
+	  } else if (requestLength <= 2000 && !Support.cors) {
+	    return jsonp(url, params, callback, context);
+
+	  // request is longer then 2000 characters and the browser does not support CORS, log a warning
+	  } else {
+	    warn('a request to ' + url + ' was longer then 2000 characters and this browser cannot make a cross-domain post request. Please use a proxy http://esri.github.io/esri-leaflet/api-reference/request.html');
+	    return;
+	  }
+
+	  return httpRequest;
+	}
+
+	function jsonp (url, params, callback, context) {
+	  window._EsriLeafletCallbacks = window._EsriLeafletCallbacks || {};
+	  var callbackId = 'c' + callbacks;
+	  params.callback = 'window._EsriLeafletCallbacks.' + callbackId;
+
+	  window._EsriLeafletCallbacks[callbackId] = function (response) {
+	    if (window._EsriLeafletCallbacks[callbackId] !== true) {
+	      var error;
+	      var responseType = Object.prototype.toString.call(response);
+
+	      if (!(responseType === '[object Object]' || responseType === '[object Array]')) {
+	        error = {
+	          error: {
+	            code: 500,
+	            message: 'Expected array or object as JSONP response'
+	          }
+	        };
+	        response = null;
+	      }
+
+	      if (!error && response.error) {
+	        error = response;
+	        response = null;
+	      }
+
+	      callback.call(context, error, response);
+	      window._EsriLeafletCallbacks[callbackId] = true;
+	    }
+	  };
+
+	  var script = L$1.DomUtil.create('script', null, document.body);
+	  script.type = 'text/javascript';
+	  script.src = url + '?' + serialize(params);
+	  script.id = callbackId;
+
+	  callbacks++;
+
+	  return {
+	    id: callbackId,
+	    url: script.src,
+	    abort: function () {
+	      window._EsriLeafletCallbacks._callback[callbackId]({
+	        code: 0,
+	        message: 'Request aborted.'
+	      });
+	    }
+	  };
+	}
+
+	var get = ((Support.cors) ? xmlHttpGet : jsonp);
+	get.CORS = xmlHttpGet;
+	get.JSONP = jsonp;
+
+	// export the Request object to call the different handlers for debugging
+	var Request = {
+	  request: request,
+	  get: get,
+	  post: xmlHttpPost
+	};
+
+	/*
+	 * Copyright 2015 Esri
+	 *
+	 * 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 Liscense.
+	 */
+
+	// checks if 2 x,y points are equal
+	function pointsEqual (a, b) {
+	  for (var i = 0; i < a.length; i++) {
+	    if (a[i] !== b[i]) {
+	      return false;
+	    }
+	  }
+	  return true;
+	}
+
+	// checks if the first and last points of a ring are equal and closes the ring
+	function closeRing (coordinates) {
+	  if (!pointsEqual(coordinates[0], coordinates[coordinates.length - 1])) {
+	    coordinates.push(coordinates[0]);
+	  }
+	  return coordinates;
+	}
+
+	// determine if polygon ring coordinates are clockwise. clockwise signifies outer ring, counter-clockwise an inner ring
+	// or hole. this logic was found at http://stackoverflow.com/questions/1165647/how-to-determine-if-a-list-of-polygon-
+	// points-are-in-clockwise-order
+	function ringIsClockwise (ringToTest) {
+	  var total = 0;
+	  var i = 0;
+	  var rLength = ringToTest.length;
+	  var pt1 = ringToTest[i];
+	  var pt2;
+	  for (i; i < rLength - 1; i++) {
+	    pt2 = ringToTest[i + 1];
+	    total += (pt2[0] - pt1[0]) * (pt2[1] + pt1[1]);
+	    pt1 = pt2;
+	  }
+	  return (total >= 0);
+	}
+
+	// ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L504-L519
+	function vertexIntersectsVertex (a1, a2, b1, b2) {
+	  var uaT = (b2[0] - b1[0]) * (a1[1] - b1[1]) - (b2[1] - b1[1]) * (a1[0] - b1[0]);
+	  var ubT = (a2[0] - a1[0]) * (a1[1] - b1[1]) - (a2[1] - a1[1]) * (a1[0] - b1[0]);
+	  var uB = (b2[1] - b1[1]) * (a2[0] - a1[0]) - (b2[0] - b1[0]) * (a2[1] - a1[1]);
+
+	  if (uB !== 0) {
+	    var ua = uaT / uB;
+	    var ub = ubT / uB;
+
+	    if (ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1) {
+	      return true;
+	    }
+	  }
+
+	  return false;
+	}
+
+	// ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L521-L531
+	function arrayIntersectsArray (a, b) {
+	  for (var i = 0; i < a.length - 1; i++) {
+	    for (var j = 0; j < b.length - 1; j++) {
+	      if (vertexIntersectsVertex(a[i], a[i + 1], b[j], b[j + 1])) {
+	        return true;
+	      }
+	    }
+	  }
+
+	  return false;
+	}
+
+	// ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L470-L480
+	function coordinatesContainPoint (coordinates, point) {
+	  var contains = false;
+	  for (var i = -1, l = coordinates.length, j = l - 1; ++i < l; j = i) {
+	    if (((coordinates[i][1] <= point[1] && point[1] < coordinates[j][1]) ||
+	         (coordinates[j][1] <= point[1] && point[1] < coordinates[i][1])) &&
+	        (point[0] < (coordinates[j][0] - coordinates[i][0]) * (point[1] - coordinates[i][1]) / (coordinates[j][1] - coordinates[i][1]) + coordinates[i][0])) {
+	      contains = !contains;
+	    }
+	  }
+	  return contains;
+	}
+
+	// ported from terraformer-arcgis-parser.js https://github.com/Esri/terraformer-arcgis-parser/blob/master/terraformer-arcgis-parser.js#L106-L113
+	function coordinatesContainCoordinates (outer, inner) {
+	  var intersects = arrayIntersectsArray(outer, inner);
+	  var contains = coordinatesContainPoint(outer, inner[0]);
+	  if (!intersects && contains) {
+	    return true;
+	  }
+	  return false;
+	}
+
+	// do any polygons in this array contain any other polygons in this array?
+	// used for checking for holes in arcgis rings
+	// ported from terraformer-arcgis-parser.js https://github.com/Esri/terraformer-arcgis-parser/blob/master/terraformer-arcgis-parser.js#L117-L172
+	function convertRingsToGeoJSON (rings) {
+	  var outerRings = [];
+	  var holes = [];
+	  var x; // iterator
+	  var outerRing; // current outer ring being evaluated
+	  var hole; // current hole being evaluated
+
+	  // for each ring
+	  for (var r = 0; r < rings.length; r++) {
+	    var ring = closeRing(rings[r].slice(0));
+	    if (ring.length < 4) {
+	      continue;
+	    }
+	    // is this ring an outer ring? is it clockwise?
+	    if (ringIsClockwise(ring)) {
+	      var polygon = [ ring ];
+	      outerRings.push(polygon); // push to outer rings
+	    } else {
+	      holes.push(ring); // counterclockwise push to holes
+	    }
+	  }
+
+	  var uncontainedHoles = [];
+
+	  // while there are holes left...
+	  while (holes.length) {
+	    // pop a hole off out stack
+	    hole = holes.pop();
+
+	    // loop over all outer rings and see if they contain our hole.
+	    var contained = false;
+	    for (x = outerRings.length - 1; x >= 0; x--) {
+	      outerRing = outerRings[x][0];
+	      if (coordinatesContainCoordinates(outerRing, hole)) {
+	        // the hole is contained push it into our polygon
+	        outerRings[x].push(hole);
+	        contained = true;
+	        break;
+	      }
+	    }
+
+	    // ring is not contained in any outer ring
+	    // sometimes this happens https://github.com/Esri/esri-leaflet/issues/320
+	    if (!contained) {
+	      uncontainedHoles.push(hole);
+	    }
+	  }
+
+	  // if we couldn't match any holes using contains we can try intersects...
+	  while (uncontainedHoles.length) {
+	    // pop a hole off out stack
+	    hole = uncontainedHoles.pop();
+
+	    // loop over all outer rings and see if any intersect our hole.
+	    var intersects = false;
+
+	    for (x = outerRings.length - 1; x >= 0; x--) {
+	      outerRing = outerRings[x][0];
+	      if (arrayIntersectsArray(outerRing, hole)) {
+	        // the hole is contained push it into our polygon
+	        outerRings[x].push(hole);
+	        intersects = true;
+	        break;
+	      }
+	    }
+
+	    if (!intersects) {
+	      outerRings.push([hole.reverse()]);
+	    }
+	  }
+
+	  if (outerRings.length === 1) {
+	    return {
+	      type: 'Polygon',
+	      coordinates: outerRings[0]
+	    };
+	  } else {
+	    return {
+	      type: 'MultiPolygon',
+	      coordinates: outerRings
+	    };
+	  }
+	}
+
+	// This function ensures that rings are oriented in the right directions
+	// outer rings are clockwise, holes are counterclockwise
+	// used for converting GeoJSON Polygons to ArcGIS Polygons
+	function orientRings (poly) {
+	  var output = [];
+	  var polygon = poly.slice(0);
+	  var outerRing = closeRing(polygon.shift().slice(0));
+	  if (outerRing.length >= 4) {
+	    if (!ringIsClockwise(outerRing)) {
+	      outerRing.reverse();
+	    }
+
+	    output.push(outerRing);
+
+	    for (var i = 0; i < polygon.length; i++) {
+	      var hole = closeRing(polygon[i].slice(0));
+	      if (hole.length >= 4) {
+	        if (ringIsClockwise(hole)) {
+	          hole.reverse();
+	        }
+	        output.push(hole);
+	      }
+	    }
+	  }
+
+	  return output;
+	}
+
+	// This function flattens holes in multipolygons to one array of polygons
+	// used for converting GeoJSON Polygons to ArcGIS Polygons
+	function flattenMultiPolygonRings (rings) {
+	  var output = [];
+	  for (var i = 0; i < rings.length; i++) {
+	    var polygon = orientRings(rings[i]);
+	    for (var x = polygon.length - 1; x >= 0; x--) {
+	      var ring = polygon[x].slice(0);
+	      output.push(ring);
+	    }
+	  }
+	  return output;
+	}
+
+	// shallow object clone for feature properties and attributes
+	// from http://jsperf.com/cloning-an-object/2
+	function shallowClone$1 (obj) {
+	  var target = {};
+	  for (var i in obj) {
+	    if (obj.hasOwnProperty(i)) {
+	      target[i] = obj[i];
+	    }
+	  }
+	  return target;
+	}
+
+	function arcgisToGeoJSON$1 (arcgis, idAttribute) {
+	  var geojson = {};
+
+	  if (typeof arcgis.x === 'number' && typeof arcgis.y === 'number') {
+	    geojson.type = 'Point';
+	    geojson.coordinates = [arcgis.x, arcgis.y];
+	  }
+
+	  if (arcgis.points) {
+	    geojson.type = 'MultiPoint';
+	    geojson.coordinates = arcgis.points.slice(0);
+	  }
+
+	  if (arcgis.paths) {
+	    if (arcgis.paths.length === 1) {
+	      geojson.type = 'LineString';
+	      geojson.coordinates = arcgis.paths[0].slice(0);
+	    } else {
+	      geojson.type = 'MultiLineString';
+	      geojson.coordinates = arcgis.paths.slice(0);
+	    }
+	  }
+
+	  if (arcgis.rings) {
+	    geojson = convertRingsToGeoJSON(arcgis.rings.slice(0));
+	  }
+
+	  if (arcgis.geometry || arcgis.attributes) {
+	    geojson.type = 'Feature';
+	    geojson.geometry = (arcgis.geometry) ? arcgisToGeoJSON$1(arcgis.geometry) : null;
+	    geojson.properties = (arcgis.attributes) ? shallowClone$1(arcgis.attributes) : null;
+	    if (arcgis.attributes) {
+	      geojson.id = arcgis.attributes[idAttribute] || arcgis.attributes.OBJECTID || arcgis.attributes.FID;
+	    }
+	  }
+
+	  return geojson;
+	}
+
+	function geojsonToArcGIS$1 (geojson, idAttribute) {
+	  idAttribute = idAttribute || 'OBJECTID';
+	  var spatialReference = { wkid: 4326 };
+	  var result = {};
+	  var i;
+
+	  switch (geojson.type) {
+	    case 'Point':
+	      result.x = geojson.coordinates[0];
+	      result.y = geojson.coordinates[1];
+	      result.spatialReference = spatialReference;
+	      break;
+	    case 'MultiPoint':
+	      result.points = geojson.coordinates.slice(0);
+	      result.spatialReference = spatialReference;
+	      break;
+	    case 'LineString':
+	      result.paths = [geojson.coordinates.slice(0)];
+	      result.spatialReference = spatialReference;
+	      break;
+	    case 'MultiLineString':
+	      result.paths = geojson.coordinates.slice(0);
+	      result.spatialReference = spatialReference;
+	      break;
+	    case 'Polygon':
+	      result.rings = orientRings(geojson.coordinates.slice(0));
+	      result.spatialReference = spatialReference;
+	      break;
+	    case 'MultiPolygon':
+	      result.rings = flattenMultiPolygonRings(geojson.coordinates.slice(0));
+	      result.spatialReference = spatialReference;
+	      break;
+	    case 'Feature':
+	      if (geojson.geometry) {
+	        result.geometry = geojsonToArcGIS$1(geojson.geometry, idAttribute);
+	      }
+	      result.attributes = (geojson.properties) ? shallowClone$1(geojson.properties) : {};
+	      if (geojson.id) {
+	        result.attributes[idAttribute] = geojson.id;
+	      }
+	      break;
+	    case 'FeatureCollection':
+	      result = [];
+	      for (i = 0; i < geojson.features.length; i++) {
+	        result.push(geojsonToArcGIS$1(geojson.features[i], idAttribute));
+	      }
+	      break;
+	    case 'GeometryCollection':
+	      result = [];
+	      for (i = 0; i < geojson.geometries.length; i++) {
+	        result.push(geojsonToArcGIS$1(geojson.geometries[i], idAttribute));
+	      }
+	      break;
+	  }
+
+	  return result;
+	}
+
+	function geojsonToArcGIS (geojson, idAttr) {
+	  return geojsonToArcGIS$1(geojson, idAttr);
+	}
+
+	function arcgisToGeoJSON (arcgis, idAttr) {
+	  return arcgisToGeoJSON$1(arcgis, idAttr);
+	}
+
+	// shallow object clone for feature properties and attributes
+	// from http://jsperf.com/cloning-an-object/2
+	function shallowClone (obj) {
+	  var target = {};
+	  for (var i in obj) {
+	    if (obj.hasOwnProperty(i)) {
+	      target[i] = obj[i];
+	    }
+	  }
+	  return target;
+	}
+
+	// convert an extent (ArcGIS) to LatLngBounds (Leaflet)
+	function extentToBounds (extent) {
+	  // "NaN" coordinates from ArcGIS Server indicate a null geometry
+	  if (extent.xmin !== 'NaN' && extent.ymin !== 'NaN' && extent.xmax !== 'NaN' && extent.ymax !== 'NaN') {
+	    var sw = L$1.latLng(extent.ymin, extent.xmin);
+	    var ne = L$1.latLng(extent.ymax, extent.xmax);
+	    return L$1.latLngBounds(sw, ne);
+	  } else {
+	    return null;
+	  }
+	}
+
+	// convert an LatLngBounds (Leaflet) to extent (ArcGIS)
+	function boundsToExtent (bounds) {
+	  bounds = L$1.latLngBounds(bounds);
+	  return {
+	    'xmin': bounds.getSouthWest().lng,
+	    'ymin': bounds.getSouthWest().lat,
+	    'xmax': bounds.getNorthEast().lng,
+	    'ymax': bounds.getNorthEast().lat,
+	    'spatialReference': {
+	      'wkid': 4326
+	    }
+	  };
+	}
+
+	function responseToFeatureCollection (response, idAttribute) {
+	  var objectIdField;
+	  var features = response.features || response.results;
+	  var count = features.length;
+
+	  if (idAttribute) {
+	    objectIdField = idAttribute;
+	  } else if (response.objectIdFieldName) {
+	    objectIdField = response.objectIdFieldName;
+	  } else if (response.fields) {
+	    for (var j = 0; j <= response.fields.length - 1; j++) {
+	      if (response.fields[j].type === 'esriFieldTypeOID') {
+	        objectIdField = response.fields[j].name;
+	        break;
+	      }
+	    }
+	  } else if (count) {
+	    /* as a last resort, check for common ID fieldnames in the first feature returned
+	    not foolproof. identifyFeatures can returned a mixed array of features. */
+	    for (var key in features[0].attributes) {
+	      if (key.match(/^(OBJECTID|FID|OID|ID)$/i)) {
+	        objectIdField = key;
+	        break;
+	      }
+	    }
+	  }
+
+	  var featureCollection = {
+	    type: 'FeatureCollection',
+	    features: []
+	  };
+
+	  if (count) {
+	    for (var i = features.length - 1; i >= 0; i--) {
+	      var feature = arcgisToGeoJSON(features[i], objectIdField);
+	      featureCollection.features.push(feature);
+	    }
+	  }
+
+	  return featureCollection;
+	}
+
+	  // trim url whitespace and add a trailing slash if needed
+	function cleanUrl (url) {
+	  // trim leading and trailing spaces, but not spaces inside the url
+	  url = L$1.Util.trim(url);
+
+	  // add a trailing slash to the url if the user omitted it
+	  if (url[url.length - 1] !== '/') {
+	    url += '/';
+	  }
+
+	  return url;
+	}
+
+	function isArcgisOnline (url) {
+	  /* hosted feature services support geojson as an output format
+	  utility.arcgis.com services are proxied from a variety of ArcGIS Server vintages, and may not */
+	  return (/^(?!.*utility\.arcgis\.com).*\.arcgis\.com.*FeatureServer/i).test(url);
+	}
+
+	function geojsonTypeToArcGIS (geoJsonType) {
+	  var arcgisGeometryType;
+	  switch (geoJsonType) {
+	    case 'Point':
+	      arcgisGeometryType = 'esriGeometryPoint';
+	      break;
+	    case 'MultiPoint':
+	      arcgisGeometryType = 'esriGeometryMultipoint';
+	      break;
+	    case 'LineString':
+	      arcgisGeometryType = 'esriGeometryPolyline';
+	      break;
+	    case 'MultiLineString':
+	      arcgisGeometryType = 'esriGeometryPolyline';
+	      break;
+	    case 'Polygon':
+	      arcgisGeometryType = 'esriGeometryPolygon';
+	      break;
+	    case 'MultiPolygon':
+	      arcgisGeometryType = 'esriGeometryPolygon';
+	      break;
+	  }
+
+	  return arcgisGeometryType;
+	}
+
+	function warn () {
+	  if (console && console.warn) {
+	    console.warn.apply(console, arguments);
+	  }
+	}
+
+	function calcAttributionWidth (map) {
+	  // either crop at 55px or user defined buffer
+	  return (map.getSize().x - options.attributionWidthOffset) + 'px';
+	}
+
+	function setEsriAttribution (map) {
+	  if (map.attributionControl && !map.attributionControl._esriAttributionAdded) {
+	    map.attributionControl.setPrefix('<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a> | Powered by <a href="https://www.esri.com">Esri</a>');
+
+	    var hoverAttributionStyle = document.createElement('style');
+	    hoverAttributionStyle.type = 'text/css';
+	    hoverAttributionStyle.innerHTML = '.esri-truncated-attribution:hover {' +
+	      'white-space: normal;' +
+	    '}';
+
+	    document.getElementsByTagName('head')[0].appendChild(hoverAttributionStyle);
+	    L$1.DomUtil.addClass(map.attributionControl._container, 'esri-truncated-attribution:hover');
+
+	    // define a new css class in JS to trim attribution into a single line
+	    var attributionStyle = document.createElement('style');
+	    attributionStyle.type = 'text/css';
+	    attributionStyle.innerHTML = '.esri-truncated-attribution {' +
+	      'vertical-align: -3px;' +
+	      'white-space: nowrap;' +
+	      'overflow: hidden;' +
+	      'text-overflow: ellipsis;' +
+	      'display: inline-block;' +
+	      'transition: 0s white-space;' +
+	      'transition-delay: 1s;' +
+	      'max-width: ' + calcAttributionWidth(map) + ';' +
+	    '}';
+
+	    document.getElementsByTagName('head')[0].appendChild(attributionStyle);
+	    L$1.DomUtil.addClass(map.attributionControl._container, 'esri-truncated-attribution');
+
+	    // update the width used to truncate when the map itself is resized
+	    map.on('resize', function (e) {
+	      map.attributionControl._container.style.maxWidth = calcAttributionWidth(e.target);
+	    });
+
+	    map.attributionControl._esriAttributionAdded = true;
+	  }
+	}
+
+	function _getAttributionData (url, map) {
+	  jsonp(url, {}, L$1.Util.bind(function (error, attributions) {
+	    if (error) { return; }
+	    map._esriAttributions = [];
+	    for (var c = 0; c < attributions.contributors.length; c++) {
+	      var contributor = attributions.contributors[c];
+
+	      for (var i = 0; i < contributor.coverageAreas.length; i++) {
+	        var coverageArea = contributor.coverageAreas[i];
+	        var southWest = L$1.latLng(coverageArea.bbox[0], coverageArea.bbox[1]);
+	        var northEast = L$1.latLng(coverageArea.bbox[2], coverageArea.bbox[3]);
+	        map._esriAttributions.push({
+	          attribution: contributor.attribution,
+	          score: coverageArea.score,
+	          bounds: L$1.latLngBounds(southWest, northEast),
+	          minZoom: coverageArea.zoomMin,
+	          maxZoom: coverageArea.zoomMax
+	        });
+	      }
+	    }
+
+	    map._esriAttributions.sort(function (a, b) {
+	      return b.score - a.score;
+	    });
+
+	    // pass the same argument as the map's 'moveend' event
+	    var obj = { target: map };
+	    _updateMapAttribution(obj);
+	  }, this));
+	}
+
+	function _updateMapAttribution (evt) {
+	  var map = evt.target;
+	  var oldAttributions = map._esriAttributions;
+
+	  if (map && map.attributionControl && oldAttributions) {
+	    var newAttributions = '';
+	    var bounds = map.getBounds();
+	    var wrappedBounds = L$1.latLngBounds(
+	      bounds.getSouthWest().wrap(),
+	      bounds.getNorthEast().wrap()
+	    );
+	    var zoom = map.getZoom();
+
+	    for (var i = 0; i < oldAttributions.length; i++) {
+	      var attribution = oldAttributions[i];
+	      var text = attribution.attribution;
+
+	      if (!newAttributions.match(text) && attribution.bounds.intersects(wrappedBounds) && zoom >= attribution.minZoom && zoom <= attribution.maxZoom) {
+	        newAttributions += (', ' + text);
+	      }
+	    }
+
+	    newAttributions = newAttributions.substr(2);
+	    var attributionElement = map.attributionControl._container.querySelector('.esri-dynamic-attribution');
+
+	    attributionElement.innerHTML = newAttributions;
+	    attributionElement.style.maxWidth = calcAttributionWidth(map);
+
+	    map.fire('attributionupdated', {
+	      attribution: newAttributions
+	    });
+	  }
+	}
+
+	var EsriUtil = {
+	  shallowClone: shallowClone,
+	  warn: warn,
+	  cleanUrl: cleanUrl,
+	  isArcgisOnline: isArcgisOnline,
+	  geojsonTypeToArcGIS: geojsonTypeToArcGIS,
+	  responseToFeatureCollection: responseToFeatureCollection,
+	  geojsonToArcGIS: geojsonToArcGIS,
+	  arcgisToGeoJSON: arcgisToGeoJSON,
+	  boundsToExtent: boundsToExtent,
+	  extentToBounds: extentToBounds,
+	  calcAttributionWidth: calcAttributionWidth,
+	  setEsriAttribution: setEsriAttribution,
+	  _getAttributionData: _getAttributionData,
+	  _updateMapAttribution: _updateMapAttribution
+	};
+
+	var Task = L$1.Class.extend({
+
+	  options: {
+	    proxy: false,
+	    useCors: cors
+	  },
+
+	  // Generate a method for each methodName:paramName in the setters for this task.
+	  generateSetter: function (param, context) {
+	    return L$1.Util.bind(function (value) {
+	      this.params[param] = value;
+	      return this;
+	    }, context);
+	  },
+
+	  initialize: function (endpoint) {
+	    // endpoint can be either a url (and options) for an ArcGIS Rest Service or an instance of EsriLeaflet.Service
+	    if (endpoint.request && endpoint.options) {
+	      this._service = endpoint;
+	      L$1.Util.setOptions(this, endpoint.options);
+	    } else {
+	      L$1.Util.setOptions(this, endpoint);
+	      this.options.url = cleanUrl(endpoint.url);
+	    }
+
+	    // clone default params into this object
+	    this.params = L$1.Util.extend({}, this.params || {});
+
+	    // generate setter methods based on the setters object implimented a child class
+	    if (this.setters) {
+	      for (var setter in this.setters) {
+	        var param = this.setters[setter];
+	        this[setter] = this.generateSetter(param, this);
+	      }
+	    }
+	  },
+
+	  token: function (token) {
+	    if (this._service) {
+	      this._service.authenticate(token);
+	    } else {
+	      this.params.token = token;
+	    }
+	    return this;
+	  },
+
+	  request: function (callback, context) {
+	    if (this._service) {
+	      return this._service.request(this.path, this.params, callback, context);
+	    }
+
+	    return this._request('request', this.path, this.params, callback, context);
+	  },
+
+	  _request: function (method, path, params, callback, context) {
+	    var url = (this.options.proxy) ? this.options.proxy + '?' + this.options.url + path : this.options.url + path;
+
+	    if ((method === 'get' || method === 'request') && !this.options.useCors) {
+	      return Request.get.JSONP(url, params, callback, context);
+	    }
+
+	    return Request[method](url, params, callback, context);
+	  }
+	});
+
+	function task (options) {
+	  return new Task(options);
+	}
+
+	var Query = Task.extend({
+	  setters: {
+	    'offset': 'resultOffset',
+	    'limit': 'resultRecordCount',
+	    'fields': 'outFields',
+	    'precision': 'geometryPrecision',
+	    'featureIds': 'objectIds',
+	    'returnGeometry': 'returnGeometry',
+	    'token': 'token'
+	  },
+
+	  path: 'query',
+
+	  params: {
+	    returnGeometry: true,
+	    where: '1=1',
+	    outSr: 4326,
+	    outFields: '*'
+	  },
+
+	  // Returns a feature if its shape is wholly contained within the search geometry. Valid for all shape type combinations.
+	  within: function (geometry) {
+	    this._setGeometry(geometry);
+	    this.params.spatialRel = 'esriSpatialRelContains'; // to the REST api this reads geometry **contains** layer
+	    return this;
+	  },
+
+	  // Returns a feature if any spatial relationship is found. Applies to all shape type combinations.
+	  intersects: function (geometry) {
+	    this._setGeometry(geometry);
+	    this.params.spatialRel = 'esriSpatialRelIntersects';
+	    return this;
+	  },
+
+	  // Returns a feature if its shape wholly contains the search geometry. Valid for all shape type combinations.
+	  contains: function (geometry) {
+	    this._setGeometry(geometry);
+	    this.params.spatialRel = 'esriSpatialRelWithin'; // to the REST api this reads geometry **within** layer
+	    return this;
+	  },
+
+	  // Returns a feature if the intersection of the interiors of the two shapes is not empty and has a lower dimension than the maximum dimension of the two shapes. Two lines that share an endpoint in common do not cross. Valid for Line/Line, Line/Area, Multi-point/Area, and Multi-point/Line shape type combinations.
+	  crosses: function (geometry) {
+	    this._setGeometry(geometry);
+	    this.params.spatialRel = 'esriSpatialRelCrosses';
+	    return this;
+	  },
+
+	  // Returns a feature if the two shapes share a common boundary. However, the intersection of the interiors of the two shapes must be empty. In the Point/Line case, the point may touch an endpoint only of the line. Applies to all combinations except Point/Point.
+	  touches: function (geometry) {
+	    this._setGeometry(geometry);
+	    this.params.spatialRel = 'esriSpatialRelTouches';
+	    return this;
+	  },
+
+	  // Returns a feature if the intersection of the two shapes results in an object of the same dimension, but different from both of the shapes. Applies to Area/Area, Line/Line, and Multi-point/Multi-point shape type combinations.
+	  overlaps: function (geometry) {
+	    this._setGeometry(geometry);
+	    this.params.spatialRel = 'esriSpatialRelOverlaps';
+	    return this;
+	  },
+
+	  // Returns a feature if the envelope of the two shapes intersects.
+	  bboxIntersects: function (geometry) {
+	    this._setGeometry(geometry);
+	    this.params.spatialRel = 'esriSpatialRelEnvelopeIntersects';
+	    return this;
+	  },
+
+	  // if someone can help decipher the ArcObjects explanation and translate to plain speak, we should mention this method in the doc
+	  indexIntersects: function (geometry) {
+	    this._setGeometry(geometry);
+	    this.params.spatialRel = 'esriSpatialRelIndexIntersects'; // Returns a feature if the envelope of the query geometry intersects the index entry for the target geometry
+	    return this;
+	  },
+
+	  // only valid for Feature Services running on ArcGIS Server 10.3+ or ArcGIS Online
+	  nearby: function (latlng, radius) {
+	    latlng = L$1.latLng(latlng);
+	    this.params.geometry = [latlng.lng, latlng.lat];
+	    this.params.geometryType = 'esriGeometryPoint';
+	    this.params.spatialRel = 'esriSpatialRelIntersects';
+	    this.params.units = 'esriSRUnit_Meter';
+	    this.params.distance = radius;
+	    this.params.inSr = 4326;
+	    return this;
+	  },
+
+	  where: function (string) {
+	    // instead of converting double-quotes to single quotes, pass as is, and provide a more informative message if a 400 is encountered
+	    this.params.where = string;
+	    return this;
+	  },
+
+	  between: function (start, end) {
+	    this.params.time = [start.valueOf(), end.valueOf()];
+	    return this;
+	  },
+
+	  simplify: function (map, factor) {
+	    var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast());
+	    this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor;
+	    return this;
+	  },
+
+	  orderBy: function (fieldName, order) {
+	    order = order || 'ASC';
+	    this.params.orderByFields = (this.params.orderByFields) ? this.params.orderByFields + ',' : '';
+	    this.params.orderByFields += ([fieldName, order]).join(' ');
+	    return this;
+	  },
+
+	  run: function (callback, context) {
+	    this._cleanParams();
+
+	    // services hosted on ArcGIS Online and ArcGIS Server 10.3.1+ support requesting geojson directly
+	    if (this.options.isModern || isArcgisOnline(this.options.url)) {
+	      this.params.f = 'geojson';
+
+	      return this.request(function (error, response) {
+	        this._trapSQLerrors(error);
+	        callback.call(context, error, response, response);
+	      }, this);
+
+	    // otherwise convert it in the callback then pass it on
+	    } else {
+	      return this.request(function (error, response) {
+	        this._trapSQLerrors(error);
+	        callback.call(context, error, (response && responseToFeatureCollection(response)), response);
+	      }, this);
+	    }
+	  },
+
+	  count: function (callback, context) {
+	    this._cleanParams();
+	    this.params.returnCountOnly = true;
+	    return this.request(function (error, response) {
+	      callback.call(this, error, (response && response.count), response);
+	    }, context);
+	  },
+
+	  ids: function (callback, context) {
+	    this._cleanParams();
+	    this.params.returnIdsOnly = true;
+	    return this.request(function (error, response) {
+	      callback.call(this, error, (response && response.objectIds), response);
+	    }, context);
+	  },
+
+	  // only valid for Feature Services running on ArcGIS Server 10.3+ or ArcGIS Online
+	  bounds: function (callback, context) {
+	    this._cleanParams();
+	    this.params.returnExtentOnly = true;
+	    return this.request(function (error, response) {
+	      if (response && response.extent && extentToBounds(response.extent)) {
+	        callback.call(context, error, extentToBounds(response.extent), response);
+	      } else {
+	        error = {
+	          message: 'Invalid Bounds'
+	        };
+	        callback.call(context, error, null, response);
+	      }
+	    }, context);
+	  },
+
+	  // only valid for image services
+	  pixelSize: function (rawPoint) {
+	    var castPoint = L$1.point(rawPoint);
+	    this.params.pixelSize = [castPoint.x, castPoint.y];
+	    return this;
+	  },
+
+	  // only valid for map services
+	  layer: function (layer) {
+	    this.path = layer + '/query';
+	    return this;
+	  },
+
+	  _trapSQLerrors: function (error) {
+	    if (error) {
+	      if (error.code === '400') {
+	        warn('one common syntax error in query requests is encasing string values in double quotes instead of single quotes');
+	      }
+	    }
+	  },
+
+	  _cleanParams: function () {
+	    delete this.params.returnIdsOnly;
+	    delete this.params.returnExtentOnly;
+	    delete this.params.returnCountOnly;
+	  },
+
+	  _setGeometry: function (geometry) {
+	    this.params.inSr = 4326;
+
+	    // convert bounds to extent and finish
+	    if (geometry instanceof L$1.LatLngBounds) {
+	      // set geometry + geometryType
+	      this.params.geometry = boundsToExtent(geometry);
+	      this.params.geometryType = 'esriGeometryEnvelope';
+	      return;
+	    }
+
+	    // convert L.Marker > L.LatLng
+	    if (geometry.getLatLng) {
+	      geometry = geometry.getLatLng();
+	    }
+
+	    // convert L.LatLng to a geojson point and continue;
+	    if (geometry instanceof L$1.LatLng) {
+	      geometry = {
+	        type: 'Point',
+	        coordinates: [geometry.lng, geometry.lat]
+	      };
+	    }
+
+	    // handle L.GeoJSON, pull out the first geometry
+	    if (geometry instanceof L$1.GeoJSON) {
+	      // reassign geometry to the GeoJSON value  (we are assuming that only one feature is present)
+	      geometry = geometry.getLayers()[0].feature.geometry;
+	      this.params.geometry = geojsonToArcGIS(geometry);
+	      this.params.geometryType = geojsonTypeToArcGIS(geometry.type);
+	    }
+
+	    // Handle L.Polyline and L.Polygon
+	    if (geometry.toGeoJSON) {
+	      geometry = geometry.toGeoJSON();
+	    }
+
+	    // handle GeoJSON feature by pulling out the geometry
+	    if (geometry.type === 'Feature') {
+	      // get the geometry of the geojson feature
+	      geometry = geometry.geometry;
+	    }
+
+	    // confirm that our GeoJSON is a point, line or polygon
+	    if (geometry.type === 'Point' || geometry.type === 'LineString' || geometry.type === 'Polygon' || geometry.type === 'MultiPolygon') {
+	      this.params.geometry = geojsonToArcGIS(geometry);
+	      this.params.geometryType = geojsonTypeToArcGIS(geometry.type);
+	      return;
+	    }
+
+	    // warn the user if we havn't found an appropriate object
+	    warn('invalid geometry passed to spatial query. Should be L.LatLng, L.LatLngBounds, L.Marker or a GeoJSON Point, Line, Polygon or MultiPolygon object');
+
+	    return;
+	  }
+	});
+
+	function query (options) {
+	  return new Query(options);
+	}
+
+	var Find = Task.extend({
+	  setters: {
+	    // method name > param name
+	    'contains': 'contains',
+	    'text': 'searchText',
+	    'fields': 'searchFields', // denote an array or single string
+	    'spatialReference': 'sr',
+	    'sr': 'sr',
+	    'layers': 'layers',
+	    'returnGeometry': 'returnGeometry',
+	    'maxAllowableOffset': 'maxAllowableOffset',
+	    'precision': 'geometryPrecision',
+	    'dynamicLayers': 'dynamicLayers',
+	    'returnZ': 'returnZ',
+	    'returnM': 'returnM',
+	    'gdbVersion': 'gdbVersion',
+	    'token': 'token'
+	  },
+
+	  path: 'find',
+
+	  params: {
+	    sr: 4326,
+	    contains: true,
+	    returnGeometry: true,
+	    returnZ: true,
+	    returnM: false
+	  },
+
+	  layerDefs: function (id, where) {
+	    this.params.layerDefs = (this.params.layerDefs) ? this.params.layerDefs + ';' : '';
+	    this.params.layerDefs += ([id, where]).join(':');
+	    return this;
+	  },
+
+	  simplify: function (map, factor) {
+	    var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast());
+	    this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor;
+	    return this;
+	  },
+
+	  run: function (callback, context) {
+	    return this.request(function (error, response) {
+	      callback.call(context, error, (response && responseToFeatureCollection(response)), response);
+	    }, context);
+	  }
+	});
+
+	function find (options) {
+	  return new Find(options);
+	}
+
+	var Identify = Task.extend({
+	  path: 'identify',
+
+	  between: function (start, end) {
+	    this.params.time = [start.valueOf(), end.valueOf()];
+	    return this;
+	  }
+	});
+
+	function identify (options) {
+	  return new Identify(options);
+	}
+
+	var IdentifyFeatures = Identify.extend({
+	  setters: {
+	    'layers': 'layers',
+	    'precision': 'geometryPrecision',
+	    'tolerance': 'tolerance',
+	    'returnGeometry': 'returnGeometry'
+	  },
+
+	  params: {
+	    sr: 4326,
+	    layers: 'all',
+	    tolerance: 3,
+	    returnGeometry: true
+	  },
+
+	  on: function (map) {
+	    var extent = boundsToExtent(map.getBounds());
+	    var size = map.getSize();
+	    this.params.imageDisplay = [size.x, size.y, 96];
+	    this.params.mapExtent = [extent.xmin, extent.ymin, extent.xmax, extent.ymax];
+	    return this;
+	  },
+
+	  at: function (latlng) {
+	    latlng = L$1.latLng(latlng);
+	    this.params.geometry = [latlng.lng, latlng.lat];
+	    this.params.geometryType = 'esriGeometryPoint';
+	    return this;
+	  },
+
+	  layerDef: function (id, where) {
+	    this.params.layerDefs = (this.params.layerDefs) ? this.params.layerDefs + ';' : '';
+	    this.params.layerDefs += ([id, where]).join(':');
+	    return this;
+	  },
+
+	  simplify: function (map, factor) {
+	    var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast());
+	    this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor;
+	    return this;
+	  },
+
+	  run: function (callback, context) {
+	    return this.request(function (error, response) {
+	      // immediately invoke with an error
+	      if (error) {
+	        callback.call(context, error, undefined, response);
+	        return;
+
+	      // ok no error lets just assume we have features...
+	      } else {
+	        var featureCollection = responseToFeatureCollection(response);
+	        response.results = response.results.reverse();
+	        for (var i = 0; i < featureCollection.features.length; i++) {
+	          var feature = featureCollection.features[i];
+	          feature.layerId = response.results[i].layerId;
+	        }
+	        callback.call(context, undefined, featureCollection, response);
+	      }
+	    });
+	  }
+	});
+
+	function identifyFeatures (options) {
+	  return new IdentifyFeatures(options);
+	}
+
+	var IdentifyImage = Identify.extend({
+	  setters: {
+	    'setMosaicRule': 'mosaicRule',
+	    'setRenderingRule': 'renderingRule',
+	    'setPixelSize': 'pixelSize',
+	    'returnCatalogItems': 'returnCatalogItems',
+	    'returnGeometry': 'returnGeometry'
+	  },
+
+	  params: {
+	    returnGeometry: false
+	  },
+
+	  at: function (latlng) {
+	    latlng = L$1.latLng(latlng);
+	    this.params.geometry = JSON.stringify({
+	      x: latlng.lng,
+	      y: latlng.lat,
+	      spatialReference: {
+	        wkid: 4326
+	      }
+	    });
+	    this.params.geometryType = 'esriGeometryPoint';
+	    return this;
+	  },
+
+	  getMosaicRule: function () {
+	    return this.params.mosaicRule;
+	  },
+
+	  getRenderingRule: function () {
+	    return this.params.renderingRule;
+	  },
+
+	  getPixelSize: function () {
+	    return this.params.pixelSize;
+	  },
+
+	  run: function (callback, context) {
+	    return this.request(function (error, response) {
+	      callback.call(context, error, (response && this._responseToGeoJSON(response)), response);
+	    }, this);
+	  },
+
+	  // get pixel data and return as geoJSON point
+	  // populate catalog items (if any)
+	  // merging in any catalogItemVisibilities as a propery of each feature
+	  _responseToGeoJSON: function (response) {
+	    var location = response.location;
+	    var catalogItems = response.catalogItems;
+	    var catalogItemVisibilities = response.catalogItemVisibilities;
+	    var geoJSON = {
+	      'pixel': {
+	        'type': 'Feature',
+	        'geometry': {
+	          'type': 'Point',
+	          'coordinates': [location.x, location.y]
+	        },
+	        'crs': {
+	          'type': 'EPSG',
+	          'properties': {
+	            'code': location.spatialReference.wkid
+	          }
+	        },
+	        'properties': {
+	          'OBJECTID': response.objectId,
+	          'name': response.name,
+	          'value': response.value
+	        },
+	        'id': response.objectId
+	      }
+	    };
+
+	    if (response.properties && response.properties.Values) {
+	      geoJSON.pixel.properties.values = response.properties.Values;
+	    }
+
+	    if (catalogItems && catalogItems.features) {
+	      geoJSON.catalogItems = responseToFeatureCollection(catalogItems);
+	      if (catalogItemVisibilities && catalogItemVisibilities.length === geoJSON.catalogItems.features.length) {
+	        for (var i = catalogItemVisibilities.length - 1; i >= 0; i--) {
+	          geoJSON.catalogItems.features[i].properties.catalogItemVisibility = catalogItemVisibilities[i];
+	        }
+	      }
+	    }
+	    return geoJSON;
+	  }
+
+	});
+
+	function identifyImage (params) {
+	  return new IdentifyImage(params);
+	}
+
+	var Service = L$1.Evented.extend({
+
+	  options: {
+	    proxy: false,
+	    useCors: cors,
+	    timeout: 0
+	  },
+
+	  initialize: function (options) {
+	    options = options || {};
+	    this._requestQueue = [];
+	    this._authenticating = false;
+	    L$1.Util.setOptions(this, options);
+	    this.options.url = cleanUrl(this.options.url);
+	  },
+
+	  get: function (path, params, callback, context) {
+	    return this._request('get', path, params, callback, context);
+	  },
+
+	  post: function (path, params, callback, context) {
+	    return this._request('post', path, params, callback, context);
+	  },
+
+	  request: function (path, params, callback, context) {
+	    return this._request('request', path, params, callback, context);
+	  },
+
+	  metadata: function (callback, context) {
+	    return this._request('get', '', {}, callback, context);
+	  },
+
+	  authenticate: function (token) {
+	    this._authenticating = false;
+	    this.options.token = token;
+	    this._runQueue();
+	    return this;
+	  },
+
+	  getTimeout: function () {
+	    return this.options.timeout;
+	  },
+
+	  setTimeout: function (timeout) {
+	    this.options.timeout = timeout;
+	  },
+
+	  _request: function (method, path, params, callback, context) {
+	    this.fire('requeststart', {
+	      url: this.options.url + path,
+	      params: params,
+	      method: method
+	    }, true);
+
+	    var wrappedCallback = this._createServiceCallback(method, path, params, callback, context);
+
+	    if (this.options.token) {
+	      params.token = this.options.token;
+	    }
+
+	    if (this._authenticating) {
+	      this._requestQueue.push([method, path, params, callback, context]);
+	      return;
+	    } else {
+	      var url = (this.options.proxy) ? this.options.proxy + '?' + this.options.url + path : this.options.url + path;
+
+	      if ((method === 'get' || method === 'request') && !this.options.useCors) {
+	        return Request.get.JSONP(url, params, wrappedCallback, context);
+	      } else {
+	        return Request[method](url, params, wrappedCallback, context);
+	      }
+	    }
+	  },
+
+	  _createServiceCallback: function (method, path, params, callback, context) {
+	    return L$1.Util.bind(function (error, response) {
+	      if (error && (error.code === 499 || error.code === 498)) {
+	        this._authenticating = true;
+
+	        this._requestQueue.push([method, path, params, callback, context]);
+
+	        // fire an event for users to handle and re-authenticate
+	        this.fire('authenticationrequired', {
+	          authenticate: L$1.Util.bind(this.authenticate, this)
+	        }, true);
+
+	        // if the user has access to a callback they can handle the auth error
+	        error.authenticate = L$1.Util.bind(this.authenticate, this);
+	      }
+
+	      callback.call(context, error, response);
+
+	      if (error) {
+	        this.fire('requesterror', {
+	          url: this.options.url + path,
+	          params: params,
+	          message: error.message,
+	          code: error.code,
+	          method: method
+	        }, true);
+	      } else {
+	        this.fire('requestsuccess', {
+	          url: this.options.url + path,
+	          params: params,
+	          response: response,
+	          method: method
+	        }, true);
+	      }
+
+	      this.fire('requestend', {
+	        url: this.options.url + path,
+	        params: params,
+	        method: method
+	      }, true);
+	    }, this);
+	  },
+
+	  _runQueue: function () {
+	    for (var i = this._requestQueue.length - 1; i >= 0; i--) {
+	      var request = this._requestQueue[i];
+	      var method = request.shift();
+	      this[method].apply(this, request);
+	    }
+	    this._requestQueue = [];
+	  }
+	});
+
+	function service (options) {
+	  return new Service(options);
+	}
+
+	var MapService = Service.extend({
+
+	  identify: function () {
+	    return identifyFeatures(this);
+	  },
+
+	  find: function () {
+	    return find(this);
+	  },
+
+	  query: function () {
+	    return query(this);
+	  }
+
+	});
+
+	function mapService (options) {
+	  return new MapService(options);
+	}
+
+	var ImageService = Service.extend({
+
+	  query: function () {
+	    return query(this);
+	  },
+
+	  identify: function () {
+	    return identifyImage(this);
+	  }
+	});
+
+	function imageService (options) {
+	  return new ImageService(options);
+	}
+
+	var FeatureLayerService = Service.extend({
+
+	  options: {
+	    idAttribute: 'OBJECTID'
+	  },
+
+	  query: function () {
+	    return query(this);
+	  },
+
+	  addFeature: function (feature, callback, context) {
+	    delete feature.id;
+
+	    feature = geojsonToArcGIS(feature);
+
+	    return this.post('addFeatures', {
+	      features: [feature]
+	    }, function (error, response) {
+	      var result = (response && response.addResults) ? response.addResults[0] : undefined;
+	      if (callback) {
+	        callback.call(context, error || response.addResults[0].error, result);
+	      }
+	    }, context);
+	  },
+
+	  updateFeature: function (feature, callback, context) {
+	    feature = geojsonToArcGIS(feature, this.options.idAttribute);
+
+	    return this.post('updateFeatures', {
+	      features: [feature]
+	    }, function (error, response) {
+	      var result = (response && response.updateResults) ? response.updateResults[0] : undefined;
+	      if (callback) {
+	        callback.call(context, error || response.updateResults[0].error, result);
+	      }
+	    }, context);
+	  },
+
+	  deleteFeature: function (id, callback, context) {
+	    return this.post('deleteFeatures', {
+	      objectIds: id
+	    }, function (error, response) {
+	      var result = (response && response.deleteResults) ? response.deleteResults[0] : undefined;
+	      if (callback) {
+	        callback.call(context, error || response.deleteResults[0].error, result);
+	      }
+	    }, context);
+	  },
+
+	  deleteFeatures: function (ids, callback, context) {
+	    return this.post('deleteFeatures', {
+	      objectIds: ids
+	    }, function (error, response) {
+	      // pass back the entire array
+	      var result = (response && response.deleteResults) ? response.deleteResults : undefined;
+	      if (callback) {
+	        callback.call(context, error || response.deleteResults[0].error, result);
+	      }
+	    }, context);
+	  }
+	});
+
+	function featureLayerService (options) {
+	  return new FeatureLayerService(options);
+	}
+
+	var tileProtocol = (window.location.protocol !== 'https:') ? 'http:' : 'https:';
+
+	var BasemapLayer = L$1.TileLayer.extend({
+	  statics: {
+	    TILES: {
+	      Streets: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 19,
+	          subdomains: ['server', 'services'],
+	          attribution: 'USGS, NOAA',
+	          attributionUrl: 'https://static.arcgis.com/attribution/World_Street_Map'
+	        }
+	      },
+	      Topographic: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 19,
+	          subdomains: ['server', 'services'],
+	          attribution: 'USGS, NOAA',
+	          attributionUrl: 'https://static.arcgis.com/attribution/World_Topo_Map'
+	        }
+	      },
+	      Oceans: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 16,
+	          subdomains: ['server', 'services'],
+	          attribution: 'USGS, NOAA',
+	          attributionUrl: 'https://static.arcgis.com/attribution/Ocean_Basemap'
+	        }
+	      },
+	      OceansLabels: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Reference/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 16,
+	          subdomains: ['server', 'services'],
+	          pane: (pointerEvents) ? 'esri-labels' : 'tilePane'
+	        }
+	      },
+	      NationalGeographic: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 16,
+	          subdomains: ['server', 'services'],
+	          attribution: 'National Geographic, DeLorme, HERE, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, increment P Corp.'
+	        }
+	      },
+	      DarkGray: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 16,
+	          subdomains: ['server', 'services'],
+	          attribution: 'HERE, DeLorme, MapmyIndia, &copy; OpenStreetMap contributors'
+	        }
+	      },
+	      DarkGrayLabels: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Reference/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 16,
+	          subdomains: ['server', 'services'],
+	          pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
+	          attribution: ''
+
+	        }
+	      },
+	      Gray: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 16,
+	          subdomains: ['server', 'services'],
+	          attribution: 'HERE, DeLorme, MapmyIndia, &copy; OpenStreetMap contributors'
+	        }
+	      },
+	      GrayLabels: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 16,
+	          subdomains: ['server', 'services'],
+	          pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
+	          attribution: ''
+	        }
+	      },
+	      Imagery: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 19,
+	          subdomains: ['server', 'services'],
+	          attribution: 'DigitalGlobe, GeoEye, i-cubed, USDA, USGS, AEX, Getmapping, Aerogrid, IGN, IGP, swisstopo, and the GIS User Community'
+	        }
+	      },
+	      ImageryLabels: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 19,
+	          subdomains: ['server', 'services'],
+	          pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
+	          attribution: ''
+	        }
+	      },
+	      ImageryTransportation: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Transportation/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 19,
+	          subdomains: ['server', 'services'],
+	          pane: (pointerEvents) ? 'esri-labels' : 'tilePane'
+	        }
+	      },
+	      ShadedRelief: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 13,
+	          subdomains: ['server', 'services'],
+	          attribution: 'USGS'
+	        }
+	      },
+	      ShadedReliefLabels: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places_Alternate/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 12,
+	          subdomains: ['server', 'services'],
+	          pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
+	          attribution: ''
+	        }
+	      },
+	      Terrain: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 13,
+	          subdomains: ['server', 'services'],
+	          attribution: 'USGS, NOAA'
+	        }
+	      },
+	      TerrainLabels: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Reference_Overlay/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 13,
+	          subdomains: ['server', 'services'],
+	          pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
+	          attribution: ''
+	        }
+	      },
+	      USATopo: {
+	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/USA_Topo_Maps/MapServer/tile/{z}/{y}/{x}',
+	        options: {
+	          minZoom: 1,
+	          maxZoom: 15,
+	          subdomains: ['server', 'services'],
+	          attribution: 'USGS, National Geographic Society, i-cubed'
+	        }
+	      }
+	    }
+	  },
+
+	  initialize: function (key, options) {
+	    var config;
+
+	    // set the config variable with the appropriate config object
+	    if (typeof key === 'object' && key.urlTemplate && key.options) {
+	      config = key;
+	    } else if (typeof key === 'string' && BasemapLayer.TILES[key]) {
+	      config = BasemapLayer.TILES[key];
+	    } else {
+	      throw new Error('L.esri.BasemapLayer: Invalid parameter. Use one of "Streets", "Topographic", "Oceans", "OceansLabels", "NationalGeographic", "Gray", "GrayLabels", "DarkGray", "DarkGrayLabels", "Imagery", "ImageryLabels", "ImageryTransportation", "ShadedRelief", "ShadedReliefLabels", "Terrain", "TerrainLabels" or "USATopo"');
+	    }
+
+	    // merge passed options into the config options
+	    var tileOptions = L$1.Util.extend(config.options, options);
+
+	    L$1.Util.setOptions(this, tileOptions);
+
+	    if (this.options.token) {
+	      config.urlTemplate += ('?token=' + this.options.token);
+	    }
+
+	    // call the initialize method on L.TileLayer to set everything up
+	    L$1.TileLayer.prototype.initialize.call(this, config.urlTemplate, tileOptions);
+	  },
+
+	  onAdd: function (map) {
+	    // include 'Powered by Esri' in map attribution
+	    setEsriAttribution(map);
+
+	    if (this.options.pane === 'esri-labels') {
+	      this._initPane();
+	    }
+	    // some basemaps can supply dynamic attribution
+	    if (this.options.attributionUrl) {
+	      _getAttributionData(this.options.attributionUrl, map);
+	    }
+
+	    map.on('moveend', _updateMapAttribution);
+
+	    L$1.TileLayer.prototype.onAdd.call(this, map);
+	  },
+
+	  onRemove: function (map) {
+	    map.off('moveend', _updateMapAttribution);
+	    L$1.TileLayer.prototype.onRemove.call(this, map);
+	  },
+
+	  _initPane: function () {
+	    if (!this._map.getPane(this.options.pane)) {
+	      var pane = this._map.createPane(this.options.pane);
+	      pane.style.pointerEvents = 'none';
+	      pane.style.zIndex = 500;
+	    }
+	  },
+
+	  getAttribution: function () {
+	    if (this.options.attribution) {
+	      var attribution = '<span class="esri-dynamic-attribution">' + this.options.attribution + '</span>';
+	    }
+	    return attribution;
+	  }
+	});
+
+	function basemapLayer (key, options) {
+	  return new BasemapLayer(key, options);
+	}
+
+	var TiledMapLayer = L$1.TileLayer.extend({
+	  options: {
+	    zoomOffsetAllowance: 0.1,
+	    errorTileUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEABAMAAACuXLVVAAAAA1BMVEUzNDVszlHHAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAAAAAAAAAB6mUWpAAAADZJREFUeJztwQEBAAAAgiD/r25IQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7waBAAABw08RwAAAAABJRU5ErkJggg=='
+	  },
+
+	  statics: {
+	    MercatorZoomLevels: {
+	      '0': 156543.03392799999,
+	      '1': 78271.516963999893,
+	      '2': 39135.758482000099,
+	      '3': 19567.879240999901,
+	      '4': 9783.9396204999593,
+	      '5': 4891.9698102499797,
+	      '6': 2445.9849051249898,
+	      '7': 1222.9924525624899,
+	      '8': 611.49622628138002,
+	      '9': 305.74811314055802,
+	      '10': 152.874056570411,
+	      '11': 76.437028285073197,
+	      '12': 38.218514142536598,
+	      '13': 19.109257071268299,
+	      '14': 9.5546285356341496,
+	      '15': 4.7773142679493699,
+	      '16': 2.38865713397468,
+	      '17': 1.1943285668550501,
+	      '18': 0.59716428355981699,
+	      '19': 0.29858214164761698,
+	      '20': 0.14929107082381,
+	      '21': 0.07464553541191,
+	      '22': 0.0373227677059525,
+	      '23': 0.0186613838529763
+	    }
+	  },
+
+	  initialize: function (options) {
+	    options.url = cleanUrl(options.url);
+	    options = L$1.Util.setOptions(this, options);
+
+	    // set the urls
+	    this.tileUrl = options.url + 'tile/{z}/{y}/{x}';
+	    this.service = mapService(options);
+	    this.service.addEventParent(this);
+
+	    var arcgisonline = new RegExp(/tiles.arcgis(online)?\.com/g);
+	    if (arcgisonline.test(options.url)) {
+	      this.tileUrl = this.tileUrl.replace('://tiles', '://tiles{s}');
+	      options.subdomains = ['1', '2', '3', '4'];
+	    }
+
+	    if (this.options.token) {
+	      this.tileUrl += ('?token=' + this.options.token);
+	    }
+
+	    // init layer by calling TileLayers initialize method
+	    L$1.TileLayer.prototype.initialize.call(this, this.tileUrl, options);
+	  },
+
+	  getTileUrl: function (tilePoint) {
+	    var zoom = this._getZoomForUrl();
+
+	    return L$1.Util.template(this.tileUrl, L$1.Util.extend({
+	      s: this._getSubdomain(tilePoint),
+	      x: tilePoint.x,
+	      y: tilePoint.y,
+	      // try lod map first, then just default to zoom level
+	      z: (this._lodMap && this._lodMap[zoom]) ? this._lodMap[zoom] : zoom
+	    }, this.options));
+	  },
+
+	  createTile: function (coords, done) {
+	    var tile = document.createElement('img');
+
+	    L.DomEvent.on(tile, 'load', L.bind(this._tileOnLoad, this, done, tile));
+	    L.DomEvent.on(tile, 'error', L.bind(this._tileOnError, this, done, tile));
+
+	    if (this.options.crossOrigin) {
+	      tile.crossOrigin = '';
+	    }
+
+	    /*
+	     Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons
+	     http://www.w3.org/TR/WCAG20-TECHS/H67
+	    */
+	    tile.alt = '';
+
+	    // if there is no lod map or an lod map with a proper zoom load the tile
+	    // otherwise wait for the lod map to become available
+	    if (!this._lodMap || (this._lodMap && this._lodMap[this._getZoomForUrl()])) {
+	      tile.src = this.getTileUrl(coords);
+	    } else {
+	      this.once('lodmap', function () {
+	        tile.src = this.getTileUrl(coords);
+	      }, this);
+	    }
+
+	    return tile;
+	  },
+
+	  onAdd: function (map) {
+	    // include 'Powered by Esri' in map attribution
+	    setEsriAttribution(map);
+
+	    if (!this._lodMap) {
+	      this.metadata(function (error, metadata) {
+	        if (!error && metadata.spatialReference) {
+	          var sr = metadata.spatialReference.latestWkid || metadata.spatialReference.wkid;
+	          if (!this.options.attribution && map.attributionControl && metadata.copyrightText) {
+	            this.options.attribution = metadata.copyrightText;
+	            map.attributionControl.addAttribution(this.getAttribution());
+	          }
+	          if (map.options.crs === L.CRS.EPSG3857 && sr === 102100 || sr === 3857) {
+	            this._lodMap = {};
+	            // create the zoom level data
+	            var arcgisLODs = metadata.tileInfo.lods;
+	            var correctResolutions = TiledMapLayer.MercatorZoomLevels;
+
+	            for (var i = 0; i < arcgisLODs.length; i++) {
+	              var arcgisLOD = arcgisLODs[i];
+	              for (var ci in correctResolutions) {
+	                var correctRes = correctResolutions[ci];
+
+	                if (this._withinPercentage(arcgisLOD.resolution, correctRes, this.options.zoomOffsetAllowance)) {
+	                  this._lodMap[ci] = arcgisLOD.level;
+	                  break;
+	                }
+	              }
+	            }
+
+	            this.fire('lodmap');
+	          } else {
+	            if (!proj4) {
+	              warn('L.esri.TiledMapLayer is using a non-mercator spatial reference. Support may be available through Proj4Leaflet http://esri.github.io/esri-leaflet/examples/non-mercator-projection.html');
+	            }
+	          }
+	        }
+	      }, this);
+	    }
+
+	    L$1.TileLayer.prototype.onAdd.call(this, map);
+	  },
+
+	  metadata: function (callback, context) {
+	    this.service.metadata(callback, context);
+	    return this;
+	  },
+
+	  identify: function () {
+	    return this.service.identify();
+	  },
+
+	  find: function () {
+	    return this.service.find();
+	  },
+
+	  query: function () {
+	    return this.service.query();
+	  },
+
+	  authenticate: function (token) {
+	    var tokenQs = '?token=' + token;
+	    this.tileUrl = (this.options.token) ? this.tileUrl.replace(/\?token=(.+)/g, tokenQs) : this.tileUrl + tokenQs;
+	    this.options.token = token;
+	    this.service.authenticate(token);
+	    return this;
+	  },
+
+	  _withinPercentage: function (a, b, percentage) {
+	    var diff = Math.abs((a / b) - 1);
+	    return diff < percentage;
+	  }
+	});
+
+	function tiledMapLayer (url, options) {
+	  return new TiledMapLayer(url, options);
+	}
+
+	var Overlay = L$1.ImageOverlay.extend({
+	  onAdd: function (map) {
+	    this._topLeft = map.getPixelBounds().min;
+	    L$1.ImageOverlay.prototype.onAdd.call(this, map);
+	  },
+	  _reset: function () {
+	    if (this._map.options.crs === L$1.CRS.EPSG3857) {
+	      L$1.ImageOverlay.prototype._reset.call(this);
+	    } else {
+	      L$1.DomUtil.setPosition(this._image, this._topLeft.subtract(this._map.getPixelOrigin()));
+	    }
+	  }
+	});
+
+	var RasterLayer = L$1.Layer.extend({
+
+	  options: {
+	    opacity: 1,
+	    position: 'front',
+	    f: 'image',
+	    useCors: cors,
+	    attribution: null,
+	    interactive: false,
+	    alt: ''
+	  },
+
+	  onAdd: function (map) {
+	    // include 'Powered by Esri' in map attribution
+	    setEsriAttribution(map);
+
+	    this._update = L$1.Util.throttle(this._update, this.options.updateInterval, this);
+
+	    map.on('moveend', this._update, this);
+
+	    // if we had an image loaded and it matches the
+	    // current bounds show the image otherwise remove it
+	    if (this._currentImage && this._currentImage._bounds.equals(this._map.getBounds())) {
+	      map.addLayer(this._currentImage);
+	    } else if (this._currentImage) {
+	      this._map.removeLayer(this._currentImage);
+	      this._currentImage = null;
+	    }
+
+	    this._update();
+
+	    if (this._popup) {
+	      this._map.on('click', this._getPopupData, this);
+	      this._map.on('dblclick', this._resetPopupState, this);
+	    }
+
+	    // add copyright text listed in service metadata
+	    this.metadata(function (err, metadata) {
+	      if (!err && !this.options.attribution && map.attributionControl && metadata.copyrightText) {
+	        this.options.attribution = metadata.copyrightText;
+	        map.attributionControl.addAttribution(this.getAttribution());
+	      }
+	    }, this);
+	  },
+
+	  onRemove: function (map) {
+	    if (this._currentImage) {
+	      this._map.removeLayer(this._currentImage);
+	    }
+
+	    if (this._popup) {
+	      this._map.off('click', this._getPopupData, this);
+	      this._map.off('dblclick', this._resetPopupState, this);
+	    }
+
+	    this._map.off('moveend', this._update, this);
+	  },
+
+	  bindPopup: function (fn, popupOptions) {
+	    this._shouldRenderPopup = false;
+	    this._lastClick = false;
+	    this._popup = L$1.popup(popupOptions);
+	    this._popupFunction = fn;
+	    if (this._map) {
+	      this._map.on('click', this._getPopupData, this);
+	      this._map.on('dblclick', this._resetPopupState, this);
+	    }
+	    return this;
+	  },
+
+	  unbindPopup: function () {
+	    if (this._map) {
+	      this._map.closePopup(this._popup);
+	      this._map.off('click', this._getPopupData, this);
+	      this._map.off('dblclick', this._resetPopupState, this);
+	    }
+	    this._popup = false;
+	    return this;
+	  },
+
+	  bringToFront: function () {
+	    this.options.position = 'front';
+	    if (this._currentImage) {
+	      this._currentImage.bringToFront();
+	    }
+	    return this;
+	  },
+
+	  bringToBack: function () {
+	    this.options.position = 'back';
+	    if (this._currentImage) {
+	      this._currentImage.bringToBack();
+	    }
+	    return this;
+	  },
+
+	  getAttribution: function () {
+	    return this.options.attribution;
+	  },
+
+	  getOpacity: function () {
+	    return this.options.opacity;
+	  },
+
+	  setOpacity: function (opacity) {
+	    this.options.opacity = opacity;
+	    if (this._currentImage) {
+	      this._currentImage.setOpacity(opacity);
+	    }
+	    return this;
+	  },
+
+	  getTimeRange: function () {
+	    return [this.options.from, this.options.to];
+	  },
+
+	  setTimeRange: function (from, to) {
+	    this.options.from = from;
+	    this.options.to = to;
+	    this._update();
+	    return this;
+	  },
+
+	  metadata: function (callback, context) {
+	    this.service.metadata(callback, context);
+	    return this;
+	  },
+
+	  authenticate: function (token) {
+	    this.service.authenticate(token);
+	    return this;
+	  },
+
+	  redraw: function () {
+	    this._update();
+	  },
+
+	  _renderImage: function (url, bounds, contentType) {
+	    if (this._map) {
+	      // if no output directory has been specified for a service, MIME data will be returned
+	      if (contentType) {
+	        url = 'data:' + contentType + ';base64,' + url;
+	      }
+	      // create a new image overlay and add it to the map
+	      // to start loading the image
+	      // opacity is 0 while the image is loading
+	      var image = new Overlay(url, bounds, {
+	        opacity: 0,
+	        crossOrigin: this.options.useCors,
+	        alt: this.options.alt,
+	        pane: this.options.pane || this.getPane(),
+	        interactive: this.options.interactive
+	      }).addTo(this._map);
+
+	      // once the image loads
+	      image.once('load', function (e) {
+	        if (this._map) {
+	          var newImage = e.target;
+	          var oldImage = this._currentImage;
+
+	          // if the bounds of this image matches the bounds that
+	          // _renderImage was called with and we have a map with the same bounds
+	          // hide the old image if there is one and set the opacity
+	          // of the new image otherwise remove the new image
+	          if (newImage._bounds.equals(bounds) && newImage._bounds.equals(this._map.getBounds())) {
+	            this._currentImage = newImage;
+
+	            if (this.options.position === 'front') {
+	              this.bringToFront();
+	            } else {
+	              this.bringToBack();
+	            }
+
+	            if (this._map && this._currentImage._map) {
+	              this._currentImage.setOpacity(this.options.opacity);
+	            } else {
+	              this._currentImage._map.removeLayer(this._currentImage);
+	            }
+
+	            if (oldImage && this._map) {
+	              this._map.removeLayer(oldImage);
+	            }
+
+	            if (oldImage && oldImage._map) {
+	              oldImage._map.removeLayer(oldImage);
+	            }
+	          } else {
+	            this._map.removeLayer(newImage);
+	          }
+	        }
+
+	        this.fire('load', {
+	          bounds: bounds
+	        });
+	      }, this);
+
+	      this.fire('loading', {
+	        bounds: bounds
+	      });
+	    }
+	  },
+
+	  _update: function () {
+	    if (!this._map) {
+	      return;
+	    }
+
+	    var zoom = this._map.getZoom();
+	    var bounds = this._map.getBounds();
+
+	    if (this._animatingZoom) {
+	      return;
+	    }
+
+	    if (this._map._panTransition && this._map._panTransition._inProgress) {
+	      return;
+	    }
+
+	    if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {
+	      if (this._currentImage) {
+	        this._currentImage._map.removeLayer(this._currentImage);
+	        this._currentImage = null;
+	      }
+	      return;
+	    }
+
+	    var params = this._buildExportParams();
+
+	    this._requestExport(params, bounds);
+	  },
+
+	  _renderPopup: function (latlng, error, results, response) {
+	    latlng = L$1.latLng(latlng);
+	    if (this._shouldRenderPopup && this._lastClick.equals(latlng)) {
+	      // add the popup to the map where the mouse was clicked at
+	      var content = this._popupFunction(error, results, response);
+	      if (content) {
+	        this._popup.setLatLng(latlng).setContent(content).openOn(this._map);
+	      }
+	    }
+	  },
+
+	  _resetPopupState: function (e) {
+	    this._shouldRenderPopup = false;
+	    this._lastClick = e.latlng;
+	  }
+	});
+
+	var ImageMapLayer = RasterLayer.extend({
+
+	  options: {
+	    updateInterval: 150,
+	    format: 'jpgpng',
+	    transparent: true,
+	    f: 'json'
+	  },
+
+	  query: function () {
+	    return this.service.query();
+	  },
+
+	  identify: function () {
+	    return this.service.identify();
+	  },
+
+	  initialize: function (options) {
+	    options.url = cleanUrl(options.url);
+	    this.service = imageService(options);
+	    this.service.addEventParent(this);
+
+	    L$1.Util.setOptions(this, options);
+	  },
+
+	  setPixelType: function (pixelType) {
+	    this.options.pixelType = pixelType;
+	    this._update();
+	    return this;
+	  },
+
+	  getPixelType: function () {
+	    return this.options.pixelType;
+	  },
+
+	  setBandIds: function (bandIds) {
+	    if (L$1.Util.isArray(bandIds)) {
+	      this.options.bandIds = bandIds.join(',');
+	    } else {
+	      this.options.bandIds = bandIds.toString();
+	    }
+	    this._update();
+	    return this;
+	  },
+
+	  getBandIds: function () {
+	    return this.options.bandIds;
+	  },
+
+	  setNoData: function (noData, noDataInterpretation) {
+	    if (L$1.Util.isArray(noData)) {
+	      this.options.noData = noData.join(',');
+	    } else {
+	      this.options.noData = noData.toString();
+	    }
+	    if (noDataInterpretation) {
+	      this.options.noDataInterpretation = noDataInterpretation;
+	    }
+	    this._update();
+	    return this;
+	  },
+
+	  getNoData: function () {
+	    return this.options.noData;
+	  },
+
+	  getNoDataInterpretation: function () {
+	    return this.options.noDataInterpretation;
+	  },
+
+	  setRenderingRule: function (renderingRule) {
+	    this.options.renderingRule = renderingRule;
+	    this._update();
+	  },
+
+	  getRenderingRule: function () {
+	    return this.options.renderingRule;
+	  },
+
+	  setMosaicRule: function (mosaicRule) {
+	    this.options.mosaicRule = mosaicRule;
+	    this._update();
+	  },
+
+	  getMosaicRule: function () {
+	    return this.options.mosaicRule;
+	  },
+
+	  _getPopupData: function (e) {
+	    var callback = L$1.Util.bind(function (error, results, response) {
+	      if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire
+	      setTimeout(L$1.Util.bind(function () {
+	        this._renderPopup(e.latlng, error, results, response);
+	      }, this), 300);
+	    }, this);
+
+	    var identifyRequest = this.identify().at(e.latlng);
+
+	    // set mosaic rule for identify task if it is set for layer
+	    if (this.options.mosaicRule) {
+	      identifyRequest.setMosaicRule(this.options.mosaicRule);
+	      // @TODO: force return catalog items too?
+	    }
+
+	    // @TODO: set rendering rule? Not sure,
+	    // sometimes you want raw pixel values
+	    // if (this.options.renderingRule) {
+	    //   identifyRequest.setRenderingRule(this.options.renderingRule);
+	    // }
+
+	    identifyRequest.run(callback);
+
+	    // set the flags to show the popup
+	    this._shouldRenderPopup = true;
+	    this._lastClick = e.latlng;
+	  },
+
+	  _buildExportParams: function () {
+	    var bounds = this._map.getBounds();
+	    var size = this._map.getSize();
+	    var ne = this._map.options.crs.project(bounds._northEast);
+	    var sw = this._map.options.crs.project(bounds._southWest);
+
+	    // ensure that we don't ask ArcGIS Server for a taller image than we have actual map displaying
+	    var top = this._map.latLngToLayerPoint(bounds._northEast);
+	    var bottom = this._map.latLngToLayerPoint(bounds._southWest);
+
+	    if (top.y > 0 || bottom.y < size.y) {
+	      size.y = bottom.y - top.y;
+	    }
+
+	    var sr = parseInt(this._map.options.crs.code.split(':')[1], 10);
+
+	    var params = {
+	      bbox: [sw.x, sw.y, ne.x, ne.y].join(','),
+	      size: size.x + ',' + size.y,
+	      format: this.options.format,
+	      transparent: this.options.transparent,
+	      bboxSR: sr,
+	      imageSR: sr
+	    };
+
+	    if (this.options.from && this.options.to) {
+	      params.time = this.options.from.valueOf() + ',' + this.options.to.valueOf();
+	    }
+
+	    if (this.options.pixelType) {
+	      params.pixelType = this.options.pixelType;
+	    }
+
+	    if (this.options.interpolation) {
+	      params.interpolation = this.options.interpolation;
+	    }
+
+	    if (this.options.compressionQuality) {
+	      params.compressionQuality = this.options.compressionQuality;
+	    }
+
+	    if (this.options.bandIds) {
+	      params.bandIds = this.options.bandIds;
+	    }
+
+	    if (this.options.noData) {
+	      params.noData = this.options.noData;
+	    }
+
+	    if (this.options.noDataInterpretation) {
+	      params.noDataInterpretation = this.options.noDataInterpretation;
+	    }
+
+	    if (this.service.options.token) {
+	      params.token = this.service.options.token;
+	    }
+
+	    if (this.options.renderingRule) {
+	      params.renderingRule = JSON.stringify(this.options.renderingRule);
+	    }
+
+	    if (this.options.mosaicRule) {
+	      params.mosaicRule = JSON.stringify(this.options.mosaicRule);
+	    }
+
+	    return params;
+	  },
+
+	  _requestExport: function (params, bounds) {
+	    if (this.options.f === 'json') {
+	      this.service.request('exportImage', params, function (error, response) {
+	        if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire
+	        if (this.options.token) {
+	          response.href += ('?token=' + this.options.token);
+	        }
+	        this._renderImage(response.href, bounds);
+	      }, this);
+	    } else {
+	      params.f = 'image';
+	      this._renderImage(this.options.url + 'exportImage' + L$1.Util.getParamString(params), bounds);
+	    }
+	  }
+	});
+
+	function imageMapLayer (url, options) {
+	  return new ImageMapLayer(url, options);
+	}
+
+	var DynamicMapLayer = RasterLayer.extend({
+
+	  options: {
+	    updateInterval: 150,
+	    layers: false,
+	    layerDefs: false,
+	    timeOptions: false,
+	    format: 'png24',
+	    transparent: true,
+	    f: 'json'
+	  },
+
+	  initialize: function (options) {
+	    options.url = cleanUrl(options.url);
+	    this.service = mapService(options);
+	    this.service.addEventParent(this);
+
+	    if ((options.proxy || options.token) && options.f !== 'json') {
+	      options.f = 'json';
+	    }
+
+	    L$1.Util.setOptions(this, options);
+	  },
+
+	  getDynamicLayers: function () {
+	    return this.options.dynamicLayers;
+	  },
+
+	  setDynamicLayers: function (dynamicLayers) {
+	    this.options.dynamicLayers = dynamicLayers;
+	    this._update();
+	    return this;
+	  },
+
+	  getLayers: function () {
+	    return this.options.layers;
+	  },
+
+	  setLayers: function (layers) {
+	    this.options.layers = layers;
+	    this._update();
+	    return this;
+	  },
+
+	  getLayerDefs: function () {
+	    return this.options.layerDefs;
+	  },
+
+	  setLayerDefs: function (layerDefs) {
+	    this.options.layerDefs = layerDefs;
+	    this._update();
+	    return this;
+	  },
+
+	  getTimeOptions: function () {
+	    return this.options.timeOptions;
+	  },
+
+	  setTimeOptions: function (timeOptions) {
+	    this.options.timeOptions = timeOptions;
+	    this._update();
+	    return this;
+	  },
+
+	  query: function () {
+	    return this.service.query();
+	  },
+
+	  identify: function () {
+	    return this.service.identify();
+	  },
+
+	  find: function () {
+	    return this.service.find();
+	  },
+
+	  _getPopupData: function (e) {
+	    var callback = L$1.Util.bind(function (error, featureCollection, response) {
+	      if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire
+	      setTimeout(L$1.Util.bind(function () {
+	        this._renderPopup(e.latlng, error, featureCollection, response);
+	      }, this), 300);
+	    }, this);
+
+	    var identifyRequest = this.identify().on(this._map).at(e.latlng);
+
+	    // remove extraneous vertices from response features
+	    identifyRequest.simplify(this._map, 0.5);
+
+	    if (this.options.layers) {
+	      identifyRequest.layers('visible:' + this.options.layers.join(','));
+	    } else {
+	      identifyRequest.layers('visible');
+	    }
+
+	    identifyRequest.run(callback);
+
+	    // set the flags to show the popup
+	    this._shouldRenderPopup = true;
+	    this._lastClick = e.latlng;
+	  },
+
+	  _buildExportParams: function () {
+	    var bounds = this._map.getBounds();
+	    var size = this._map.getSize();
+	    var ne = this._map.options.crs.project(bounds.getNorthEast());
+	    var sw = this._map.options.crs.project(bounds.getSouthWest());
+	    var sr = parseInt(this._map.options.crs.code.split(':')[1], 10);
+
+	    // ensure that we don't ask ArcGIS Server for a taller image than we have actual map displaying
+	    var top = this._map.latLngToLayerPoint(bounds._northEast);
+	    var bottom = this._map.latLngToLayerPoint(bounds._southWest);
+
+	    if (top.y > 0 || bottom.y < size.y) {
+	      size.y = bottom.y - top.y;
+	    }
+
+	    var params = {
+	      bbox: [sw.x, sw.y, ne.x, ne.y].join(','),
+	      size: size.x + ',' + size.y,
+	      dpi: 96,
+	      format: this.options.format,
+	      transparent: this.options.transparent,
+	      bboxSR: sr,
+	      imageSR: sr
+	    };
+
+	    if (this.options.dynamicLayers) {
+	      params.dynamicLayers = this.options.dynamicLayers;
+	    }
+
+	    if (this.options.layers) {
+	      params.layers = 'show:' + this.options.layers.join(',');
+	    }
+
+	    if (this.options.layerDefs) {
+	      params.layerDefs = typeof this.options.layerDefs === 'string' ? this.options.layerDefs : JSON.stringify(this.options.layerDefs);
+	    }
+
+	    if (this.options.timeOptions) {
+	      params.timeOptions = JSON.stringify(this.options.timeOptions);
+	    }
+
+	    if (this.options.from && this.options.to) {
+	      params.time = this.options.from.valueOf() + ',' + this.options.to.valueOf();
+	    }
+
+	    if (this.service.options.token) {
+	      params.token = this.service.options.token;
+	    }
+
+	    if (this.options.proxy) {
+	      params.proxy = this.options.proxy;
+	    }
+
+	    return params;
+	  },
+
+	  _requestExport: function (params, bounds) {
+	    if (this.options.f === 'json') {
+	      this.service.request('export', params, function (error, response) {
+	        if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire
+
+	        if (this.options.token) {
+	          response.href += ('?token=' + this.options.token);
+	        }
+	        if (this.options.proxy) {
+	          response.href = this.options.proxy + '?' + response.href;
+	        }
+	        if (response.href) {
+	          this._renderImage(response.href, bounds);
+	        } else {
+	          this._renderImage(response.imageData, bounds, response.contentType);
+	        }
+	      }, this);
+	    } else {
+	      params.f = 'image';
+	      this._renderImage(this.options.url + 'export' + L$1.Util.getParamString(params), bounds);
+	    }
+	  }
+	});
+
+	function dynamicMapLayer (url, options) {
+	  return new DynamicMapLayer(url, options);
+	}
+
+	var VirtualGrid = L$1__default.Layer.extend({
+
+	  options: {
+	    cellSize: 512,
+	    updateInterval: 150
+	  },
+
+	  initialize: function (options) {
+	    options = L$1__default.setOptions(this, options);
+	    this._zooming = false;
+	  },
+
+	  onAdd: function (map) {
+	    this._map = map;
+	    this._update = L$1__default.Util.throttle(this._update, this.options.updateInterval, this);
+	    this._reset();
+	    this._update();
+	  },
+
+	  onRemove: function () {
+	    this._map.removeEventListener(this.getEvents(), this);
+	    this._removeCells();
+	  },
+
+	  getEvents: function () {
+	    var events = {
+	      moveend: this._update,
+	      zoomstart: this._zoomstart,
+	      zoomend: this._reset
+	    };
+
+	    return events;
+	  },
+
+	  addTo: function (map) {
+	    map.addLayer(this);
+	    return this;
+	  },
+
+	  removeFrom: function (map) {
+	    map.removeLayer(this);
+	    return this;
+	  },
+
+	  _zoomstart: function () {
+	    this._zooming = true;
+	  },
+
+	  _reset: function () {
+	    this._removeCells();
+
+	    this._cells = {};
+	    this._activeCells = {};
+	    this._cellsToLoad = 0;
+	    this._cellsTotal = 0;
+	    this._cellNumBounds = this._getCellNumBounds();
+
+	    this._resetWrap();
+	    this._zooming = false;
+	  },
+
+	  _resetWrap: function () {
+	    var map = this._map;
+	    var crs = map.options.crs;
+
+	    if (crs.infinite) { return; }
+
+	    var cellSize = this._getCellSize();
+
+	    if (crs.wrapLng) {
+	      this._wrapLng = [
+	        Math.floor(map.project([0, crs.wrapLng[0]]).x / cellSize),
+	        Math.ceil(map.project([0, crs.wrapLng[1]]).x / cellSize)
+	      ];
+	    }
+
+	    if (crs.wrapLat) {
+	      this._wrapLat = [
+	        Math.floor(map.project([crs.wrapLat[0], 0]).y / cellSize),
+	        Math.ceil(map.project([crs.wrapLat[1], 0]).y / cellSize)
+	      ];
+	    }
+	  },
+
+	  _getCellSize: function () {
+	    return this.options.cellSize;
+	  },
+
+	  _update: function () {
+	    if (!this._map) {
+	      return;
+	    }
+
+	    var bounds = this._map.getPixelBounds();
+	    var cellSize = this._getCellSize();
+
+	    // cell coordinates range for the current view
+	    var cellBounds = L$1__default.bounds(
+	      bounds.min.divideBy(cellSize).floor(),
+	      bounds.max.divideBy(cellSize).floor());
+
+	    this._removeOtherCells(cellBounds);
+	    this._addCells(cellBounds);
+
+	    this.fire('cellsupdated');
+	  },
+
+	  _addCells: function (bounds) {
+	    var queue = [];
+	    var center = bounds.getCenter();
+	    var zoom = this._map.getZoom();
+
+	    var j, i, coords;
+	    // create a queue of coordinates to load cells from
+	    for (j = bounds.min.y; j <= bounds.max.y; j++) {
+	      for (i = bounds.min.x; i <= bounds.max.x; i++) {
+	        coords = L$1__default.point(i, j);
+	        coords.z = zoom;
+
+	        if (this._isValidCell(coords)) {
+	          queue.push(coords);
+	        }
+	      }
+	    }
+
+	    var cellsToLoad = queue.length;
+
+	    if (cellsToLoad === 0) { return; }
+
+	    this._cellsToLoad += cellsToLoad;
+	    this._cellsTotal += cellsToLoad;
+
+	    // sort cell queue to load cells in order of their distance to center
+	    queue.sort(function (a, b) {
+	      return a.distanceTo(center) - b.distanceTo(center);
+	    });
+
+	    for (i = 0; i < cellsToLoad; i++) {
+	      this._addCell(queue[i]);
+	    }
+	  },
+
+	  _isValidCell: function (coords) {
+	    var crs = this._map.options.crs;
+
+	    if (!crs.infinite) {
+	      // don't load cell if it's out of bounds and not wrapped
+	      var bounds = this._cellNumBounds;
+	      if (
+	        (!crs.wrapLng && (coords.x < bounds.min.x || coords.x > bounds.max.x)) ||
+	        (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y))
+	      ) {
+	        return false;
+	      }
+	    }
+
+	    if (!this.options.bounds) {
+	      return true;
+	    }
+
+	    // don't load cell if it doesn't intersect the bounds in options
+	    var cellBounds = this._cellCoordsToBounds(coords);
+	    return L$1__default.latLngBounds(this.options.bounds).intersects(cellBounds);
+	  },
+
+	  // converts cell coordinates to its geographical bounds
+	  _cellCoordsToBounds: function (coords) {
+	    var map = this._map;
+	    var cellSize = this.options.cellSize;
+	    var nwPoint = coords.multiplyBy(cellSize);
+	    var sePoint = nwPoint.add([cellSize, cellSize]);
+	    var nw = map.wrapLatLng(map.unproject(nwPoint, coords.z));
+	    var se = map.wrapLatLng(map.unproject(sePoint, coords.z));
+
+	    return L$1__default.latLngBounds(nw, se);
+	  },
+
+	  // converts cell coordinates to key for the cell cache
+	  _cellCoordsToKey: function (coords) {
+	    return coords.x + ':' + coords.y;
+	  },
+
+	  // converts cell cache key to coordiantes
+	  _keyToCellCoords: function (key) {
+	    var kArr = key.split(':');
+	    var x = parseInt(kArr[0], 10);
+	    var y = parseInt(kArr[1], 10);
+
+	    return L$1__default.point(x, y);
+	  },
+
+	  // remove any present cells that are off the specified bounds
+	  _removeOtherCells: function (bounds) {
+	    for (var key in this._cells) {
+	      if (!bounds.contains(this._keyToCellCoords(key))) {
+	        this._removeCell(key);
+	      }
+	    }
+	  },
+
+	  _removeCell: function (key) {
+	    var cell = this._activeCells[key];
+
+	    if (cell) {
+	      delete this._activeCells[key];
+
+	      if (this.cellLeave) {
+	        this.cellLeave(cell.bounds, cell.coords);
+	      }
+
+	      this.fire('cellleave', {
+	        bounds: cell.bounds,
+	        coords: cell.coords
+	      });
+	    }
+	  },
+
+	  _removeCells: function () {
+	    for (var key in this._cells) {
+	      var bounds = this._cells[key].bounds;
+	      var coords = this._cells[key].coords;
+
+	      if (this.cellLeave) {
+	        this.cellLeave(bounds, coords);
+	      }
+
+	      this.fire('cellleave', {
+	        bounds: bounds,
+	        coords: coords
+	      });
+	    }
+	  },
+
+	  _addCell: function (coords) {
+	    // wrap cell coords if necessary (depending on CRS)
+	    this._wrapCoords(coords);
+
+	    // generate the cell key
+	    var key = this._cellCoordsToKey(coords);
+
+	    // get the cell from the cache
+	    var cell = this._cells[key];
+	    // if this cell should be shown as isnt active yet (enter)
+
+	    if (cell && !this._activeCells[key]) {
+	      if (this.cellEnter) {
+	        this.cellEnter(cell.bounds, coords);
+	      }
+
+	      this.fire('cellenter', {
+	        bounds: cell.bounds,
+	        coords: coords
+	      });
+
+	      this._activeCells[key] = cell;
+	    }
+
+	    // if we dont have this cell in the cache yet (create)
+	    if (!cell) {
+	      cell = {
+	        coords: coords,
+	        bounds: this._cellCoordsToBounds(coords)
+	      };
+
+	      this._cells[key] = cell;
+	      this._activeCells[key] = cell;
+
+	      if (this.createCell) {
+	        this.createCell(cell.bounds, coords);
+	      }
+
+	      this.fire('cellcreate', {
+	        bounds: cell.bounds,
+	        coords: coords
+	      });
+	    }
+	  },
+
+	  _wrapCoords: function (coords) {
+	    coords.x = this._wrapLng ? L$1__default.Util.wrapNum(coords.x, this._wrapLng) : coords.x;
+	    coords.y = this._wrapLat ? L$1__default.Util.wrapNum(coords.y, this._wrapLat) : coords.y;
+	  },
+
+	  // get the global cell coordinates range for the current zoom
+	  _getCellNumBounds: function () {
+	    var bounds = this._map.getPixelWorldBounds();
+	    var size = this._getCellSize();
+
+	    return bounds ? L$1__default.bounds(
+	        bounds.min.divideBy(size).floor(),
+	        bounds.max.divideBy(size).ceil().subtract([1, 1])) : null;
+	  }
+	});
+
+	function BinarySearchIndex (values) {
+	  this.values = [].concat(values || []);
+	}
+
+	BinarySearchIndex.prototype.query = function (value) {
+	  var index = this.getIndex(value);
+	  return this.values[index];
+	};
+
+	BinarySearchIndex.prototype.getIndex = function getIndex (value) {
+	  if (this.dirty) {
+	    this.sort();
+	  }
+
+	  var minIndex = 0;
+	  var maxIndex = this.values.length - 1;
+	  var currentIndex;
+	  var currentElement;
+
+	  while (minIndex <= maxIndex) {
+	    currentIndex = (minIndex + maxIndex) / 2 | 0;
+	    currentElement = this.values[Math.round(currentIndex)];
+	    if (+currentElement.value < +value) {
+	      minIndex = currentIndex + 1;
+	    } else if (+currentElement.value > +value) {
+	      maxIndex = currentIndex - 1;
+	    } else {
+	      return currentIndex;
+	    }
+	  }
+
+	  return Math.abs(~maxIndex);
+	};
+
+	BinarySearchIndex.prototype.between = function between (start, end) {
+	  var startIndex = this.getIndex(start);
+	  var endIndex = this.getIndex(end);
+
+	  if (startIndex === 0 && endIndex === 0) {
+	    return [];
+	  }
+
+	  while (this.values[startIndex - 1] && this.values[startIndex - 1].value === start) {
+	    startIndex--;
+	  }
+
+	  while (this.values[endIndex + 1] && this.values[endIndex + 1].value === end) {
+	    endIndex++;
+	  }
+
+	  if (this.values[endIndex] && this.values[endIndex].value === end && this.values[endIndex + 1]) {
+	    endIndex++;
+	  }
+
+	  return this.values.slice(startIndex, endIndex);
+	};
+
+	BinarySearchIndex.prototype.insert = function insert (item) {
+	  this.values.splice(this.getIndex(item.value), 0, item);
+	  return this;
+	};
+
+	BinarySearchIndex.prototype.bulkAdd = function bulkAdd (items, sort) {
+	  this.values = this.values.concat([].concat(items || []));
+
+	  if (sort) {
+	    this.sort();
+	  } else {
+	    this.dirty = true;
+	  }
+
+	  return this;
+	};
+
+	BinarySearchIndex.prototype.sort = function sort () {
+	  this.values.sort(function (a, b) {
+	    return +b.value - +a.value;
+	  }).reverse();
+	  this.dirty = false;
+	  return this;
+	};
+
+	var FeatureManager = VirtualGrid.extend({
+	  /**
+	   * Options
+	   */
+
+	  options: {
+	    attribution: null,
+	    where: '1=1',
+	    fields: ['*'],
+	    from: false,
+	    to: false,
+	    timeField: false,
+	    timeFilterMode: 'server',
+	    simplifyFactor: 0,
+	    precision: 6
+	  },
+
+	  /**
+	   * Constructor
+	   */
+
+	  initialize: function (options) {
+	    VirtualGrid.prototype.initialize.call(this, options);
+
+	    options.url = cleanUrl(options.url);
+	    options = L$1.setOptions(this, options);
+
+	    this.service = featureLayerService(options);
+	    this.service.addEventParent(this);
+
+	    // use case insensitive regex to look for common fieldnames used for indexing
+	    if (this.options.fields[0] !== '*') {
+	      var oidCheck = false;
+	      for (var i = 0; i < this.options.fields.length; i++) {
+	        if (this.options.fields[i].match(/^(OBJECTID|FID|OID|ID)$/i)) {
+	          oidCheck = true;
+	        }
+	      }
+	      if (oidCheck === false) {
+	        warn('no known esriFieldTypeOID field detected in fields Array.  Please add an attribute field containing unique IDs to ensure the layer can be drawn correctly.');
+	      }
+	    }
+
+	    if (this.options.timeField.start && this.options.timeField.end) {
+	      this._startTimeIndex = new BinarySearchIndex();
+	      this._endTimeIndex = new BinarySearchIndex();
+	    } else if (this.options.timeField) {
+	      this._timeIndex = new BinarySearchIndex();
+	    }
+
+	    this._cache = {};
+	    this._currentSnapshot = []; // cache of what layers should be active
+	    this._activeRequests = 0;
+	  },
+
+	  /**
+	   * Layer Interface
+	   */
+
+	  onAdd: function (map) {
+	    // include 'Powered by Esri' in map attribution
+	    setEsriAttribution(map);
+
+	    this.service.metadata(function (err, metadata) {
+	      if (!err) {
+	        var supportedFormats = metadata.supportedQueryFormats;
+
+	        // Check if someone has requested that we don't use geoJSON, even if it's available
+	        var forceJsonFormat = false;
+	        if (this.service.options.isModern === false) {
+	          forceJsonFormat = true;
+	        }
+
+	        // Unless we've been told otherwise, check to see whether service can emit GeoJSON natively
+	        if (!forceJsonFormat && supportedFormats && supportedFormats.indexOf('geoJSON') !== -1) {
+	          this.service.options.isModern = true;
+	        }
+
+	        // add copyright text listed in service metadata
+	        if (!this.options.attribution && map.attributionControl && metadata.copyrightText) {
+	          this.options.attribution = metadata.copyrightText;
+	          map.attributionControl.addAttribution(this.getAttribution());
+	        }
+	      }
+	    }, this);
+
+	    map.on('zoomend', this._handleZoomChange, this);
+
+	    return VirtualGrid.prototype.onAdd.call(this, map);
+	  },
+
+	  onRemove: function (map) {
+	    map.off('zoomend', this._handleZoomChange, this);
+
+	    return VirtualGrid.prototype.onRemove.call(this, map);
+	  },
+
+	  getAttribution: function () {
+	    return this.options.attribution;
+	  },
+
+	  /**
+	   * Feature Management
+	   */
+
+	  createCell: function (bounds, coords) {
+	    // dont fetch features outside the scale range defined for the layer
+	    if (this._visibleZoom()) {
+	      this._requestFeatures(bounds, coords);
+	    }
+	  },
+
+	  _requestFeatures: function (bounds, coords, callback) {
+	    this._activeRequests++;
+
+	    // our first active request fires loading
+	    if (this._activeRequests === 1) {
+	      this.fire('loading', {
+	        bounds: bounds
+	      }, true);
+	    }
+
+	    return this._buildQuery(bounds).run(function (error, featureCollection, response) {
+	      if (response && response.exceededTransferLimit) {
+	        this.fire('drawlimitexceeded');
+	      }
+
+	      // no error, features
+	      if (!error && featureCollection && featureCollection.features.length) {
+	        // schedule adding features until the next animation frame
+	        L$1.Util.requestAnimFrame(L$1.Util.bind(function () {
+	          this._addFeatures(featureCollection.features, coords);
+	          this._postProcessFeatures(bounds);
+	        }, this));
+	      }
+
+	      // no error, no features
+	      if (!error && featureCollection && !featureCollection.features.length) {
+	        this._postProcessFeatures(bounds);
+	      }
+
+	      if (error) {
+	        this._postProcessFeatures(bounds);
+	      }
+
+	      if (callback) {
+	        callback.call(this, error, featureCollection);
+	      }
+	    }, this);
+	  },
+
+	  _postProcessFeatures: function (bounds) {
+	    // deincrement the request counter now that we have processed features
+	    this._activeRequests--;
+
+	    // if there are no more active requests fire a load event for this view
+	    if (this._activeRequests <= 0) {
+	      this.fire('load', {
+	        bounds: bounds
+	      });
+	    }
+	  },
+
+	  _cacheKey: function (coords) {
+	    return coords.z + ':' + coords.x + ':' + coords.y;
+	  },
+
+	  _addFeatures: function (features, coords) {
+	    var key = this._cacheKey(coords);
+	    this._cache[key] = this._cache[key] || [];
+
+	    for (var i = features.length - 1; i >= 0; i--) {
+	      var id = features[i].id;
+
+	      if (this._currentSnapshot.indexOf(id) === -1) {
+	        this._currentSnapshot.push(id);
+	      }
+	      if (this._cache[key].indexOf(id) === -1) {
+	        this._cache[key].push(id);
+	      }
+	    }
+
+	    if (this.options.timeField) {
+	      this._buildTimeIndexes(features);
+	    }
+
+	    this.createLayers(features);
+	  },
+
+	  _buildQuery: function (bounds) {
+	    var query = this.service.query()
+	      .intersects(bounds)
+	      .where(this.options.where)
+	      .fields(this.options.fields)
+	      .precision(this.options.precision);
+
+	    if (this.options.simplifyFactor) {
+	      query.simplify(this._map, this.options.simplifyFactor);
+	    }
+
+	    if (this.options.timeFilterMode === 'server' && this.options.from && this.options.to) {
+	      query.between(this.options.from, this.options.to);
+	    }
+
+	    return query;
+	  },
+
+	  /**
+	   * Where Methods
+	   */
+
+	  setWhere: function (where, callback, context) {
+	    this.options.where = (where && where.length) ? where : '1=1';
+
+	    var oldSnapshot = [];
+	    var newSnapshot = [];
+	    var pendingRequests = 0;
+	    var requestError = null;
+	    var requestCallback = L$1.Util.bind(function (error, featureCollection) {
+	      if (error) {
+	        requestError = error;
+	      }
+
+	      if (featureCollection) {
+	        for (var i = featureCollection.features.length - 1; i >= 0; i--) {
+	          newSnapshot.push(featureCollection.features[i].id);
+	        }
+	      }
+
+	      pendingRequests--;
+
+	      if (pendingRequests <= 0) {
+	        this._currentSnapshot = newSnapshot;
+	        // schedule adding features for the next animation frame
+	        L$1.Util.requestAnimFrame(L$1.Util.bind(function () {
+	          this.removeLayers(oldSnapshot);
+	          this.addLayers(newSnapshot);
+	          if (callback) {
+	            callback.call(context, requestError);
+	          }
+	        }, this));
+	      }
+	    }, this);
+
+	    for (var i = this._currentSnapshot.length - 1; i >= 0; i--) {
+	      oldSnapshot.push(this._currentSnapshot[i]);
+	    }
+
+	    for (var key in this._activeCells) {
+	      pendingRequests++;
+	      var coords = this._keyToCellCoords(key);
+	      var bounds = this._cellCoordsToBounds(coords);
+	      this._requestFeatures(bounds, key, requestCallback);
+	    }
+
+	    return this;
+	  },
+
+	  getWhere: function () {
+	    return this.options.where;
+	  },
+
+	  /**
+	   * Time Range Methods
+	   */
+
+	  getTimeRange: function () {
+	    return [this.options.from, this.options.to];
+	  },
+
+	  setTimeRange: function (from, to, callback, context) {
+	    var oldFrom = this.options.from;
+	    var oldTo = this.options.to;
+	    var pendingRequests = 0;
+	    var requestError = null;
+	    var requestCallback = L$1.Util.bind(function (error) {
+	      if (error) {
+	        requestError = error;
+	      }
+	      this._filterExistingFeatures(oldFrom, oldTo, from, to);
+
+	      pendingRequests--;
+
+	      if (callback && pendingRequests <= 0) {
+	        callback.call(context, requestError);
+	      }
+	    }, this);
+
+	    this.options.from = from;
+	    this.options.to = to;
+
+	    this._filterExistingFeatures(oldFrom, oldTo, from, to);
+
+	    if (this.options.timeFilterMode === 'server') {
+	      for (var key in this._activeCells) {
+	        pendingRequests++;
+	        var coords = this._keyToCellCoords(key);
+	        var bounds = this._cellCoordsToBounds(coords);
+	        this._requestFeatures(bounds, key, requestCallback);
+	      }
+	    }
+
+	    return this;
+	  },
+
+	  refresh: function () {
+	    for (var key in this._activeCells) {
+	      var coords = this._keyToCellCoords(key);
+	      var bounds = this._cellCoordsToBounds(coords);
+	      this._requestFeatures(bounds, key);
+	    }
+
+	    if (this.redraw) {
+	      this.once('load', function () {
+	        this.eachFeature(function (layer) {
+	          this._redraw(layer.feature.id);
+	        }, this);
+	      }, this);
+	    }
+	  },
+
+	  _filterExistingFeatures: function (oldFrom, oldTo, newFrom, newTo) {
+	    var layersToRemove = (oldFrom && oldTo) ? this._getFeaturesInTimeRange(oldFrom, oldTo) : this._currentSnapshot;
+	    var layersToAdd = this._getFeaturesInTimeRange(newFrom, newTo);
+
+	    if (layersToAdd.indexOf) {
+	      for (var i = 0; i < layersToAdd.length; i++) {
+	        var shouldRemoveLayer = layersToRemove.indexOf(layersToAdd[i]);
+	        if (shouldRemoveLayer >= 0) {
+	          layersToRemove.splice(shouldRemoveLayer, 1);
+	        }
+	      }
+	    }
+
+	    // schedule adding features until the next animation frame
+	    L$1.Util.requestAnimFrame(L$1.Util.bind(function () {
+	      this.removeLayers(layersToRemove);
+	      this.addLayers(layersToAdd);
+	    }, this));
+	  },
+
+	  _getFeaturesInTimeRange: function (start, end) {
+	    var ids = [];
+	    var search;
+
+	    if (this.options.timeField.start && this.options.timeField.end) {
+	      var startTimes = this._startTimeIndex.between(start, end);
+	      var endTimes = this._endTimeIndex.between(start, end);
+	      search = startTimes.concat(endTimes);
+	    } else {
+	      search = this._timeIndex.between(start, end);
+	    }
+
+	    for (var i = search.length - 1; i >= 0; i--) {
+	      ids.push(search[i].id);
+	    }
+
+	    return ids;
+	  },
+
+	  _buildTimeIndexes: function (geojson) {
+	    var i;
+	    var feature;
+	    if (this.options.timeField.start && this.options.timeField.end) {
+	      var startTimeEntries = [];
+	      var endTimeEntries = [];
+	      for (i = geojson.length - 1; i >= 0; i--) {
+	        feature = geojson[i];
+	        startTimeEntries.push({
+	          id: feature.id,
+	          value: new Date(feature.properties[this.options.timeField.start])
+	        });
+	        endTimeEntries.push({
+	          id: feature.id,
+	          value: new Date(feature.properties[this.options.timeField.end])
+	        });
+	      }
+	      this._startTimeIndex.bulkAdd(startTimeEntries);
+	      this._endTimeIndex.bulkAdd(endTimeEntries);
+	    } else {
+	      var timeEntries = [];
+	      for (i = geojson.length - 1; i >= 0; i--) {
+	        feature = geojson[i];
+	        timeEntries.push({
+	          id: feature.id,
+	          value: new Date(feature.properties[this.options.timeField])
+	        });
+	      }
+
+	      this._timeIndex.bulkAdd(timeEntries);
+	    }
+	  },
+
+	  _featureWithinTimeRange: function (feature) {
+	    if (!this.options.from || !this.options.to) {
+	      return true;
+	    }
+
+	    var from = +this.options.from.valueOf();
+	    var to = +this.options.to.valueOf();
+
+	    if (typeof this.options.timeField === 'string') {
+	      var date = +feature.properties[this.options.timeField];
+	      return (date >= from) && (date <= to);
+	    }
+
+	    if (this.options.timeField.start && this.options.timeField.end) {
+	      var startDate = +feature.properties[this.options.timeField.start];
+	      var endDate = +feature.properties[this.options.timeField.end];
+	      return ((startDate >= from) && (startDate <= to)) || ((endDate >= from) && (endDate <= to));
+	    }
+	  },
+
+	  _visibleZoom: function () {
+	    // check to see whether the current zoom level of the map is within the optional limit defined for the FeatureLayer
+	    if (!this._map) {
+	      return false;
+	    }
+	    var zoom = this._map.getZoom();
+	    if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {
+	      return false;
+	    } else { return true; }
+	  },
+
+	  _handleZoomChange: function () {
+	    if (!this._visibleZoom()) {
+	      this.removeLayers(this._currentSnapshot);
+	      this._currentSnapshot = [];
+	    } else {
+	      /*
+	      for every cell in this._activeCells
+	        1. Get the cache key for the coords of the cell
+	        2. If this._cache[key] exists it will be an array of feature IDs.
+	        3. Call this.addLayers(this._cache[key]) to instruct the feature layer to add the layers back.
+	      */
+	      for (var i in this._activeCells) {
+	        var coords = this._activeCells[i].coords;
+	        var key = this._cacheKey(coords);
+	        if (this._cache[key]) {
+	          this.addLayers(this._cache[key]);
+	        }
+	      }
+	    }
+	  },
+
+	  /**
+	   * Service Methods
+	   */
+
+	  authenticate: function (token) {
+	    this.service.authenticate(token);
+	    return this;
+	  },
+
+	  metadata: function (callback, context) {
+	    this.service.metadata(callback, context);
+	    return this;
+	  },
+
+	  query: function () {
+	    return this.service.query();
+	  },
+
+	  _getMetadata: function (callback) {
+	    if (this._metadata) {
+	      var error;
+	      callback(error, this._metadata);
+	    } else {
+	      this.metadata(L$1.Util.bind(function (error, response) {
+	        this._metadata = response;
+	        callback(error, this._metadata);
+	      }, this));
+	    }
+	  },
+
+	  addFeature: function (feature, callback, context) {
+	    this._getMetadata(L$1.Util.bind(function (error, metadata) {
+	      if (error) {
+	        if (callback) { callback.call(this, error, null); }
+	        return;
+	      }
+
+	      this.service.addFeature(feature, L$1.Util.bind(function (error, response) {
+	        if (!error) {
+	          // assign ID from result to appropriate objectid field from service metadata
+	          feature.properties[metadata.objectIdField] = response.objectId;
+
+	          // we also need to update the geojson id for createLayers() to function
+	          feature.id = response.objectId;
+	          this.createLayers([feature]);
+	        }
+
+	        if (callback) {
+	          callback.call(context, error, response);
+	        }
+	      }, this));
+	    }, this));
+	  },
+
+	  updateFeature: function (feature, callback, context) {
+	    this.service.updateFeature(feature, function (error, response) {
+	      if (!error) {
+	        this.removeLayers([feature.id], true);
+	        this.createLayers([feature]);
+	      }
+
+	      if (callback) {
+	        callback.call(context, error, response);
+	      }
+	    }, this);
+	  },
+
+	  deleteFeature: function (id, callback, context) {
+	    this.service.deleteFeature(id, function (error, response) {
+	      if (!error && response.objectId) {
+	        this.removeLayers([response.objectId], true);
+	      }
+	      if (callback) {
+	        callback.call(context, error, response);
+	      }
+	    }, this);
+	  },
+
+	  deleteFeatures: function (ids, callback, context) {
+	    return this.service.deleteFeatures(ids, function (error, response) {
+	      if (!error && response.length > 0) {
+	        for (var i = 0; i < response.length; i++) {
+	          this.removeLayers([response[i].objectId], true);
+	        }
+	      }
+	      if (callback) {
+	        callback.call(context, error, response);
+	      }
+	    }, this);
+	  }
+	});
+
+	var FeatureLayer = FeatureManager.extend({
+
+	  options: {
+	    cacheLayers: true
+	  },
+
+	  /**
+	   * Constructor
+	   */
+	  initialize: function (options) {
+	    FeatureManager.prototype.initialize.call(this, options);
+	    this._originalStyle = this.options.style;
+	    this._layers = {};
+	  },
+
+	  /**
+	   * Layer Interface
+	   */
+
+	  onRemove: function (map) {
+	    for (var i in this._layers) {
+	      map.removeLayer(this._layers[i]);
+	      // trigger the event when the entire featureLayer is removed from the map
+	      this.fire('removefeature', {
+	        feature: this._layers[i].feature,
+	        permanent: false
+	      }, true);
+	    }
+
+	    return FeatureManager.prototype.onRemove.call(this, map);
+	  },
+
+	  createNewLayer: function (geojson) {
+	    var layer = L$1.GeoJSON.geometryToLayer(geojson, this.options);
+	    layer.defaultOptions = layer.options;
+	    return layer;
+	  },
+
+	  _updateLayer: function (layer, geojson) {
+	    // convert the geojson coordinates into a Leaflet LatLng array/nested arrays
+	    // pass it to setLatLngs to update layer geometries
+	    var latlngs = [];
+	    var coordsToLatLng = this.options.coordsToLatLng || L$1.GeoJSON.coordsToLatLng;
+
+	    // copy new attributes, if present
+	    if (geojson.properties) {
+	      layer.feature.properties = geojson.properties;
+	    }
+
+	    switch (geojson.geometry.type) {
+	      case 'Point':
+	        latlngs = L$1.GeoJSON.coordsToLatLng(geojson.geometry.coordinates);
+	        layer.setLatLng(latlngs);
+	        break;
+	      case 'LineString':
+	        latlngs = L$1.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 0, coordsToLatLng);
+	        layer.setLatLngs(latlngs);
+	        break;
+	      case 'MultiLineString':
+	        latlngs = L$1.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1, coordsToLatLng);
+	        layer.setLatLngs(latlngs);
+	        break;
+	      case 'Polygon':
+	        latlngs = L$1.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1, coordsToLatLng);
+	        layer.setLatLngs(latlngs);
+	        break;
+	      case 'MultiPolygon':
+	        latlngs = L$1.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 2, coordsToLatLng);
+	        layer.setLatLngs(latlngs);
+	        break;
+	    }
+	  },
+
+	  /**
+	   * Feature Management Methods
+	   */
+
+	  createLayers: function (features) {
+	    for (var i = features.length - 1; i >= 0; i--) {
+	      var geojson = features[i];
+
+	      var layer = this._layers[geojson.id];
+	      var newLayer;
+
+	      if (this._visibleZoom() && layer && !this._map.hasLayer(layer)) {
+	        this._map.addLayer(layer);
+	        this.fire('addfeature', {
+	          feature: layer.feature
+	        }, true);
+	      }
+
+	      // update geometry if necessary
+	      if (layer && this.options.simplifyFactor > 0 && (layer.setLatLngs || layer.setLatLng)) {
+	        this._updateLayer(layer, geojson);
+	      }
+
+	      if (!layer) {
+	        newLayer = this.createNewLayer(geojson);
+	        newLayer.feature = geojson;
+
+	        // bubble events from individual layers to the feature layer
+	        newLayer.addEventParent(this);
+
+	        if (this.options.onEachFeature) {
+	          this.options.onEachFeature(newLayer.feature, newLayer);
+	        }
+
+	        // cache the layer
+	        this._layers[newLayer.feature.id] = newLayer;
+
+	        // style the layer
+	        this.setFeatureStyle(newLayer.feature.id, this.options.style);
+
+	        this.fire('createfeature', {
+	          feature: newLayer.feature
+	        }, true);
+
+	        // add the layer if the current zoom level is inside the range defined for the layer, it is within the current time bounds or our layer is not time enabled
+	        if (this._visibleZoom() && (!this.options.timeField || (this.options.timeField && this._featureWithinTimeRange(geojson)))) {
+	          this._map.addLayer(newLayer);
+	        }
+	      }
+	    }
+	  },
+
+	  addLayers: function (ids) {
+	    for (var i = ids.length - 1; i >= 0; i--) {
+	      var layer = this._layers[ids[i]];
+	      if (layer) {
+	        this._map.addLayer(layer);
+	      }
+	    }
+	  },
+
+	  removeLayers: function (ids, permanent) {
+	    for (var i = ids.length - 1; i >= 0; i--) {
+	      var id = ids[i];
+	      var layer = this._layers[id];
+	      if (layer) {
+	        this.fire('removefeature', {
+	          feature: layer.feature,
+	          permanent: permanent
+	        }, true);
+	        this._map.removeLayer(layer);
+	      }
+	      if (layer && permanent) {
+	        delete this._layers[id];
+	      }
+	    }
+	  },
+
+	  cellEnter: function (bounds, coords) {
+	    if (this._visibleZoom() && !this._zooming && this._map) {
+	      L$1.Util.requestAnimFrame(L$1.Util.bind(function () {
+	        var cacheKey = this._cacheKey(coords);
+	        var cellKey = this._cellCoordsToKey(coords);
+	        var layers = this._cache[cacheKey];
+	        if (this._activeCells[cellKey] && layers) {
+	          this.addLayers(layers);
+	        }
+	      }, this));
+	    }
+	  },
+
+	  cellLeave: function (bounds, coords) {
+	    if (!this._zooming) {
+	      L$1.Util.requestAnimFrame(L$1.Util.bind(function () {
+	        if (this._map) {
+	          var cacheKey = this._cacheKey(coords);
+	          var cellKey = this._cellCoordsToKey(coords);
+	          var layers = this._cache[cacheKey];
+	          var mapBounds = this._map.getBounds();
+	          if (!this._activeCells[cellKey] && layers) {
+	            var removable = true;
+
+	            for (var i = 0; i < layers.length; i++) {
+	              var layer = this._layers[layers[i]];
+	              if (layer && layer.getBounds && mapBounds.intersects(layer.getBounds())) {
+	                removable = false;
+	              }
+	            }
+
+	            if (removable) {
+	              this.removeLayers(layers, !this.options.cacheLayers);
+	            }
+
+	            if (!this.options.cacheLayers && removable) {
+	              delete this._cache[cacheKey];
+	              delete this._cells[cellKey];
+	              delete this._activeCells[cellKey];
+	            }
+	          }
+	        }
+	      }, this));
+	    }
+	  },
+
+	  /**
+	   * Styling Methods
+	   */
+
+	  resetStyle: function () {
+	    this.options.style = this._originalStyle;
+	    this.eachFeature(function (layer) {
+	      this.resetFeatureStyle(layer.feature.id);
+	    }, this);
+	    return this;
+	  },
+
+	  setStyle: function (style) {
+	    this.options.style = style;
+	    this.eachFeature(function (layer) {
+	      this.setFeatureStyle(layer.feature.id, style);
+	    }, this);
+	    return this;
+	  },
+
+	  resetFeatureStyle: function (id) {
+	    var layer = this._layers[id];
+	    var style = this._originalStyle || L.Path.prototype.options;
+	    if (layer) {
+	      L$1.Util.extend(layer.options, layer.defaultOptions);
+	      this.setFeatureStyle(id, style);
+	    }
+	    return this;
+	  },
+
+	  setFeatureStyle: function (id, style) {
+	    var layer = this._layers[id];
+	    if (typeof style === 'function') {
+	      style = style(layer.feature);
+	    }
+	    if (layer.setStyle) {
+	      layer.setStyle(style);
+	    }
+	    return this;
+	  },
+
+	  /**
+	   * Utility Methods
+	   */
+
+	  eachActiveFeature: function (fn, context) {
+	    // figure out (roughly) which layers are in view
+	    if (this._map) {
+	      var activeBounds = this._map.getBounds();
+	      for (var i in this._layers) {
+	        if (activeBounds.intersects(this._layers[i].getBounds()) && this._currentSnapshot.indexOf(this._layers[i].feature.id) !== -1) {
+	          fn.call(context, this._layers[i]);
+	        }
+	      }
+	    }
+	    return this;
+	  },
+
+	  eachFeature: function (fn, context) {
+	    for (var i in this._layers) {
+	      fn.call(context, this._layers[i]);
+	    }
+	    return this;
+	  },
+
+	  getFeature: function (id) {
+	    return this._layers[id];
+	  },
+
+	  bringToBack: function () {
+	    this.eachFeature(function (layer) {
+	      if (layer.bringToBack) {
+	        layer.bringToBack();
+	      }
+	    });
+	  },
+
+	  bringToFront: function () {
+	    this.eachFeature(function (layer) {
+	      if (layer.bringToFront) {
+	        layer.bringToFront();
+	      }
+	    });
+	  },
+
+	  redraw: function (id) {
+	    if (id) {
+	      this._redraw(id);
+	    }
+	    return this;
+	  },
+
+	  _redraw: function (id) {
+	    var layer = this._layers[id];
+	    var geojson = layer.feature;
+
+	    // if this looks like a marker
+	    if (layer && layer.setIcon && this.options.pointToLayer) {
+	      // update custom symbology, if necessary
+	      if (this.options.pointToLayer) {
+	        var getIcon = this.options.pointToLayer(geojson, L$1.latLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0]));
+	        var updatedIcon = getIcon.options.icon;
+	        layer.setIcon(updatedIcon);
+	      }
+	    }
+
+	    // looks like a vector marker (circleMarker)
+	    if (layer && layer.setStyle && this.options.pointToLayer) {
+	      var getStyle = this.options.pointToLayer(geojson, L$1.latLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0]));
+	      var updatedStyle = getStyle.options;
+	      this.setFeatureStyle(geojson.id, updatedStyle);
+	    }
+
+	    // looks like a path (polygon/polyline)
+	    if (layer && layer.setStyle && this.options.style) {
+	      this.resetStyle(geojson.id);
+	    }
+	  }
+	});
+
+	function featureLayer (options) {
+	  return new FeatureLayer(options);
+	}
+
+	exports.VERSION = version;
+	exports.Support = Support;
+	exports.options = options;
+	exports.Util = EsriUtil;
+	exports.get = get;
+	exports.post = xmlHttpPost;
+	exports.request = request;
+	exports.Task = Task;
+	exports.task = task;
+	exports.Query = Query;
+	exports.query = query;
+	exports.Find = Find;
+	exports.find = find;
+	exports.Identify = Identify;
+	exports.identify = identify;
+	exports.IdentifyFeatures = IdentifyFeatures;
+	exports.identifyFeatures = identifyFeatures;
+	exports.IdentifyImage = IdentifyImage;
+	exports.identifyImage = identifyImage;
+	exports.Service = Service;
+	exports.service = service;
+	exports.MapService = MapService;
+	exports.mapService = mapService;
+	exports.ImageService = ImageService;
+	exports.imageService = imageService;
+	exports.FeatureLayerService = FeatureLayerService;
+	exports.featureLayerService = featureLayerService;
+	exports.BasemapLayer = BasemapLayer;
+	exports.basemapLayer = basemapLayer;
+	exports.TiledMapLayer = TiledMapLayer;
+	exports.tiledMapLayer = tiledMapLayer;
+	exports.RasterLayer = RasterLayer;
+	exports.ImageMapLayer = ImageMapLayer;
+	exports.imageMapLayer = imageMapLayer;
+	exports.DynamicMapLayer = DynamicMapLayer;
+	exports.dynamicMapLayer = dynamicMapLayer;
+	exports.FeatureManager = FeatureManager;
+	exports.FeatureLayer = FeatureLayer;
+	exports.featureLayer = featureLayer;
+
+}));
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWRlYnVnLmpzIiwic291cmNlcyI6WyIuLi9wYWNrYWdlLmpzb24iLCIuLi9zcmMvU3VwcG9ydC5qcyIsIi4uL3NyYy9PcHRpb25zLmpzIiwiLi4vc3JjL1JlcXVlc3QuanMiLCIuLi9ub2RlX21vZHVsZXMvYXJjZ2lzLXRvLWdlb2pzb24tdXRpbHMvaW5kZXguanMiLCIuLi9zcmMvVXRpbC5qcyIsIi4uL3NyYy9UYXNrcy9UYXNrLmpzIiwiLi4vc3JjL1Rhc2tzL1F1ZXJ5LmpzIiwiLi4vc3JjL1Rhc2tzL0ZpbmQuanMiLCIuLi9zcmMvVGFza3MvSWRlbnRpZnkuanMiLCIuLi9zcmMvVGFza3MvSWRlbnRpZnlGZWF0dXJlcy5qcyIsIi4uL3NyYy9UYXNrcy9JZGVudGlmeUltYWdlLmpzIiwiLi4vc3JjL1NlcnZpY2VzL1NlcnZpY2UuanMiLCIuLi9zcmMvU2VydmljZXMvTWFwU2VydmljZS5qcyIsIi4uL3NyYy9TZXJ2aWNlcy9JbWFnZVNlcnZpY2UuanMiLCIuLi9zcmMvU2VydmljZXMvRmVhdHVyZUxheWVyU2VydmljZS5qcyIsIi4uL3NyYy9MYXllcnMvQmFzZW1hcExheWVyLmpzIiwiLi4vc3JjL0xheWVycy9UaWxlZE1hcExheWVyLmpzIiwiLi4vc3JjL0xheWVycy9SYXN0ZXJMYXllci5qcyIsIi4uL3NyYy9MYXllcnMvSW1hZ2VNYXBMYXllci5qcyIsIi4uL3NyYy9MYXllcnMvRHluYW1pY01hcExheWVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xlYWZsZXQtdmlydHVhbC1ncmlkL3NyYy92aXJ0dWFsLWdyaWQuanMiLCIuLi9ub2RlX21vZHVsZXMvdGlueS1iaW5hcnktc2VhcmNoL2luZGV4LmpzIiwiLi4vc3JjL0xheWVycy9GZWF0dXJlTGF5ZXIvRmVhdHVyZU1hbmFnZXIuanMiLCIuLi9zcmMvTGF5ZXJzL0ZlYXR1cmVMYXllci9GZWF0dXJlTGF5ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsie1xuICBcIm5hbWVcIjogXCJlc3JpLWxlYWZsZXRcIixcbiAgXCJkZXNjcmlwdGlvblwiOiBcIkxlYWZsZXQgcGx1Z2lucyBmb3IgY29uc3VtaW5nIEFyY0dJUyBPbmxpbmUgYW5kIEFyY0dJUyBTZXJ2ZXIgc2VydmljZXMuXCIsXG4gIFwidmVyc2lvblwiOiBcIjIuMC44XCIsXG4gIFwiYXV0aG9yXCI6IFwiUGF0cmljayBBcmx0IDxwYXJsdEBlc3JpLmNvbT4gKGh0dHA6Ly9wYXRyaWNrYXJsdC5jb20pXCIsXG4gIFwiYnJvd3NlclwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LWRlYnVnLmpzXCIsXG4gIFwiYnVnc1wiOiB7XG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZXNyaS9lc3JpLWxlYWZsZXQvaXNzdWVzXCJcbiAgfSxcbiAgXCJjb250cmlidXRvcnNcIjogW1xuICAgIFwiUGF0cmljayBBcmx0IDxwYXJsdEBlc3JpLmNvbT4gKGh0dHA6Ly9wYXRyaWNrYXJsdC5jb20pXCIsXG4gICAgXCJKb2huIEdyYXZvaXMgPGpncmF2b2lzQGVzcmkuY29tPiAoaHR0cDovL2pvaG5ncmF2b2lzLmNvbSlcIlxuICBdLFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJhcmNnaXMtdG8tZ2VvanNvbi11dGlsc1wiOiBcIl4xLjAuMVwiLFxuICAgIFwibGVhZmxldFwiOiBcIl4xLjAuMFwiLFxuICAgIFwibGVhZmxldC12aXJ0dWFsLWdyaWRcIjogXCJeMS4wLjNcIixcbiAgICBcInRpbnktYmluYXJ5LXNlYXJjaFwiOiBcIl4xLjAuMlwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImNoYWlcIjogXCIzLjUuMFwiLFxuICAgIFwiZ2gtcmVsZWFzZVwiOiBcIl4yLjAuMFwiLFxuICAgIFwiaGlnaGxpZ2h0LmpzXCI6IFwiXjguMC4wXCIsXG4gICAgXCJodHRwLXNlcnZlclwiOiBcIl4wLjguNVwiLFxuICAgIFwiaHVza3lcIjogXCJeMC4xMi4wXCIsXG4gICAgXCJpc3BhcnRhXCI6IFwiXjQuMC4wXCIsXG4gICAgXCJpc3RhbmJ1bFwiOiBcIl4wLjQuMlwiLFxuICAgIFwia2FybWFcIjogXCJeMS4zLjBcIixcbiAgICBcImthcm1hLWNoYWktc2lub25cIjogXCJeMC4xLjNcIixcbiAgICBcImthcm1hLWNvdmVyYWdlXCI6IFwiXjEuMS4xXCIsXG4gICAgXCJrYXJtYS1tb2NoYVwiOiBcIl4xLjMuMFwiLFxuICAgIFwia2FybWEtbW9jaGEtcmVwb3J0ZXJcIjogXCJeMi4yLjFcIixcbiAgICBcImthcm1hLXBoYW50b21qcy1sYXVuY2hlclwiOiBcIl4wLjIuMFwiLFxuICAgIFwia2FybWEtc291cmNlbWFwLWxvYWRlclwiOiBcIl4wLjMuNVwiLFxuICAgIFwibWtkaXJwXCI6IFwiXjAuNS4xXCIsXG4gICAgXCJtb2NoYVwiOiBcIl4zLjEuMFwiLFxuICAgIFwicGFyYWxsZWxzaGVsbFwiOiBcIl4yLjAuMFwiLFxuICAgIFwicGhhbnRvbWpzXCI6IFwiXjEuOS44XCIsXG4gICAgXCJyb2xsdXBcIjogXCJeMC4yNS40XCIsXG4gICAgXCJyb2xsdXAtcGx1Z2luLWpzb25cIjogXCJeMi4wLjBcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tbm9kZS1yZXNvbHZlXCI6IFwiXjEuNC4wXCIsXG4gICAgXCJyb2xsdXAtcGx1Z2luLXVnbGlmeVwiOiBcIl4wLjMuMVwiLFxuICAgIFwic2VtaXN0YW5kYXJkXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJzaW5vblwiOiBcIl4xLjExLjFcIixcbiAgICBcInNpbm9uLWNoYWlcIjogXCIyLjguMFwiLFxuICAgIFwic25henp5XCI6IFwiXjUuMC4wXCIsXG4gICAgXCJ1Z2xpZnktanNcIjogXCJeMi42LjFcIixcbiAgICBcIndhdGNoXCI6IFwiXjAuMTcuMVwiXG4gIH0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwOi8vZXNyaS5naXRodWIuaW8vZXNyaS1sZWFmbGV0XCIsXG4gIFwibW9kdWxlXCI6IFwic3JjL0VzcmlMZWFmbGV0LmpzXCIsXG4gIFwianNuZXh0Om1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXQuanNcIixcbiAgXCJqc3BtXCI6IHtcbiAgICBcInJlZ2lzdHJ5XCI6IFwibnBtXCIsXG4gICAgXCJmb3JtYXRcIjogXCJlczZcIixcbiAgICBcIm1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXQuanNcIlxuICB9LFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImFyY2dpc1wiLFxuICAgIFwiZXNyaVwiLFxuICAgIFwiZXNyaSBsZWFmbGV0XCIsXG4gICAgXCJnaXNcIixcbiAgICBcImxlYWZsZXQgcGx1Z2luXCIsXG4gICAgXCJtYXBwaW5nXCJcbiAgXSxcbiAgXCJsaWNlbnNlXCI6IFwiQXBhY2hlLTIuMFwiLFxuICBcIm1haW5cIjogXCJkaXN0L2VzcmktbGVhZmxldC1kZWJ1Zy5qc1wiLFxuICBcInJlYWRtZUZpbGVuYW1lXCI6IFwiUkVBRE1FLm1kXCIsXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJnaXRAZ2l0aHViLmNvbTpFc3JpL2VzcmktbGVhZmxldC5naXRcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwiYnVpbGRcIjogXCJyb2xsdXAgLWMgcHJvZmlsZXMvZGVidWcuanMgJiByb2xsdXAgLWMgcHJvZmlsZXMvcHJvZHVjdGlvbi5qc1wiLFxuICAgIFwibGludFwiOiBcInNlbWlzdGFuZGFyZCB8IHNuYXp6eVwiLFxuICAgIFwicHJlYnVpbGRcIjogXCJta2RpcnAgZGlzdFwiLFxuICAgIFwicHJlcHVibGlzaFwiOiBcIm5wbSBydW4gYnVpbGRcIixcbiAgICBcInByZXRlc3RcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJwcmVjb21taXRcIjogXCJucG0gcnVuIGxpbnRcIixcbiAgICBcInJlbGVhc2VcIjogXCIuL3NjcmlwdHMvcmVsZWFzZS5zaFwiLFxuICAgIFwic3RhcnQtd2F0Y2hcIjogXCJ3YXRjaCBcXFwibnBtIHJ1biBidWlsZFxcXCIgc3JjXCIsXG4gICAgXCJzdGFydFwiOiBcInBhcmFsbGVsc2hlbGwgXFxcIm5wbSBydW4gc3RhcnQtd2F0Y2hcXFwiIFxcXCJodHRwLXNlcnZlciAtcCA1MDAwIC1jLTEgLW9cXFwiXCIsXG4gICAgXCJ0ZXN0XCI6IFwibnBtIHJ1biBsaW50ICYmIGthcm1hIHN0YXJ0XCJcbiAgfSxcbiAgXCJzZW1pc3RhbmRhcmRcIjoge1xuICAgIFwiZ2xvYmFsc1wiOiBbIFwiZXhwZWN0XCIsIFwiTFwiLCBcIlhNTEh0dHBSZXF1ZXN0XCIsIFwic2lub25cIiwgXCJ4aHJcIiwgXCJwcm9qNFwiIF1cbiAgfVxufVxuIiwiZXhwb3J0IHZhciBjb3JzID0gKCh3aW5kb3cuWE1MSHR0cFJlcXVlc3QgJiYgJ3dpdGhDcmVkZW50aWFscycgaW4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpKSk7XG5leHBvcnQgdmFyIHBvaW50ZXJFdmVudHMgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9PT0gJyc7XG5cbmV4cG9ydCB2YXIgU3VwcG9ydCA9IHtcbiAgY29yczogY29ycyxcbiAgcG9pbnRlckV2ZW50czogcG9pbnRlckV2ZW50c1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU3VwcG9ydDtcbiIsImV4cG9ydCB2YXIgb3B0aW9ucyA9IHtcbiAgYXR0cmlidXRpb25XaWR0aE9mZnNldDogNTVcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG9wdGlvbnM7XG4iLCJpbXBvcnQgeyBVdGlsLCBEb21VdGlsIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgU3VwcG9ydCBmcm9tICcuL1N1cHBvcnQnO1xuaW1wb3J0IHsgd2FybiB9IGZyb20gJy4vVXRpbCc7XG5cbnZhciBjYWxsYmFja3MgPSAwO1xuXG5mdW5jdGlvbiBzZXJpYWxpemUgKHBhcmFtcykge1xuICB2YXIgZGF0YSA9ICcnO1xuXG4gIHBhcmFtcy5mID0gcGFyYW1zLmYgfHwgJ2pzb24nO1xuXG4gIGZvciAodmFyIGtleSBpbiBwYXJhbXMpIHtcbiAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1trZXldO1xuICAgICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocGFyYW0pO1xuICAgICAgdmFyIHZhbHVlO1xuXG4gICAgICBpZiAoZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgZGF0YSArPSAnJic7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgICAgIHZhbHVlID0gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwYXJhbVswXSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSA/IEpTT04uc3RyaW5naWZ5KHBhcmFtKSA6IHBhcmFtLmpvaW4oJywnKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeShwYXJhbSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgICAgICB2YWx1ZSA9IHBhcmFtLnZhbHVlT2YoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gcGFyYW07XG4gICAgICB9XG5cbiAgICAgIGRhdGEgKz0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSZXF1ZXN0IChjYWxsYmFjaywgY29udGV4dCkge1xuICB2YXIgaHR0cFJlcXVlc3QgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgaHR0cFJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgaHR0cFJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gVXRpbC5mYWxzZUZuO1xuXG4gICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiA1MDAsXG4gICAgICAgIG1lc3NhZ2U6ICdYTUxIdHRwUmVxdWVzdCBlcnJvcidcbiAgICAgIH1cbiAgICB9LCBudWxsKTtcbiAgfTtcblxuICBodHRwUmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3BvbnNlO1xuICAgIHZhciBlcnJvcjtcblxuICAgIGlmIChodHRwUmVxdWVzdC5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UoaHR0cFJlcXVlc3QucmVzcG9uc2VUZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVzcG9uc2UgPSBudWxsO1xuICAgICAgICBlcnJvciA9IHtcbiAgICAgICAgICBjb2RlOiA1MDAsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvdWxkIG5vdCBwYXJzZSByZXNwb25zZSBhcyBKU09OLiBUaGlzIGNvdWxkIGFsc28gYmUgY2F1c2VkIGJ5IGEgQ09SUyBvciBYTUxIdHRwUmVxdWVzdCBlcnJvci4nXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghZXJyb3IgJiYgcmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcbiAgICAgICAgcmVzcG9uc2UgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBodHRwUmVxdWVzdC5vbmVycm9yID0gVXRpbC5mYWxzZUZuO1xuXG4gICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSk7XG4gICAgfVxuICB9O1xuXG4gIGh0dHBSZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm9uZXJyb3IoKTtcbiAgfTtcblxuICByZXR1cm4gaHR0cFJlcXVlc3Q7XG59XG5cbmZ1bmN0aW9uIHhtbEh0dHBQb3N0ICh1cmwsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgdmFyIGh0dHBSZXF1ZXN0ID0gY3JlYXRlUmVxdWVzdChjYWxsYmFjaywgY29udGV4dCk7XG4gIGh0dHBSZXF1ZXN0Lm9wZW4oJ1BPU1QnLCB1cmwpO1xuXG4gIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGV4dCAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgY29udGV4dC5vcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaHR0cFJlcXVlc3QudGltZW91dCA9IGNvbnRleHQub3B0aW9ucy50aW1lb3V0O1xuICAgIH1cbiAgfVxuICBodHRwUmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gIGh0dHBSZXF1ZXN0LnNlbmQoc2VyaWFsaXplKHBhcmFtcykpO1xuXG4gIHJldHVybiBodHRwUmVxdWVzdDtcbn1cblxuZnVuY3Rpb24geG1sSHR0cEdldCAodXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIHZhciBodHRwUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3QoY2FsbGJhY2ssIGNvbnRleHQpO1xuICBodHRwUmVxdWVzdC5vcGVuKCdHRVQnLCB1cmwgKyAnPycgKyBzZXJpYWxpemUocGFyYW1zKSwgdHJ1ZSk7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0ICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZXh0ICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0Lm9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBodHRwUmVxdWVzdC50aW1lb3V0ID0gY29udGV4dC5vcHRpb25zLnRpbWVvdXQ7XG4gICAgfVxuICB9XG4gIGh0dHBSZXF1ZXN0LnNlbmQobnVsbCk7XG5cbiAgcmV0dXJuIGh0dHBSZXF1ZXN0O1xufVxuXG4vLyBBSkFYIGhhbmRsZXJzIGZvciBDT1JTIChtb2Rlcm4gYnJvd3NlcnMpIG9yIEpTT05QIChvbGRlciBicm93c2VycylcbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0ICh1cmwsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgdmFyIHBhcmFtU3RyaW5nID0gc2VyaWFsaXplKHBhcmFtcyk7XG4gIHZhciBodHRwUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3QoY2FsbGJhY2ssIGNvbnRleHQpO1xuICB2YXIgcmVxdWVzdExlbmd0aCA9ICh1cmwgKyAnPycgKyBwYXJhbVN0cmluZykubGVuZ3RoO1xuXG4gIC8vIGllMTAvMTEgcmVxdWlyZSB0aGUgcmVxdWVzdCBiZSBvcGVuZWQgYmVmb3JlIGEgdGltZW91dCBpcyBhcHBsaWVkXG4gIGlmIChyZXF1ZXN0TGVuZ3RoIDw9IDIwMDAgJiYgU3VwcG9ydC5jb3JzKSB7XG4gICAgaHR0cFJlcXVlc3Qub3BlbignR0VUJywgdXJsICsgJz8nICsgcGFyYW1TdHJpbmcpO1xuICB9IGVsc2UgaWYgKHJlcXVlc3RMZW5ndGggPiAyMDAwICYmIFN1cHBvcnQuY29ycykge1xuICAgIGh0dHBSZXF1ZXN0Lm9wZW4oJ1BPU1QnLCB1cmwpO1xuICAgIGh0dHBSZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGV4dCAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgY29udGV4dC5vcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaHR0cFJlcXVlc3QudGltZW91dCA9IGNvbnRleHQub3B0aW9ucy50aW1lb3V0O1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlcXVlc3QgaXMgbGVzcyB0aGFuIDIwMDAgY2hhcmFjdGVycyBhbmQgdGhlIGJyb3dzZXIgc3VwcG9ydHMgQ09SUywgbWFrZSBHRVQgcmVxdWVzdCB3aXRoIFhNTEh0dHBSZXF1ZXN0XG4gIGlmIChyZXF1ZXN0TGVuZ3RoIDw9IDIwMDAgJiYgU3VwcG9ydC5jb3JzKSB7XG4gICAgaHR0cFJlcXVlc3Quc2VuZChudWxsKTtcblxuICAvLyByZXF1ZXN0IGlzIG1vcmUgdGhhbiAyMDAwIGNoYXJhY3RlcnMgYW5kIHRoZSBicm93c2VyIHN1cHBvcnRzIENPUlMsIG1ha2UgUE9TVCByZXF1ZXN0IHdpdGggWE1MSHR0cFJlcXVlc3RcbiAgfSBlbHNlIGlmIChyZXF1ZXN0TGVuZ3RoID4gMjAwMCAmJiBTdXBwb3J0LmNvcnMpIHtcbiAgICBodHRwUmVxdWVzdC5zZW5kKHBhcmFtU3RyaW5nKTtcblxuICAvLyByZXF1ZXN0IGlzIGxlc3MgIHRoYW4gMjAwMCBjaGFyYWN0ZXJzIGFuZCB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IENPUlMsIG1ha2UgYSBKU09OUCByZXF1ZXN0XG4gIH0gZWxzZSBpZiAocmVxdWVzdExlbmd0aCA8PSAyMDAwICYmICFTdXBwb3J0LmNvcnMpIHtcbiAgICByZXR1cm4ganNvbnAodXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcblxuICAvLyByZXF1ZXN0IGlzIGxvbmdlciB0aGVuIDIwMDAgY2hhcmFjdGVycyBhbmQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBDT1JTLCBsb2cgYSB3YXJuaW5nXG4gIH0gZWxzZSB7XG4gICAgd2FybignYSByZXF1ZXN0IHRvICcgKyB1cmwgKyAnIHdhcyBsb25nZXIgdGhlbiAyMDAwIGNoYXJhY3RlcnMgYW5kIHRoaXMgYnJvd3NlciBjYW5ub3QgbWFrZSBhIGNyb3NzLWRvbWFpbiBwb3N0IHJlcXVlc3QuIFBsZWFzZSB1c2UgYSBwcm94eSBodHRwOi8vZXNyaS5naXRodWIuaW8vZXNyaS1sZWFmbGV0L2FwaS1yZWZlcmVuY2UvcmVxdWVzdC5odG1sJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGh0dHBSZXF1ZXN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganNvbnAgKHVybCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICB3aW5kb3cuX0VzcmlMZWFmbGV0Q2FsbGJhY2tzID0gd2luZG93Ll9Fc3JpTGVhZmxldENhbGxiYWNrcyB8fCB7fTtcbiAgdmFyIGNhbGxiYWNrSWQgPSAnYycgKyBjYWxsYmFja3M7XG4gIHBhcmFtcy5jYWxsYmFjayA9ICd3aW5kb3cuX0VzcmlMZWFmbGV0Q2FsbGJhY2tzLicgKyBjYWxsYmFja0lkO1xuXG4gIHdpbmRvdy5fRXNyaUxlYWZsZXRDYWxsYmFja3NbY2FsbGJhY2tJZF0gPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICBpZiAod2luZG93Ll9Fc3JpTGVhZmxldENhbGxiYWNrc1tjYWxsYmFja0lkXSAhPT0gdHJ1ZSkge1xuICAgICAgdmFyIGVycm9yO1xuICAgICAgdmFyIHJlc3BvbnNlVHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyZXNwb25zZSk7XG5cbiAgICAgIGlmICghKHJlc3BvbnNlVHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgfHwgcmVzcG9uc2VUeXBlID09PSAnW29iamVjdCBBcnJheV0nKSkge1xuICAgICAgICBlcnJvciA9IHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogNTAwLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0V4cGVjdGVkIGFycmF5IG9yIG9iamVjdCBhcyBKU09OUCByZXNwb25zZSdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlc3BvbnNlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlcnJvciAmJiByZXNwb25zZS5lcnJvcikge1xuICAgICAgICBlcnJvciA9IHJlc3BvbnNlO1xuICAgICAgICByZXNwb25zZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIHJlc3BvbnNlKTtcbiAgICAgIHdpbmRvdy5fRXNyaUxlYWZsZXRDYWxsYmFja3NbY2FsbGJhY2tJZF0gPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc2NyaXB0ID0gRG9tVXRpbC5jcmVhdGUoJ3NjcmlwdCcsIG51bGwsIGRvY3VtZW50LmJvZHkpO1xuICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xuICBzY3JpcHQuc3JjID0gdXJsICsgJz8nICsgc2VyaWFsaXplKHBhcmFtcyk7XG4gIHNjcmlwdC5pZCA9IGNhbGxiYWNrSWQ7XG5cbiAgY2FsbGJhY2tzKys7XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogY2FsbGJhY2tJZCxcbiAgICB1cmw6IHNjcmlwdC5zcmMsXG4gICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdpbmRvdy5fRXNyaUxlYWZsZXRDYWxsYmFja3MuX2NhbGxiYWNrW2NhbGxiYWNrSWRdKHtcbiAgICAgICAgY29kZTogMCxcbiAgICAgICAgbWVzc2FnZTogJ1JlcXVlc3QgYWJvcnRlZC4nXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBnZXQgPSAoKFN1cHBvcnQuY29ycykgPyB4bWxIdHRwR2V0IDoganNvbnApO1xuZ2V0LkNPUlMgPSB4bWxIdHRwR2V0O1xuZ2V0LkpTT05QID0ganNvbnA7XG5cbi8vIGNob29zZSB0aGUgY29ycmVjdCBBSkFYIGhhbmRsZXIgZGVwZW5kaW5nIG9uIENPUlMgc3VwcG9ydFxuZXhwb3J0IHsgZ2V0IH07XG5cbi8vIGFsd2F5cyB1c2UgWE1MSHR0cFJlcXVlc3QgZm9yIHBvc3RzXG5leHBvcnQgeyB4bWxIdHRwUG9zdCBhcyBwb3N0IH07XG5cbi8vIGV4cG9ydCB0aGUgUmVxdWVzdCBvYmplY3QgdG8gY2FsbCB0aGUgZGlmZmVyZW50IGhhbmRsZXJzIGZvciBkZWJ1Z2dpbmdcbmV4cG9ydCB2YXIgUmVxdWVzdCA9IHtcbiAgcmVxdWVzdDogcmVxdWVzdCxcbiAgZ2V0OiBnZXQsXG4gIHBvc3Q6IHhtbEh0dHBQb3N0XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSZXF1ZXN0O1xuIiwiLypcbiAqIENvcHlyaWdodCAyMDE1IEVzcmlcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpc2NlbnNlLlxuICovXG5cbi8vIGNoZWNrcyBpZiAyIHgseSBwb2ludHMgYXJlIGVxdWFsXG5mdW5jdGlvbiBwb2ludHNFcXVhbCAoYSwgYikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gY2hlY2tzIGlmIHRoZSBmaXJzdCBhbmQgbGFzdCBwb2ludHMgb2YgYSByaW5nIGFyZSBlcXVhbCBhbmQgY2xvc2VzIHRoZSByaW5nXG5mdW5jdGlvbiBjbG9zZVJpbmcgKGNvb3JkaW5hdGVzKSB7XG4gIGlmICghcG9pbnRzRXF1YWwoY29vcmRpbmF0ZXNbMF0sIGNvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzLmxlbmd0aCAtIDFdKSkge1xuICAgIGNvb3JkaW5hdGVzLnB1c2goY29vcmRpbmF0ZXNbMF0pO1xuICB9XG4gIHJldHVybiBjb29yZGluYXRlcztcbn1cblxuLy8gZGV0ZXJtaW5lIGlmIHBvbHlnb24gcmluZyBjb29yZGluYXRlcyBhcmUgY2xvY2t3aXNlLiBjbG9ja3dpc2Ugc2lnbmlmaWVzIG91dGVyIHJpbmcsIGNvdW50ZXItY2xvY2t3aXNlIGFuIGlubmVyIHJpbmdcbi8vIG9yIGhvbGUuIHRoaXMgbG9naWMgd2FzIGZvdW5kIGF0IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTE2NTY0Ny9ob3ctdG8tZGV0ZXJtaW5lLWlmLWEtbGlzdC1vZi1wb2x5Z29uLVxuLy8gcG9pbnRzLWFyZS1pbi1jbG9ja3dpc2Utb3JkZXJcbmZ1bmN0aW9uIHJpbmdJc0Nsb2Nrd2lzZSAocmluZ1RvVGVzdCkge1xuICB2YXIgdG90YWwgPSAwO1xuICB2YXIgaSA9IDA7XG4gIHZhciByTGVuZ3RoID0gcmluZ1RvVGVzdC5sZW5ndGg7XG4gIHZhciBwdDEgPSByaW5nVG9UZXN0W2ldO1xuICB2YXIgcHQyO1xuICBmb3IgKGk7IGkgPCByTGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgcHQyID0gcmluZ1RvVGVzdFtpICsgMV07XG4gICAgdG90YWwgKz0gKHB0MlswXSAtIHB0MVswXSkgKiAocHQyWzFdICsgcHQxWzFdKTtcbiAgICBwdDEgPSBwdDI7XG4gIH1cbiAgcmV0dXJuICh0b3RhbCA+PSAwKTtcbn1cblxuLy8gcG9ydGVkIGZyb20gdGVycmFmb3JtZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvVGVycmFmb3JtZXIvYmxvYi9tYXN0ZXIvdGVycmFmb3JtZXIuanMjTDUwNC1MNTE5XG5mdW5jdGlvbiB2ZXJ0ZXhJbnRlcnNlY3RzVmVydGV4IChhMSwgYTIsIGIxLCBiMikge1xuICB2YXIgdWFUID0gKGIyWzBdIC0gYjFbMF0pICogKGExWzFdIC0gYjFbMV0pIC0gKGIyWzFdIC0gYjFbMV0pICogKGExWzBdIC0gYjFbMF0pO1xuICB2YXIgdWJUID0gKGEyWzBdIC0gYTFbMF0pICogKGExWzFdIC0gYjFbMV0pIC0gKGEyWzFdIC0gYTFbMV0pICogKGExWzBdIC0gYjFbMF0pO1xuICB2YXIgdUIgPSAoYjJbMV0gLSBiMVsxXSkgKiAoYTJbMF0gLSBhMVswXSkgLSAoYjJbMF0gLSBiMVswXSkgKiAoYTJbMV0gLSBhMVsxXSk7XG5cbiAgaWYgKHVCICE9PSAwKSB7XG4gICAgdmFyIHVhID0gdWFUIC8gdUI7XG4gICAgdmFyIHViID0gdWJUIC8gdUI7XG5cbiAgICBpZiAodWEgPj0gMCAmJiB1YSA8PSAxICYmIHViID49IDAgJiYgdWIgPD0gMSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBwb3J0ZWQgZnJvbSB0ZXJyYWZvcm1lci5qcyBodHRwczovL2dpdGh1Yi5jb20vRXNyaS9UZXJyYWZvcm1lci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci5qcyNMNTIxLUw1MzFcbmZ1bmN0aW9uIGFycmF5SW50ZXJzZWN0c0FycmF5IChhLCBiKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGIubGVuZ3RoIC0gMTsgaisrKSB7XG4gICAgICBpZiAodmVydGV4SW50ZXJzZWN0c1ZlcnRleChhW2ldLCBhW2kgKyAxXSwgYltqXSwgYltqICsgMV0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gcG9ydGVkIGZyb20gdGVycmFmb3JtZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvVGVycmFmb3JtZXIvYmxvYi9tYXN0ZXIvdGVycmFmb3JtZXIuanMjTDQ3MC1MNDgwXG5mdW5jdGlvbiBjb29yZGluYXRlc0NvbnRhaW5Qb2ludCAoY29vcmRpbmF0ZXMsIHBvaW50KSB7XG4gIHZhciBjb250YWlucyA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gLTEsIGwgPSBjb29yZGluYXRlcy5sZW5ndGgsIGogPSBsIC0gMTsgKytpIDwgbDsgaiA9IGkpIHtcbiAgICBpZiAoKChjb29yZGluYXRlc1tpXVsxXSA8PSBwb2ludFsxXSAmJiBwb2ludFsxXSA8IGNvb3JkaW5hdGVzW2pdWzFdKSB8fFxuICAgICAgICAgKGNvb3JkaW5hdGVzW2pdWzFdIDw9IHBvaW50WzFdICYmIHBvaW50WzFdIDwgY29vcmRpbmF0ZXNbaV1bMV0pKSAmJlxuICAgICAgICAocG9pbnRbMF0gPCAoY29vcmRpbmF0ZXNbal1bMF0gLSBjb29yZGluYXRlc1tpXVswXSkgKiAocG9pbnRbMV0gLSBjb29yZGluYXRlc1tpXVsxXSkgLyAoY29vcmRpbmF0ZXNbal1bMV0gLSBjb29yZGluYXRlc1tpXVsxXSkgKyBjb29yZGluYXRlc1tpXVswXSkpIHtcbiAgICAgIGNvbnRhaW5zID0gIWNvbnRhaW5zO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29udGFpbnM7XG59XG5cbi8vIHBvcnRlZCBmcm9tIHRlcnJhZm9ybWVyLWFyY2dpcy1wYXJzZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvdGVycmFmb3JtZXItYXJjZ2lzLXBhcnNlci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci1hcmNnaXMtcGFyc2VyLmpzI0wxMDYtTDExM1xuZnVuY3Rpb24gY29vcmRpbmF0ZXNDb250YWluQ29vcmRpbmF0ZXMgKG91dGVyLCBpbm5lcikge1xuICB2YXIgaW50ZXJzZWN0cyA9IGFycmF5SW50ZXJzZWN0c0FycmF5KG91dGVyLCBpbm5lcik7XG4gIHZhciBjb250YWlucyA9IGNvb3JkaW5hdGVzQ29udGFpblBvaW50KG91dGVyLCBpbm5lclswXSk7XG4gIGlmICghaW50ZXJzZWN0cyAmJiBjb250YWlucykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gZG8gYW55IHBvbHlnb25zIGluIHRoaXMgYXJyYXkgY29udGFpbiBhbnkgb3RoZXIgcG9seWdvbnMgaW4gdGhpcyBhcnJheT9cbi8vIHVzZWQgZm9yIGNoZWNraW5nIGZvciBob2xlcyBpbiBhcmNnaXMgcmluZ3Ncbi8vIHBvcnRlZCBmcm9tIHRlcnJhZm9ybWVyLWFyY2dpcy1wYXJzZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvdGVycmFmb3JtZXItYXJjZ2lzLXBhcnNlci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci1hcmNnaXMtcGFyc2VyLmpzI0wxMTctTDE3MlxuZnVuY3Rpb24gY29udmVydFJpbmdzVG9HZW9KU09OIChyaW5ncykge1xuICB2YXIgb3V0ZXJSaW5ncyA9IFtdO1xuICB2YXIgaG9sZXMgPSBbXTtcbiAgdmFyIHg7IC8vIGl0ZXJhdG9yXG4gIHZhciBvdXRlclJpbmc7IC8vIGN1cnJlbnQgb3V0ZXIgcmluZyBiZWluZyBldmFsdWF0ZWRcbiAgdmFyIGhvbGU7IC8vIGN1cnJlbnQgaG9sZSBiZWluZyBldmFsdWF0ZWRcblxuICAvLyBmb3IgZWFjaCByaW5nXG4gIGZvciAodmFyIHIgPSAwOyByIDwgcmluZ3MubGVuZ3RoOyByKyspIHtcbiAgICB2YXIgcmluZyA9IGNsb3NlUmluZyhyaW5nc1tyXS5zbGljZSgwKSk7XG4gICAgaWYgKHJpbmcubGVuZ3RoIDwgNCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIGlzIHRoaXMgcmluZyBhbiBvdXRlciByaW5nPyBpcyBpdCBjbG9ja3dpc2U/XG4gICAgaWYgKHJpbmdJc0Nsb2Nrd2lzZShyaW5nKSkge1xuICAgICAgdmFyIHBvbHlnb24gPSBbIHJpbmcgXTtcbiAgICAgIG91dGVyUmluZ3MucHVzaChwb2x5Z29uKTsgLy8gcHVzaCB0byBvdXRlciByaW5nc1xuICAgIH0gZWxzZSB7XG4gICAgICBob2xlcy5wdXNoKHJpbmcpOyAvLyBjb3VudGVyY2xvY2t3aXNlIHB1c2ggdG8gaG9sZXNcbiAgICB9XG4gIH1cblxuICB2YXIgdW5jb250YWluZWRIb2xlcyA9IFtdO1xuXG4gIC8vIHdoaWxlIHRoZXJlIGFyZSBob2xlcyBsZWZ0Li4uXG4gIHdoaWxlIChob2xlcy5sZW5ndGgpIHtcbiAgICAvLyBwb3AgYSBob2xlIG9mZiBvdXQgc3RhY2tcbiAgICBob2xlID0gaG9sZXMucG9wKCk7XG5cbiAgICAvLyBsb29wIG92ZXIgYWxsIG91dGVyIHJpbmdzIGFuZCBzZWUgaWYgdGhleSBjb250YWluIG91ciBob2xlLlxuICAgIHZhciBjb250YWluZWQgPSBmYWxzZTtcbiAgICBmb3IgKHggPSBvdXRlclJpbmdzLmxlbmd0aCAtIDE7IHggPj0gMDsgeC0tKSB7XG4gICAgICBvdXRlclJpbmcgPSBvdXRlclJpbmdzW3hdWzBdO1xuICAgICAgaWYgKGNvb3JkaW5hdGVzQ29udGFpbkNvb3JkaW5hdGVzKG91dGVyUmluZywgaG9sZSkpIHtcbiAgICAgICAgLy8gdGhlIGhvbGUgaXMgY29udGFpbmVkIHB1c2ggaXQgaW50byBvdXIgcG9seWdvblxuICAgICAgICBvdXRlclJpbmdzW3hdLnB1c2goaG9sZSk7XG4gICAgICAgIGNvbnRhaW5lZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJpbmcgaXMgbm90IGNvbnRhaW5lZCBpbiBhbnkgb3V0ZXIgcmluZ1xuICAgIC8vIHNvbWV0aW1lcyB0aGlzIGhhcHBlbnMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvZXNyaS1sZWFmbGV0L2lzc3Vlcy8zMjBcbiAgICBpZiAoIWNvbnRhaW5lZCkge1xuICAgICAgdW5jb250YWluZWRIb2xlcy5wdXNoKGhvbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHdlIGNvdWxkbid0IG1hdGNoIGFueSBob2xlcyB1c2luZyBjb250YWlucyB3ZSBjYW4gdHJ5IGludGVyc2VjdHMuLi5cbiAgd2hpbGUgKHVuY29udGFpbmVkSG9sZXMubGVuZ3RoKSB7XG4gICAgLy8gcG9wIGEgaG9sZSBvZmYgb3V0IHN0YWNrXG4gICAgaG9sZSA9IHVuY29udGFpbmVkSG9sZXMucG9wKCk7XG5cbiAgICAvLyBsb29wIG92ZXIgYWxsIG91dGVyIHJpbmdzIGFuZCBzZWUgaWYgYW55IGludGVyc2VjdCBvdXIgaG9sZS5cbiAgICB2YXIgaW50ZXJzZWN0cyA9IGZhbHNlO1xuXG4gICAgZm9yICh4ID0gb3V0ZXJSaW5ncy5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkge1xuICAgICAgb3V0ZXJSaW5nID0gb3V0ZXJSaW5nc1t4XVswXTtcbiAgICAgIGlmIChhcnJheUludGVyc2VjdHNBcnJheShvdXRlclJpbmcsIGhvbGUpKSB7XG4gICAgICAgIC8vIHRoZSBob2xlIGlzIGNvbnRhaW5lZCBwdXNoIGl0IGludG8gb3VyIHBvbHlnb25cbiAgICAgICAgb3V0ZXJSaW5nc1t4XS5wdXNoKGhvbGUpO1xuICAgICAgICBpbnRlcnNlY3RzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbnRlcnNlY3RzKSB7XG4gICAgICBvdXRlclJpbmdzLnB1c2goW2hvbGUucmV2ZXJzZSgpXSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG91dGVyUmluZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgIGNvb3JkaW5hdGVzOiBvdXRlclJpbmdzWzBdXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ011bHRpUG9seWdvbicsXG4gICAgICBjb29yZGluYXRlczogb3V0ZXJSaW5nc1xuICAgIH07XG4gIH1cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgcmluZ3MgYXJlIG9yaWVudGVkIGluIHRoZSByaWdodCBkaXJlY3Rpb25zXG4vLyBvdXRlciByaW5ncyBhcmUgY2xvY2t3aXNlLCBob2xlcyBhcmUgY291bnRlcmNsb2Nrd2lzZVxuLy8gdXNlZCBmb3IgY29udmVydGluZyBHZW9KU09OIFBvbHlnb25zIHRvIEFyY0dJUyBQb2x5Z29uc1xuZnVuY3Rpb24gb3JpZW50UmluZ3MgKHBvbHkpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICB2YXIgcG9seWdvbiA9IHBvbHkuc2xpY2UoMCk7XG4gIHZhciBvdXRlclJpbmcgPSBjbG9zZVJpbmcocG9seWdvbi5zaGlmdCgpLnNsaWNlKDApKTtcbiAgaWYgKG91dGVyUmluZy5sZW5ndGggPj0gNCkge1xuICAgIGlmICghcmluZ0lzQ2xvY2t3aXNlKG91dGVyUmluZykpIHtcbiAgICAgIG91dGVyUmluZy5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgb3V0cHV0LnB1c2gob3V0ZXJSaW5nKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9seWdvbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhvbGUgPSBjbG9zZVJpbmcocG9seWdvbltpXS5zbGljZSgwKSk7XG4gICAgICBpZiAoaG9sZS5sZW5ndGggPj0gNCkge1xuICAgICAgICBpZiAocmluZ0lzQ2xvY2t3aXNlKGhvbGUpKSB7XG4gICAgICAgICAgaG9sZS5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0LnB1c2goaG9sZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBmbGF0dGVucyBob2xlcyBpbiBtdWx0aXBvbHlnb25zIHRvIG9uZSBhcnJheSBvZiBwb2x5Z29uc1xuLy8gdXNlZCBmb3IgY29udmVydGluZyBHZW9KU09OIFBvbHlnb25zIHRvIEFyY0dJUyBQb2x5Z29uc1xuZnVuY3Rpb24gZmxhdHRlbk11bHRpUG9seWdvblJpbmdzIChyaW5ncykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcG9seWdvbiA9IG9yaWVudFJpbmdzKHJpbmdzW2ldKTtcbiAgICBmb3IgKHZhciB4ID0gcG9seWdvbi5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkge1xuICAgICAgdmFyIHJpbmcgPSBwb2x5Z29uW3hdLnNsaWNlKDApO1xuICAgICAgb3V0cHV0LnB1c2gocmluZyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8vIHNoYWxsb3cgb2JqZWN0IGNsb25lIGZvciBmZWF0dXJlIHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXNcbi8vIGZyb20gaHR0cDovL2pzcGVyZi5jb20vY2xvbmluZy1hbi1vYmplY3QvMlxuZnVuY3Rpb24gc2hhbGxvd0Nsb25lIChvYmopIHtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgIHRhcmdldFtpXSA9IG9ialtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyY2dpc1RvR2VvSlNPTiAoYXJjZ2lzLCBpZEF0dHJpYnV0ZSkge1xuICB2YXIgZ2VvanNvbiA9IHt9O1xuXG4gIGlmICh0eXBlb2YgYXJjZ2lzLnggPT09ICdudW1iZXInICYmIHR5cGVvZiBhcmNnaXMueSA9PT0gJ251bWJlcicpIHtcbiAgICBnZW9qc29uLnR5cGUgPSAnUG9pbnQnO1xuICAgIGdlb2pzb24uY29vcmRpbmF0ZXMgPSBbYXJjZ2lzLngsIGFyY2dpcy55XTtcbiAgfVxuXG4gIGlmIChhcmNnaXMucG9pbnRzKSB7XG4gICAgZ2VvanNvbi50eXBlID0gJ011bHRpUG9pbnQnO1xuICAgIGdlb2pzb24uY29vcmRpbmF0ZXMgPSBhcmNnaXMucG9pbnRzLnNsaWNlKDApO1xuICB9XG5cbiAgaWYgKGFyY2dpcy5wYXRocykge1xuICAgIGlmIChhcmNnaXMucGF0aHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBnZW9qc29uLnR5cGUgPSAnTGluZVN0cmluZyc7XG4gICAgICBnZW9qc29uLmNvb3JkaW5hdGVzID0gYXJjZ2lzLnBhdGhzWzBdLnNsaWNlKDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW9qc29uLnR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICAgIGdlb2pzb24uY29vcmRpbmF0ZXMgPSBhcmNnaXMucGF0aHMuc2xpY2UoMCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGFyY2dpcy5yaW5ncykge1xuICAgIGdlb2pzb24gPSBjb252ZXJ0UmluZ3NUb0dlb0pTT04oYXJjZ2lzLnJpbmdzLnNsaWNlKDApKTtcbiAgfVxuXG4gIGlmIChhcmNnaXMuZ2VvbWV0cnkgfHwgYXJjZ2lzLmF0dHJpYnV0ZXMpIHtcbiAgICBnZW9qc29uLnR5cGUgPSAnRmVhdHVyZSc7XG4gICAgZ2VvanNvbi5nZW9tZXRyeSA9IChhcmNnaXMuZ2VvbWV0cnkpID8gYXJjZ2lzVG9HZW9KU09OKGFyY2dpcy5nZW9tZXRyeSkgOiBudWxsO1xuICAgIGdlb2pzb24ucHJvcGVydGllcyA9IChhcmNnaXMuYXR0cmlidXRlcykgPyBzaGFsbG93Q2xvbmUoYXJjZ2lzLmF0dHJpYnV0ZXMpIDogbnVsbDtcbiAgICBpZiAoYXJjZ2lzLmF0dHJpYnV0ZXMpIHtcbiAgICAgIGdlb2pzb24uaWQgPSBhcmNnaXMuYXR0cmlidXRlc1tpZEF0dHJpYnV0ZV0gfHwgYXJjZ2lzLmF0dHJpYnV0ZXMuT0JKRUNUSUQgfHwgYXJjZ2lzLmF0dHJpYnV0ZXMuRklEO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZW9qc29uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VvanNvblRvQXJjR0lTIChnZW9qc29uLCBpZEF0dHJpYnV0ZSkge1xuICBpZEF0dHJpYnV0ZSA9IGlkQXR0cmlidXRlIHx8ICdPQkpFQ1RJRCc7XG4gIHZhciBzcGF0aWFsUmVmZXJlbmNlID0geyB3a2lkOiA0MzI2IH07XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIGk7XG5cbiAgc3dpdGNoIChnZW9qc29uLnR5cGUpIHtcbiAgICBjYXNlICdQb2ludCc6XG4gICAgICByZXN1bHQueCA9IGdlb2pzb24uY29vcmRpbmF0ZXNbMF07XG4gICAgICByZXN1bHQueSA9IGdlb2pzb24uY29vcmRpbmF0ZXNbMV07XG4gICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aVBvaW50JzpcbiAgICAgIHJlc3VsdC5wb2ludHMgPSBnZW9qc29uLmNvb3JkaW5hdGVzLnNsaWNlKDApO1xuICAgICAgcmVzdWx0LnNwYXRpYWxSZWZlcmVuY2UgPSBzcGF0aWFsUmVmZXJlbmNlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnTGluZVN0cmluZyc6XG4gICAgICByZXN1bHQucGF0aHMgPSBbZ2VvanNvbi5jb29yZGluYXRlcy5zbGljZSgwKV07XG4gICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aUxpbmVTdHJpbmcnOlxuICAgICAgcmVzdWx0LnBhdGhzID0gZ2VvanNvbi5jb29yZGluYXRlcy5zbGljZSgwKTtcbiAgICAgIHJlc3VsdC5zcGF0aWFsUmVmZXJlbmNlID0gc3BhdGlhbFJlZmVyZW5jZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1BvbHlnb24nOlxuICAgICAgcmVzdWx0LnJpbmdzID0gb3JpZW50UmluZ3MoZ2VvanNvbi5jb29yZGluYXRlcy5zbGljZSgwKSk7XG4gICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aVBvbHlnb24nOlxuICAgICAgcmVzdWx0LnJpbmdzID0gZmxhdHRlbk11bHRpUG9seWdvblJpbmdzKGdlb2pzb24uY29vcmRpbmF0ZXMuc2xpY2UoMCkpO1xuICAgICAgcmVzdWx0LnNwYXRpYWxSZWZlcmVuY2UgPSBzcGF0aWFsUmVmZXJlbmNlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRmVhdHVyZSc6XG4gICAgICBpZiAoZ2VvanNvbi5nZW9tZXRyeSkge1xuICAgICAgICByZXN1bHQuZ2VvbWV0cnkgPSBnZW9qc29uVG9BcmNHSVMoZ2VvanNvbi5nZW9tZXRyeSwgaWRBdHRyaWJ1dGUpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmF0dHJpYnV0ZXMgPSAoZ2VvanNvbi5wcm9wZXJ0aWVzKSA/IHNoYWxsb3dDbG9uZShnZW9qc29uLnByb3BlcnRpZXMpIDoge307XG4gICAgICBpZiAoZ2VvanNvbi5pZCkge1xuICAgICAgICByZXN1bHQuYXR0cmlidXRlc1tpZEF0dHJpYnV0ZV0gPSBnZW9qc29uLmlkO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRmVhdHVyZUNvbGxlY3Rpb24nOlxuICAgICAgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvanNvbi5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQucHVzaChnZW9qc29uVG9BcmNHSVMoZ2VvanNvbi5mZWF0dXJlc1tpXSwgaWRBdHRyaWJ1dGUpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0dlb21ldHJ5Q29sbGVjdGlvbic6XG4gICAgICByZXN1bHQgPSBbXTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9qc29uLmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0LnB1c2goZ2VvanNvblRvQXJjR0lTKGdlb2pzb24uZ2VvbWV0cmllc1tpXSwgaWRBdHRyaWJ1dGUpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsImltcG9ydCB7IGxhdExuZywgbGF0TG5nQm91bmRzLCBVdGlsLCBEb21VdGlsIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBqc29ucCB9IGZyb20gJy4vUmVxdWVzdCc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9PcHRpb25zJztcblxuaW1wb3J0IHtcbiAgZ2VvanNvblRvQXJjR0lTIGFzIGcyYSxcbiAgYXJjZ2lzVG9HZW9KU09OIGFzIGEyZ1xufSBmcm9tICdhcmNnaXMtdG8tZ2VvanNvbi11dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9qc29uVG9BcmNHSVMgKGdlb2pzb24sIGlkQXR0cikge1xuICByZXR1cm4gZzJhKGdlb2pzb24sIGlkQXR0cik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmNnaXNUb0dlb0pTT04gKGFyY2dpcywgaWRBdHRyKSB7XG4gIHJldHVybiBhMmcoYXJjZ2lzLCBpZEF0dHIpO1xufVxuXG4vLyBzaGFsbG93IG9iamVjdCBjbG9uZSBmb3IgZmVhdHVyZSBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzXG4vLyBmcm9tIGh0dHA6Ly9qc3BlcmYuY29tL2Nsb25pbmctYW4tb2JqZWN0LzJcbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93Q2xvbmUgKG9iaikge1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIGZvciAodmFyIGkgaW4gb2JqKSB7XG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgdGFyZ2V0W2ldID0gb2JqW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vLyBjb252ZXJ0IGFuIGV4dGVudCAoQXJjR0lTKSB0byBMYXRMbmdCb3VuZHMgKExlYWZsZXQpXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW50VG9Cb3VuZHMgKGV4dGVudCkge1xuICAvLyBcIk5hTlwiIGNvb3JkaW5hdGVzIGZyb20gQXJjR0lTIFNlcnZlciBpbmRpY2F0ZSBhIG51bGwgZ2VvbWV0cnlcbiAgaWYgKGV4dGVudC54bWluICE9PSAnTmFOJyAmJiBleHRlbnQueW1pbiAhPT0gJ05hTicgJiYgZXh0ZW50LnhtYXggIT09ICdOYU4nICYmIGV4dGVudC55bWF4ICE9PSAnTmFOJykge1xuICAgIHZhciBzdyA9IGxhdExuZyhleHRlbnQueW1pbiwgZXh0ZW50LnhtaW4pO1xuICAgIHZhciBuZSA9IGxhdExuZyhleHRlbnQueW1heCwgZXh0ZW50LnhtYXgpO1xuICAgIHJldHVybiBsYXRMbmdCb3VuZHMoc3csIG5lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBjb252ZXJ0IGFuIExhdExuZ0JvdW5kcyAoTGVhZmxldCkgdG8gZXh0ZW50IChBcmNHSVMpXG5leHBvcnQgZnVuY3Rpb24gYm91bmRzVG9FeHRlbnQgKGJvdW5kcykge1xuICBib3VuZHMgPSBsYXRMbmdCb3VuZHMoYm91bmRzKTtcbiAgcmV0dXJuIHtcbiAgICAneG1pbic6IGJvdW5kcy5nZXRTb3V0aFdlc3QoKS5sbmcsXG4gICAgJ3ltaW4nOiBib3VuZHMuZ2V0U291dGhXZXN0KCkubGF0LFxuICAgICd4bWF4JzogYm91bmRzLmdldE5vcnRoRWFzdCgpLmxuZyxcbiAgICAneW1heCc6IGJvdW5kcy5nZXROb3J0aEVhc3QoKS5sYXQsXG4gICAgJ3NwYXRpYWxSZWZlcmVuY2UnOiB7XG4gICAgICAnd2tpZCc6IDQzMjZcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24gKHJlc3BvbnNlLCBpZEF0dHJpYnV0ZSkge1xuICB2YXIgb2JqZWN0SWRGaWVsZDtcbiAgdmFyIGZlYXR1cmVzID0gcmVzcG9uc2UuZmVhdHVyZXMgfHwgcmVzcG9uc2UucmVzdWx0cztcbiAgdmFyIGNvdW50ID0gZmVhdHVyZXMubGVuZ3RoO1xuXG4gIGlmIChpZEF0dHJpYnV0ZSkge1xuICAgIG9iamVjdElkRmllbGQgPSBpZEF0dHJpYnV0ZTtcbiAgfSBlbHNlIGlmIChyZXNwb25zZS5vYmplY3RJZEZpZWxkTmFtZSkge1xuICAgIG9iamVjdElkRmllbGQgPSByZXNwb25zZS5vYmplY3RJZEZpZWxkTmFtZTtcbiAgfSBlbHNlIGlmIChyZXNwb25zZS5maWVsZHMpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8PSByZXNwb25zZS5maWVsZHMubGVuZ3RoIC0gMTsgaisrKSB7XG4gICAgICBpZiAocmVzcG9uc2UuZmllbGRzW2pdLnR5cGUgPT09ICdlc3JpRmllbGRUeXBlT0lEJykge1xuICAgICAgICBvYmplY3RJZEZpZWxkID0gcmVzcG9uc2UuZmllbGRzW2pdLm5hbWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChjb3VudCkge1xuICAgIC8qIGFzIGEgbGFzdCByZXNvcnQsIGNoZWNrIGZvciBjb21tb24gSUQgZmllbGRuYW1lcyBpbiB0aGUgZmlyc3QgZmVhdHVyZSByZXR1cm5lZFxuICAgIG5vdCBmb29scHJvb2YuIGlkZW50aWZ5RmVhdHVyZXMgY2FuIHJldHVybmVkIGEgbWl4ZWQgYXJyYXkgb2YgZmVhdHVyZXMuICovXG4gICAgZm9yICh2YXIga2V5IGluIGZlYXR1cmVzWzBdLmF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmIChrZXkubWF0Y2goL14oT0JKRUNUSUR8RklEfE9JRHxJRCkkL2kpKSB7XG4gICAgICAgIG9iamVjdElkRmllbGQgPSBrZXk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBmZWF0dXJlQ29sbGVjdGlvbiA9IHtcbiAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgIGZlYXR1cmVzOiBbXVxuICB9O1xuXG4gIGlmIChjb3VudCkge1xuICAgIGZvciAodmFyIGkgPSBmZWF0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZlYXR1cmUgPSBhcmNnaXNUb0dlb0pTT04oZmVhdHVyZXNbaV0sIG9iamVjdElkRmllbGQpO1xuICAgICAgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMucHVzaChmZWF0dXJlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmVhdHVyZUNvbGxlY3Rpb247XG59XG5cbiAgLy8gdHJpbSB1cmwgd2hpdGVzcGFjZSBhbmQgYWRkIGEgdHJhaWxpbmcgc2xhc2ggaWYgbmVlZGVkXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcmwgKHVybCkge1xuICAvLyB0cmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcywgYnV0IG5vdCBzcGFjZXMgaW5zaWRlIHRoZSB1cmxcbiAgdXJsID0gVXRpbC50cmltKHVybCk7XG5cbiAgLy8gYWRkIGEgdHJhaWxpbmcgc2xhc2ggdG8gdGhlIHVybCBpZiB0aGUgdXNlciBvbWl0dGVkIGl0XG4gIGlmICh1cmxbdXJsLmxlbmd0aCAtIDFdICE9PSAnLycpIHtcbiAgICB1cmwgKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJjZ2lzT25saW5lICh1cmwpIHtcbiAgLyogaG9zdGVkIGZlYXR1cmUgc2VydmljZXMgc3VwcG9ydCBnZW9qc29uIGFzIGFuIG91dHB1dCBmb3JtYXRcbiAgdXRpbGl0eS5hcmNnaXMuY29tIHNlcnZpY2VzIGFyZSBwcm94aWVkIGZyb20gYSB2YXJpZXR5IG9mIEFyY0dJUyBTZXJ2ZXIgdmludGFnZXMsIGFuZCBtYXkgbm90ICovXG4gIHJldHVybiAoL14oPyEuKnV0aWxpdHlcXC5hcmNnaXNcXC5jb20pLipcXC5hcmNnaXNcXC5jb20uKkZlYXR1cmVTZXJ2ZXIvaSkudGVzdCh1cmwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VvanNvblR5cGVUb0FyY0dJUyAoZ2VvSnNvblR5cGUpIHtcbiAgdmFyIGFyY2dpc0dlb21ldHJ5VHlwZTtcbiAgc3dpdGNoIChnZW9Kc29uVHlwZSkge1xuICAgIGNhc2UgJ1BvaW50JzpcbiAgICAgIGFyY2dpc0dlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlQb2ludCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aVBvaW50JzpcbiAgICAgIGFyY2dpc0dlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlNdWx0aXBvaW50JztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0xpbmVTdHJpbmcnOlxuICAgICAgYXJjZ2lzR2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvbHlsaW5lJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ011bHRpTGluZVN0cmluZyc6XG4gICAgICBhcmNnaXNHZW9tZXRyeVR5cGUgPSAnZXNyaUdlb21ldHJ5UG9seWxpbmUnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnUG9seWdvbic6XG4gICAgICBhcmNnaXNHZW9tZXRyeVR5cGUgPSAnZXNyaUdlb21ldHJ5UG9seWdvbic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aVBvbHlnb24nOlxuICAgICAgYXJjZ2lzR2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvbHlnb24nO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gYXJjZ2lzR2VvbWV0cnlUeXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2FybiAoKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2Fybikge1xuICAgIGNvbnNvbGUud2Fybi5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjQXR0cmlidXRpb25XaWR0aCAobWFwKSB7XG4gIC8vIGVpdGhlciBjcm9wIGF0IDU1cHggb3IgdXNlciBkZWZpbmVkIGJ1ZmZlclxuICByZXR1cm4gKG1hcC5nZXRTaXplKCkueCAtIG9wdGlvbnMuYXR0cmlidXRpb25XaWR0aE9mZnNldCkgKyAncHgnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RXNyaUF0dHJpYnV0aW9uIChtYXApIHtcbiAgaWYgKG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wgJiYgIW1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuX2VzcmlBdHRyaWJ1dGlvbkFkZGVkKSB7XG4gICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5zZXRQcmVmaXgoJzxhIGhyZWY9XCJodHRwOi8vbGVhZmxldGpzLmNvbVwiIHRpdGxlPVwiQSBKUyBsaWJyYXJ5IGZvciBpbnRlcmFjdGl2ZSBtYXBzXCI+TGVhZmxldDwvYT4gfCBQb3dlcmVkIGJ5IDxhIGhyZWY9XCJodHRwczovL3d3dy5lc3JpLmNvbVwiPkVzcmk8L2E+Jyk7XG5cbiAgICB2YXIgaG92ZXJBdHRyaWJ1dGlvblN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBob3ZlckF0dHJpYnV0aW9uU3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgaG92ZXJBdHRyaWJ1dGlvblN0eWxlLmlubmVySFRNTCA9ICcuZXNyaS10cnVuY2F0ZWQtYXR0cmlidXRpb246aG92ZXIgeycgK1xuICAgICAgJ3doaXRlLXNwYWNlOiBub3JtYWw7JyArXG4gICAgJ30nO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChob3ZlckF0dHJpYnV0aW9uU3R5bGUpO1xuICAgIERvbVV0aWwuYWRkQ2xhc3MobWFwLmF0dHJpYnV0aW9uQ29udHJvbC5fY29udGFpbmVyLCAnZXNyaS10cnVuY2F0ZWQtYXR0cmlidXRpb246aG92ZXInKTtcblxuICAgIC8vIGRlZmluZSBhIG5ldyBjc3MgY2xhc3MgaW4gSlMgdG8gdHJpbSBhdHRyaWJ1dGlvbiBpbnRvIGEgc2luZ2xlIGxpbmVcbiAgICB2YXIgYXR0cmlidXRpb25TdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgYXR0cmlidXRpb25TdHlsZS50eXBlID0gJ3RleHQvY3NzJztcbiAgICBhdHRyaWJ1dGlvblN0eWxlLmlubmVySFRNTCA9ICcuZXNyaS10cnVuY2F0ZWQtYXR0cmlidXRpb24geycgK1xuICAgICAgJ3ZlcnRpY2FsLWFsaWduOiAtM3B4OycgK1xuICAgICAgJ3doaXRlLXNwYWNlOiBub3dyYXA7JyArXG4gICAgICAnb3ZlcmZsb3c6IGhpZGRlbjsnICtcbiAgICAgICd0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsnICtcbiAgICAgICdkaXNwbGF5OiBpbmxpbmUtYmxvY2s7JyArXG4gICAgICAndHJhbnNpdGlvbjogMHMgd2hpdGUtc3BhY2U7JyArXG4gICAgICAndHJhbnNpdGlvbi1kZWxheTogMXM7JyArXG4gICAgICAnbWF4LXdpZHRoOiAnICsgY2FsY0F0dHJpYnV0aW9uV2lkdGgobWFwKSArICc7JyArXG4gICAgJ30nO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChhdHRyaWJ1dGlvblN0eWxlKTtcbiAgICBEb21VdGlsLmFkZENsYXNzKG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuX2NvbnRhaW5lciwgJ2VzcmktdHJ1bmNhdGVkLWF0dHJpYnV0aW9uJyk7XG5cbiAgICAvLyB1cGRhdGUgdGhlIHdpZHRoIHVzZWQgdG8gdHJ1bmNhdGUgd2hlbiB0aGUgbWFwIGl0c2VsZiBpcyByZXNpemVkXG4gICAgbWFwLm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5fY29udGFpbmVyLnN0eWxlLm1heFdpZHRoID0gY2FsY0F0dHJpYnV0aW9uV2lkdGgoZS50YXJnZXQpO1xuICAgIH0pO1xuXG4gICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5fZXNyaUF0dHJpYnV0aW9uQWRkZWQgPSB0cnVlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0QXR0cmlidXRpb25EYXRhICh1cmwsIG1hcCkge1xuICBqc29ucCh1cmwsIHt9LCBVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCBhdHRyaWJ1dGlvbnMpIHtcbiAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9XG4gICAgbWFwLl9lc3JpQXR0cmlidXRpb25zID0gW107XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBhdHRyaWJ1dGlvbnMuY29udHJpYnV0b3JzLmxlbmd0aDsgYysrKSB7XG4gICAgICB2YXIgY29udHJpYnV0b3IgPSBhdHRyaWJ1dGlvbnMuY29udHJpYnV0b3JzW2NdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRyaWJ1dG9yLmNvdmVyYWdlQXJlYXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvdmVyYWdlQXJlYSA9IGNvbnRyaWJ1dG9yLmNvdmVyYWdlQXJlYXNbaV07XG4gICAgICAgIHZhciBzb3V0aFdlc3QgPSBsYXRMbmcoY292ZXJhZ2VBcmVhLmJib3hbMF0sIGNvdmVyYWdlQXJlYS5iYm94WzFdKTtcbiAgICAgICAgdmFyIG5vcnRoRWFzdCA9IGxhdExuZyhjb3ZlcmFnZUFyZWEuYmJveFsyXSwgY292ZXJhZ2VBcmVhLmJib3hbM10pO1xuICAgICAgICBtYXAuX2VzcmlBdHRyaWJ1dGlvbnMucHVzaCh7XG4gICAgICAgICAgYXR0cmlidXRpb246IGNvbnRyaWJ1dG9yLmF0dHJpYnV0aW9uLFxuICAgICAgICAgIHNjb3JlOiBjb3ZlcmFnZUFyZWEuc2NvcmUsXG4gICAgICAgICAgYm91bmRzOiBsYXRMbmdCb3VuZHMoc291dGhXZXN0LCBub3J0aEVhc3QpLFxuICAgICAgICAgIG1pblpvb206IGNvdmVyYWdlQXJlYS56b29tTWluLFxuICAgICAgICAgIG1heFpvb206IGNvdmVyYWdlQXJlYS56b29tTWF4XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1hcC5fZXNyaUF0dHJpYnV0aW9ucy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYi5zY29yZSAtIGEuc2NvcmU7XG4gICAgfSk7XG5cbiAgICAvLyBwYXNzIHRoZSBzYW1lIGFyZ3VtZW50IGFzIHRoZSBtYXAncyAnbW92ZWVuZCcgZXZlbnRcbiAgICB2YXIgb2JqID0geyB0YXJnZXQ6IG1hcCB9O1xuICAgIF91cGRhdGVNYXBBdHRyaWJ1dGlvbihvYmopO1xuICB9LCB0aGlzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfdXBkYXRlTWFwQXR0cmlidXRpb24gKGV2dCkge1xuICB2YXIgbWFwID0gZXZ0LnRhcmdldDtcbiAgdmFyIG9sZEF0dHJpYnV0aW9ucyA9IG1hcC5fZXNyaUF0dHJpYnV0aW9ucztcblxuICBpZiAobWFwICYmIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wgJiYgb2xkQXR0cmlidXRpb25zKSB7XG4gICAgdmFyIG5ld0F0dHJpYnV0aW9ucyA9ICcnO1xuICAgIHZhciBib3VuZHMgPSBtYXAuZ2V0Qm91bmRzKCk7XG4gICAgdmFyIHdyYXBwZWRCb3VuZHMgPSBsYXRMbmdCb3VuZHMoXG4gICAgICBib3VuZHMuZ2V0U291dGhXZXN0KCkud3JhcCgpLFxuICAgICAgYm91bmRzLmdldE5vcnRoRWFzdCgpLndyYXAoKVxuICAgICk7XG4gICAgdmFyIHpvb20gPSBtYXAuZ2V0Wm9vbSgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbGRBdHRyaWJ1dGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBhdHRyaWJ1dGlvbiA9IG9sZEF0dHJpYnV0aW9uc1tpXTtcbiAgICAgIHZhciB0ZXh0ID0gYXR0cmlidXRpb24uYXR0cmlidXRpb247XG5cbiAgICAgIGlmICghbmV3QXR0cmlidXRpb25zLm1hdGNoKHRleHQpICYmIGF0dHJpYnV0aW9uLmJvdW5kcy5pbnRlcnNlY3RzKHdyYXBwZWRCb3VuZHMpICYmIHpvb20gPj0gYXR0cmlidXRpb24ubWluWm9vbSAmJiB6b29tIDw9IGF0dHJpYnV0aW9uLm1heFpvb20pIHtcbiAgICAgICAgbmV3QXR0cmlidXRpb25zICs9ICgnLCAnICsgdGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV3QXR0cmlidXRpb25zID0gbmV3QXR0cmlidXRpb25zLnN1YnN0cigyKTtcbiAgICB2YXIgYXR0cmlidXRpb25FbGVtZW50ID0gbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5lc3JpLWR5bmFtaWMtYXR0cmlidXRpb24nKTtcblxuICAgIGF0dHJpYnV0aW9uRWxlbWVudC5pbm5lckhUTUwgPSBuZXdBdHRyaWJ1dGlvbnM7XG4gICAgYXR0cmlidXRpb25FbGVtZW50LnN0eWxlLm1heFdpZHRoID0gY2FsY0F0dHJpYnV0aW9uV2lkdGgobWFwKTtcblxuICAgIG1hcC5maXJlKCdhdHRyaWJ1dGlvbnVwZGF0ZWQnLCB7XG4gICAgICBhdHRyaWJ1dGlvbjogbmV3QXR0cmlidXRpb25zXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHZhciBFc3JpVXRpbCA9IHtcbiAgc2hhbGxvd0Nsb25lOiBzaGFsbG93Q2xvbmUsXG4gIHdhcm46IHdhcm4sXG4gIGNsZWFuVXJsOiBjbGVhblVybCxcbiAgaXNBcmNnaXNPbmxpbmU6IGlzQXJjZ2lzT25saW5lLFxuICBnZW9qc29uVHlwZVRvQXJjR0lTOiBnZW9qc29uVHlwZVRvQXJjR0lTLFxuICByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb246IHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbixcbiAgZ2VvanNvblRvQXJjR0lTOiBnZW9qc29uVG9BcmNHSVMsXG4gIGFyY2dpc1RvR2VvSlNPTjogYXJjZ2lzVG9HZW9KU09OLFxuICBib3VuZHNUb0V4dGVudDogYm91bmRzVG9FeHRlbnQsXG4gIGV4dGVudFRvQm91bmRzOiBleHRlbnRUb0JvdW5kcyxcbiAgY2FsY0F0dHJpYnV0aW9uV2lkdGg6IGNhbGNBdHRyaWJ1dGlvbldpZHRoLFxuICBzZXRFc3JpQXR0cmlidXRpb246IHNldEVzcmlBdHRyaWJ1dGlvbixcbiAgX2dldEF0dHJpYnV0aW9uRGF0YTogX2dldEF0dHJpYnV0aW9uRGF0YSxcbiAgX3VwZGF0ZU1hcEF0dHJpYnV0aW9uOiBfdXBkYXRlTWFwQXR0cmlidXRpb25cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEVzcmlVdGlsO1xuIiwiaW1wb3J0IHsgQ2xhc3MsIFV0aWwgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7Y29yc30gZnJvbSAnLi4vU3VwcG9ydCc7XG5pbXBvcnQge2NsZWFuVXJsfSBmcm9tICcuLi9VdGlsJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4uL1JlcXVlc3QnO1xuXG5leHBvcnQgdmFyIFRhc2sgPSBDbGFzcy5leHRlbmQoe1xuXG4gIG9wdGlvbnM6IHtcbiAgICBwcm94eTogZmFsc2UsXG4gICAgdXNlQ29yczogY29yc1xuICB9LFxuXG4gIC8vIEdlbmVyYXRlIGEgbWV0aG9kIGZvciBlYWNoIG1ldGhvZE5hbWU6cGFyYW1OYW1lIGluIHRoZSBzZXR0ZXJzIGZvciB0aGlzIHRhc2suXG4gIGdlbmVyYXRlU2V0dGVyOiBmdW5jdGlvbiAocGFyYW0sIGNvbnRleHQpIHtcbiAgICByZXR1cm4gVXRpbC5iaW5kKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdGhpcy5wYXJhbXNbcGFyYW1dID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBjb250ZXh0KTtcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAoZW5kcG9pbnQpIHtcbiAgICAvLyBlbmRwb2ludCBjYW4gYmUgZWl0aGVyIGEgdXJsIChhbmQgb3B0aW9ucykgZm9yIGFuIEFyY0dJUyBSZXN0IFNlcnZpY2Ugb3IgYW4gaW5zdGFuY2Ugb2YgRXNyaUxlYWZsZXQuU2VydmljZVxuICAgIGlmIChlbmRwb2ludC5yZXF1ZXN0ICYmIGVuZHBvaW50Lm9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX3NlcnZpY2UgPSBlbmRwb2ludDtcbiAgICAgIFV0aWwuc2V0T3B0aW9ucyh0aGlzLCBlbmRwb2ludC5vcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgVXRpbC5zZXRPcHRpb25zKHRoaXMsIGVuZHBvaW50KTtcbiAgICAgIHRoaXMub3B0aW9ucy51cmwgPSBjbGVhblVybChlbmRwb2ludC51cmwpO1xuICAgIH1cblxuICAgIC8vIGNsb25lIGRlZmF1bHQgcGFyYW1zIGludG8gdGhpcyBvYmplY3RcbiAgICB0aGlzLnBhcmFtcyA9IFV0aWwuZXh0ZW5kKHt9LCB0aGlzLnBhcmFtcyB8fCB7fSk7XG5cbiAgICAvLyBnZW5lcmF0ZSBzZXR0ZXIgbWV0aG9kcyBiYXNlZCBvbiB0aGUgc2V0dGVycyBvYmplY3QgaW1wbGltZW50ZWQgYSBjaGlsZCBjbGFzc1xuICAgIGlmICh0aGlzLnNldHRlcnMpIHtcbiAgICAgIGZvciAodmFyIHNldHRlciBpbiB0aGlzLnNldHRlcnMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gdGhpcy5zZXR0ZXJzW3NldHRlcl07XG4gICAgICAgIHRoaXNbc2V0dGVyXSA9IHRoaXMuZ2VuZXJhdGVTZXR0ZXIocGFyYW0sIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB0b2tlbjogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRoaXMuX3NlcnZpY2UpIHtcbiAgICAgIHRoaXMuX3NlcnZpY2UuYXV0aGVudGljYXRlKHRva2VuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJhbXMudG9rZW4gPSB0b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcmVxdWVzdDogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgaWYgKHRoaXMuX3NlcnZpY2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QodGhpcy5wYXRoLCB0aGlzLnBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdyZXF1ZXN0JywgdGhpcy5wYXRoLCB0aGlzLnBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICB9LFxuXG4gIF9yZXF1ZXN0OiBmdW5jdGlvbiAobWV0aG9kLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdmFyIHVybCA9ICh0aGlzLm9wdGlvbnMucHJveHkpID8gdGhpcy5vcHRpb25zLnByb3h5ICsgJz8nICsgdGhpcy5vcHRpb25zLnVybCArIHBhdGggOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aDtcblxuICAgIGlmICgobWV0aG9kID09PSAnZ2V0JyB8fCBtZXRob2QgPT09ICdyZXF1ZXN0JykgJiYgIXRoaXMub3B0aW9ucy51c2VDb3JzKSB7XG4gICAgICByZXR1cm4gUmVxdWVzdC5nZXQuSlNPTlAodXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gUmVxdWVzdFttZXRob2RdKHVybCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gdGFzayAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IFRhc2sob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRhc2s7XG4iLCJpbXBvcnQgeyBwb2ludCwgbGF0TG5nLCBMYXRMbmdCb3VuZHMsIExhdExuZywgR2VvSlNPTiB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5pbXBvcnQge1xuICB3YXJuLFxuICByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24sXG4gIGlzQXJjZ2lzT25saW5lLFxuICBleHRlbnRUb0JvdW5kcyxcbiAgYm91bmRzVG9FeHRlbnQsXG4gIGdlb2pzb25Ub0FyY0dJUyxcbiAgZ2VvanNvblR5cGVUb0FyY0dJU1xufSBmcm9tICcuLi9VdGlsJztcblxuZXhwb3J0IHZhciBRdWVyeSA9IFRhc2suZXh0ZW5kKHtcbiAgc2V0dGVyczoge1xuICAgICdvZmZzZXQnOiAncmVzdWx0T2Zmc2V0JyxcbiAgICAnbGltaXQnOiAncmVzdWx0UmVjb3JkQ291bnQnLFxuICAgICdmaWVsZHMnOiAnb3V0RmllbGRzJyxcbiAgICAncHJlY2lzaW9uJzogJ2dlb21ldHJ5UHJlY2lzaW9uJyxcbiAgICAnZmVhdHVyZUlkcyc6ICdvYmplY3RJZHMnLFxuICAgICdyZXR1cm5HZW9tZXRyeSc6ICdyZXR1cm5HZW9tZXRyeScsXG4gICAgJ3Rva2VuJzogJ3Rva2VuJ1xuICB9LFxuXG4gIHBhdGg6ICdxdWVyeScsXG5cbiAgcGFyYW1zOiB7XG4gICAgcmV0dXJuR2VvbWV0cnk6IHRydWUsXG4gICAgd2hlcmU6ICcxPTEnLFxuICAgIG91dFNyOiA0MzI2LFxuICAgIG91dEZpZWxkczogJyonXG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIGZlYXR1cmUgaWYgaXRzIHNoYXBlIGlzIHdob2xseSBjb250YWluZWQgd2l0aGluIHRoZSBzZWFyY2ggZ2VvbWV0cnkuIFZhbGlkIGZvciBhbGwgc2hhcGUgdHlwZSBjb21iaW5hdGlvbnMuXG4gIHdpdGhpbjogZnVuY3Rpb24gKGdlb21ldHJ5KSB7XG4gICAgdGhpcy5fc2V0R2VvbWV0cnkoZ2VvbWV0cnkpO1xuICAgIHRoaXMucGFyYW1zLnNwYXRpYWxSZWwgPSAnZXNyaVNwYXRpYWxSZWxDb250YWlucyc7IC8vIHRvIHRoZSBSRVNUIGFwaSB0aGlzIHJlYWRzIGdlb21ldHJ5ICoqY29udGFpbnMqKiBsYXllclxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIGFueSBzcGF0aWFsIHJlbGF0aW9uc2hpcCBpcyBmb3VuZC4gQXBwbGllcyB0byBhbGwgc2hhcGUgdHlwZSBjb21iaW5hdGlvbnMuXG4gIGludGVyc2VjdHM6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIHRoaXMuX3NldEdlb21ldHJ5KGdlb21ldHJ5KTtcbiAgICB0aGlzLnBhcmFtcy5zcGF0aWFsUmVsID0gJ2VzcmlTcGF0aWFsUmVsSW50ZXJzZWN0cyc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIGZlYXR1cmUgaWYgaXRzIHNoYXBlIHdob2xseSBjb250YWlucyB0aGUgc2VhcmNoIGdlb21ldHJ5LiBWYWxpZCBmb3IgYWxsIHNoYXBlIHR5cGUgY29tYmluYXRpb25zLlxuICBjb250YWluczogZnVuY3Rpb24gKGdlb21ldHJ5KSB7XG4gICAgdGhpcy5fc2V0R2VvbWV0cnkoZ2VvbWV0cnkpO1xuICAgIHRoaXMucGFyYW1zLnNwYXRpYWxSZWwgPSAnZXNyaVNwYXRpYWxSZWxXaXRoaW4nOyAvLyB0byB0aGUgUkVTVCBhcGkgdGhpcyByZWFkcyBnZW9tZXRyeSAqKndpdGhpbioqIGxheWVyXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIGZlYXR1cmUgaWYgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgaW50ZXJpb3JzIG9mIHRoZSB0d28gc2hhcGVzIGlzIG5vdCBlbXB0eSBhbmQgaGFzIGEgbG93ZXIgZGltZW5zaW9uIHRoYW4gdGhlIG1heGltdW0gZGltZW5zaW9uIG9mIHRoZSB0d28gc2hhcGVzLiBUd28gbGluZXMgdGhhdCBzaGFyZSBhbiBlbmRwb2ludCBpbiBjb21tb24gZG8gbm90IGNyb3NzLiBWYWxpZCBmb3IgTGluZS9MaW5lLCBMaW5lL0FyZWEsIE11bHRpLXBvaW50L0FyZWEsIGFuZCBNdWx0aS1wb2ludC9MaW5lIHNoYXBlIHR5cGUgY29tYmluYXRpb25zLlxuICBjcm9zc2VzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbENyb3NzZXMnO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIHRoZSB0d28gc2hhcGVzIHNoYXJlIGEgY29tbW9uIGJvdW5kYXJ5LiBIb3dldmVyLCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBpbnRlcmlvcnMgb2YgdGhlIHR3byBzaGFwZXMgbXVzdCBiZSBlbXB0eS4gSW4gdGhlIFBvaW50L0xpbmUgY2FzZSwgdGhlIHBvaW50IG1heSB0b3VjaCBhbiBlbmRwb2ludCBvbmx5IG9mIHRoZSBsaW5lLiBBcHBsaWVzIHRvIGFsbCBjb21iaW5hdGlvbnMgZXhjZXB0IFBvaW50L1BvaW50LlxuICB0b3VjaGVzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbFRvdWNoZXMnO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBzaGFwZXMgcmVzdWx0cyBpbiBhbiBvYmplY3Qgb2YgdGhlIHNhbWUgZGltZW5zaW9uLCBidXQgZGlmZmVyZW50IGZyb20gYm90aCBvZiB0aGUgc2hhcGVzLiBBcHBsaWVzIHRvIEFyZWEvQXJlYSwgTGluZS9MaW5lLCBhbmQgTXVsdGktcG9pbnQvTXVsdGktcG9pbnQgc2hhcGUgdHlwZSBjb21iaW5hdGlvbnMuXG4gIG92ZXJsYXBzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbE92ZXJsYXBzJztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBSZXR1cm5zIGEgZmVhdHVyZSBpZiB0aGUgZW52ZWxvcGUgb2YgdGhlIHR3byBzaGFwZXMgaW50ZXJzZWN0cy5cbiAgYmJveEludGVyc2VjdHM6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIHRoaXMuX3NldEdlb21ldHJ5KGdlb21ldHJ5KTtcbiAgICB0aGlzLnBhcmFtcy5zcGF0aWFsUmVsID0gJ2VzcmlTcGF0aWFsUmVsRW52ZWxvcGVJbnRlcnNlY3RzJztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBpZiBzb21lb25lIGNhbiBoZWxwIGRlY2lwaGVyIHRoZSBBcmNPYmplY3RzIGV4cGxhbmF0aW9uIGFuZCB0cmFuc2xhdGUgdG8gcGxhaW4gc3BlYWssIHdlIHNob3VsZCBtZW50aW9uIHRoaXMgbWV0aG9kIGluIHRoZSBkb2NcbiAgaW5kZXhJbnRlcnNlY3RzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbEluZGV4SW50ZXJzZWN0cyc7IC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIHRoZSBlbnZlbG9wZSBvZiB0aGUgcXVlcnkgZ2VvbWV0cnkgaW50ZXJzZWN0cyB0aGUgaW5kZXggZW50cnkgZm9yIHRoZSB0YXJnZXQgZ2VvbWV0cnlcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBvbmx5IHZhbGlkIGZvciBGZWF0dXJlIFNlcnZpY2VzIHJ1bm5pbmcgb24gQXJjR0lTIFNlcnZlciAxMC4zKyBvciBBcmNHSVMgT25saW5lXG4gIG5lYXJieTogZnVuY3Rpb24gKGxhdGxuZywgcmFkaXVzKSB7XG4gICAgbGF0bG5nID0gbGF0TG5nKGxhdGxuZyk7XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBbbGF0bG5nLmxuZywgbGF0bG5nLmxhdF07XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvaW50JztcbiAgICB0aGlzLnBhcmFtcy5zcGF0aWFsUmVsID0gJ2VzcmlTcGF0aWFsUmVsSW50ZXJzZWN0cyc7XG4gICAgdGhpcy5wYXJhbXMudW5pdHMgPSAnZXNyaVNSVW5pdF9NZXRlcic7XG4gICAgdGhpcy5wYXJhbXMuZGlzdGFuY2UgPSByYWRpdXM7XG4gICAgdGhpcy5wYXJhbXMuaW5TciA9IDQzMjY7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgd2hlcmU6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAvLyBpbnN0ZWFkIG9mIGNvbnZlcnRpbmcgZG91YmxlLXF1b3RlcyB0byBzaW5nbGUgcXVvdGVzLCBwYXNzIGFzIGlzLCBhbmQgcHJvdmlkZSBhIG1vcmUgaW5mb3JtYXRpdmUgbWVzc2FnZSBpZiBhIDQwMCBpcyBlbmNvdW50ZXJlZFxuICAgIHRoaXMucGFyYW1zLndoZXJlID0gc3RyaW5nO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGJldHdlZW46IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgdGhpcy5wYXJhbXMudGltZSA9IFtzdGFydC52YWx1ZU9mKCksIGVuZC52YWx1ZU9mKCldO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNpbXBsaWZ5OiBmdW5jdGlvbiAobWFwLCBmYWN0b3IpIHtcbiAgICB2YXIgbWFwV2lkdGggPSBNYXRoLmFicyhtYXAuZ2V0Qm91bmRzKCkuZ2V0V2VzdCgpIC0gbWFwLmdldEJvdW5kcygpLmdldEVhc3QoKSk7XG4gICAgdGhpcy5wYXJhbXMubWF4QWxsb3dhYmxlT2Zmc2V0ID0gKG1hcFdpZHRoIC8gbWFwLmdldFNpemUoKS55KSAqIGZhY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBvcmRlckJ5OiBmdW5jdGlvbiAoZmllbGROYW1lLCBvcmRlcikge1xuICAgIG9yZGVyID0gb3JkZXIgfHwgJ0FTQyc7XG4gICAgdGhpcy5wYXJhbXMub3JkZXJCeUZpZWxkcyA9ICh0aGlzLnBhcmFtcy5vcmRlckJ5RmllbGRzKSA/IHRoaXMucGFyYW1zLm9yZGVyQnlGaWVsZHMgKyAnLCcgOiAnJztcbiAgICB0aGlzLnBhcmFtcy5vcmRlckJ5RmllbGRzICs9IChbZmllbGROYW1lLCBvcmRlcl0pLmpvaW4oJyAnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBydW46IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NsZWFuUGFyYW1zKCk7XG5cbiAgICAvLyBzZXJ2aWNlcyBob3N0ZWQgb24gQXJjR0lTIE9ubGluZSBhbmQgQXJjR0lTIFNlcnZlciAxMC4zLjErIHN1cHBvcnQgcmVxdWVzdGluZyBnZW9qc29uIGRpcmVjdGx5XG4gICAgaWYgKHRoaXMub3B0aW9ucy5pc01vZGVybiB8fCBpc0FyY2dpc09ubGluZSh0aGlzLm9wdGlvbnMudXJsKSkge1xuICAgICAgdGhpcy5wYXJhbXMuZiA9ICdnZW9qc29uJztcblxuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuX3RyYXBTUUxlcnJvcnMoZXJyb3IpO1xuICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgICAgfSwgdGhpcyk7XG5cbiAgICAvLyBvdGhlcndpc2UgY29udmVydCBpdCBpbiB0aGUgY2FsbGJhY2sgdGhlbiBwYXNzIGl0IG9uXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICB0aGlzLl90cmFwU1FMZXJyb3JzKGVycm9yKTtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgKHJlc3BvbnNlICYmIHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbihyZXNwb25zZSkpLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH0sXG5cbiAgY291bnQ6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NsZWFuUGFyYW1zKCk7XG4gICAgdGhpcy5wYXJhbXMucmV0dXJuQ291bnRPbmx5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgZXJyb3IsIChyZXNwb25zZSAmJiByZXNwb25zZS5jb3VudCksIHJlc3BvbnNlKTtcbiAgICB9LCBjb250ZXh0KTtcbiAgfSxcblxuICBpZHM6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NsZWFuUGFyYW1zKCk7XG4gICAgdGhpcy5wYXJhbXMucmV0dXJuSWRzT25seSA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIGVycm9yLCAocmVzcG9uc2UgJiYgcmVzcG9uc2Uub2JqZWN0SWRzKSwgcmVzcG9uc2UpO1xuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIC8vIG9ubHkgdmFsaWQgZm9yIEZlYXR1cmUgU2VydmljZXMgcnVubmluZyBvbiBBcmNHSVMgU2VydmVyIDEwLjMrIG9yIEFyY0dJUyBPbmxpbmVcbiAgYm91bmRzOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLl9jbGVhblBhcmFtcygpO1xuICAgIHRoaXMucGFyYW1zLnJldHVybkV4dGVudE9ubHkgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmV4dGVudCAmJiBleHRlbnRUb0JvdW5kcyhyZXNwb25zZS5leHRlbnQpKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIGV4dGVudFRvQm91bmRzKHJlc3BvbnNlLmV4dGVudCksIHJlc3BvbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0ge1xuICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIEJvdW5kcydcbiAgICAgICAgfTtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgbnVsbCwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIC8vIG9ubHkgdmFsaWQgZm9yIGltYWdlIHNlcnZpY2VzXG4gIHBpeGVsU2l6ZTogZnVuY3Rpb24gKHJhd1BvaW50KSB7XG4gICAgdmFyIGNhc3RQb2ludCA9IHBvaW50KHJhd1BvaW50KTtcbiAgICB0aGlzLnBhcmFtcy5waXhlbFNpemUgPSBbY2FzdFBvaW50LngsIGNhc3RQb2ludC55XTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBvbmx5IHZhbGlkIGZvciBtYXAgc2VydmljZXNcbiAgbGF5ZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgIHRoaXMucGF0aCA9IGxheWVyICsgJy9xdWVyeSc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgX3RyYXBTUUxlcnJvcnM6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICc0MDAnKSB7XG4gICAgICAgIHdhcm4oJ29uZSBjb21tb24gc3ludGF4IGVycm9yIGluIHF1ZXJ5IHJlcXVlc3RzIGlzIGVuY2FzaW5nIHN0cmluZyB2YWx1ZXMgaW4gZG91YmxlIHF1b3RlcyBpbnN0ZWFkIG9mIHNpbmdsZSBxdW90ZXMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgX2NsZWFuUGFyYW1zOiBmdW5jdGlvbiAoKSB7XG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLnJldHVybklkc09ubHk7XG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLnJldHVybkV4dGVudE9ubHk7XG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLnJldHVybkNvdW50T25seTtcbiAgfSxcblxuICBfc2V0R2VvbWV0cnk6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIHRoaXMucGFyYW1zLmluU3IgPSA0MzI2O1xuXG4gICAgLy8gY29udmVydCBib3VuZHMgdG8gZXh0ZW50IGFuZCBmaW5pc2hcbiAgICBpZiAoZ2VvbWV0cnkgaW5zdGFuY2VvZiBMYXRMbmdCb3VuZHMpIHtcbiAgICAgIC8vIHNldCBnZW9tZXRyeSArIGdlb21ldHJ5VHlwZVxuICAgICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBib3VuZHNUb0V4dGVudChnZW9tZXRyeSk7XG4gICAgICB0aGlzLnBhcmFtcy5nZW9tZXRyeVR5cGUgPSAnZXNyaUdlb21ldHJ5RW52ZWxvcGUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNvbnZlcnQgTC5NYXJrZXIgPiBMLkxhdExuZ1xuICAgIGlmIChnZW9tZXRyeS5nZXRMYXRMbmcpIHtcbiAgICAgIGdlb21ldHJ5ID0gZ2VvbWV0cnkuZ2V0TGF0TG5nKCk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBMLkxhdExuZyB0byBhIGdlb2pzb24gcG9pbnQgYW5kIGNvbnRpbnVlO1xuICAgIGlmIChnZW9tZXRyeSBpbnN0YW5jZW9mIExhdExuZykge1xuICAgICAgZ2VvbWV0cnkgPSB7XG4gICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBbZ2VvbWV0cnkubG5nLCBnZW9tZXRyeS5sYXRdXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGhhbmRsZSBMLkdlb0pTT04sIHB1bGwgb3V0IHRoZSBmaXJzdCBnZW9tZXRyeVxuICAgIGlmIChnZW9tZXRyeSBpbnN0YW5jZW9mIEdlb0pTT04pIHtcbiAgICAgIC8vIHJlYXNzaWduIGdlb21ldHJ5IHRvIHRoZSBHZW9KU09OIHZhbHVlICAod2UgYXJlIGFzc3VtaW5nIHRoYXQgb25seSBvbmUgZmVhdHVyZSBpcyBwcmVzZW50KVxuICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZXRMYXllcnMoKVswXS5mZWF0dXJlLmdlb21ldHJ5O1xuICAgICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBnZW9qc29uVG9BcmNHSVMoZ2VvbWV0cnkpO1xuICAgICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gZ2VvanNvblR5cGVUb0FyY0dJUyhnZW9tZXRyeS50eXBlKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgTC5Qb2x5bGluZSBhbmQgTC5Qb2x5Z29uXG4gICAgaWYgKGdlb21ldHJ5LnRvR2VvSlNPTikge1xuICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS50b0dlb0pTT04oKTtcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgR2VvSlNPTiBmZWF0dXJlIGJ5IHB1bGxpbmcgb3V0IHRoZSBnZW9tZXRyeVxuICAgIGlmIChnZW9tZXRyeS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgIC8vIGdldCB0aGUgZ2VvbWV0cnkgb2YgdGhlIGdlb2pzb24gZmVhdHVyZVxuICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZW9tZXRyeTtcbiAgICB9XG5cbiAgICAvLyBjb25maXJtIHRoYXQgb3VyIEdlb0pTT04gaXMgYSBwb2ludCwgbGluZSBvciBwb2x5Z29uXG4gICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcgfHwgZ2VvbWV0cnkudHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJyB8fCBnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBnZW9qc29uVG9BcmNHSVMoZ2VvbWV0cnkpO1xuICAgICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gZ2VvanNvblR5cGVUb0FyY0dJUyhnZW9tZXRyeS50eXBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB3YXJuIHRoZSB1c2VyIGlmIHdlIGhhdm4ndCBmb3VuZCBhbiBhcHByb3ByaWF0ZSBvYmplY3RcbiAgICB3YXJuKCdpbnZhbGlkIGdlb21ldHJ5IHBhc3NlZCB0byBzcGF0aWFsIHF1ZXJ5LiBTaG91bGQgYmUgTC5MYXRMbmcsIEwuTGF0TG5nQm91bmRzLCBMLk1hcmtlciBvciBhIEdlb0pTT04gUG9pbnQsIExpbmUsIFBvbHlnb24gb3IgTXVsdGlQb2x5Z29uIG9iamVjdCcpO1xuXG4gICAgcmV0dXJuO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5IChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgUXVlcnkob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHF1ZXJ5O1xuIiwiaW1wb3J0IHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5pbXBvcnQgeyByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuLi9VdGlsJztcblxuZXhwb3J0IHZhciBGaW5kID0gVGFzay5leHRlbmQoe1xuICBzZXR0ZXJzOiB7XG4gICAgLy8gbWV0aG9kIG5hbWUgPiBwYXJhbSBuYW1lXG4gICAgJ2NvbnRhaW5zJzogJ2NvbnRhaW5zJyxcbiAgICAndGV4dCc6ICdzZWFyY2hUZXh0JyxcbiAgICAnZmllbGRzJzogJ3NlYXJjaEZpZWxkcycsIC8vIGRlbm90ZSBhbiBhcnJheSBvciBzaW5nbGUgc3RyaW5nXG4gICAgJ3NwYXRpYWxSZWZlcmVuY2UnOiAnc3InLFxuICAgICdzcic6ICdzcicsXG4gICAgJ2xheWVycyc6ICdsYXllcnMnLFxuICAgICdyZXR1cm5HZW9tZXRyeSc6ICdyZXR1cm5HZW9tZXRyeScsXG4gICAgJ21heEFsbG93YWJsZU9mZnNldCc6ICdtYXhBbGxvd2FibGVPZmZzZXQnLFxuICAgICdwcmVjaXNpb24nOiAnZ2VvbWV0cnlQcmVjaXNpb24nLFxuICAgICdkeW5hbWljTGF5ZXJzJzogJ2R5bmFtaWNMYXllcnMnLFxuICAgICdyZXR1cm5aJzogJ3JldHVyblonLFxuICAgICdyZXR1cm5NJzogJ3JldHVybk0nLFxuICAgICdnZGJWZXJzaW9uJzogJ2dkYlZlcnNpb24nLFxuICAgICd0b2tlbic6ICd0b2tlbidcbiAgfSxcblxuICBwYXRoOiAnZmluZCcsXG5cbiAgcGFyYW1zOiB7XG4gICAgc3I6IDQzMjYsXG4gICAgY29udGFpbnM6IHRydWUsXG4gICAgcmV0dXJuR2VvbWV0cnk6IHRydWUsXG4gICAgcmV0dXJuWjogdHJ1ZSxcbiAgICByZXR1cm5NOiBmYWxzZVxuICB9LFxuXG4gIGxheWVyRGVmczogZnVuY3Rpb24gKGlkLCB3aGVyZSkge1xuICAgIHRoaXMucGFyYW1zLmxheWVyRGVmcyA9ICh0aGlzLnBhcmFtcy5sYXllckRlZnMpID8gdGhpcy5wYXJhbXMubGF5ZXJEZWZzICsgJzsnIDogJyc7XG4gICAgdGhpcy5wYXJhbXMubGF5ZXJEZWZzICs9IChbaWQsIHdoZXJlXSkuam9pbignOicpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNpbXBsaWZ5OiBmdW5jdGlvbiAobWFwLCBmYWN0b3IpIHtcbiAgICB2YXIgbWFwV2lkdGggPSBNYXRoLmFicyhtYXAuZ2V0Qm91bmRzKCkuZ2V0V2VzdCgpIC0gbWFwLmdldEJvdW5kcygpLmdldEVhc3QoKSk7XG4gICAgdGhpcy5wYXJhbXMubWF4QWxsb3dhYmxlT2Zmc2V0ID0gKG1hcFdpZHRoIC8gbWFwLmdldFNpemUoKS55KSAqIGZhY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBydW46IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgKHJlc3BvbnNlICYmIHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbihyZXNwb25zZSkpLCByZXNwb25zZSk7XG4gICAgfSwgY29udGV4dCk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZmluZCAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IEZpbmQob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZpbmQ7XG4iLCJpbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi9UYXNrJztcblxuZXhwb3J0IHZhciBJZGVudGlmeSA9IFRhc2suZXh0ZW5kKHtcbiAgcGF0aDogJ2lkZW50aWZ5JyxcblxuICBiZXR3ZWVuOiBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgIHRoaXMucGFyYW1zLnRpbWUgPSBbc3RhcnQudmFsdWVPZigpLCBlbmQudmFsdWVPZigpXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeSAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IElkZW50aWZ5KG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpZGVudGlmeTtcbiIsImltcG9ydCB7IGxhdExuZyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgSWRlbnRpZnkgfSBmcm9tICcuL0lkZW50aWZ5JztcbmltcG9ydCB7IGJvdW5kc1RvRXh0ZW50LCByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuLi9VdGlsJztcblxuZXhwb3J0IHZhciBJZGVudGlmeUZlYXR1cmVzID0gSWRlbnRpZnkuZXh0ZW5kKHtcbiAgc2V0dGVyczoge1xuICAgICdsYXllcnMnOiAnbGF5ZXJzJyxcbiAgICAncHJlY2lzaW9uJzogJ2dlb21ldHJ5UHJlY2lzaW9uJyxcbiAgICAndG9sZXJhbmNlJzogJ3RvbGVyYW5jZScsXG4gICAgJ3JldHVybkdlb21ldHJ5JzogJ3JldHVybkdlb21ldHJ5J1xuICB9LFxuXG4gIHBhcmFtczoge1xuICAgIHNyOiA0MzI2LFxuICAgIGxheWVyczogJ2FsbCcsXG4gICAgdG9sZXJhbmNlOiAzLFxuICAgIHJldHVybkdlb21ldHJ5OiB0cnVlXG4gIH0sXG5cbiAgb246IGZ1bmN0aW9uIChtYXApIHtcbiAgICB2YXIgZXh0ZW50ID0gYm91bmRzVG9FeHRlbnQobWFwLmdldEJvdW5kcygpKTtcbiAgICB2YXIgc2l6ZSA9IG1hcC5nZXRTaXplKCk7XG4gICAgdGhpcy5wYXJhbXMuaW1hZ2VEaXNwbGF5ID0gW3NpemUueCwgc2l6ZS55LCA5Nl07XG4gICAgdGhpcy5wYXJhbXMubWFwRXh0ZW50ID0gW2V4dGVudC54bWluLCBleHRlbnQueW1pbiwgZXh0ZW50LnhtYXgsIGV4dGVudC55bWF4XTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBhdDogZnVuY3Rpb24gKGxhdGxuZykge1xuICAgIGxhdGxuZyA9IGxhdExuZyhsYXRsbmcpO1xuICAgIHRoaXMucGFyYW1zLmdlb21ldHJ5ID0gW2xhdGxuZy5sbmcsIGxhdGxuZy5sYXRdO1xuICAgIHRoaXMucGFyYW1zLmdlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlQb2ludCc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgbGF5ZXJEZWY6IGZ1bmN0aW9uIChpZCwgd2hlcmUpIHtcbiAgICB0aGlzLnBhcmFtcy5sYXllckRlZnMgPSAodGhpcy5wYXJhbXMubGF5ZXJEZWZzKSA/IHRoaXMucGFyYW1zLmxheWVyRGVmcyArICc7JyA6ICcnO1xuICAgIHRoaXMucGFyYW1zLmxheWVyRGVmcyArPSAoW2lkLCB3aGVyZV0pLmpvaW4oJzonKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBzaW1wbGlmeTogZnVuY3Rpb24gKG1hcCwgZmFjdG9yKSB7XG4gICAgdmFyIG1hcFdpZHRoID0gTWF0aC5hYnMobWFwLmdldEJvdW5kcygpLmdldFdlc3QoKSAtIG1hcC5nZXRCb3VuZHMoKS5nZXRFYXN0KCkpO1xuICAgIHRoaXMucGFyYW1zLm1heEFsbG93YWJsZU9mZnNldCA9IChtYXBXaWR0aCAvIG1hcC5nZXRTaXplKCkueSkgKiBmYWN0b3I7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcnVuOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIC8vIGltbWVkaWF0ZWx5IGludm9rZSB3aXRoIGFuIGVycm9yXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgdW5kZWZpbmVkLCByZXNwb25zZSk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgLy8gb2sgbm8gZXJyb3IgbGV0cyBqdXN0IGFzc3VtZSB3ZSBoYXZlIGZlYXR1cmVzLi4uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZmVhdHVyZUNvbGxlY3Rpb24gPSByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24ocmVzcG9uc2UpO1xuICAgICAgICByZXNwb25zZS5yZXN1bHRzID0gcmVzcG9uc2UucmVzdWx0cy5yZXZlcnNlKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzW2ldO1xuICAgICAgICAgIGZlYXR1cmUubGF5ZXJJZCA9IHJlc3BvbnNlLnJlc3VsdHNbaV0ubGF5ZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIHVuZGVmaW5lZCwgZmVhdHVyZUNvbGxlY3Rpb24sIHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeUZlYXR1cmVzIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgSWRlbnRpZnlGZWF0dXJlcyhvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaWRlbnRpZnlGZWF0dXJlcztcbiIsImltcG9ydCB7IGxhdExuZyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgSWRlbnRpZnkgfSBmcm9tICcuL0lkZW50aWZ5JztcbmltcG9ydCB7IHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbiB9IGZyb20gJy4uL1V0aWwnO1xuXG5leHBvcnQgdmFyIElkZW50aWZ5SW1hZ2UgPSBJZGVudGlmeS5leHRlbmQoe1xuICBzZXR0ZXJzOiB7XG4gICAgJ3NldE1vc2FpY1J1bGUnOiAnbW9zYWljUnVsZScsXG4gICAgJ3NldFJlbmRlcmluZ1J1bGUnOiAncmVuZGVyaW5nUnVsZScsXG4gICAgJ3NldFBpeGVsU2l6ZSc6ICdwaXhlbFNpemUnLFxuICAgICdyZXR1cm5DYXRhbG9nSXRlbXMnOiAncmV0dXJuQ2F0YWxvZ0l0ZW1zJyxcbiAgICAncmV0dXJuR2VvbWV0cnknOiAncmV0dXJuR2VvbWV0cnknXG4gIH0sXG5cbiAgcGFyYW1zOiB7XG4gICAgcmV0dXJuR2VvbWV0cnk6IGZhbHNlXG4gIH0sXG5cbiAgYXQ6IGZ1bmN0aW9uIChsYXRsbmcpIHtcbiAgICBsYXRsbmcgPSBsYXRMbmcobGF0bG5nKTtcbiAgICB0aGlzLnBhcmFtcy5nZW9tZXRyeSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHg6IGxhdGxuZy5sbmcsXG4gICAgICB5OiBsYXRsbmcubGF0LFxuICAgICAgc3BhdGlhbFJlZmVyZW5jZToge1xuICAgICAgICB3a2lkOiA0MzI2XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvaW50JztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRNb3NhaWNSdWxlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLm1vc2FpY1J1bGU7XG4gIH0sXG5cbiAgZ2V0UmVuZGVyaW5nUnVsZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5yZW5kZXJpbmdSdWxlO1xuICB9LFxuXG4gIGdldFBpeGVsU2l6ZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5waXhlbFNpemU7XG4gIH0sXG5cbiAgcnVuOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIChyZXNwb25zZSAmJiB0aGlzLl9yZXNwb25zZVRvR2VvSlNPTihyZXNwb25zZSkpLCByZXNwb25zZSk7XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgLy8gZ2V0IHBpeGVsIGRhdGEgYW5kIHJldHVybiBhcyBnZW9KU09OIHBvaW50XG4gIC8vIHBvcHVsYXRlIGNhdGFsb2cgaXRlbXMgKGlmIGFueSlcbiAgLy8gbWVyZ2luZyBpbiBhbnkgY2F0YWxvZ0l0ZW1WaXNpYmlsaXRpZXMgYXMgYSBwcm9wZXJ5IG9mIGVhY2ggZmVhdHVyZVxuICBfcmVzcG9uc2VUb0dlb0pTT046IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgIHZhciBsb2NhdGlvbiA9IHJlc3BvbnNlLmxvY2F0aW9uO1xuICAgIHZhciBjYXRhbG9nSXRlbXMgPSByZXNwb25zZS5jYXRhbG9nSXRlbXM7XG4gICAgdmFyIGNhdGFsb2dJdGVtVmlzaWJpbGl0aWVzID0gcmVzcG9uc2UuY2F0YWxvZ0l0ZW1WaXNpYmlsaXRpZXM7XG4gICAgdmFyIGdlb0pTT04gPSB7XG4gICAgICAncGl4ZWwnOiB7XG4gICAgICAgICd0eXBlJzogJ0ZlYXR1cmUnLFxuICAgICAgICAnZ2VvbWV0cnknOiB7XG4gICAgICAgICAgJ3R5cGUnOiAnUG9pbnQnLFxuICAgICAgICAgICdjb29yZGluYXRlcyc6IFtsb2NhdGlvbi54LCBsb2NhdGlvbi55XVxuICAgICAgICB9LFxuICAgICAgICAnY3JzJzoge1xuICAgICAgICAgICd0eXBlJzogJ0VQU0cnLFxuICAgICAgICAgICdwcm9wZXJ0aWVzJzoge1xuICAgICAgICAgICAgJ2NvZGUnOiBsb2NhdGlvbi5zcGF0aWFsUmVmZXJlbmNlLndraWRcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdwcm9wZXJ0aWVzJzoge1xuICAgICAgICAgICdPQkpFQ1RJRCc6IHJlc3BvbnNlLm9iamVjdElkLFxuICAgICAgICAgICduYW1lJzogcmVzcG9uc2UubmFtZSxcbiAgICAgICAgICAndmFsdWUnOiByZXNwb25zZS52YWx1ZVxuICAgICAgICB9LFxuICAgICAgICAnaWQnOiByZXNwb25zZS5vYmplY3RJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAocmVzcG9uc2UucHJvcGVydGllcyAmJiByZXNwb25zZS5wcm9wZXJ0aWVzLlZhbHVlcykge1xuICAgICAgZ2VvSlNPTi5waXhlbC5wcm9wZXJ0aWVzLnZhbHVlcyA9IHJlc3BvbnNlLnByb3BlcnRpZXMuVmFsdWVzO1xuICAgIH1cblxuICAgIGlmIChjYXRhbG9nSXRlbXMgJiYgY2F0YWxvZ0l0ZW1zLmZlYXR1cmVzKSB7XG4gICAgICBnZW9KU09OLmNhdGFsb2dJdGVtcyA9IHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbihjYXRhbG9nSXRlbXMpO1xuICAgICAgaWYgKGNhdGFsb2dJdGVtVmlzaWJpbGl0aWVzICYmIGNhdGFsb2dJdGVtVmlzaWJpbGl0aWVzLmxlbmd0aCA9PT0gZ2VvSlNPTi5jYXRhbG9nSXRlbXMuZmVhdHVyZXMubGVuZ3RoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBjYXRhbG9nSXRlbVZpc2liaWxpdGllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGdlb0pTT04uY2F0YWxvZ0l0ZW1zLmZlYXR1cmVzW2ldLnByb3BlcnRpZXMuY2F0YWxvZ0l0ZW1WaXNpYmlsaXR5ID0gY2F0YWxvZ0l0ZW1WaXNpYmlsaXRpZXNbaV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdlb0pTT047XG4gIH1cblxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeUltYWdlIChwYXJhbXMpIHtcbiAgcmV0dXJuIG5ldyBJZGVudGlmeUltYWdlKHBhcmFtcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlkZW50aWZ5SW1hZ2U7XG4iLCJpbXBvcnQgeyBVdGlsLCBFdmVudGVkIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQge2NvcnN9IGZyb20gJy4uL1N1cHBvcnQnO1xuaW1wb3J0IHtjbGVhblVybH0gZnJvbSAnLi4vVXRpbCc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuLi9SZXF1ZXN0JztcblxuZXhwb3J0IHZhciBTZXJ2aWNlID0gRXZlbnRlZC5leHRlbmQoe1xuXG4gIG9wdGlvbnM6IHtcbiAgICBwcm94eTogZmFsc2UsXG4gICAgdXNlQ29yczogY29ycyxcbiAgICB0aW1lb3V0OiAwXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLl9yZXF1ZXN0UXVldWUgPSBbXTtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGluZyA9IGZhbHNlO1xuICAgIFV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLm9wdGlvbnMudXJsID0gY2xlYW5VcmwodGhpcy5vcHRpb25zLnVybCk7XG4gIH0sXG5cbiAgZ2V0OiBmdW5jdGlvbiAocGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdnZXQnLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgfSxcblxuICBwb3N0OiBmdW5jdGlvbiAocGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdwb3N0JywgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCk7XG4gIH0sXG5cbiAgcmVxdWVzdDogZnVuY3Rpb24gKHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgncmVxdWVzdCcsIHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICB9LFxuXG4gIG1ldGFkYXRhOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnZ2V0JywgJycsIHt9LCBjYWxsYmFjaywgY29udGV4dCk7XG4gIH0sXG5cbiAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGluZyA9IGZhbHNlO1xuICAgIHRoaXMub3B0aW9ucy50b2tlbiA9IHRva2VuO1xuICAgIHRoaXMuX3J1blF1ZXVlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0VGltZW91dDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudGltZW91dDtcbiAgfSxcblxuICBzZXRUaW1lb3V0OiBmdW5jdGlvbiAodGltZW91dCkge1xuICAgIHRoaXMub3B0aW9ucy50aW1lb3V0ID0gdGltZW91dDtcbiAgfSxcblxuICBfcmVxdWVzdDogZnVuY3Rpb24gKG1ldGhvZCwgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuZmlyZSgncmVxdWVzdHN0YXJ0Jywge1xuICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aCxcbiAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgbWV0aG9kOiBtZXRob2RcbiAgICB9LCB0cnVlKTtcblxuICAgIHZhciB3cmFwcGVkQ2FsbGJhY2sgPSB0aGlzLl9jcmVhdGVTZXJ2aWNlQ2FsbGJhY2sobWV0aG9kLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIHBhcmFtcy50b2tlbiA9IHRoaXMub3B0aW9ucy50b2tlbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYXV0aGVudGljYXRpbmcpIHtcbiAgICAgIHRoaXMuX3JlcXVlc3RRdWV1ZS5wdXNoKFttZXRob2QsIHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHRdKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVybCA9ICh0aGlzLm9wdGlvbnMucHJveHkpID8gdGhpcy5vcHRpb25zLnByb3h5ICsgJz8nICsgdGhpcy5vcHRpb25zLnVybCArIHBhdGggOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aDtcblxuICAgICAgaWYgKChtZXRob2QgPT09ICdnZXQnIHx8IG1ldGhvZCA9PT0gJ3JlcXVlc3QnKSAmJiAhdGhpcy5vcHRpb25zLnVzZUNvcnMpIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3QuZ2V0LkpTT05QKHVybCwgcGFyYW1zLCB3cmFwcGVkQ2FsbGJhY2ssIGNvbnRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3RbbWV0aG9kXSh1cmwsIHBhcmFtcywgd3JhcHBlZENhbGxiYWNrLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgX2NyZWF0ZVNlcnZpY2VDYWxsYmFjazogZnVuY3Rpb24gKG1ldGhvZCwgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiBVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgaWYgKGVycm9yICYmIChlcnJvci5jb2RlID09PSA0OTkgfHwgZXJyb3IuY29kZSA9PT0gNDk4KSkge1xuICAgICAgICB0aGlzLl9hdXRoZW50aWNhdGluZyA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fcmVxdWVzdFF1ZXVlLnB1c2goW21ldGhvZCwgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dF0pO1xuXG4gICAgICAgIC8vIGZpcmUgYW4gZXZlbnQgZm9yIHVzZXJzIHRvIGhhbmRsZSBhbmQgcmUtYXV0aGVudGljYXRlXG4gICAgICAgIHRoaXMuZmlyZSgnYXV0aGVudGljYXRpb25yZXF1aXJlZCcsIHtcbiAgICAgICAgICBhdXRoZW50aWNhdGU6IFV0aWwuYmluZCh0aGlzLmF1dGhlbnRpY2F0ZSwgdGhpcylcbiAgICAgICAgfSwgdHJ1ZSk7XG5cbiAgICAgICAgLy8gaWYgdGhlIHVzZXIgaGFzIGFjY2VzcyB0byBhIGNhbGxiYWNrIHRoZXkgY2FuIGhhbmRsZSB0aGUgYXV0aCBlcnJvclxuICAgICAgICBlcnJvci5hdXRoZW50aWNhdGUgPSBVdGlsLmJpbmQodGhpcy5hdXRoZW50aWNhdGUsIHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSk7XG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICB0aGlzLmZpcmUoJ3JlcXVlc3RlcnJvcicsIHtcbiAgICAgICAgICB1cmw6IHRoaXMub3B0aW9ucy51cmwgKyBwYXRoLFxuICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgY29kZTogZXJyb3IuY29kZSxcbiAgICAgICAgICBtZXRob2Q6IG1ldGhvZFxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlyZSgncmVxdWVzdHN1Y2Nlc3MnLCB7XG4gICAgICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aCxcbiAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICByZXNwb25zZTogcmVzcG9uc2UsXG4gICAgICAgICAgbWV0aG9kOiBtZXRob2RcbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlyZSgncmVxdWVzdGVuZCcsIHtcbiAgICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aCxcbiAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgIG1ldGhvZDogbWV0aG9kXG4gICAgICB9LCB0cnVlKTtcbiAgICB9LCB0aGlzKTtcbiAgfSxcblxuICBfcnVuUXVldWU6IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5fcmVxdWVzdFF1ZXVlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgcmVxdWVzdCA9IHRoaXMuX3JlcXVlc3RRdWV1ZVtpXTtcbiAgICAgIHZhciBtZXRob2QgPSByZXF1ZXN0LnNoaWZ0KCk7XG4gICAgICB0aGlzW21ldGhvZF0uYXBwbHkodGhpcywgcmVxdWVzdCk7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RRdWV1ZSA9IFtdO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2UgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBTZXJ2aWNlKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzZXJ2aWNlO1xuIiwiaW1wb3J0IHsgU2VydmljZSB9IGZyb20gJy4vU2VydmljZSc7XG5pbXBvcnQgaWRlbnRpZnlGZWF0dXJlcyBmcm9tICcuLi9UYXNrcy9JZGVudGlmeUZlYXR1cmVzJztcbmltcG9ydCBxdWVyeSBmcm9tICcuLi9UYXNrcy9RdWVyeSc7XG5pbXBvcnQgZmluZCBmcm9tICcuLi9UYXNrcy9GaW5kJztcblxuZXhwb3J0IHZhciBNYXBTZXJ2aWNlID0gU2VydmljZS5leHRlbmQoe1xuXG4gIGlkZW50aWZ5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlkZW50aWZ5RmVhdHVyZXModGhpcyk7XG4gIH0sXG5cbiAgZmluZDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmaW5kKHRoaXMpO1xuICB9LFxuXG4gIHF1ZXJ5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHF1ZXJ5KHRoaXMpO1xuICB9XG5cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFwU2VydmljZSAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IE1hcFNlcnZpY2Uob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1hcFNlcnZpY2U7XG4iLCJpbXBvcnQgeyBTZXJ2aWNlIH0gZnJvbSAnLi9TZXJ2aWNlJztcbmltcG9ydCBpZGVudGlmeUltYWdlIGZyb20gJy4uL1Rhc2tzL0lkZW50aWZ5SW1hZ2UnO1xuaW1wb3J0IHF1ZXJ5IGZyb20gJy4uL1Rhc2tzL1F1ZXJ5JztcblxuZXhwb3J0IHZhciBJbWFnZVNlcnZpY2UgPSBTZXJ2aWNlLmV4dGVuZCh7XG5cbiAgcXVlcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcXVlcnkodGhpcyk7XG4gIH0sXG5cbiAgaWRlbnRpZnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaWRlbnRpZnlJbWFnZSh0aGlzKTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZVNlcnZpY2UgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBJbWFnZVNlcnZpY2Uob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGltYWdlU2VydmljZTtcbiIsImltcG9ydCB7IFNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2UnO1xuaW1wb3J0IHF1ZXJ5IGZyb20gJy4uL1Rhc2tzL1F1ZXJ5JztcbmltcG9ydCB7IGdlb2pzb25Ub0FyY0dJUyB9IGZyb20gJy4uL1V0aWwnO1xuXG5leHBvcnQgdmFyIEZlYXR1cmVMYXllclNlcnZpY2UgPSBTZXJ2aWNlLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIGlkQXR0cmlidXRlOiAnT0JKRUNUSUQnXG4gIH0sXG5cbiAgcXVlcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcXVlcnkodGhpcyk7XG4gIH0sXG5cbiAgYWRkRmVhdHVyZTogZnVuY3Rpb24gKGZlYXR1cmUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgZGVsZXRlIGZlYXR1cmUuaWQ7XG5cbiAgICBmZWF0dXJlID0gZ2VvanNvblRvQXJjR0lTKGZlYXR1cmUpO1xuXG4gICAgcmV0dXJuIHRoaXMucG9zdCgnYWRkRmVhdHVyZXMnLCB7XG4gICAgICBmZWF0dXJlczogW2ZlYXR1cmVdXG4gICAgfSwgZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXNwb25zZSAmJiByZXNwb25zZS5hZGRSZXN1bHRzKSA/IHJlc3BvbnNlLmFkZFJlc3VsdHNbMF0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciB8fCByZXNwb25zZS5hZGRSZXN1bHRzWzBdLmVycm9yLCByZXN1bHQpO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIHVwZGF0ZUZlYXR1cmU6IGZ1bmN0aW9uIChmZWF0dXJlLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIGZlYXR1cmUgPSBnZW9qc29uVG9BcmNHSVMoZmVhdHVyZSwgdGhpcy5vcHRpb25zLmlkQXR0cmlidXRlKTtcblxuICAgIHJldHVybiB0aGlzLnBvc3QoJ3VwZGF0ZUZlYXR1cmVzJywge1xuICAgICAgZmVhdHVyZXM6IFtmZWF0dXJlXVxuICAgIH0sIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzcG9uc2UgJiYgcmVzcG9uc2UudXBkYXRlUmVzdWx0cykgPyByZXNwb25zZS51cGRhdGVSZXN1bHRzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IgfHwgcmVzcG9uc2UudXBkYXRlUmVzdWx0c1swXS5lcnJvciwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9LCBjb250ZXh0KTtcbiAgfSxcblxuICBkZWxldGVGZWF0dXJlOiBmdW5jdGlvbiAoaWQsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMucG9zdCgnZGVsZXRlRmVhdHVyZXMnLCB7XG4gICAgICBvYmplY3RJZHM6IGlkXG4gICAgfSwgZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXNwb25zZSAmJiByZXNwb25zZS5kZWxldGVSZXN1bHRzKSA/IHJlc3BvbnNlLmRlbGV0ZVJlc3VsdHNbMF0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciB8fCByZXNwb25zZS5kZWxldGVSZXN1bHRzWzBdLmVycm9yLCByZXN1bHQpO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIGRlbGV0ZUZlYXR1cmVzOiBmdW5jdGlvbiAoaWRzLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnBvc3QoJ2RlbGV0ZUZlYXR1cmVzJywge1xuICAgICAgb2JqZWN0SWRzOiBpZHNcbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAvLyBwYXNzIGJhY2sgdGhlIGVudGlyZSBhcnJheVxuICAgICAgdmFyIHJlc3VsdCA9IChyZXNwb25zZSAmJiByZXNwb25zZS5kZWxldGVSZXN1bHRzKSA/IHJlc3BvbnNlLmRlbGV0ZVJlc3VsdHMgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciB8fCByZXNwb25zZS5kZWxldGVSZXN1bHRzWzBdLmVycm9yLCByZXN1bHQpO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZlYXR1cmVMYXllclNlcnZpY2UgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBGZWF0dXJlTGF5ZXJTZXJ2aWNlKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmZWF0dXJlTGF5ZXJTZXJ2aWNlO1xuIiwiaW1wb3J0IHsgVGlsZUxheWVyLCBVdGlsIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBwb2ludGVyRXZlbnRzIH0gZnJvbSAnLi4vU3VwcG9ydCc7XG5pbXBvcnQge1xuICBzZXRFc3JpQXR0cmlidXRpb24sXG4gIF9nZXRBdHRyaWJ1dGlvbkRhdGEsXG4gIF91cGRhdGVNYXBBdHRyaWJ1dGlvblxufSBmcm9tICcuLi9VdGlsJztcblxudmFyIHRpbGVQcm90b2NvbCA9ICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgIT09ICdodHRwczonKSA/ICdodHRwOicgOiAnaHR0cHM6JztcblxuZXhwb3J0IHZhciBCYXNlbWFwTGF5ZXIgPSBUaWxlTGF5ZXIuZXh0ZW5kKHtcbiAgc3RhdGljczoge1xuICAgIFRJTEVTOiB7XG4gICAgICBTdHJlZXRzOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9TdHJlZXRfTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTksXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ1VTR1MsIE5PQUEnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uVXJsOiAnaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9Xb3JsZF9TdHJlZXRfTWFwJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgVG9wb2dyYXBoaWM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX1RvcG9fTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTksXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ1VTR1MsIE5PQUEnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uVXJsOiAnaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9Xb3JsZF9Ub3BvX01hcCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIE9jZWFuczoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vYXJjZ2lzL3Jlc3Qvc2VydmljZXMvT2NlYW4vV29ybGRfT2NlYW5fQmFzZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE2LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdVU0dTLCBOT0FBJyxcbiAgICAgICAgICBhdHRyaWJ1dGlvblVybDogJ2h0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vT2NlYW5fQmFzZW1hcCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIE9jZWFuc0xhYmVsczoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vYXJjZ2lzL3Jlc3Qvc2VydmljZXMvT2NlYW4vV29ybGRfT2NlYW5fUmVmZXJlbmNlL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTYsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBwYW5lOiAocG9pbnRlckV2ZW50cykgPyAnZXNyaS1sYWJlbHMnIDogJ3RpbGVQYW5lJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgTmF0aW9uYWxHZW9ncmFwaGljOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9OYXRHZW9fV29ybGRfTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTYsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ05hdGlvbmFsIEdlb2dyYXBoaWMsIERlTG9ybWUsIEhFUkUsIFVORVAtV0NNQywgVVNHUywgTkFTQSwgRVNBLCBNRVRJLCBOUkNBTiwgR0VCQ08sIE5PQUEsIGluY3JlbWVudCBQIENvcnAuJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgRGFya0dyYXk6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL0NhbnZhcy9Xb3JsZF9EYXJrX0dyYXlfQmFzZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE2LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdIRVJFLCBEZUxvcm1lLCBNYXBteUluZGlhLCAmY29weTsgT3BlblN0cmVldE1hcCBjb250cmlidXRvcnMnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBEYXJrR3JheUxhYmVsczoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvQ2FudmFzL1dvcmxkX0RhcmtfR3JheV9SZWZlcmVuY2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxNixcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJ1xuXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBHcmF5OiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9DYW52YXMvV29ybGRfTGlnaHRfR3JheV9CYXNlL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTYsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ0hFUkUsIERlTG9ybWUsIE1hcG15SW5kaWEsICZjb3B5OyBPcGVuU3RyZWV0TWFwIGNvbnRyaWJ1dG9ycydcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIEdyYXlMYWJlbHM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL0NhbnZhcy9Xb3JsZF9MaWdodF9HcmF5X1JlZmVyZW5jZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE2LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgcGFuZTogKHBvaW50ZXJFdmVudHMpID8gJ2VzcmktbGFiZWxzJyA6ICd0aWxlUGFuZScsXG4gICAgICAgICAgYXR0cmlidXRpb246ICcnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBJbWFnZXJ5OiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9JbWFnZXJ5L01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTksXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ0RpZ2l0YWxHbG9iZSwgR2VvRXllLCBpLWN1YmVkLCBVU0RBLCBVU0dTLCBBRVgsIEdldG1hcHBpbmcsIEFlcm9ncmlkLCBJR04sIElHUCwgc3dpc3N0b3BvLCBhbmQgdGhlIEdJUyBVc2VyIENvbW11bml0eSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIEltYWdlcnlMYWJlbHM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1JlZmVyZW5jZS9Xb3JsZF9Cb3VuZGFyaWVzX2FuZF9QbGFjZXMvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxOSxcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgSW1hZ2VyeVRyYW5zcG9ydGF0aW9uOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfVHJhbnNwb3J0YXRpb24vTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxOSxcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBTaGFkZWRSZWxpZWY6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX1NoYWRlZF9SZWxpZWYvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxMyxcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnVVNHUydcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFNoYWRlZFJlbGllZkxhYmVsczoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvUmVmZXJlbmNlL1dvcmxkX0JvdW5kYXJpZXNfYW5kX1BsYWNlc19BbHRlcm5hdGUvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxMixcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgVGVycmFpbjoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfVGVycmFpbl9CYXNlL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTMsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ1VTR1MsIE5PQUEnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBUZXJyYWluTGFiZWxzOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfUmVmZXJlbmNlX092ZXJsYXkvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxMyxcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgVVNBVG9wbzoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvVVNBX1RvcG9fTWFwcy9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE1LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdVU0dTLCBOYXRpb25hbCBHZW9ncmFwaGljIFNvY2lldHksIGktY3ViZWQnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGtleSwgb3B0aW9ucykge1xuICAgIHZhciBjb25maWc7XG5cbiAgICAvLyBzZXQgdGhlIGNvbmZpZyB2YXJpYWJsZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb25maWcgb2JqZWN0XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnICYmIGtleS51cmxUZW1wbGF0ZSAmJiBrZXkub3B0aW9ucykge1xuICAgICAgY29uZmlnID0ga2V5O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYgQmFzZW1hcExheWVyLlRJTEVTW2tleV0pIHtcbiAgICAgIGNvbmZpZyA9IEJhc2VtYXBMYXllci5USUxFU1trZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0wuZXNyaS5CYXNlbWFwTGF5ZXI6IEludmFsaWQgcGFyYW1ldGVyLiBVc2Ugb25lIG9mIFwiU3RyZWV0c1wiLCBcIlRvcG9ncmFwaGljXCIsIFwiT2NlYW5zXCIsIFwiT2NlYW5zTGFiZWxzXCIsIFwiTmF0aW9uYWxHZW9ncmFwaGljXCIsIFwiR3JheVwiLCBcIkdyYXlMYWJlbHNcIiwgXCJEYXJrR3JheVwiLCBcIkRhcmtHcmF5TGFiZWxzXCIsIFwiSW1hZ2VyeVwiLCBcIkltYWdlcnlMYWJlbHNcIiwgXCJJbWFnZXJ5VHJhbnNwb3J0YXRpb25cIiwgXCJTaGFkZWRSZWxpZWZcIiwgXCJTaGFkZWRSZWxpZWZMYWJlbHNcIiwgXCJUZXJyYWluXCIsIFwiVGVycmFpbkxhYmVsc1wiIG9yIFwiVVNBVG9wb1wiJyk7XG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgcGFzc2VkIG9wdGlvbnMgaW50byB0aGUgY29uZmlnIG9wdGlvbnNcbiAgICB2YXIgdGlsZU9wdGlvbnMgPSBVdGlsLmV4dGVuZChjb25maWcub3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICBVdGlsLnNldE9wdGlvbnModGhpcywgdGlsZU9wdGlvbnMpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50b2tlbikge1xuICAgICAgY29uZmlnLnVybFRlbXBsYXRlICs9ICgnP3Rva2VuPScgKyB0aGlzLm9wdGlvbnMudG9rZW4pO1xuICAgIH1cblxuICAgIC8vIGNhbGwgdGhlIGluaXRpYWxpemUgbWV0aG9kIG9uIEwuVGlsZUxheWVyIHRvIHNldCBldmVyeXRoaW5nIHVwXG4gICAgVGlsZUxheWVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgY29uZmlnLnVybFRlbXBsYXRlLCB0aWxlT3B0aW9ucyk7XG4gIH0sXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAvLyBpbmNsdWRlICdQb3dlcmVkIGJ5IEVzcmknIGluIG1hcCBhdHRyaWJ1dGlvblxuICAgIHNldEVzcmlBdHRyaWJ1dGlvbihtYXApO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wYW5lID09PSAnZXNyaS1sYWJlbHMnKSB7XG4gICAgICB0aGlzLl9pbml0UGFuZSgpO1xuICAgIH1cbiAgICAvLyBzb21lIGJhc2VtYXBzIGNhbiBzdXBwbHkgZHluYW1pYyBhdHRyaWJ1dGlvblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRpb25VcmwpIHtcbiAgICAgIF9nZXRBdHRyaWJ1dGlvbkRhdGEodGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uVXJsLCBtYXApO1xuICAgIH1cblxuICAgIG1hcC5vbignbW92ZWVuZCcsIF91cGRhdGVNYXBBdHRyaWJ1dGlvbik7XG5cbiAgICBUaWxlTGF5ZXIucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcywgbWFwKTtcbiAgfSxcblxuICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgIG1hcC5vZmYoJ21vdmVlbmQnLCBfdXBkYXRlTWFwQXR0cmlidXRpb24pO1xuICAgIFRpbGVMYXllci5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIF9pbml0UGFuZTogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fbWFwLmdldFBhbmUodGhpcy5vcHRpb25zLnBhbmUpKSB7XG4gICAgICB2YXIgcGFuZSA9IHRoaXMuX21hcC5jcmVhdGVQYW5lKHRoaXMub3B0aW9ucy5wYW5lKTtcbiAgICAgIHBhbmUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgIHBhbmUuc3R5bGUuekluZGV4ID0gNTAwO1xuICAgIH1cbiAgfSxcblxuICBnZXRBdHRyaWJ1dGlvbjogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRpb24pIHtcbiAgICAgIHZhciBhdHRyaWJ1dGlvbiA9ICc8c3BhbiBjbGFzcz1cImVzcmktZHluYW1pYy1hdHRyaWJ1dGlvblwiPicgKyB0aGlzLm9wdGlvbnMuYXR0cmlidXRpb24gKyAnPC9zcGFuPic7XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGlvbjtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlbWFwTGF5ZXIgKGtleSwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEJhc2VtYXBMYXllcihrZXksIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlbWFwTGF5ZXI7XG4iLCJpbXBvcnQgeyBUaWxlTGF5ZXIsIFV0aWwgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IHdhcm4sIGNsZWFuVXJsLCBzZXRFc3JpQXR0cmlidXRpb24gfSBmcm9tICcuLi9VdGlsJztcbmltcG9ydCBtYXBTZXJ2aWNlIGZyb20gJy4uL1NlcnZpY2VzL01hcFNlcnZpY2UnO1xuXG5leHBvcnQgdmFyIFRpbGVkTWFwTGF5ZXIgPSBUaWxlTGF5ZXIuZXh0ZW5kKHtcbiAgb3B0aW9uczoge1xuICAgIHpvb21PZmZzZXRBbGxvd2FuY2U6IDAuMSxcbiAgICBlcnJvclRpbGVVcmw6ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQVFBQUFBRUFCQU1BQUFDdVhMVlZBQUFBQTFCTVZFVXpORFZzemxISEFBQUFBWFJTVGxNQVFPYllaZ0FBQUFsd1NGbHpBQUFBQUFBQUFBQUI2bVVXcEFBQUFEWkpSRUZVZUp6dHdRRUJBQUFBZ2lEL3IyNUlRQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTd3YUJBQUFCdzA4UndBQUFBQUJKUlU1RXJrSmdnZz09J1xuICB9LFxuXG4gIHN0YXRpY3M6IHtcbiAgICBNZXJjYXRvclpvb21MZXZlbHM6IHtcbiAgICAgICcwJzogMTU2NTQzLjAzMzkyNzk5OTk5LFxuICAgICAgJzEnOiA3ODI3MS41MTY5NjM5OTk4OTMsXG4gICAgICAnMic6IDM5MTM1Ljc1ODQ4MjAwMDA5OSxcbiAgICAgICczJzogMTk1NjcuODc5MjQwOTk5OTAxLFxuICAgICAgJzQnOiA5NzgzLjkzOTYyMDQ5OTk1OTMsXG4gICAgICAnNSc6IDQ4OTEuOTY5ODEwMjQ5OTc5NyxcbiAgICAgICc2JzogMjQ0NS45ODQ5MDUxMjQ5ODk4LFxuICAgICAgJzcnOiAxMjIyLjk5MjQ1MjU2MjQ4OTksXG4gICAgICAnOCc6IDYxMS40OTYyMjYyODEzODAwMixcbiAgICAgICc5JzogMzA1Ljc0ODExMzE0MDU1ODAyLFxuICAgICAgJzEwJzogMTUyLjg3NDA1NjU3MDQxMSxcbiAgICAgICcxMSc6IDc2LjQzNzAyODI4NTA3MzE5NyxcbiAgICAgICcxMic6IDM4LjIxODUxNDE0MjUzNjU5OCxcbiAgICAgICcxMyc6IDE5LjEwOTI1NzA3MTI2ODI5OSxcbiAgICAgICcxNCc6IDkuNTU0NjI4NTM1NjM0MTQ5NixcbiAgICAgICcxNSc6IDQuNzc3MzE0MjY3OTQ5MzY5OSxcbiAgICAgICcxNic6IDIuMzg4NjU3MTMzOTc0NjgsXG4gICAgICAnMTcnOiAxLjE5NDMyODU2Njg1NTA1MDEsXG4gICAgICAnMTgnOiAwLjU5NzE2NDI4MzU1OTgxNjk5LFxuICAgICAgJzE5JzogMC4yOTg1ODIxNDE2NDc2MTY5OCxcbiAgICAgICcyMCc6IDAuMTQ5MjkxMDcwODIzODEsXG4gICAgICAnMjEnOiAwLjA3NDY0NTUzNTQxMTkxLFxuICAgICAgJzIyJzogMC4wMzczMjI3Njc3MDU5NTI1LFxuICAgICAgJzIzJzogMC4wMTg2NjEzODM4NTI5NzYzXG4gICAgfVxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgb3B0aW9ucy51cmwgPSBjbGVhblVybChvcHRpb25zLnVybCk7XG4gICAgb3B0aW9ucyA9IFV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcblxuICAgIC8vIHNldCB0aGUgdXJsc1xuICAgIHRoaXMudGlsZVVybCA9IG9wdGlvbnMudXJsICsgJ3RpbGUve3p9L3t5fS97eH0nO1xuICAgIHRoaXMuc2VydmljZSA9IG1hcFNlcnZpY2Uob3B0aW9ucyk7XG4gICAgdGhpcy5zZXJ2aWNlLmFkZEV2ZW50UGFyZW50KHRoaXMpO1xuXG4gICAgdmFyIGFyY2dpc29ubGluZSA9IG5ldyBSZWdFeHAoL3RpbGVzLmFyY2dpcyhvbmxpbmUpP1xcLmNvbS9nKTtcbiAgICBpZiAoYXJjZ2lzb25saW5lLnRlc3Qob3B0aW9ucy51cmwpKSB7XG4gICAgICB0aGlzLnRpbGVVcmwgPSB0aGlzLnRpbGVVcmwucmVwbGFjZSgnOi8vdGlsZXMnLCAnOi8vdGlsZXN7c30nKTtcbiAgICAgIG9wdGlvbnMuc3ViZG9tYWlucyA9IFsnMScsICcyJywgJzMnLCAnNCddO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIHRoaXMudGlsZVVybCArPSAoJz90b2tlbj0nICsgdGhpcy5vcHRpb25zLnRva2VuKTtcbiAgICB9XG5cbiAgICAvLyBpbml0IGxheWVyIGJ5IGNhbGxpbmcgVGlsZUxheWVycyBpbml0aWFsaXplIG1ldGhvZFxuICAgIFRpbGVMYXllci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHRoaXMudGlsZVVybCwgb3B0aW9ucyk7XG4gIH0sXG5cbiAgZ2V0VGlsZVVybDogZnVuY3Rpb24gKHRpbGVQb2ludCkge1xuICAgIHZhciB6b29tID0gdGhpcy5fZ2V0Wm9vbUZvclVybCgpO1xuXG4gICAgcmV0dXJuIFV0aWwudGVtcGxhdGUodGhpcy50aWxlVXJsLCBVdGlsLmV4dGVuZCh7XG4gICAgICBzOiB0aGlzLl9nZXRTdWJkb21haW4odGlsZVBvaW50KSxcbiAgICAgIHg6IHRpbGVQb2ludC54LFxuICAgICAgeTogdGlsZVBvaW50LnksXG4gICAgICAvLyB0cnkgbG9kIG1hcCBmaXJzdCwgdGhlbiBqdXN0IGRlZmF1bHQgdG8gem9vbSBsZXZlbFxuICAgICAgejogKHRoaXMuX2xvZE1hcCAmJiB0aGlzLl9sb2RNYXBbem9vbV0pID8gdGhpcy5fbG9kTWFwW3pvb21dIDogem9vbVxuICAgIH0sIHRoaXMub3B0aW9ucykpO1xuICB9LFxuXG4gIGNyZWF0ZVRpbGU6IGZ1bmN0aW9uIChjb29yZHMsIGRvbmUpIHtcbiAgICB2YXIgdGlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuXG4gICAgTC5Eb21FdmVudC5vbih0aWxlLCAnbG9hZCcsIEwuYmluZCh0aGlzLl90aWxlT25Mb2FkLCB0aGlzLCBkb25lLCB0aWxlKSk7XG4gICAgTC5Eb21FdmVudC5vbih0aWxlLCAnZXJyb3InLCBMLmJpbmQodGhpcy5fdGlsZU9uRXJyb3IsIHRoaXMsIGRvbmUsIHRpbGUpKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW4pIHtcbiAgICAgIHRpbGUuY3Jvc3NPcmlnaW4gPSAnJztcbiAgICB9XG5cbiAgICAvKlxuICAgICBBbHQgdGFnIGlzIHNldCB0byBlbXB0eSBzdHJpbmcgdG8ga2VlcCBzY3JlZW4gcmVhZGVycyBmcm9tIHJlYWRpbmcgVVJMIGFuZCBmb3IgY29tcGxpYW5jZSByZWFzb25zXG4gICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1dDQUcyMC1URUNIUy9INjdcbiAgICAqL1xuICAgIHRpbGUuYWx0ID0gJyc7XG5cbiAgICAvLyBpZiB0aGVyZSBpcyBubyBsb2QgbWFwIG9yIGFuIGxvZCBtYXAgd2l0aCBhIHByb3BlciB6b29tIGxvYWQgdGhlIHRpbGVcbiAgICAvLyBvdGhlcndpc2Ugd2FpdCBmb3IgdGhlIGxvZCBtYXAgdG8gYmVjb21lIGF2YWlsYWJsZVxuICAgIGlmICghdGhpcy5fbG9kTWFwIHx8ICh0aGlzLl9sb2RNYXAgJiYgdGhpcy5fbG9kTWFwW3RoaXMuX2dldFpvb21Gb3JVcmwoKV0pKSB7XG4gICAgICB0aWxlLnNyYyA9IHRoaXMuZ2V0VGlsZVVybChjb29yZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uY2UoJ2xvZG1hcCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGlsZS5zcmMgPSB0aGlzLmdldFRpbGVVcmwoY29vcmRzKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aWxlO1xuICB9LFxuXG4gIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgLy8gaW5jbHVkZSAnUG93ZXJlZCBieSBFc3JpJyBpbiBtYXAgYXR0cmlidXRpb25cbiAgICBzZXRFc3JpQXR0cmlidXRpb24obWFwKTtcblxuICAgIGlmICghdGhpcy5fbG9kTWFwKSB7XG4gICAgICB0aGlzLm1ldGFkYXRhKGZ1bmN0aW9uIChlcnJvciwgbWV0YWRhdGEpIHtcbiAgICAgICAgaWYgKCFlcnJvciAmJiBtZXRhZGF0YS5zcGF0aWFsUmVmZXJlbmNlKSB7XG4gICAgICAgICAgdmFyIHNyID0gbWV0YWRhdGEuc3BhdGlhbFJlZmVyZW5jZS5sYXRlc3RXa2lkIHx8IG1ldGFkYXRhLnNwYXRpYWxSZWZlcmVuY2Uud2tpZDtcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbiAmJiBtYXAuYXR0cmlidXRpb25Db250cm9sICYmIG1ldGFkYXRhLmNvcHlyaWdodFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbiA9IG1ldGFkYXRhLmNvcHlyaWdodFRleHQ7XG4gICAgICAgICAgICBtYXAuYXR0cmlidXRpb25Db250cm9sLmFkZEF0dHJpYnV0aW9uKHRoaXMuZ2V0QXR0cmlidXRpb24oKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXAub3B0aW9ucy5jcnMgPT09IEwuQ1JTLkVQU0czODU3ICYmIHNyID09PSAxMDIxMDAgfHwgc3IgPT09IDM4NTcpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZE1hcCA9IHt9O1xuICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSB6b29tIGxldmVsIGRhdGFcbiAgICAgICAgICAgIHZhciBhcmNnaXNMT0RzID0gbWV0YWRhdGEudGlsZUluZm8ubG9kcztcbiAgICAgICAgICAgIHZhciBjb3JyZWN0UmVzb2x1dGlvbnMgPSBUaWxlZE1hcExheWVyLk1lcmNhdG9yWm9vbUxldmVscztcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmNnaXNMT0RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBhcmNnaXNMT0QgPSBhcmNnaXNMT0RzW2ldO1xuICAgICAgICAgICAgICBmb3IgKHZhciBjaSBpbiBjb3JyZWN0UmVzb2x1dGlvbnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29ycmVjdFJlcyA9IGNvcnJlY3RSZXNvbHV0aW9uc1tjaV07XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fd2l0aGluUGVyY2VudGFnZShhcmNnaXNMT0QucmVzb2x1dGlvbiwgY29ycmVjdFJlcywgdGhpcy5vcHRpb25zLnpvb21PZmZzZXRBbGxvd2FuY2UpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9sb2RNYXBbY2ldID0gYXJjZ2lzTE9ELmxldmVsO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbG9kbWFwJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghcHJvajQpIHtcbiAgICAgICAgICAgICAgd2FybignTC5lc3JpLlRpbGVkTWFwTGF5ZXIgaXMgdXNpbmcgYSBub24tbWVyY2F0b3Igc3BhdGlhbCByZWZlcmVuY2UuIFN1cHBvcnQgbWF5IGJlIGF2YWlsYWJsZSB0aHJvdWdoIFByb2o0TGVhZmxldCBodHRwOi8vZXNyaS5naXRodWIuaW8vZXNyaS1sZWFmbGV0L2V4YW1wbGVzL25vbi1tZXJjYXRvci1wcm9qZWN0aW9uLmh0bWwnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgIH1cblxuICAgIFRpbGVMYXllci5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIG1ldGFkYXRhOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLnNlcnZpY2UubWV0YWRhdGEoY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGlkZW50aWZ5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS5pZGVudGlmeSgpO1xuICB9LFxuXG4gIGZpbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmZpbmQoKTtcbiAgfSxcblxuICBxdWVyeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UucXVlcnkoKTtcbiAgfSxcblxuICBhdXRoZW50aWNhdGU6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHZhciB0b2tlblFzID0gJz90b2tlbj0nICsgdG9rZW47XG4gICAgdGhpcy50aWxlVXJsID0gKHRoaXMub3B0aW9ucy50b2tlbikgPyB0aGlzLnRpbGVVcmwucmVwbGFjZSgvXFw/dG9rZW49KC4rKS9nLCB0b2tlblFzKSA6IHRoaXMudGlsZVVybCArIHRva2VuUXM7XG4gICAgdGhpcy5vcHRpb25zLnRva2VuID0gdG9rZW47XG4gICAgdGhpcy5zZXJ2aWNlLmF1dGhlbnRpY2F0ZSh0b2tlbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgX3dpdGhpblBlcmNlbnRhZ2U6IGZ1bmN0aW9uIChhLCBiLCBwZXJjZW50YWdlKSB7XG4gICAgdmFyIGRpZmYgPSBNYXRoLmFicygoYSAvIGIpIC0gMSk7XG4gICAgcmV0dXJuIGRpZmYgPCBwZXJjZW50YWdlO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbGVkTWFwTGF5ZXIgKHVybCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IFRpbGVkTWFwTGF5ZXIodXJsLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdGlsZWRNYXBMYXllcjtcbiIsImltcG9ydCB7IEltYWdlT3ZlcmxheSwgQ1JTLCBEb21VdGlsLCBVdGlsLCBMYXllciwgcG9wdXAsIGxhdExuZyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgY29ycyB9IGZyb20gJy4uL1N1cHBvcnQnO1xuaW1wb3J0IHsgc2V0RXNyaUF0dHJpYnV0aW9uIH0gZnJvbSAnLi4vVXRpbCc7XG5cbnZhciBPdmVybGF5ID0gSW1hZ2VPdmVybGF5LmV4dGVuZCh7XG4gIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgdGhpcy5fdG9wTGVmdCA9IG1hcC5nZXRQaXhlbEJvdW5kcygpLm1pbjtcbiAgICBJbWFnZU92ZXJsYXkucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcywgbWFwKTtcbiAgfSxcbiAgX3Jlc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX21hcC5vcHRpb25zLmNycyA9PT0gQ1JTLkVQU0czODU3KSB7XG4gICAgICBJbWFnZU92ZXJsYXkucHJvdG90eXBlLl9yZXNldC5jYWxsKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBEb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX2ltYWdlLCB0aGlzLl90b3BMZWZ0LnN1YnRyYWN0KHRoaXMuX21hcC5nZXRQaXhlbE9yaWdpbigpKSk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IHZhciBSYXN0ZXJMYXllciA9IExheWVyLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIG9wYWNpdHk6IDEsXG4gICAgcG9zaXRpb246ICdmcm9udCcsXG4gICAgZjogJ2ltYWdlJyxcbiAgICB1c2VDb3JzOiBjb3JzLFxuICAgIGF0dHJpYnV0aW9uOiBudWxsLFxuICAgIGludGVyYWN0aXZlOiBmYWxzZSxcbiAgICBhbHQ6ICcnXG4gIH0sXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAvLyBpbmNsdWRlICdQb3dlcmVkIGJ5IEVzcmknIGluIG1hcCBhdHRyaWJ1dGlvblxuICAgIHNldEVzcmlBdHRyaWJ1dGlvbihtYXApO1xuXG4gICAgdGhpcy5fdXBkYXRlID0gVXRpbC50aHJvdHRsZSh0aGlzLl91cGRhdGUsIHRoaXMub3B0aW9ucy51cGRhdGVJbnRlcnZhbCwgdGhpcyk7XG5cbiAgICBtYXAub24oJ21vdmVlbmQnLCB0aGlzLl91cGRhdGUsIHRoaXMpO1xuXG4gICAgLy8gaWYgd2UgaGFkIGFuIGltYWdlIGxvYWRlZCBhbmQgaXQgbWF0Y2hlcyB0aGVcbiAgICAvLyBjdXJyZW50IGJvdW5kcyBzaG93IHRoZSBpbWFnZSBvdGhlcndpc2UgcmVtb3ZlIGl0XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRJbWFnZSAmJiB0aGlzLl9jdXJyZW50SW1hZ2UuX2JvdW5kcy5lcXVhbHModGhpcy5fbWFwLmdldEJvdW5kcygpKSkge1xuICAgICAgbWFwLmFkZExheWVyKHRoaXMuX2N1cnJlbnRJbWFnZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9jdXJyZW50SW1hZ2UpIHtcbiAgICAgIHRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzLl9jdXJyZW50SW1hZ2UpO1xuICAgICAgdGhpcy5fY3VycmVudEltYWdlID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGUoKTtcblxuICAgIGlmICh0aGlzLl9wb3B1cCkge1xuICAgICAgdGhpcy5fbWFwLm9uKCdjbGljaycsIHRoaXMuX2dldFBvcHVwRGF0YSwgdGhpcyk7XG4gICAgICB0aGlzLl9tYXAub24oJ2RibGNsaWNrJywgdGhpcy5fcmVzZXRQb3B1cFN0YXRlLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgY29weXJpZ2h0IHRleHQgbGlzdGVkIGluIHNlcnZpY2UgbWV0YWRhdGFcbiAgICB0aGlzLm1ldGFkYXRhKGZ1bmN0aW9uIChlcnIsIG1ldGFkYXRhKSB7XG4gICAgICBpZiAoIWVyciAmJiAhdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uICYmIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wgJiYgbWV0YWRhdGEuY29weXJpZ2h0VGV4dCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRpb24gPSBtZXRhZGF0YS5jb3B5cmlnaHRUZXh0O1xuICAgICAgICBtYXAuYXR0cmlidXRpb25Db250cm9sLmFkZEF0dHJpYnV0aW9uKHRoaXMuZ2V0QXR0cmlidXRpb24oKSk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgb25SZW1vdmU6IGZ1bmN0aW9uIChtYXApIHtcbiAgICBpZiAodGhpcy5fY3VycmVudEltYWdlKSB7XG4gICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fY3VycmVudEltYWdlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcG9wdXApIHtcbiAgICAgIHRoaXMuX21hcC5vZmYoJ2NsaWNrJywgdGhpcy5fZ2V0UG9wdXBEYXRhLCB0aGlzKTtcbiAgICAgIHRoaXMuX21hcC5vZmYoJ2RibGNsaWNrJywgdGhpcy5fcmVzZXRQb3B1cFN0YXRlLCB0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlLCB0aGlzKTtcbiAgfSxcblxuICBiaW5kUG9wdXA6IGZ1bmN0aW9uIChmbiwgcG9wdXBPcHRpb25zKSB7XG4gICAgdGhpcy5fc2hvdWxkUmVuZGVyUG9wdXAgPSBmYWxzZTtcbiAgICB0aGlzLl9sYXN0Q2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLl9wb3B1cCA9IHBvcHVwKHBvcHVwT3B0aW9ucyk7XG4gICAgdGhpcy5fcG9wdXBGdW5jdGlvbiA9IGZuO1xuICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgIHRoaXMuX21hcC5vbignY2xpY2snLCB0aGlzLl9nZXRQb3B1cERhdGEsIHRoaXMpO1xuICAgICAgdGhpcy5fbWFwLm9uKCdkYmxjbGljaycsIHRoaXMuX3Jlc2V0UG9wdXBTdGF0ZSwgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHVuYmluZFBvcHVwOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgdGhpcy5fbWFwLmNsb3NlUG9wdXAodGhpcy5fcG9wdXApO1xuICAgICAgdGhpcy5fbWFwLm9mZignY2xpY2snLCB0aGlzLl9nZXRQb3B1cERhdGEsIHRoaXMpO1xuICAgICAgdGhpcy5fbWFwLm9mZignZGJsY2xpY2snLCB0aGlzLl9yZXNldFBvcHVwU3RhdGUsIHRoaXMpO1xuICAgIH1cbiAgICB0aGlzLl9wb3B1cCA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGJyaW5nVG9Gcm9udDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9ICdmcm9udCc7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRJbWFnZSkge1xuICAgICAgdGhpcy5fY3VycmVudEltYWdlLmJyaW5nVG9Gcm9udCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBicmluZ1RvQmFjazogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9ICdiYWNrJztcbiAgICBpZiAodGhpcy5fY3VycmVudEltYWdlKSB7XG4gICAgICB0aGlzLl9jdXJyZW50SW1hZ2UuYnJpbmdUb0JhY2soKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0QXR0cmlidXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uO1xuICB9LFxuXG4gIGdldE9wYWNpdHk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm9wYWNpdHk7XG4gIH0sXG5cbiAgc2V0T3BhY2l0eTogZnVuY3Rpb24gKG9wYWNpdHkpIHtcbiAgICB0aGlzLm9wdGlvbnMub3BhY2l0eSA9IG9wYWNpdHk7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRJbWFnZSkge1xuICAgICAgdGhpcy5fY3VycmVudEltYWdlLnNldE9wYWNpdHkob3BhY2l0eSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldFRpbWVSYW5nZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBbdGhpcy5vcHRpb25zLmZyb20sIHRoaXMub3B0aW9ucy50b107XG4gIH0sXG5cbiAgc2V0VGltZVJhbmdlOiBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgICB0aGlzLm9wdGlvbnMuZnJvbSA9IGZyb207XG4gICAgdGhpcy5vcHRpb25zLnRvID0gdG87XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgbWV0YWRhdGE6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuc2VydmljZS5tZXRhZGF0YShjYWxsYmFjaywgY29udGV4dCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB0aGlzLnNlcnZpY2UuYXV0aGVudGljYXRlKHRva2VuKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICByZWRyYXc6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfSxcblxuICBfcmVuZGVySW1hZ2U6IGZ1bmN0aW9uICh1cmwsIGJvdW5kcywgY29udGVudFR5cGUpIHtcbiAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAvLyBpZiBubyBvdXRwdXQgZGlyZWN0b3J5IGhhcyBiZWVuIHNwZWNpZmllZCBmb3IgYSBzZXJ2aWNlLCBNSU1FIGRhdGEgd2lsbCBiZSByZXR1cm5lZFxuICAgICAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgICAgIHVybCA9ICdkYXRhOicgKyBjb250ZW50VHlwZSArICc7YmFzZTY0LCcgKyB1cmw7XG4gICAgICB9XG4gICAgICAvLyBjcmVhdGUgYSBuZXcgaW1hZ2Ugb3ZlcmxheSBhbmQgYWRkIGl0IHRvIHRoZSBtYXBcbiAgICAgIC8vIHRvIHN0YXJ0IGxvYWRpbmcgdGhlIGltYWdlXG4gICAgICAvLyBvcGFjaXR5IGlzIDAgd2hpbGUgdGhlIGltYWdlIGlzIGxvYWRpbmdcbiAgICAgIHZhciBpbWFnZSA9IG5ldyBPdmVybGF5KHVybCwgYm91bmRzLCB7XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIGNyb3NzT3JpZ2luOiB0aGlzLm9wdGlvbnMudXNlQ29ycyxcbiAgICAgICAgYWx0OiB0aGlzLm9wdGlvbnMuYWx0LFxuICAgICAgICBwYW5lOiB0aGlzLm9wdGlvbnMucGFuZSB8fCB0aGlzLmdldFBhbmUoKSxcbiAgICAgICAgaW50ZXJhY3RpdmU6IHRoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZVxuICAgICAgfSkuYWRkVG8odGhpcy5fbWFwKTtcblxuICAgICAgLy8gb25jZSB0aGUgaW1hZ2UgbG9hZHNcbiAgICAgIGltYWdlLm9uY2UoJ2xvYWQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgdmFyIG5ld0ltYWdlID0gZS50YXJnZXQ7XG4gICAgICAgICAgdmFyIG9sZEltYWdlID0gdGhpcy5fY3VycmVudEltYWdlO1xuXG4gICAgICAgICAgLy8gaWYgdGhlIGJvdW5kcyBvZiB0aGlzIGltYWdlIG1hdGNoZXMgdGhlIGJvdW5kcyB0aGF0XG4gICAgICAgICAgLy8gX3JlbmRlckltYWdlIHdhcyBjYWxsZWQgd2l0aCBhbmQgd2UgaGF2ZSBhIG1hcCB3aXRoIHRoZSBzYW1lIGJvdW5kc1xuICAgICAgICAgIC8vIGhpZGUgdGhlIG9sZCBpbWFnZSBpZiB0aGVyZSBpcyBvbmUgYW5kIHNldCB0aGUgb3BhY2l0eVxuICAgICAgICAgIC8vIG9mIHRoZSBuZXcgaW1hZ2Ugb3RoZXJ3aXNlIHJlbW92ZSB0aGUgbmV3IGltYWdlXG4gICAgICAgICAgaWYgKG5ld0ltYWdlLl9ib3VuZHMuZXF1YWxzKGJvdW5kcykgJiYgbmV3SW1hZ2UuX2JvdW5kcy5lcXVhbHModGhpcy5fbWFwLmdldEJvdW5kcygpKSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudEltYWdlID0gbmV3SW1hZ2U7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24gPT09ICdmcm9udCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5icmluZ1RvRnJvbnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuYnJpbmdUb0JhY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcCAmJiB0aGlzLl9jdXJyZW50SW1hZ2UuX21hcCkge1xuICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW1hZ2Uuc2V0T3BhY2l0eSh0aGlzLm9wdGlvbnMub3BhY2l0eSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW1hZ2UuX21hcC5yZW1vdmVMYXllcih0aGlzLl9jdXJyZW50SW1hZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob2xkSW1hZ2UgJiYgdGhpcy5fbWFwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX21hcC5yZW1vdmVMYXllcihvbGRJbWFnZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvbGRJbWFnZSAmJiBvbGRJbWFnZS5fbWFwKSB7XG4gICAgICAgICAgICAgIG9sZEltYWdlLl9tYXAucmVtb3ZlTGF5ZXIob2xkSW1hZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIobmV3SW1hZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnbG9hZCcsIHtcbiAgICAgICAgICBib3VuZHM6IGJvdW5kc1xuICAgICAgICB9KTtcbiAgICAgIH0sIHRoaXMpO1xuXG4gICAgICB0aGlzLmZpcmUoJ2xvYWRpbmcnLCB7XG4gICAgICAgIGJvdW5kczogYm91bmRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX3VwZGF0ZTogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHpvb20gPSB0aGlzLl9tYXAuZ2V0Wm9vbSgpO1xuICAgIHZhciBib3VuZHMgPSB0aGlzLl9tYXAuZ2V0Qm91bmRzKCk7XG5cbiAgICBpZiAodGhpcy5fYW5pbWF0aW5nWm9vbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tYXAuX3BhblRyYW5zaXRpb24gJiYgdGhpcy5fbWFwLl9wYW5UcmFuc2l0aW9uLl9pblByb2dyZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHpvb20gPiB0aGlzLm9wdGlvbnMubWF4Wm9vbSB8fCB6b29tIDwgdGhpcy5vcHRpb25zLm1pblpvb20pIHtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50SW1hZ2UpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudEltYWdlLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fY3VycmVudEltYWdlKTtcbiAgICAgICAgdGhpcy5fY3VycmVudEltYWdlID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcGFyYW1zID0gdGhpcy5fYnVpbGRFeHBvcnRQYXJhbXMoKTtcblxuICAgIHRoaXMuX3JlcXVlc3RFeHBvcnQocGFyYW1zLCBib3VuZHMpO1xuICB9LFxuXG4gIF9yZW5kZXJQb3B1cDogZnVuY3Rpb24gKGxhdGxuZywgZXJyb3IsIHJlc3VsdHMsIHJlc3BvbnNlKSB7XG4gICAgbGF0bG5nID0gbGF0TG5nKGxhdGxuZyk7XG4gICAgaWYgKHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwICYmIHRoaXMuX2xhc3RDbGljay5lcXVhbHMobGF0bG5nKSkge1xuICAgICAgLy8gYWRkIHRoZSBwb3B1cCB0byB0aGUgbWFwIHdoZXJlIHRoZSBtb3VzZSB3YXMgY2xpY2tlZCBhdFxuICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLl9wb3B1cEZ1bmN0aW9uKGVycm9yLCByZXN1bHRzLCByZXNwb25zZSk7XG4gICAgICBpZiAoY29udGVudCkge1xuICAgICAgICB0aGlzLl9wb3B1cC5zZXRMYXRMbmcobGF0bG5nKS5zZXRDb250ZW50KGNvbnRlbnQpLm9wZW5Pbih0aGlzLl9tYXApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBfcmVzZXRQb3B1cFN0YXRlOiBmdW5jdGlvbiAoZSkge1xuICAgIHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwID0gZmFsc2U7XG4gICAgdGhpcy5fbGFzdENsaWNrID0gZS5sYXRsbmc7XG4gIH1cbn0pO1xuIiwiaW1wb3J0IHsgVXRpbCB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgUmFzdGVyTGF5ZXIgfSBmcm9tICcuL1Jhc3RlckxheWVyJztcbmltcG9ydCB7IGNsZWFuVXJsIH0gZnJvbSAnLi4vVXRpbCc7XG5pbXBvcnQgaW1hZ2VTZXJ2aWNlIGZyb20gJy4uL1NlcnZpY2VzL0ltYWdlU2VydmljZSc7XG5cbmV4cG9ydCB2YXIgSW1hZ2VNYXBMYXllciA9IFJhc3RlckxheWVyLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIHVwZGF0ZUludGVydmFsOiAxNTAsXG4gICAgZm9ybWF0OiAnanBncG5nJyxcbiAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICBmOiAnanNvbidcbiAgfSxcblxuICBxdWVyeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UucXVlcnkoKTtcbiAgfSxcblxuICBpZGVudGlmeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuaWRlbnRpZnkoKTtcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIG9wdGlvbnMudXJsID0gY2xlYW5Vcmwob3B0aW9ucy51cmwpO1xuICAgIHRoaXMuc2VydmljZSA9IGltYWdlU2VydmljZShvcHRpb25zKTtcbiAgICB0aGlzLnNlcnZpY2UuYWRkRXZlbnRQYXJlbnQodGhpcyk7XG5cbiAgICBVdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gIH0sXG5cbiAgc2V0UGl4ZWxUeXBlOiBmdW5jdGlvbiAocGl4ZWxUeXBlKSB7XG4gICAgdGhpcy5vcHRpb25zLnBpeGVsVHlwZSA9IHBpeGVsVHlwZTtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRQaXhlbFR5cGU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBpeGVsVHlwZTtcbiAgfSxcblxuICBzZXRCYW5kSWRzOiBmdW5jdGlvbiAoYmFuZElkcykge1xuICAgIGlmIChVdGlsLmlzQXJyYXkoYmFuZElkcykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5iYW5kSWRzID0gYmFuZElkcy5qb2luKCcsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3B0aW9ucy5iYW5kSWRzID0gYmFuZElkcy50b1N0cmluZygpO1xuICAgIH1cbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRCYW5kSWRzOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5iYW5kSWRzO1xuICB9LFxuXG4gIHNldE5vRGF0YTogZnVuY3Rpb24gKG5vRGF0YSwgbm9EYXRhSW50ZXJwcmV0YXRpb24pIHtcbiAgICBpZiAoVXRpbC5pc0FycmF5KG5vRGF0YSkpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5ub0RhdGEgPSBub0RhdGEuam9pbignLCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wdGlvbnMubm9EYXRhID0gbm9EYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmIChub0RhdGFJbnRlcnByZXRhdGlvbikge1xuICAgICAgdGhpcy5vcHRpb25zLm5vRGF0YUludGVycHJldGF0aW9uID0gbm9EYXRhSW50ZXJwcmV0YXRpb247XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldE5vRGF0YTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubm9EYXRhO1xuICB9LFxuXG4gIGdldE5vRGF0YUludGVycHJldGF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ub0RhdGFJbnRlcnByZXRhdGlvbjtcbiAgfSxcblxuICBzZXRSZW5kZXJpbmdSdWxlOiBmdW5jdGlvbiAocmVuZGVyaW5nUnVsZSkge1xuICAgIHRoaXMub3B0aW9ucy5yZW5kZXJpbmdSdWxlID0gcmVuZGVyaW5nUnVsZTtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfSxcblxuICBnZXRSZW5kZXJpbmdSdWxlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5yZW5kZXJpbmdSdWxlO1xuICB9LFxuXG4gIHNldE1vc2FpY1J1bGU6IGZ1bmN0aW9uIChtb3NhaWNSdWxlKSB7XG4gICAgdGhpcy5vcHRpb25zLm1vc2FpY1J1bGUgPSBtb3NhaWNSdWxlO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICB9LFxuXG4gIGdldE1vc2FpY1J1bGU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1vc2FpY1J1bGU7XG4gIH0sXG5cbiAgX2dldFBvcHVwRGF0YTogZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCByZXN1bHRzLCByZXNwb25zZSkge1xuICAgICAgaWYgKGVycm9yKSB7IHJldHVybjsgfSAvLyB3ZSByZWFsbHkgY2FuJ3QgZG8gYW55dGhpbmcgaGVyZSBidXQgYXV0aGVudGljYXRlIG9yIHJlcXVlc3RlcnJvciB3aWxsIGZpcmVcbiAgICAgIHNldFRpbWVvdXQoVXRpbC5iaW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyUG9wdXAoZS5sYXRsbmcsIGVycm9yLCByZXN1bHRzLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKSwgMzAwKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHZhciBpZGVudGlmeVJlcXVlc3QgPSB0aGlzLmlkZW50aWZ5KCkuYXQoZS5sYXRsbmcpO1xuXG4gICAgLy8gc2V0IG1vc2FpYyBydWxlIGZvciBpZGVudGlmeSB0YXNrIGlmIGl0IGlzIHNldCBmb3IgbGF5ZXJcbiAgICBpZiAodGhpcy5vcHRpb25zLm1vc2FpY1J1bGUpIHtcbiAgICAgIGlkZW50aWZ5UmVxdWVzdC5zZXRNb3NhaWNSdWxlKHRoaXMub3B0aW9ucy5tb3NhaWNSdWxlKTtcbiAgICAgIC8vIEBUT0RPOiBmb3JjZSByZXR1cm4gY2F0YWxvZyBpdGVtcyB0b28/XG4gICAgfVxuXG4gICAgLy8gQFRPRE86IHNldCByZW5kZXJpbmcgcnVsZT8gTm90IHN1cmUsXG4gICAgLy8gc29tZXRpbWVzIHlvdSB3YW50IHJhdyBwaXhlbCB2YWx1ZXNcbiAgICAvLyBpZiAodGhpcy5vcHRpb25zLnJlbmRlcmluZ1J1bGUpIHtcbiAgICAvLyAgIGlkZW50aWZ5UmVxdWVzdC5zZXRSZW5kZXJpbmdSdWxlKHRoaXMub3B0aW9ucy5yZW5kZXJpbmdSdWxlKTtcbiAgICAvLyB9XG5cbiAgICBpZGVudGlmeVJlcXVlc3QucnVuKGNhbGxiYWNrKTtcblxuICAgIC8vIHNldCB0aGUgZmxhZ3MgdG8gc2hvdyB0aGUgcG9wdXBcbiAgICB0aGlzLl9zaG91bGRSZW5kZXJQb3B1cCA9IHRydWU7XG4gICAgdGhpcy5fbGFzdENsaWNrID0gZS5sYXRsbmc7XG4gIH0sXG5cbiAgX2J1aWxkRXhwb3J0UGFyYW1zOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuX21hcC5nZXRTaXplKCk7XG4gICAgdmFyIG5lID0gdGhpcy5fbWFwLm9wdGlvbnMuY3JzLnByb2plY3QoYm91bmRzLl9ub3J0aEVhc3QpO1xuICAgIHZhciBzdyA9IHRoaXMuX21hcC5vcHRpb25zLmNycy5wcm9qZWN0KGJvdW5kcy5fc291dGhXZXN0KTtcblxuICAgIC8vIGVuc3VyZSB0aGF0IHdlIGRvbid0IGFzayBBcmNHSVMgU2VydmVyIGZvciBhIHRhbGxlciBpbWFnZSB0aGFuIHdlIGhhdmUgYWN0dWFsIG1hcCBkaXNwbGF5aW5nXG4gICAgdmFyIHRvcCA9IHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQoYm91bmRzLl9ub3J0aEVhc3QpO1xuICAgIHZhciBib3R0b20gPSB0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KGJvdW5kcy5fc291dGhXZXN0KTtcblxuICAgIGlmICh0b3AueSA+IDAgfHwgYm90dG9tLnkgPCBzaXplLnkpIHtcbiAgICAgIHNpemUueSA9IGJvdHRvbS55IC0gdG9wLnk7XG4gICAgfVxuXG4gICAgdmFyIHNyID0gcGFyc2VJbnQodGhpcy5fbWFwLm9wdGlvbnMuY3JzLmNvZGUuc3BsaXQoJzonKVsxXSwgMTApO1xuXG4gICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgIGJib3g6IFtzdy54LCBzdy55LCBuZS54LCBuZS55XS5qb2luKCcsJyksXG4gICAgICBzaXplOiBzaXplLnggKyAnLCcgKyBzaXplLnksXG4gICAgICBmb3JtYXQ6IHRoaXMub3B0aW9ucy5mb3JtYXQsXG4gICAgICB0cmFuc3BhcmVudDogdGhpcy5vcHRpb25zLnRyYW5zcGFyZW50LFxuICAgICAgYmJveFNSOiBzcixcbiAgICAgIGltYWdlU1I6IHNyXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZnJvbSAmJiB0aGlzLm9wdGlvbnMudG8pIHtcbiAgICAgIHBhcmFtcy50aW1lID0gdGhpcy5vcHRpb25zLmZyb20udmFsdWVPZigpICsgJywnICsgdGhpcy5vcHRpb25zLnRvLnZhbHVlT2YoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnBpeGVsVHlwZSkge1xuICAgICAgcGFyYW1zLnBpeGVsVHlwZSA9IHRoaXMub3B0aW9ucy5waXhlbFR5cGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uKSB7XG4gICAgICBwYXJhbXMuaW50ZXJwb2xhdGlvbiA9IHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcHJlc3Npb25RdWFsaXR5KSB7XG4gICAgICBwYXJhbXMuY29tcHJlc3Npb25RdWFsaXR5ID0gdGhpcy5vcHRpb25zLmNvbXByZXNzaW9uUXVhbGl0eTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmJhbmRJZHMpIHtcbiAgICAgIHBhcmFtcy5iYW5kSWRzID0gdGhpcy5vcHRpb25zLmJhbmRJZHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub0RhdGEpIHtcbiAgICAgIHBhcmFtcy5ub0RhdGEgPSB0aGlzLm9wdGlvbnMubm9EYXRhO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubm9EYXRhSW50ZXJwcmV0YXRpb24pIHtcbiAgICAgIHBhcmFtcy5ub0RhdGFJbnRlcnByZXRhdGlvbiA9IHRoaXMub3B0aW9ucy5ub0RhdGFJbnRlcnByZXRhdGlvbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXJ2aWNlLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIHBhcmFtcy50b2tlbiA9IHRoaXMuc2VydmljZS5vcHRpb25zLnRva2VuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucmVuZGVyaW5nUnVsZSkge1xuICAgICAgcGFyYW1zLnJlbmRlcmluZ1J1bGUgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMucmVuZGVyaW5nUnVsZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5tb3NhaWNSdWxlKSB7XG4gICAgICBwYXJhbXMubW9zYWljUnVsZSA9IEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5tb3NhaWNSdWxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9LFxuXG4gIF9yZXF1ZXN0RXhwb3J0OiBmdW5jdGlvbiAocGFyYW1zLCBib3VuZHMpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmYgPT09ICdqc29uJykge1xuICAgICAgdGhpcy5zZXJ2aWNlLnJlcXVlc3QoJ2V4cG9ydEltYWdlJywgcGFyYW1zLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChlcnJvcikgeyByZXR1cm47IH0gLy8gd2UgcmVhbGx5IGNhbid0IGRvIGFueXRoaW5nIGhlcmUgYnV0IGF1dGhlbnRpY2F0ZSBvciByZXF1ZXN0ZXJyb3Igd2lsbCBmaXJlXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgICAgICByZXNwb25zZS5ocmVmICs9ICgnP3Rva2VuPScgKyB0aGlzLm9wdGlvbnMudG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbmRlckltYWdlKHJlc3BvbnNlLmhyZWYsIGJvdW5kcyk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zLmYgPSAnaW1hZ2UnO1xuICAgICAgdGhpcy5fcmVuZGVySW1hZ2UodGhpcy5vcHRpb25zLnVybCArICdleHBvcnRJbWFnZScgKyBVdGlsLmdldFBhcmFtU3RyaW5nKHBhcmFtcyksIGJvdW5kcyk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlTWFwTGF5ZXIgKHVybCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEltYWdlTWFwTGF5ZXIodXJsLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW1hZ2VNYXBMYXllcjtcbiIsImltcG9ydCB7IFV0aWwgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFJhc3RlckxheWVyIH0gZnJvbSAnLi9SYXN0ZXJMYXllcic7XG5pbXBvcnQgeyBjbGVhblVybCB9IGZyb20gJy4uL1V0aWwnO1xuaW1wb3J0IG1hcFNlcnZpY2UgZnJvbSAnLi4vU2VydmljZXMvTWFwU2VydmljZSc7XG5cbmV4cG9ydCB2YXIgRHluYW1pY01hcExheWVyID0gUmFzdGVyTGF5ZXIuZXh0ZW5kKHtcblxuICBvcHRpb25zOiB7XG4gICAgdXBkYXRlSW50ZXJ2YWw6IDE1MCxcbiAgICBsYXllcnM6IGZhbHNlLFxuICAgIGxheWVyRGVmczogZmFsc2UsXG4gICAgdGltZU9wdGlvbnM6IGZhbHNlLFxuICAgIGZvcm1hdDogJ3BuZzI0JyxcbiAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICBmOiAnanNvbidcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIG9wdGlvbnMudXJsID0gY2xlYW5Vcmwob3B0aW9ucy51cmwpO1xuICAgIHRoaXMuc2VydmljZSA9IG1hcFNlcnZpY2Uob3B0aW9ucyk7XG4gICAgdGhpcy5zZXJ2aWNlLmFkZEV2ZW50UGFyZW50KHRoaXMpO1xuXG4gICAgaWYgKChvcHRpb25zLnByb3h5IHx8IG9wdGlvbnMudG9rZW4pICYmIG9wdGlvbnMuZiAhPT0gJ2pzb24nKSB7XG4gICAgICBvcHRpb25zLmYgPSAnanNvbic7XG4gICAgfVxuXG4gICAgVXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xuICB9LFxuXG4gIGdldER5bmFtaWNMYXllcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmR5bmFtaWNMYXllcnM7XG4gIH0sXG5cbiAgc2V0RHluYW1pY0xheWVyczogZnVuY3Rpb24gKGR5bmFtaWNMYXllcnMpIHtcbiAgICB0aGlzLm9wdGlvbnMuZHluYW1pY0xheWVycyA9IGR5bmFtaWNMYXllcnM7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0TGF5ZXJzOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYXllcnM7XG4gIH0sXG5cbiAgc2V0TGF5ZXJzOiBmdW5jdGlvbiAobGF5ZXJzKSB7XG4gICAgdGhpcy5vcHRpb25zLmxheWVycyA9IGxheWVycztcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRMYXllckRlZnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxheWVyRGVmcztcbiAgfSxcblxuICBzZXRMYXllckRlZnM6IGZ1bmN0aW9uIChsYXllckRlZnMpIHtcbiAgICB0aGlzLm9wdGlvbnMubGF5ZXJEZWZzID0gbGF5ZXJEZWZzO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldFRpbWVPcHRpb25zOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50aW1lT3B0aW9ucztcbiAgfSxcblxuICBzZXRUaW1lT3B0aW9uczogZnVuY3Rpb24gKHRpbWVPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zLnRpbWVPcHRpb25zID0gdGltZU9wdGlvbnM7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcXVlcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnF1ZXJ5KCk7XG4gIH0sXG5cbiAgaWRlbnRpZnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmlkZW50aWZ5KCk7XG4gIH0sXG5cbiAgZmluZDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZmluZCgpO1xuICB9LFxuXG4gIF9nZXRQb3B1cERhdGE6IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIGNhbGxiYWNrID0gVXRpbC5iaW5kKGZ1bmN0aW9uIChlcnJvciwgZmVhdHVyZUNvbGxlY3Rpb24sIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9IC8vIHdlIHJlYWxseSBjYW4ndCBkbyBhbnl0aGluZyBoZXJlIGJ1dCBhdXRoZW50aWNhdGUgb3IgcmVxdWVzdGVycm9yIHdpbGwgZmlyZVxuICAgICAgc2V0VGltZW91dChVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9yZW5kZXJQb3B1cChlLmxhdGxuZywgZXJyb3IsIGZlYXR1cmVDb2xsZWN0aW9uLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKSwgMzAwKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHZhciBpZGVudGlmeVJlcXVlc3QgPSB0aGlzLmlkZW50aWZ5KCkub24odGhpcy5fbWFwKS5hdChlLmxhdGxuZyk7XG5cbiAgICAvLyByZW1vdmUgZXh0cmFuZW91cyB2ZXJ0aWNlcyBmcm9tIHJlc3BvbnNlIGZlYXR1cmVzXG4gICAgaWRlbnRpZnlSZXF1ZXN0LnNpbXBsaWZ5KHRoaXMuX21hcCwgMC41KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMubGF5ZXJzKSB7XG4gICAgICBpZGVudGlmeVJlcXVlc3QubGF5ZXJzKCd2aXNpYmxlOicgKyB0aGlzLm9wdGlvbnMubGF5ZXJzLmpvaW4oJywnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkZW50aWZ5UmVxdWVzdC5sYXllcnMoJ3Zpc2libGUnKTtcbiAgICB9XG5cbiAgICBpZGVudGlmeVJlcXVlc3QucnVuKGNhbGxiYWNrKTtcblxuICAgIC8vIHNldCB0aGUgZmxhZ3MgdG8gc2hvdyB0aGUgcG9wdXBcbiAgICB0aGlzLl9zaG91bGRSZW5kZXJQb3B1cCA9IHRydWU7XG4gICAgdGhpcy5fbGFzdENsaWNrID0gZS5sYXRsbmc7XG4gIH0sXG5cbiAgX2J1aWxkRXhwb3J0UGFyYW1zOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuX21hcC5nZXRTaXplKCk7XG4gICAgdmFyIG5lID0gdGhpcy5fbWFwLm9wdGlvbnMuY3JzLnByb2plY3QoYm91bmRzLmdldE5vcnRoRWFzdCgpKTtcbiAgICB2YXIgc3cgPSB0aGlzLl9tYXAub3B0aW9ucy5jcnMucHJvamVjdChib3VuZHMuZ2V0U291dGhXZXN0KCkpO1xuICAgIHZhciBzciA9IHBhcnNlSW50KHRoaXMuX21hcC5vcHRpb25zLmNycy5jb2RlLnNwbGl0KCc6JylbMV0sIDEwKTtcblxuICAgIC8vIGVuc3VyZSB0aGF0IHdlIGRvbid0IGFzayBBcmNHSVMgU2VydmVyIGZvciBhIHRhbGxlciBpbWFnZSB0aGFuIHdlIGhhdmUgYWN0dWFsIG1hcCBkaXNwbGF5aW5nXG4gICAgdmFyIHRvcCA9IHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQoYm91bmRzLl9ub3J0aEVhc3QpO1xuICAgIHZhciBib3R0b20gPSB0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KGJvdW5kcy5fc291dGhXZXN0KTtcblxuICAgIGlmICh0b3AueSA+IDAgfHwgYm90dG9tLnkgPCBzaXplLnkpIHtcbiAgICAgIHNpemUueSA9IGJvdHRvbS55IC0gdG9wLnk7XG4gICAgfVxuXG4gICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgIGJib3g6IFtzdy54LCBzdy55LCBuZS54LCBuZS55XS5qb2luKCcsJyksXG4gICAgICBzaXplOiBzaXplLnggKyAnLCcgKyBzaXplLnksXG4gICAgICBkcGk6IDk2LFxuICAgICAgZm9ybWF0OiB0aGlzLm9wdGlvbnMuZm9ybWF0LFxuICAgICAgdHJhbnNwYXJlbnQ6IHRoaXMub3B0aW9ucy50cmFuc3BhcmVudCxcbiAgICAgIGJib3hTUjogc3IsXG4gICAgICBpbWFnZVNSOiBzclxuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmR5bmFtaWNMYXllcnMpIHtcbiAgICAgIHBhcmFtcy5keW5hbWljTGF5ZXJzID0gdGhpcy5vcHRpb25zLmR5bmFtaWNMYXllcnM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYXllcnMpIHtcbiAgICAgIHBhcmFtcy5sYXllcnMgPSAnc2hvdzonICsgdGhpcy5vcHRpb25zLmxheWVycy5qb2luKCcsJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYXllckRlZnMpIHtcbiAgICAgIHBhcmFtcy5sYXllckRlZnMgPSB0eXBlb2YgdGhpcy5vcHRpb25zLmxheWVyRGVmcyA9PT0gJ3N0cmluZycgPyB0aGlzLm9wdGlvbnMubGF5ZXJEZWZzIDogSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLmxheWVyRGVmcyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50aW1lT3B0aW9ucykge1xuICAgICAgcGFyYW1zLnRpbWVPcHRpb25zID0gSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLnRpbWVPcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmZyb20gJiYgdGhpcy5vcHRpb25zLnRvKSB7XG4gICAgICBwYXJhbXMudGltZSA9IHRoaXMub3B0aW9ucy5mcm9tLnZhbHVlT2YoKSArICcsJyArIHRoaXMub3B0aW9ucy50by52YWx1ZU9mKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VydmljZS5vcHRpb25zLnRva2VuKSB7XG4gICAgICBwYXJhbXMudG9rZW4gPSB0aGlzLnNlcnZpY2Uub3B0aW9ucy50b2tlbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5KSB7XG4gICAgICBwYXJhbXMucHJveHkgPSB0aGlzLm9wdGlvbnMucHJveHk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfSxcblxuICBfcmVxdWVzdEV4cG9ydDogZnVuY3Rpb24gKHBhcmFtcywgYm91bmRzKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5mID09PSAnanNvbicpIHtcbiAgICAgIHRoaXMuc2VydmljZS5yZXF1ZXN0KCdleHBvcnQnLCBwYXJhbXMsIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKGVycm9yKSB7IHJldHVybjsgfSAvLyB3ZSByZWFsbHkgY2FuJ3QgZG8gYW55dGhpbmcgaGVyZSBidXQgYXV0aGVudGljYXRlIG9yIHJlcXVlc3RlcnJvciB3aWxsIGZpcmVcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRva2VuKSB7XG4gICAgICAgICAgcmVzcG9uc2UuaHJlZiArPSAoJz90b2tlbj0nICsgdGhpcy5vcHRpb25zLnRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5KSB7XG4gICAgICAgICAgcmVzcG9uc2UuaHJlZiA9IHRoaXMub3B0aW9ucy5wcm94eSArICc/JyArIHJlc3BvbnNlLmhyZWY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlLmhyZWYpIHtcbiAgICAgICAgICB0aGlzLl9yZW5kZXJJbWFnZShyZXNwb25zZS5ocmVmLCBib3VuZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3JlbmRlckltYWdlKHJlc3BvbnNlLmltYWdlRGF0YSwgYm91bmRzLCByZXNwb25zZS5jb250ZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXMuZiA9ICdpbWFnZSc7XG4gICAgICB0aGlzLl9yZW5kZXJJbWFnZSh0aGlzLm9wdGlvbnMudXJsICsgJ2V4cG9ydCcgKyBVdGlsLmdldFBhcmFtU3RyaW5nKHBhcmFtcyksIGJvdW5kcyk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGR5bmFtaWNNYXBMYXllciAodXJsLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRHluYW1pY01hcExheWVyKHVybCwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGR5bmFtaWNNYXBMYXllcjtcbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuXG52YXIgVmlydHVhbEdyaWQgPSBMLkxheWVyLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIGNlbGxTaXplOiA1MTIsXG4gICAgdXBkYXRlSW50ZXJ2YWw6IDE1MFxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IEwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLl96b29taW5nID0gZmFsc2U7XG4gIH0sXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgdGhpcy5fdXBkYXRlID0gTC5VdGlsLnRocm90dGxlKHRoaXMuX3VwZGF0ZSwgdGhpcy5vcHRpb25zLnVwZGF0ZUludGVydmFsLCB0aGlzKTtcbiAgICB0aGlzLl9yZXNldCgpO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICB9LFxuXG4gIG9uUmVtb3ZlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fbWFwLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5nZXRFdmVudHMoKSwgdGhpcyk7XG4gICAgdGhpcy5fcmVtb3ZlQ2VsbHMoKTtcbiAgfSxcblxuICBnZXRFdmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXZlbnRzID0ge1xuICAgICAgbW92ZWVuZDogdGhpcy5fdXBkYXRlLFxuICAgICAgem9vbXN0YXJ0OiB0aGlzLl96b29tc3RhcnQsXG4gICAgICB6b29tZW5kOiB0aGlzLl9yZXNldFxuICAgIH07XG5cbiAgICByZXR1cm4gZXZlbnRzO1xuICB9LFxuXG4gIGFkZFRvOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgbWFwLmFkZExheWVyKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJlbW92ZUZyb206IGZ1bmN0aW9uIChtYXApIHtcbiAgICBtYXAucmVtb3ZlTGF5ZXIodGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgX3pvb21zdGFydDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3pvb21pbmcgPSB0cnVlO1xuICB9LFxuXG4gIF9yZXNldDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3JlbW92ZUNlbGxzKCk7XG5cbiAgICB0aGlzLl9jZWxscyA9IHt9O1xuICAgIHRoaXMuX2FjdGl2ZUNlbGxzID0ge307XG4gICAgdGhpcy5fY2VsbHNUb0xvYWQgPSAwO1xuICAgIHRoaXMuX2NlbGxzVG90YWwgPSAwO1xuICAgIHRoaXMuX2NlbGxOdW1Cb3VuZHMgPSB0aGlzLl9nZXRDZWxsTnVtQm91bmRzKCk7XG5cbiAgICB0aGlzLl9yZXNldFdyYXAoKTtcbiAgICB0aGlzLl96b29taW5nID0gZmFsc2U7XG4gIH0sXG5cbiAgX3Jlc2V0V3JhcDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG4gICAgdmFyIGNycyA9IG1hcC5vcHRpb25zLmNycztcblxuICAgIGlmIChjcnMuaW5maW5pdGUpIHsgcmV0dXJuOyB9XG5cbiAgICB2YXIgY2VsbFNpemUgPSB0aGlzLl9nZXRDZWxsU2l6ZSgpO1xuXG4gICAgaWYgKGNycy53cmFwTG5nKSB7XG4gICAgICB0aGlzLl93cmFwTG5nID0gW1xuICAgICAgICBNYXRoLmZsb29yKG1hcC5wcm9qZWN0KFswLCBjcnMud3JhcExuZ1swXV0pLnggLyBjZWxsU2l6ZSksXG4gICAgICAgIE1hdGguY2VpbChtYXAucHJvamVjdChbMCwgY3JzLndyYXBMbmdbMV1dKS54IC8gY2VsbFNpemUpXG4gICAgICBdO1xuICAgIH1cblxuICAgIGlmIChjcnMud3JhcExhdCkge1xuICAgICAgdGhpcy5fd3JhcExhdCA9IFtcbiAgICAgICAgTWF0aC5mbG9vcihtYXAucHJvamVjdChbY3JzLndyYXBMYXRbMF0sIDBdKS55IC8gY2VsbFNpemUpLFxuICAgICAgICBNYXRoLmNlaWwobWFwLnByb2plY3QoW2Nycy53cmFwTGF0WzFdLCAwXSkueSAvIGNlbGxTaXplKVxuICAgICAgXTtcbiAgICB9XG4gIH0sXG5cbiAgX2dldENlbGxTaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jZWxsU2l6ZTtcbiAgfSxcblxuICBfdXBkYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLl9tYXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYm91bmRzID0gdGhpcy5fbWFwLmdldFBpeGVsQm91bmRzKCk7XG4gICAgdmFyIGNlbGxTaXplID0gdGhpcy5fZ2V0Q2VsbFNpemUoKTtcblxuICAgIC8vIGNlbGwgY29vcmRpbmF0ZXMgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHZpZXdcbiAgICB2YXIgY2VsbEJvdW5kcyA9IEwuYm91bmRzKFxuICAgICAgYm91bmRzLm1pbi5kaXZpZGVCeShjZWxsU2l6ZSkuZmxvb3IoKSxcbiAgICAgIGJvdW5kcy5tYXguZGl2aWRlQnkoY2VsbFNpemUpLmZsb29yKCkpO1xuXG4gICAgdGhpcy5fcmVtb3ZlT3RoZXJDZWxscyhjZWxsQm91bmRzKTtcbiAgICB0aGlzLl9hZGRDZWxscyhjZWxsQm91bmRzKTtcblxuICAgIHRoaXMuZmlyZSgnY2VsbHN1cGRhdGVkJyk7XG4gIH0sXG5cbiAgX2FkZENlbGxzOiBmdW5jdGlvbiAoYm91bmRzKSB7XG4gICAgdmFyIHF1ZXVlID0gW107XG4gICAgdmFyIGNlbnRlciA9IGJvdW5kcy5nZXRDZW50ZXIoKTtcbiAgICB2YXIgem9vbSA9IHRoaXMuX21hcC5nZXRab29tKCk7XG5cbiAgICB2YXIgaiwgaSwgY29vcmRzO1xuICAgIC8vIGNyZWF0ZSBhIHF1ZXVlIG9mIGNvb3JkaW5hdGVzIHRvIGxvYWQgY2VsbHMgZnJvbVxuICAgIGZvciAoaiA9IGJvdW5kcy5taW4ueTsgaiA8PSBib3VuZHMubWF4Lnk7IGorKykge1xuICAgICAgZm9yIChpID0gYm91bmRzLm1pbi54OyBpIDw9IGJvdW5kcy5tYXgueDsgaSsrKSB7XG4gICAgICAgIGNvb3JkcyA9IEwucG9pbnQoaSwgaik7XG4gICAgICAgIGNvb3Jkcy56ID0gem9vbTtcblxuICAgICAgICBpZiAodGhpcy5faXNWYWxpZENlbGwoY29vcmRzKSkge1xuICAgICAgICAgIHF1ZXVlLnB1c2goY29vcmRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjZWxsc1RvTG9hZCA9IHF1ZXVlLmxlbmd0aDtcblxuICAgIGlmIChjZWxsc1RvTG9hZCA9PT0gMCkgeyByZXR1cm47IH1cblxuICAgIHRoaXMuX2NlbGxzVG9Mb2FkICs9IGNlbGxzVG9Mb2FkO1xuICAgIHRoaXMuX2NlbGxzVG90YWwgKz0gY2VsbHNUb0xvYWQ7XG5cbiAgICAvLyBzb3J0IGNlbGwgcXVldWUgdG8gbG9hZCBjZWxscyBpbiBvcmRlciBvZiB0aGVpciBkaXN0YW5jZSB0byBjZW50ZXJcbiAgICBxdWV1ZS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS5kaXN0YW5jZVRvKGNlbnRlcikgLSBiLmRpc3RhbmNlVG8oY2VudGVyKTtcbiAgICB9KTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBjZWxsc1RvTG9hZDsgaSsrKSB7XG4gICAgICB0aGlzLl9hZGRDZWxsKHF1ZXVlW2ldKTtcbiAgICB9XG4gIH0sXG5cbiAgX2lzVmFsaWRDZWxsOiBmdW5jdGlvbiAoY29vcmRzKSB7XG4gICAgdmFyIGNycyA9IHRoaXMuX21hcC5vcHRpb25zLmNycztcblxuICAgIGlmICghY3JzLmluZmluaXRlKSB7XG4gICAgICAvLyBkb24ndCBsb2FkIGNlbGwgaWYgaXQncyBvdXQgb2YgYm91bmRzIGFuZCBub3Qgd3JhcHBlZFxuICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxOdW1Cb3VuZHM7XG4gICAgICBpZiAoXG4gICAgICAgICghY3JzLndyYXBMbmcgJiYgKGNvb3Jkcy54IDwgYm91bmRzLm1pbi54IHx8IGNvb3Jkcy54ID4gYm91bmRzLm1heC54KSkgfHxcbiAgICAgICAgKCFjcnMud3JhcExhdCAmJiAoY29vcmRzLnkgPCBib3VuZHMubWluLnkgfHwgY29vcmRzLnkgPiBib3VuZHMubWF4LnkpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ib3VuZHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGRvbid0IGxvYWQgY2VsbCBpZiBpdCBkb2Vzbid0IGludGVyc2VjdCB0aGUgYm91bmRzIGluIG9wdGlvbnNcbiAgICB2YXIgY2VsbEJvdW5kcyA9IHRoaXMuX2NlbGxDb29yZHNUb0JvdW5kcyhjb29yZHMpO1xuICAgIHJldHVybiBMLmxhdExuZ0JvdW5kcyh0aGlzLm9wdGlvbnMuYm91bmRzKS5pbnRlcnNlY3RzKGNlbGxCb3VuZHMpO1xuICB9LFxuXG4gIC8vIGNvbnZlcnRzIGNlbGwgY29vcmRpbmF0ZXMgdG8gaXRzIGdlb2dyYXBoaWNhbCBib3VuZHNcbiAgX2NlbGxDb29yZHNUb0JvdW5kczogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG4gICAgdmFyIGNlbGxTaXplID0gdGhpcy5vcHRpb25zLmNlbGxTaXplO1xuICAgIHZhciBud1BvaW50ID0gY29vcmRzLm11bHRpcGx5QnkoY2VsbFNpemUpO1xuICAgIHZhciBzZVBvaW50ID0gbndQb2ludC5hZGQoW2NlbGxTaXplLCBjZWxsU2l6ZV0pO1xuICAgIHZhciBudyA9IG1hcC53cmFwTGF0TG5nKG1hcC51bnByb2plY3QobndQb2ludCwgY29vcmRzLnopKTtcbiAgICB2YXIgc2UgPSBtYXAud3JhcExhdExuZyhtYXAudW5wcm9qZWN0KHNlUG9pbnQsIGNvb3Jkcy56KSk7XG5cbiAgICByZXR1cm4gTC5sYXRMbmdCb3VuZHMobncsIHNlKTtcbiAgfSxcblxuICAvLyBjb252ZXJ0cyBjZWxsIGNvb3JkaW5hdGVzIHRvIGtleSBmb3IgdGhlIGNlbGwgY2FjaGVcbiAgX2NlbGxDb29yZHNUb0tleTogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHJldHVybiBjb29yZHMueCArICc6JyArIGNvb3Jkcy55O1xuICB9LFxuXG4gIC8vIGNvbnZlcnRzIGNlbGwgY2FjaGUga2V5IHRvIGNvb3JkaWFudGVzXG4gIF9rZXlUb0NlbGxDb29yZHM6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIga0FyciA9IGtleS5zcGxpdCgnOicpO1xuICAgIHZhciB4ID0gcGFyc2VJbnQoa0FyclswXSwgMTApO1xuICAgIHZhciB5ID0gcGFyc2VJbnQoa0FyclsxXSwgMTApO1xuXG4gICAgcmV0dXJuIEwucG9pbnQoeCwgeSk7XG4gIH0sXG5cbiAgLy8gcmVtb3ZlIGFueSBwcmVzZW50IGNlbGxzIHRoYXQgYXJlIG9mZiB0aGUgc3BlY2lmaWVkIGJvdW5kc1xuICBfcmVtb3ZlT3RoZXJDZWxsczogZnVuY3Rpb24gKGJvdW5kcykge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9jZWxscykge1xuICAgICAgaWYgKCFib3VuZHMuY29udGFpbnModGhpcy5fa2V5VG9DZWxsQ29vcmRzKGtleSkpKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZUNlbGwoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgX3JlbW92ZUNlbGw6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuX2FjdGl2ZUNlbGxzW2tleV07XG5cbiAgICBpZiAoY2VsbCkge1xuICAgICAgZGVsZXRlIHRoaXMuX2FjdGl2ZUNlbGxzW2tleV07XG5cbiAgICAgIGlmICh0aGlzLmNlbGxMZWF2ZSkge1xuICAgICAgICB0aGlzLmNlbGxMZWF2ZShjZWxsLmJvdW5kcywgY2VsbC5jb29yZHMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpcmUoJ2NlbGxsZWF2ZScsIHtcbiAgICAgICAgYm91bmRzOiBjZWxsLmJvdW5kcyxcbiAgICAgICAgY29vcmRzOiBjZWxsLmNvb3Jkc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIF9yZW1vdmVDZWxsczogZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9jZWxscykge1xuICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxzW2tleV0uYm91bmRzO1xuICAgICAgdmFyIGNvb3JkcyA9IHRoaXMuX2NlbGxzW2tleV0uY29vcmRzO1xuXG4gICAgICBpZiAodGhpcy5jZWxsTGVhdmUpIHtcbiAgICAgICAgdGhpcy5jZWxsTGVhdmUoYm91bmRzLCBjb29yZHMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpcmUoJ2NlbGxsZWF2ZScsIHtcbiAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgIGNvb3JkczogY29vcmRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX2FkZENlbGw6IGZ1bmN0aW9uIChjb29yZHMpIHtcbiAgICAvLyB3cmFwIGNlbGwgY29vcmRzIGlmIG5lY2Vzc2FyeSAoZGVwZW5kaW5nIG9uIENSUylcbiAgICB0aGlzLl93cmFwQ29vcmRzKGNvb3Jkcyk7XG5cbiAgICAvLyBnZW5lcmF0ZSB0aGUgY2VsbCBrZXlcbiAgICB2YXIga2V5ID0gdGhpcy5fY2VsbENvb3Jkc1RvS2V5KGNvb3Jkcyk7XG5cbiAgICAvLyBnZXQgdGhlIGNlbGwgZnJvbSB0aGUgY2FjaGVcbiAgICB2YXIgY2VsbCA9IHRoaXMuX2NlbGxzW2tleV07XG4gICAgLy8gaWYgdGhpcyBjZWxsIHNob3VsZCBiZSBzaG93biBhcyBpc250IGFjdGl2ZSB5ZXQgKGVudGVyKVxuXG4gICAgaWYgKGNlbGwgJiYgIXRoaXMuX2FjdGl2ZUNlbGxzW2tleV0pIHtcbiAgICAgIGlmICh0aGlzLmNlbGxFbnRlcikge1xuICAgICAgICB0aGlzLmNlbGxFbnRlcihjZWxsLmJvdW5kcywgY29vcmRzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maXJlKCdjZWxsZW50ZXInLCB7XG4gICAgICAgIGJvdW5kczogY2VsbC5ib3VuZHMsXG4gICAgICAgIGNvb3JkczogY29vcmRzXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fYWN0aXZlQ2VsbHNba2V5XSA9IGNlbGw7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgZG9udCBoYXZlIHRoaXMgY2VsbCBpbiB0aGUgY2FjaGUgeWV0IChjcmVhdGUpXG4gICAgaWYgKCFjZWxsKSB7XG4gICAgICBjZWxsID0ge1xuICAgICAgICBjb29yZHM6IGNvb3JkcyxcbiAgICAgICAgYm91bmRzOiB0aGlzLl9jZWxsQ29vcmRzVG9Cb3VuZHMoY29vcmRzKVxuICAgICAgfTtcblxuICAgICAgdGhpcy5fY2VsbHNba2V5XSA9IGNlbGw7XG4gICAgICB0aGlzLl9hY3RpdmVDZWxsc1trZXldID0gY2VsbDtcblxuICAgICAgaWYgKHRoaXMuY3JlYXRlQ2VsbCkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNlbGwoY2VsbC5ib3VuZHMsIGNvb3Jkcyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlyZSgnY2VsbGNyZWF0ZScsIHtcbiAgICAgICAgYm91bmRzOiBjZWxsLmJvdW5kcyxcbiAgICAgICAgY29vcmRzOiBjb29yZHNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBfd3JhcENvb3JkczogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIGNvb3Jkcy54ID0gdGhpcy5fd3JhcExuZyA/IEwuVXRpbC53cmFwTnVtKGNvb3Jkcy54LCB0aGlzLl93cmFwTG5nKSA6IGNvb3Jkcy54O1xuICAgIGNvb3Jkcy55ID0gdGhpcy5fd3JhcExhdCA/IEwuVXRpbC53cmFwTnVtKGNvb3Jkcy55LCB0aGlzLl93cmFwTGF0KSA6IGNvb3Jkcy55O1xuICB9LFxuXG4gIC8vIGdldCB0aGUgZ2xvYmFsIGNlbGwgY29vcmRpbmF0ZXMgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHpvb21cbiAgX2dldENlbGxOdW1Cb3VuZHM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYm91bmRzID0gdGhpcy5fbWFwLmdldFBpeGVsV29ybGRCb3VuZHMoKTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuX2dldENlbGxTaXplKCk7XG5cbiAgICByZXR1cm4gYm91bmRzID8gTC5ib3VuZHMoXG4gICAgICAgIGJvdW5kcy5taW4uZGl2aWRlQnkoc2l6ZSkuZmxvb3IoKSxcbiAgICAgICAgYm91bmRzLm1heC5kaXZpZGVCeShzaXplKS5jZWlsKCkuc3VidHJhY3QoWzEsIDFdKSkgOiBudWxsO1xuICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgVmlydHVhbEdyaWQ7XG4iLCJmdW5jdGlvbiBCaW5hcnlTZWFyY2hJbmRleCAodmFsdWVzKSB7XG4gIHRoaXMudmFsdWVzID0gW10uY29uY2F0KHZhbHVlcyB8fCBbXSk7XG59XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgaW5kZXggPSB0aGlzLmdldEluZGV4KHZhbHVlKTtcbiAgcmV0dXJuIHRoaXMudmFsdWVzW2luZGV4XTtcbn07XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5nZXRJbmRleCA9IGZ1bmN0aW9uIGdldEluZGV4ICh2YWx1ZSkge1xuICBpZiAodGhpcy5kaXJ0eSkge1xuICAgIHRoaXMuc29ydCgpO1xuICB9XG5cbiAgdmFyIG1pbkluZGV4ID0gMDtcbiAgdmFyIG1heEluZGV4ID0gdGhpcy52YWx1ZXMubGVuZ3RoIC0gMTtcbiAgdmFyIGN1cnJlbnRJbmRleDtcbiAgdmFyIGN1cnJlbnRFbGVtZW50O1xuXG4gIHdoaWxlIChtaW5JbmRleCA8PSBtYXhJbmRleCkge1xuICAgIGN1cnJlbnRJbmRleCA9IChtaW5JbmRleCArIG1heEluZGV4KSAvIDIgfCAwO1xuICAgIGN1cnJlbnRFbGVtZW50ID0gdGhpcy52YWx1ZXNbTWF0aC5yb3VuZChjdXJyZW50SW5kZXgpXTtcbiAgICBpZiAoK2N1cnJlbnRFbGVtZW50LnZhbHVlIDwgK3ZhbHVlKSB7XG4gICAgICBtaW5JbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgfSBlbHNlIGlmICgrY3VycmVudEVsZW1lbnQudmFsdWUgPiArdmFsdWUpIHtcbiAgICAgIG1heEluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gTWF0aC5hYnMofm1heEluZGV4KTtcbn07XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5iZXR3ZWVuID0gZnVuY3Rpb24gYmV0d2VlbiAoc3RhcnQsIGVuZCkge1xuICB2YXIgc3RhcnRJbmRleCA9IHRoaXMuZ2V0SW5kZXgoc3RhcnQpO1xuICB2YXIgZW5kSW5kZXggPSB0aGlzLmdldEluZGV4KGVuZCk7XG5cbiAgaWYgKHN0YXJ0SW5kZXggPT09IDAgJiYgZW5kSW5kZXggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB3aGlsZSAodGhpcy52YWx1ZXNbc3RhcnRJbmRleCAtIDFdICYmIHRoaXMudmFsdWVzW3N0YXJ0SW5kZXggLSAxXS52YWx1ZSA9PT0gc3RhcnQpIHtcbiAgICBzdGFydEluZGV4LS07XG4gIH1cblxuICB3aGlsZSAodGhpcy52YWx1ZXNbZW5kSW5kZXggKyAxXSAmJiB0aGlzLnZhbHVlc1tlbmRJbmRleCArIDFdLnZhbHVlID09PSBlbmQpIHtcbiAgICBlbmRJbmRleCsrO1xuICB9XG5cbiAgaWYgKHRoaXMudmFsdWVzW2VuZEluZGV4XSAmJiB0aGlzLnZhbHVlc1tlbmRJbmRleF0udmFsdWUgPT09IGVuZCAmJiB0aGlzLnZhbHVlc1tlbmRJbmRleCArIDFdKSB7XG4gICAgZW5kSW5kZXgrKztcbiAgfVxuXG4gIHJldHVybiB0aGlzLnZhbHVlcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG59O1xuXG5CaW5hcnlTZWFyY2hJbmRleC5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gaW5zZXJ0IChpdGVtKSB7XG4gIHRoaXMudmFsdWVzLnNwbGljZSh0aGlzLmdldEluZGV4KGl0ZW0udmFsdWUpLCAwLCBpdGVtKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5CaW5hcnlTZWFyY2hJbmRleC5wcm90b3R5cGUuYnVsa0FkZCA9IGZ1bmN0aW9uIGJ1bGtBZGQgKGl0ZW1zLCBzb3J0KSB7XG4gIHRoaXMudmFsdWVzID0gdGhpcy52YWx1ZXMuY29uY2F0KFtdLmNvbmNhdChpdGVtcyB8fCBbXSkpO1xuXG4gIGlmIChzb3J0KSB7XG4gICAgdGhpcy5zb3J0KCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24gc29ydCAoKSB7XG4gIHRoaXMudmFsdWVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gK2IudmFsdWUgLSArYS52YWx1ZTtcbiAgfSkucmV2ZXJzZSgpO1xuICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQmluYXJ5U2VhcmNoSW5kZXg7XG4iLCJpbXBvcnQgeyBVdGlsLCBzZXRPcHRpb25zIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgZmVhdHVyZUxheWVyU2VydmljZSBmcm9tICcuLi8uLi9TZXJ2aWNlcy9GZWF0dXJlTGF5ZXJTZXJ2aWNlJztcbmltcG9ydCB7IGNsZWFuVXJsLCB3YXJuLCBzZXRFc3JpQXR0cmlidXRpb24gfSBmcm9tICcuLi8uLi9VdGlsJztcbmltcG9ydCBWaXJ0dWFsR3JpZCBmcm9tICdsZWFmbGV0LXZpcnR1YWwtZ3JpZCc7XG5pbXBvcnQgQmluYXJ5U2VhcmNoSW5kZXggZnJvbSAndGlueS1iaW5hcnktc2VhcmNoJztcblxuZXhwb3J0IHZhciBGZWF0dXJlTWFuYWdlciA9IFZpcnR1YWxHcmlkLmV4dGVuZCh7XG4gIC8qKlxuICAgKiBPcHRpb25zXG4gICAqL1xuXG4gIG9wdGlvbnM6IHtcbiAgICBhdHRyaWJ1dGlvbjogbnVsbCxcbiAgICB3aGVyZTogJzE9MScsXG4gICAgZmllbGRzOiBbJyonXSxcbiAgICBmcm9tOiBmYWxzZSxcbiAgICB0bzogZmFsc2UsXG4gICAgdGltZUZpZWxkOiBmYWxzZSxcbiAgICB0aW1lRmlsdGVyTW9kZTogJ3NlcnZlcicsXG4gICAgc2ltcGxpZnlGYWN0b3I6IDAsXG4gICAgcHJlY2lzaW9uOiA2XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqL1xuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgVmlydHVhbEdyaWQucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICAgIG9wdGlvbnMudXJsID0gY2xlYW5Vcmwob3B0aW9ucy51cmwpO1xuICAgIG9wdGlvbnMgPSBzZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5zZXJ2aWNlID0gZmVhdHVyZUxheWVyU2VydmljZShvcHRpb25zKTtcbiAgICB0aGlzLnNlcnZpY2UuYWRkRXZlbnRQYXJlbnQodGhpcyk7XG5cbiAgICAvLyB1c2UgY2FzZSBpbnNlbnNpdGl2ZSByZWdleCB0byBsb29rIGZvciBjb21tb24gZmllbGRuYW1lcyB1c2VkIGZvciBpbmRleGluZ1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZmllbGRzWzBdICE9PSAnKicpIHtcbiAgICAgIHZhciBvaWRDaGVjayA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmllbGRzW2ldLm1hdGNoKC9eKE9CSkVDVElEfEZJRHxPSUR8SUQpJC9pKSkge1xuICAgICAgICAgIG9pZENoZWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9pZENoZWNrID09PSBmYWxzZSkge1xuICAgICAgICB3YXJuKCdubyBrbm93biBlc3JpRmllbGRUeXBlT0lEIGZpZWxkIGRldGVjdGVkIGluIGZpZWxkcyBBcnJheS4gIFBsZWFzZSBhZGQgYW4gYXR0cmlidXRlIGZpZWxkIGNvbnRhaW5pbmcgdW5pcXVlIElEcyB0byBlbnN1cmUgdGhlIGxheWVyIGNhbiBiZSBkcmF3biBjb3JyZWN0bHkuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50aW1lRmllbGQuc3RhcnQgJiYgdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5lbmQpIHtcbiAgICAgIHRoaXMuX3N0YXJ0VGltZUluZGV4ID0gbmV3IEJpbmFyeVNlYXJjaEluZGV4KCk7XG4gICAgICB0aGlzLl9lbmRUaW1lSW5kZXggPSBuZXcgQmluYXJ5U2VhcmNoSW5kZXgoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy50aW1lRmllbGQpIHtcbiAgICAgIHRoaXMuX3RpbWVJbmRleCA9IG5ldyBCaW5hcnlTZWFyY2hJbmRleCgpO1xuICAgIH1cblxuICAgIHRoaXMuX2NhY2hlID0ge307XG4gICAgdGhpcy5fY3VycmVudFNuYXBzaG90ID0gW107IC8vIGNhY2hlIG9mIHdoYXQgbGF5ZXJzIHNob3VsZCBiZSBhY3RpdmVcbiAgICB0aGlzLl9hY3RpdmVSZXF1ZXN0cyA9IDA7XG4gIH0sXG5cbiAgLyoqXG4gICAqIExheWVyIEludGVyZmFjZVxuICAgKi9cblxuICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xuICAgIC8vIGluY2x1ZGUgJ1Bvd2VyZWQgYnkgRXNyaScgaW4gbWFwIGF0dHJpYnV0aW9uXG4gICAgc2V0RXNyaUF0dHJpYnV0aW9uKG1hcCk7XG5cbiAgICB0aGlzLnNlcnZpY2UubWV0YWRhdGEoZnVuY3Rpb24gKGVyciwgbWV0YWRhdGEpIHtcbiAgICAgIGlmICghZXJyKSB7XG4gICAgICAgIHZhciBzdXBwb3J0ZWRGb3JtYXRzID0gbWV0YWRhdGEuc3VwcG9ydGVkUXVlcnlGb3JtYXRzO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHNvbWVvbmUgaGFzIHJlcXVlc3RlZCB0aGF0IHdlIGRvbid0IHVzZSBnZW9KU09OLCBldmVuIGlmIGl0J3MgYXZhaWxhYmxlXG4gICAgICAgIHZhciBmb3JjZUpzb25Gb3JtYXQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuc2VydmljZS5vcHRpb25zLmlzTW9kZXJuID09PSBmYWxzZSkge1xuICAgICAgICAgIGZvcmNlSnNvbkZvcm1hdCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVbmxlc3Mgd2UndmUgYmVlbiB0b2xkIG90aGVyd2lzZSwgY2hlY2sgdG8gc2VlIHdoZXRoZXIgc2VydmljZSBjYW4gZW1pdCBHZW9KU09OIG5hdGl2ZWx5XG4gICAgICAgIGlmICghZm9yY2VKc29uRm9ybWF0ICYmIHN1cHBvcnRlZEZvcm1hdHMgJiYgc3VwcG9ydGVkRm9ybWF0cy5pbmRleE9mKCdnZW9KU09OJykgIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5zZXJ2aWNlLm9wdGlvbnMuaXNNb2Rlcm4gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGNvcHlyaWdodCB0ZXh0IGxpc3RlZCBpbiBzZXJ2aWNlIG1ldGFkYXRhXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uICYmIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wgJiYgbWV0YWRhdGEuY29weXJpZ2h0VGV4dCkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbiA9IG1ldGFkYXRhLmNvcHlyaWdodFRleHQ7XG4gICAgICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5hZGRBdHRyaWJ1dGlvbih0aGlzLmdldEF0dHJpYnV0aW9uKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG5cbiAgICBtYXAub24oJ3pvb21lbmQnLCB0aGlzLl9oYW5kbGVab29tQ2hhbmdlLCB0aGlzKTtcblxuICAgIHJldHVybiBWaXJ0dWFsR3JpZC5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIG9uUmVtb3ZlOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgbWFwLm9mZignem9vbWVuZCcsIHRoaXMuX2hhbmRsZVpvb21DaGFuZ2UsIHRoaXMpO1xuXG4gICAgcmV0dXJuIFZpcnR1YWxHcmlkLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsIG1hcCk7XG4gIH0sXG5cbiAgZ2V0QXR0cmlidXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGZWF0dXJlIE1hbmFnZW1lbnRcbiAgICovXG5cbiAgY3JlYXRlQ2VsbDogZnVuY3Rpb24gKGJvdW5kcywgY29vcmRzKSB7XG4gICAgLy8gZG9udCBmZXRjaCBmZWF0dXJlcyBvdXRzaWRlIHRoZSBzY2FsZSByYW5nZSBkZWZpbmVkIGZvciB0aGUgbGF5ZXJcbiAgICBpZiAodGhpcy5fdmlzaWJsZVpvb20oKSkge1xuICAgICAgdGhpcy5fcmVxdWVzdEZlYXR1cmVzKGJvdW5kcywgY29vcmRzKTtcbiAgICB9XG4gIH0sXG5cbiAgX3JlcXVlc3RGZWF0dXJlczogZnVuY3Rpb24gKGJvdW5kcywgY29vcmRzLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX2FjdGl2ZVJlcXVlc3RzKys7XG5cbiAgICAvLyBvdXIgZmlyc3QgYWN0aXZlIHJlcXVlc3QgZmlyZXMgbG9hZGluZ1xuICAgIGlmICh0aGlzLl9hY3RpdmVSZXF1ZXN0cyA9PT0gMSkge1xuICAgICAgdGhpcy5maXJlKCdsb2FkaW5nJywge1xuICAgICAgICBib3VuZHM6IGJvdW5kc1xuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2J1aWxkUXVlcnkoYm91bmRzKS5ydW4oZnVuY3Rpb24gKGVycm9yLCBmZWF0dXJlQ29sbGVjdGlvbiwgcmVzcG9uc2UpIHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5leGNlZWRlZFRyYW5zZmVyTGltaXQpIHtcbiAgICAgICAgdGhpcy5maXJlKCdkcmF3bGltaXRleGNlZWRlZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBubyBlcnJvciwgZmVhdHVyZXNcbiAgICAgIGlmICghZXJyb3IgJiYgZmVhdHVyZUNvbGxlY3Rpb24gJiYgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIHNjaGVkdWxlIGFkZGluZyBmZWF0dXJlcyB1bnRpbCB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWVcbiAgICAgICAgVXRpbC5yZXF1ZXN0QW5pbUZyYW1lKFV0aWwuYmluZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5fYWRkRmVhdHVyZXMoZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMsIGNvb3Jkcyk7XG4gICAgICAgICAgdGhpcy5fcG9zdFByb2Nlc3NGZWF0dXJlcyhib3VuZHMpO1xuICAgICAgICB9LCB0aGlzKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIG5vIGVycm9yLCBubyBmZWF0dXJlc1xuICAgICAgaWYgKCFlcnJvciAmJiBmZWF0dXJlQ29sbGVjdGlvbiAmJiAhZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX3Bvc3RQcm9jZXNzRmVhdHVyZXMoYm91bmRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX3Bvc3RQcm9jZXNzRmVhdHVyZXMoYm91bmRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgZXJyb3IsIGZlYXR1cmVDb2xsZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfSxcblxuICBfcG9zdFByb2Nlc3NGZWF0dXJlczogZnVuY3Rpb24gKGJvdW5kcykge1xuICAgIC8vIGRlaW5jcmVtZW50IHRoZSByZXF1ZXN0IGNvdW50ZXIgbm93IHRoYXQgd2UgaGF2ZSBwcm9jZXNzZWQgZmVhdHVyZXNcbiAgICB0aGlzLl9hY3RpdmVSZXF1ZXN0cy0tO1xuXG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIG1vcmUgYWN0aXZlIHJlcXVlc3RzIGZpcmUgYSBsb2FkIGV2ZW50IGZvciB0aGlzIHZpZXdcbiAgICBpZiAodGhpcy5fYWN0aXZlUmVxdWVzdHMgPD0gMCkge1xuICAgICAgdGhpcy5maXJlKCdsb2FkJywge1xuICAgICAgICBib3VuZHM6IGJvdW5kc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIF9jYWNoZUtleTogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHJldHVybiBjb29yZHMueiArICc6JyArIGNvb3Jkcy54ICsgJzonICsgY29vcmRzLnk7XG4gIH0sXG5cbiAgX2FkZEZlYXR1cmVzOiBmdW5jdGlvbiAoZmVhdHVyZXMsIGNvb3Jkcykge1xuICAgIHZhciBrZXkgPSB0aGlzLl9jYWNoZUtleShjb29yZHMpO1xuICAgIHRoaXMuX2NhY2hlW2tleV0gPSB0aGlzLl9jYWNoZVtrZXldIHx8IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IGZlYXR1cmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgaWQgPSBmZWF0dXJlc1tpXS5pZDtcblxuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTbmFwc2hvdC5pbmRleE9mKGlkKSA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFNuYXBzaG90LnB1c2goaWQpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2NhY2hlW2tleV0uaW5kZXhPZihpZCkgPT09IC0xKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlW2tleV0ucHVzaChpZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50aW1lRmllbGQpIHtcbiAgICAgIHRoaXMuX2J1aWxkVGltZUluZGV4ZXMoZmVhdHVyZXMpO1xuICAgIH1cblxuICAgIHRoaXMuY3JlYXRlTGF5ZXJzKGZlYXR1cmVzKTtcbiAgfSxcblxuICBfYnVpbGRRdWVyeTogZnVuY3Rpb24gKGJvdW5kcykge1xuICAgIHZhciBxdWVyeSA9IHRoaXMuc2VydmljZS5xdWVyeSgpXG4gICAgICAuaW50ZXJzZWN0cyhib3VuZHMpXG4gICAgICAud2hlcmUodGhpcy5vcHRpb25zLndoZXJlKVxuICAgICAgLmZpZWxkcyh0aGlzLm9wdGlvbnMuZmllbGRzKVxuICAgICAgLnByZWNpc2lvbih0aGlzLm9wdGlvbnMucHJlY2lzaW9uKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2ltcGxpZnlGYWN0b3IpIHtcbiAgICAgIHF1ZXJ5LnNpbXBsaWZ5KHRoaXMuX21hcCwgdGhpcy5vcHRpb25zLnNpbXBsaWZ5RmFjdG9yKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWVGaWx0ZXJNb2RlID09PSAnc2VydmVyJyAmJiB0aGlzLm9wdGlvbnMuZnJvbSAmJiB0aGlzLm9wdGlvbnMudG8pIHtcbiAgICAgIHF1ZXJ5LmJldHdlZW4odGhpcy5vcHRpb25zLmZyb20sIHRoaXMub3B0aW9ucy50byk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9LFxuXG4gIC8qKlxuICAgKiBXaGVyZSBNZXRob2RzXG4gICAqL1xuXG4gIHNldFdoZXJlOiBmdW5jdGlvbiAod2hlcmUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5vcHRpb25zLndoZXJlID0gKHdoZXJlICYmIHdoZXJlLmxlbmd0aCkgPyB3aGVyZSA6ICcxPTEnO1xuXG4gICAgdmFyIG9sZFNuYXBzaG90ID0gW107XG4gICAgdmFyIG5ld1NuYXBzaG90ID0gW107XG4gICAgdmFyIHBlbmRpbmdSZXF1ZXN0cyA9IDA7XG4gICAgdmFyIHJlcXVlc3RFcnJvciA9IG51bGw7XG4gICAgdmFyIHJlcXVlc3RDYWxsYmFjayA9IFV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIGZlYXR1cmVDb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmVxdWVzdEVycm9yID0gZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChmZWF0dXJlQ29sbGVjdGlvbikge1xuICAgICAgICBmb3IgKHZhciBpID0gZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBuZXdTbmFwc2hvdC5wdXNoKGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzW2ldLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwZW5kaW5nUmVxdWVzdHMtLTtcblxuICAgICAgaWYgKHBlbmRpbmdSZXF1ZXN0cyA8PSAwKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTbmFwc2hvdCA9IG5ld1NuYXBzaG90O1xuICAgICAgICAvLyBzY2hlZHVsZSBhZGRpbmcgZmVhdHVyZXMgZm9yIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZVxuICAgICAgICBVdGlsLnJlcXVlc3RBbmltRnJhbWUoVXRpbC5iaW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxheWVycyhvbGRTbmFwc2hvdCk7XG4gICAgICAgICAgdGhpcy5hZGRMYXllcnMobmV3U25hcHNob3QpO1xuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCByZXF1ZXN0RXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcykpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgZm9yICh2YXIgaSA9IHRoaXMuX2N1cnJlbnRTbmFwc2hvdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgb2xkU25hcHNob3QucHVzaCh0aGlzLl9jdXJyZW50U25hcHNob3RbaV0pO1xuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9hY3RpdmVDZWxscykge1xuICAgICAgcGVuZGluZ1JlcXVlc3RzKys7XG4gICAgICB2YXIgY29vcmRzID0gdGhpcy5fa2V5VG9DZWxsQ29vcmRzKGtleSk7XG4gICAgICB2YXIgYm91bmRzID0gdGhpcy5fY2VsbENvb3Jkc1RvQm91bmRzKGNvb3Jkcyk7XG4gICAgICB0aGlzLl9yZXF1ZXN0RmVhdHVyZXMoYm91bmRzLCBrZXksIHJlcXVlc3RDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0V2hlcmU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLndoZXJlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUaW1lIFJhbmdlIE1ldGhvZHNcbiAgICovXG5cbiAgZ2V0VGltZVJhbmdlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFt0aGlzLm9wdGlvbnMuZnJvbSwgdGhpcy5vcHRpb25zLnRvXTtcbiAgfSxcblxuICBzZXRUaW1lUmFuZ2U6IGZ1bmN0aW9uIChmcm9tLCB0bywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB2YXIgb2xkRnJvbSA9IHRoaXMub3B0aW9ucy5mcm9tO1xuICAgIHZhciBvbGRUbyA9IHRoaXMub3B0aW9ucy50bztcbiAgICB2YXIgcGVuZGluZ1JlcXVlc3RzID0gMDtcbiAgICB2YXIgcmVxdWVzdEVycm9yID0gbnVsbDtcbiAgICB2YXIgcmVxdWVzdENhbGxiYWNrID0gVXRpbC5iaW5kKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlcXVlc3RFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhpcy5fZmlsdGVyRXhpc3RpbmdGZWF0dXJlcyhvbGRGcm9tLCBvbGRUbywgZnJvbSwgdG8pO1xuXG4gICAgICBwZW5kaW5nUmVxdWVzdHMtLTtcblxuICAgICAgaWYgKGNhbGxiYWNrICYmIHBlbmRpbmdSZXF1ZXN0cyA8PSAwKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgcmVxdWVzdEVycm9yKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcblxuICAgIHRoaXMub3B0aW9ucy5mcm9tID0gZnJvbTtcbiAgICB0aGlzLm9wdGlvbnMudG8gPSB0bztcblxuICAgIHRoaXMuX2ZpbHRlckV4aXN0aW5nRmVhdHVyZXMob2xkRnJvbSwgb2xkVG8sIGZyb20sIHRvKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUZpbHRlck1vZGUgPT09ICdzZXJ2ZXInKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fYWN0aXZlQ2VsbHMpIHtcbiAgICAgICAgcGVuZGluZ1JlcXVlc3RzKys7XG4gICAgICAgIHZhciBjb29yZHMgPSB0aGlzLl9rZXlUb0NlbGxDb29yZHMoa2V5KTtcbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxDb29yZHNUb0JvdW5kcyhjb29yZHMpO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0RmVhdHVyZXMoYm91bmRzLCBrZXksIHJlcXVlc3RDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcmVmcmVzaDogZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9hY3RpdmVDZWxscykge1xuICAgICAgdmFyIGNvb3JkcyA9IHRoaXMuX2tleVRvQ2VsbENvb3JkcyhrZXkpO1xuICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxDb29yZHNUb0JvdW5kcyhjb29yZHMpO1xuICAgICAgdGhpcy5fcmVxdWVzdEZlYXR1cmVzKGJvdW5kcywga2V5KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWRyYXcpIHtcbiAgICAgIHRoaXMub25jZSgnbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5lYWNoRmVhdHVyZShmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICAgICAgICB0aGlzLl9yZWRyYXcobGF5ZXIuZmVhdHVyZS5pZCk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICB9LFxuXG4gIF9maWx0ZXJFeGlzdGluZ0ZlYXR1cmVzOiBmdW5jdGlvbiAob2xkRnJvbSwgb2xkVG8sIG5ld0Zyb20sIG5ld1RvKSB7XG4gICAgdmFyIGxheWVyc1RvUmVtb3ZlID0gKG9sZEZyb20gJiYgb2xkVG8pID8gdGhpcy5fZ2V0RmVhdHVyZXNJblRpbWVSYW5nZShvbGRGcm9tLCBvbGRUbykgOiB0aGlzLl9jdXJyZW50U25hcHNob3Q7XG4gICAgdmFyIGxheWVyc1RvQWRkID0gdGhpcy5fZ2V0RmVhdHVyZXNJblRpbWVSYW5nZShuZXdGcm9tLCBuZXdUbyk7XG5cbiAgICBpZiAobGF5ZXJzVG9BZGQuaW5kZXhPZikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnNUb0FkZC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2hvdWxkUmVtb3ZlTGF5ZXIgPSBsYXllcnNUb1JlbW92ZS5pbmRleE9mKGxheWVyc1RvQWRkW2ldKTtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUxheWVyID49IDApIHtcbiAgICAgICAgICBsYXllcnNUb1JlbW92ZS5zcGxpY2Uoc2hvdWxkUmVtb3ZlTGF5ZXIsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2NoZWR1bGUgYWRkaW5nIGZlYXR1cmVzIHVudGlsIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZVxuICAgIFV0aWwucmVxdWVzdEFuaW1GcmFtZShVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5yZW1vdmVMYXllcnMobGF5ZXJzVG9SZW1vdmUpO1xuICAgICAgdGhpcy5hZGRMYXllcnMobGF5ZXJzVG9BZGQpO1xuICAgIH0sIHRoaXMpKTtcbiAgfSxcblxuICBfZ2V0RmVhdHVyZXNJblRpbWVSYW5nZTogZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgaWRzID0gW107XG4gICAgdmFyIHNlYXJjaDtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUZpZWxkLnN0YXJ0ICYmIHRoaXMub3B0aW9ucy50aW1lRmllbGQuZW5kKSB7XG4gICAgICB2YXIgc3RhcnRUaW1lcyA9IHRoaXMuX3N0YXJ0VGltZUluZGV4LmJldHdlZW4oc3RhcnQsIGVuZCk7XG4gICAgICB2YXIgZW5kVGltZXMgPSB0aGlzLl9lbmRUaW1lSW5kZXguYmV0d2VlbihzdGFydCwgZW5kKTtcbiAgICAgIHNlYXJjaCA9IHN0YXJ0VGltZXMuY29uY2F0KGVuZFRpbWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VhcmNoID0gdGhpcy5fdGltZUluZGV4LmJldHdlZW4oc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IHNlYXJjaC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWRzLnB1c2goc2VhcmNoW2ldLmlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWRzO1xuICB9LFxuXG4gIF9idWlsZFRpbWVJbmRleGVzOiBmdW5jdGlvbiAoZ2VvanNvbikge1xuICAgIHZhciBpO1xuICAgIHZhciBmZWF0dXJlO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUZpZWxkLnN0YXJ0ICYmIHRoaXMub3B0aW9ucy50aW1lRmllbGQuZW5kKSB7XG4gICAgICB2YXIgc3RhcnRUaW1lRW50cmllcyA9IFtdO1xuICAgICAgdmFyIGVuZFRpbWVFbnRyaWVzID0gW107XG4gICAgICBmb3IgKGkgPSBnZW9qc29uLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGZlYXR1cmUgPSBnZW9qc29uW2ldO1xuICAgICAgICBzdGFydFRpbWVFbnRyaWVzLnB1c2goe1xuICAgICAgICAgIGlkOiBmZWF0dXJlLmlkLFxuICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydF0pXG4gICAgICAgIH0pO1xuICAgICAgICBlbmRUaW1lRW50cmllcy5wdXNoKHtcbiAgICAgICAgICBpZDogZmVhdHVyZS5pZCxcbiAgICAgICAgICB2YWx1ZTogbmV3IERhdGUoZmVhdHVyZS5wcm9wZXJ0aWVzW3RoaXMub3B0aW9ucy50aW1lRmllbGQuZW5kXSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFydFRpbWVJbmRleC5idWxrQWRkKHN0YXJ0VGltZUVudHJpZXMpO1xuICAgICAgdGhpcy5fZW5kVGltZUluZGV4LmJ1bGtBZGQoZW5kVGltZUVudHJpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdGltZUVudHJpZXMgPSBbXTtcbiAgICAgIGZvciAoaSA9IGdlb2pzb24ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgZmVhdHVyZSA9IGdlb2pzb25baV07XG4gICAgICAgIHRpbWVFbnRyaWVzLnB1c2goe1xuICAgICAgICAgIGlkOiBmZWF0dXJlLmlkLFxuICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZF0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90aW1lSW5kZXguYnVsa0FkZCh0aW1lRW50cmllcyk7XG4gICAgfVxuICB9LFxuXG4gIF9mZWF0dXJlV2l0aGluVGltZVJhbmdlOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmZyb20gfHwgIXRoaXMub3B0aW9ucy50bykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGZyb20gPSArdGhpcy5vcHRpb25zLmZyb20udmFsdWVPZigpO1xuICAgIHZhciB0byA9ICt0aGlzLm9wdGlvbnMudG8udmFsdWVPZigpO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMudGltZUZpZWxkID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIGRhdGUgPSArZmVhdHVyZS5wcm9wZXJ0aWVzW3RoaXMub3B0aW9ucy50aW1lRmllbGRdO1xuICAgICAgcmV0dXJuIChkYXRlID49IGZyb20pICYmIChkYXRlIDw9IHRvKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydCAmJiB0aGlzLm9wdGlvbnMudGltZUZpZWxkLmVuZCkge1xuICAgICAgdmFyIHN0YXJ0RGF0ZSA9ICtmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydF07XG4gICAgICB2YXIgZW5kRGF0ZSA9ICtmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5lbmRdO1xuICAgICAgcmV0dXJuICgoc3RhcnREYXRlID49IGZyb20pICYmIChzdGFydERhdGUgPD0gdG8pKSB8fCAoKGVuZERhdGUgPj0gZnJvbSkgJiYgKGVuZERhdGUgPD0gdG8pKTtcbiAgICB9XG4gIH0sXG5cbiAgX3Zpc2libGVab29tOiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBvZiB0aGUgbWFwIGlzIHdpdGhpbiB0aGUgb3B0aW9uYWwgbGltaXQgZGVmaW5lZCBmb3IgdGhlIEZlYXR1cmVMYXllclxuICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKTtcbiAgICBpZiAoem9vbSA+IHRoaXMub3B0aW9ucy5tYXhab29tIHx8IHpvb20gPCB0aGlzLm9wdGlvbnMubWluWm9vbSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7IHJldHVybiB0cnVlOyB9XG4gIH0sXG5cbiAgX2hhbmRsZVpvb21DaGFuZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX3Zpc2libGVab29tKCkpIHtcbiAgICAgIHRoaXMucmVtb3ZlTGF5ZXJzKHRoaXMuX2N1cnJlbnRTbmFwc2hvdCk7XG4gICAgICB0aGlzLl9jdXJyZW50U25hcHNob3QgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLypcbiAgICAgIGZvciBldmVyeSBjZWxsIGluIHRoaXMuX2FjdGl2ZUNlbGxzXG4gICAgICAgIDEuIEdldCB0aGUgY2FjaGUga2V5IGZvciB0aGUgY29vcmRzIG9mIHRoZSBjZWxsXG4gICAgICAgIDIuIElmIHRoaXMuX2NhY2hlW2tleV0gZXhpc3RzIGl0IHdpbGwgYmUgYW4gYXJyYXkgb2YgZmVhdHVyZSBJRHMuXG4gICAgICAgIDMuIENhbGwgdGhpcy5hZGRMYXllcnModGhpcy5fY2FjaGVba2V5XSkgdG8gaW5zdHJ1Y3QgdGhlIGZlYXR1cmUgbGF5ZXIgdG8gYWRkIHRoZSBsYXllcnMgYmFjay5cbiAgICAgICovXG4gICAgICBmb3IgKHZhciBpIGluIHRoaXMuX2FjdGl2ZUNlbGxzKSB7XG4gICAgICAgIHZhciBjb29yZHMgPSB0aGlzLl9hY3RpdmVDZWxsc1tpXS5jb29yZHM7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLl9jYWNoZUtleShjb29yZHMpO1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVba2V5XSkge1xuICAgICAgICAgIHRoaXMuYWRkTGF5ZXJzKHRoaXMuX2NhY2hlW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTZXJ2aWNlIE1ldGhvZHNcbiAgICovXG5cbiAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB0aGlzLnNlcnZpY2UuYXV0aGVudGljYXRlKHRva2VuKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBtZXRhZGF0YTogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5zZXJ2aWNlLm1ldGFkYXRhKGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBxdWVyeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UucXVlcnkoKTtcbiAgfSxcblxuICBfZ2V0TWV0YWRhdGE6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9tZXRhZGF0YSkge1xuICAgICAgdmFyIGVycm9yO1xuICAgICAgY2FsbGJhY2soZXJyb3IsIHRoaXMuX21ldGFkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhZGF0YShVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICBjYWxsYmFjayhlcnJvciwgdGhpcy5fbWV0YWRhdGEpO1xuICAgICAgfSwgdGhpcykpO1xuICAgIH1cbiAgfSxcblxuICBhZGRGZWF0dXJlOiBmdW5jdGlvbiAoZmVhdHVyZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLl9nZXRNZXRhZGF0YShVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCBtZXRhZGF0YSkge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChjYWxsYmFjaykgeyBjYWxsYmFjay5jYWxsKHRoaXMsIGVycm9yLCBudWxsKTsgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VydmljZS5hZGRGZWF0dXJlKGZlYXR1cmUsIFV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAvLyBhc3NpZ24gSUQgZnJvbSByZXN1bHQgdG8gYXBwcm9wcmlhdGUgb2JqZWN0aWQgZmllbGQgZnJvbSBzZXJ2aWNlIG1ldGFkYXRhXG4gICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW21ldGFkYXRhLm9iamVjdElkRmllbGRdID0gcmVzcG9uc2Uub2JqZWN0SWQ7XG5cbiAgICAgICAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gdXBkYXRlIHRoZSBnZW9qc29uIGlkIGZvciBjcmVhdGVMYXllcnMoKSB0byBmdW5jdGlvblxuICAgICAgICAgIGZlYXR1cmUuaWQgPSByZXNwb25zZS5vYmplY3RJZDtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUxheWVycyhbZmVhdHVyZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzKSk7XG4gICAgfSwgdGhpcykpO1xuICB9LFxuXG4gIHVwZGF0ZUZlYXR1cmU6IGZ1bmN0aW9uIChmZWF0dXJlLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuc2VydmljZS51cGRhdGVGZWF0dXJlKGZlYXR1cmUsIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMYXllcnMoW2ZlYXR1cmUuaWRdLCB0cnVlKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMYXllcnMoW2ZlYXR1cmVdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfSxcblxuICBkZWxldGVGZWF0dXJlOiBmdW5jdGlvbiAoaWQsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5zZXJ2aWNlLmRlbGV0ZUZlYXR1cmUoaWQsIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGlmICghZXJyb3IgJiYgcmVzcG9uc2Uub2JqZWN0SWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMYXllcnMoW3Jlc3BvbnNlLm9iamVjdElkXSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICB9LFxuXG4gIGRlbGV0ZUZlYXR1cmVzOiBmdW5jdGlvbiAoaWRzLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZGVsZXRlRmVhdHVyZXMoaWRzLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoIWVycm9yICYmIHJlc3BvbnNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGF5ZXJzKFtyZXNwb25zZVtpXS5vYmplY3RJZF0sIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICB9XG59KTtcbiIsImltcG9ydCB7IFV0aWwsIEdlb0pTT04sIGxhdExuZyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgRmVhdHVyZU1hbmFnZXIgfSBmcm9tICcuL0ZlYXR1cmVNYW5hZ2VyJztcblxuZXhwb3J0IHZhciBGZWF0dXJlTGF5ZXIgPSBGZWF0dXJlTWFuYWdlci5leHRlbmQoe1xuXG4gIG9wdGlvbnM6IHtcbiAgICBjYWNoZUxheWVyczogdHJ1ZVxuICB9LFxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKi9cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIHRoaXMuX29yaWdpbmFsU3R5bGUgPSB0aGlzLm9wdGlvbnMuc3R5bGU7XG4gICAgdGhpcy5fbGF5ZXJzID0ge307XG4gIH0sXG5cbiAgLyoqXG4gICAqIExheWVyIEludGVyZmFjZVxuICAgKi9cblxuICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICBtYXAucmVtb3ZlTGF5ZXIodGhpcy5fbGF5ZXJzW2ldKTtcbiAgICAgIC8vIHRyaWdnZXIgdGhlIGV2ZW50IHdoZW4gdGhlIGVudGlyZSBmZWF0dXJlTGF5ZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBtYXBcbiAgICAgIHRoaXMuZmlyZSgncmVtb3ZlZmVhdHVyZScsIHtcbiAgICAgICAgZmVhdHVyZTogdGhpcy5fbGF5ZXJzW2ldLmZlYXR1cmUsXG4gICAgICAgIHBlcm1hbmVudDogZmFsc2VcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIGNyZWF0ZU5ld0xheWVyOiBmdW5jdGlvbiAoZ2VvanNvbikge1xuICAgIHZhciBsYXllciA9IEdlb0pTT04uZ2VvbWV0cnlUb0xheWVyKGdlb2pzb24sIHRoaXMub3B0aW9ucyk7XG4gICAgbGF5ZXIuZGVmYXVsdE9wdGlvbnMgPSBsYXllci5vcHRpb25zO1xuICAgIHJldHVybiBsYXllcjtcbiAgfSxcblxuICBfdXBkYXRlTGF5ZXI6IGZ1bmN0aW9uIChsYXllciwgZ2VvanNvbikge1xuICAgIC8vIGNvbnZlcnQgdGhlIGdlb2pzb24gY29vcmRpbmF0ZXMgaW50byBhIExlYWZsZXQgTGF0TG5nIGFycmF5L25lc3RlZCBhcnJheXNcbiAgICAvLyBwYXNzIGl0IHRvIHNldExhdExuZ3MgdG8gdXBkYXRlIGxheWVyIGdlb21ldHJpZXNcbiAgICB2YXIgbGF0bG5ncyA9IFtdO1xuICAgIHZhciBjb29yZHNUb0xhdExuZyA9IHRoaXMub3B0aW9ucy5jb29yZHNUb0xhdExuZyB8fCBHZW9KU09OLmNvb3Jkc1RvTGF0TG5nO1xuXG4gICAgLy8gY29weSBuZXcgYXR0cmlidXRlcywgaWYgcHJlc2VudFxuICAgIGlmIChnZW9qc29uLnByb3BlcnRpZXMpIHtcbiAgICAgIGxheWVyLmZlYXR1cmUucHJvcGVydGllcyA9IGdlb2pzb24ucHJvcGVydGllcztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGdlb2pzb24uZ2VvbWV0cnkudHlwZSkge1xuICAgICAgY2FzZSAnUG9pbnQnOlxuICAgICAgICBsYXRsbmdzID0gR2VvSlNPTi5jb29yZHNUb0xhdExuZyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgbGF5ZXIuc2V0TGF0TG5nKGxhdGxuZ3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0xpbmVTdHJpbmcnOlxuICAgICAgICBsYXRsbmdzID0gR2VvSlNPTi5jb29yZHNUb0xhdExuZ3MoZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlcywgMCwgY29vcmRzVG9MYXRMbmcpO1xuICAgICAgICBsYXllci5zZXRMYXRMbmdzKGxhdGxuZ3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ011bHRpTGluZVN0cmluZyc6XG4gICAgICAgIGxhdGxuZ3MgPSBHZW9KU09OLmNvb3Jkc1RvTGF0TG5ncyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzLCAxLCBjb29yZHNUb0xhdExuZyk7XG4gICAgICAgIGxheWVyLnNldExhdExuZ3MobGF0bG5ncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnUG9seWdvbic6XG4gICAgICAgIGxhdGxuZ3MgPSBHZW9KU09OLmNvb3Jkc1RvTGF0TG5ncyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzLCAxLCBjb29yZHNUb0xhdExuZyk7XG4gICAgICAgIGxheWVyLnNldExhdExuZ3MobGF0bG5ncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnTXVsdGlQb2x5Z29uJzpcbiAgICAgICAgbGF0bG5ncyA9IEdlb0pTT04uY29vcmRzVG9MYXRMbmdzKGdlb2pzb24uZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIDIsIGNvb3Jkc1RvTGF0TG5nKTtcbiAgICAgICAgbGF5ZXIuc2V0TGF0TG5ncyhsYXRsbmdzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBGZWF0dXJlIE1hbmFnZW1lbnQgTWV0aG9kc1xuICAgKi9cblxuICBjcmVhdGVMYXllcnM6IGZ1bmN0aW9uIChmZWF0dXJlcykge1xuICAgIGZvciAodmFyIGkgPSBmZWF0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGdlb2pzb24gPSBmZWF0dXJlc1tpXTtcblxuICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2dlb2pzb24uaWRdO1xuICAgICAgdmFyIG5ld0xheWVyO1xuXG4gICAgICBpZiAodGhpcy5fdmlzaWJsZVpvb20oKSAmJiBsYXllciAmJiAhdGhpcy5fbWFwLmhhc0xheWVyKGxheWVyKSkge1xuICAgICAgICB0aGlzLl9tYXAuYWRkTGF5ZXIobGF5ZXIpO1xuICAgICAgICB0aGlzLmZpcmUoJ2FkZGZlYXR1cmUnLCB7XG4gICAgICAgICAgZmVhdHVyZTogbGF5ZXIuZmVhdHVyZVxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gdXBkYXRlIGdlb21ldHJ5IGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKGxheWVyICYmIHRoaXMub3B0aW9ucy5zaW1wbGlmeUZhY3RvciA+IDAgJiYgKGxheWVyLnNldExhdExuZ3MgfHwgbGF5ZXIuc2V0TGF0TG5nKSkge1xuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllciwgZ2VvanNvbik7XG4gICAgICB9XG5cbiAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgbmV3TGF5ZXIgPSB0aGlzLmNyZWF0ZU5ld0xheWVyKGdlb2pzb24pO1xuICAgICAgICBuZXdMYXllci5mZWF0dXJlID0gZ2VvanNvbjtcblxuICAgICAgICAvLyBidWJibGUgZXZlbnRzIGZyb20gaW5kaXZpZHVhbCBsYXllcnMgdG8gdGhlIGZlYXR1cmUgbGF5ZXJcbiAgICAgICAgbmV3TGF5ZXIuYWRkRXZlbnRQYXJlbnQodGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkVhY2hGZWF0dXJlKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLm9uRWFjaEZlYXR1cmUobmV3TGF5ZXIuZmVhdHVyZSwgbmV3TGF5ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FjaGUgdGhlIGxheWVyXG4gICAgICAgIHRoaXMuX2xheWVyc1tuZXdMYXllci5mZWF0dXJlLmlkXSA9IG5ld0xheWVyO1xuXG4gICAgICAgIC8vIHN0eWxlIHRoZSBsYXllclxuICAgICAgICB0aGlzLnNldEZlYXR1cmVTdHlsZShuZXdMYXllci5mZWF0dXJlLmlkLCB0aGlzLm9wdGlvbnMuc3R5bGUpO1xuXG4gICAgICAgIHRoaXMuZmlyZSgnY3JlYXRlZmVhdHVyZScsIHtcbiAgICAgICAgICBmZWF0dXJlOiBuZXdMYXllci5mZWF0dXJlXG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIC8vIGFkZCB0aGUgbGF5ZXIgaWYgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBpcyBpbnNpZGUgdGhlIHJhbmdlIGRlZmluZWQgZm9yIHRoZSBsYXllciwgaXQgaXMgd2l0aGluIHRoZSBjdXJyZW50IHRpbWUgYm91bmRzIG9yIG91ciBsYXllciBpcyBub3QgdGltZSBlbmFibGVkXG4gICAgICAgIGlmICh0aGlzLl92aXNpYmxlWm9vbSgpICYmICghdGhpcy5vcHRpb25zLnRpbWVGaWVsZCB8fCAodGhpcy5vcHRpb25zLnRpbWVGaWVsZCAmJiB0aGlzLl9mZWF0dXJlV2l0aGluVGltZVJhbmdlKGdlb2pzb24pKSkpIHtcbiAgICAgICAgICB0aGlzLl9tYXAuYWRkTGF5ZXIobmV3TGF5ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGFkZExheWVyczogZnVuY3Rpb24gKGlkcykge1xuICAgIGZvciAodmFyIGkgPSBpZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tpZHNbaV1dO1xuICAgICAgaWYgKGxheWVyKSB7XG4gICAgICAgIHRoaXMuX21hcC5hZGRMYXllcihsYXllcik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlbW92ZUxheWVyczogZnVuY3Rpb24gKGlkcywgcGVybWFuZW50KSB7XG4gICAgZm9yICh2YXIgaSA9IGlkcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGlkID0gaWRzW2ldO1xuICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICAgIGlmIChsYXllcikge1xuICAgICAgICB0aGlzLmZpcmUoJ3JlbW92ZWZlYXR1cmUnLCB7XG4gICAgICAgICAgZmVhdHVyZTogbGF5ZXIuZmVhdHVyZSxcbiAgICAgICAgICBwZXJtYW5lbnQ6IHBlcm1hbmVudFxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKGxheWVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYXllciAmJiBwZXJtYW5lbnQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xheWVyc1tpZF07XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNlbGxFbnRlcjogZnVuY3Rpb24gKGJvdW5kcywgY29vcmRzKSB7XG4gICAgaWYgKHRoaXMuX3Zpc2libGVab29tKCkgJiYgIXRoaXMuX3pvb21pbmcgJiYgdGhpcy5fbWFwKSB7XG4gICAgICBVdGlsLnJlcXVlc3RBbmltRnJhbWUoVXRpbC5iaW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhY2hlS2V5ID0gdGhpcy5fY2FjaGVLZXkoY29vcmRzKTtcbiAgICAgICAgdmFyIGNlbGxLZXkgPSB0aGlzLl9jZWxsQ29vcmRzVG9LZXkoY29vcmRzKTtcbiAgICAgICAgdmFyIGxheWVycyA9IHRoaXMuX2NhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUNlbGxzW2NlbGxLZXldICYmIGxheWVycykge1xuICAgICAgICAgIHRoaXMuYWRkTGF5ZXJzKGxheWVycyk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpKTtcbiAgICB9XG4gIH0sXG5cbiAgY2VsbExlYXZlOiBmdW5jdGlvbiAoYm91bmRzLCBjb29yZHMpIHtcbiAgICBpZiAoIXRoaXMuX3pvb21pbmcpIHtcbiAgICAgIFV0aWwucmVxdWVzdEFuaW1GcmFtZShVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgdmFyIGNhY2hlS2V5ID0gdGhpcy5fY2FjaGVLZXkoY29vcmRzKTtcbiAgICAgICAgICB2YXIgY2VsbEtleSA9IHRoaXMuX2NlbGxDb29yZHNUb0tleShjb29yZHMpO1xuICAgICAgICAgIHZhciBsYXllcnMgPSB0aGlzLl9jYWNoZVtjYWNoZUtleV07XG4gICAgICAgICAgdmFyIG1hcEJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuX2FjdGl2ZUNlbGxzW2NlbGxLZXldICYmIGxheWVycykge1xuICAgICAgICAgICAgdmFyIHJlbW92YWJsZSA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcnNbaV1dO1xuICAgICAgICAgICAgICBpZiAobGF5ZXIgJiYgbGF5ZXIuZ2V0Qm91bmRzICYmIG1hcEJvdW5kcy5pbnRlcnNlY3RzKGxheWVyLmdldEJvdW5kcygpKSkge1xuICAgICAgICAgICAgICAgIHJlbW92YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW1vdmFibGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMYXllcnMobGF5ZXJzLCAhdGhpcy5vcHRpb25zLmNhY2hlTGF5ZXJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuY2FjaGVMYXllcnMgJiYgcmVtb3ZhYmxlKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWNoZVtjYWNoZUtleV07XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jZWxsc1tjZWxsS2V5XTtcbiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2FjdGl2ZUNlbGxzW2NlbGxLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgdGhpcykpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU3R5bGluZyBNZXRob2RzXG4gICAqL1xuXG4gIHJlc2V0U3R5bGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3R5bGUgPSB0aGlzLl9vcmlnaW5hbFN0eWxlO1xuICAgIHRoaXMuZWFjaEZlYXR1cmUoZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICB0aGlzLnJlc2V0RmVhdHVyZVN0eWxlKGxheWVyLmZlYXR1cmUuaWQpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNldFN0eWxlOiBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3R5bGUgPSBzdHlsZTtcbiAgICB0aGlzLmVhY2hGZWF0dXJlKGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgdGhpcy5zZXRGZWF0dXJlU3R5bGUobGF5ZXIuZmVhdHVyZS5pZCwgc3R5bGUpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJlc2V0RmVhdHVyZVN0eWxlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgIHZhciBzdHlsZSA9IHRoaXMuX29yaWdpbmFsU3R5bGUgfHwgTC5QYXRoLnByb3RvdHlwZS5vcHRpb25zO1xuICAgIGlmIChsYXllcikge1xuICAgICAgVXRpbC5leHRlbmQobGF5ZXIub3B0aW9ucywgbGF5ZXIuZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgdGhpcy5zZXRGZWF0dXJlU3R5bGUoaWQsIHN0eWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgc2V0RmVhdHVyZVN0eWxlOiBmdW5jdGlvbiAoaWQsIHN0eWxlKSB7XG4gICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICBpZiAodHlwZW9mIHN0eWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdHlsZSA9IHN0eWxlKGxheWVyLmZlYXR1cmUpO1xuICAgIH1cbiAgICBpZiAobGF5ZXIuc2V0U3R5bGUpIHtcbiAgICAgIGxheWVyLnNldFN0eWxlKHN0eWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFV0aWxpdHkgTWV0aG9kc1xuICAgKi9cblxuICBlYWNoQWN0aXZlRmVhdHVyZTogZnVuY3Rpb24gKGZuLCBjb250ZXh0KSB7XG4gICAgLy8gZmlndXJlIG91dCAocm91Z2hseSkgd2hpY2ggbGF5ZXJzIGFyZSBpbiB2aWV3XG4gICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgdmFyIGFjdGl2ZUJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTtcbiAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgIGlmIChhY3RpdmVCb3VuZHMuaW50ZXJzZWN0cyh0aGlzLl9sYXllcnNbaV0uZ2V0Qm91bmRzKCkpICYmIHRoaXMuX2N1cnJlbnRTbmFwc2hvdC5pbmRleE9mKHRoaXMuX2xheWVyc1tpXS5mZWF0dXJlLmlkKSAhPT0gLTEpIHtcbiAgICAgICAgICBmbi5jYWxsKGNvbnRleHQsIHRoaXMuX2xheWVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZWFjaEZlYXR1cmU6IGZ1bmN0aW9uIChmbiwgY29udGV4dCkge1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICBmbi5jYWxsKGNvbnRleHQsIHRoaXMuX2xheWVyc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldEZlYXR1cmU6IGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiB0aGlzLl9sYXllcnNbaWRdO1xuICB9LFxuXG4gIGJyaW5nVG9CYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lYWNoRmVhdHVyZShmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICAgIGlmIChsYXllci5icmluZ1RvQmFjaykge1xuICAgICAgICBsYXllci5icmluZ1RvQmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIGJyaW5nVG9Gcm9udDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZWFjaEZlYXR1cmUoZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICBpZiAobGF5ZXIuYnJpbmdUb0Zyb250KSB7XG4gICAgICAgIGxheWVyLmJyaW5nVG9Gcm9udCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIHJlZHJhdzogZnVuY3Rpb24gKGlkKSB7XG4gICAgaWYgKGlkKSB7XG4gICAgICB0aGlzLl9yZWRyYXcoaWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBfcmVkcmF3OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgIHZhciBnZW9qc29uID0gbGF5ZXIuZmVhdHVyZTtcblxuICAgIC8vIGlmIHRoaXMgbG9va3MgbGlrZSBhIG1hcmtlclxuICAgIGlmIChsYXllciAmJiBsYXllci5zZXRJY29uICYmIHRoaXMub3B0aW9ucy5wb2ludFRvTGF5ZXIpIHtcbiAgICAgIC8vIHVwZGF0ZSBjdXN0b20gc3ltYm9sb2d5LCBpZiBuZWNlc3NhcnlcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9pbnRUb0xheWVyKSB7XG4gICAgICAgIHZhciBnZXRJY29uID0gdGhpcy5vcHRpb25zLnBvaW50VG9MYXllcihnZW9qc29uLCBsYXRMbmcoZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSwgZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlc1swXSkpO1xuICAgICAgICB2YXIgdXBkYXRlZEljb24gPSBnZXRJY29uLm9wdGlvbnMuaWNvbjtcbiAgICAgICAgbGF5ZXIuc2V0SWNvbih1cGRhdGVkSWNvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbG9va3MgbGlrZSBhIHZlY3RvciBtYXJrZXIgKGNpcmNsZU1hcmtlcilcbiAgICBpZiAobGF5ZXIgJiYgbGF5ZXIuc2V0U3R5bGUgJiYgdGhpcy5vcHRpb25zLnBvaW50VG9MYXllcikge1xuICAgICAgdmFyIGdldFN0eWxlID0gdGhpcy5vcHRpb25zLnBvaW50VG9MYXllcihnZW9qc29uLCBsYXRMbmcoZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSwgZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlc1swXSkpO1xuICAgICAgdmFyIHVwZGF0ZWRTdHlsZSA9IGdldFN0eWxlLm9wdGlvbnM7XG4gICAgICB0aGlzLnNldEZlYXR1cmVTdHlsZShnZW9qc29uLmlkLCB1cGRhdGVkU3R5bGUpO1xuICAgIH1cblxuICAgIC8vIGxvb2tzIGxpa2UgYSBwYXRoIChwb2x5Z29uL3BvbHlsaW5lKVxuICAgIGlmIChsYXllciAmJiBsYXllci5zZXRTdHlsZSAmJiB0aGlzLm9wdGlvbnMuc3R5bGUpIHtcbiAgICAgIHRoaXMucmVzZXRTdHlsZShnZW9qc29uLmlkKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZUxheWVyIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRmVhdHVyZUxheWVyKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmZWF0dXJlTGF5ZXI7XG4iXSwibmFtZXMiOlsiVXRpbCIsIkRvbVV0aWwiLCJzaGFsbG93Q2xvbmUiLCJhcmNnaXNUb0dlb0pTT04iLCJnZW9qc29uVG9BcmNHSVMiLCJnMmEiLCJhMmciLCJsYXRMbmciLCJsYXRMbmdCb3VuZHMiLCJDbGFzcyIsInBvaW50IiwiTGF0TG5nQm91bmRzIiwiTGF0TG5nIiwiR2VvSlNPTiIsIkV2ZW50ZWQiLCJUaWxlTGF5ZXIiLCJJbWFnZU92ZXJsYXkiLCJDUlMiLCJMYXllciIsInBvcHVwIiwiTCIsInNldE9wdGlvbnMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Q0NBTyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxpQkFBaUIsSUFBSSxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEcsQ0FBTyxJQUFJLGFBQWEsR0FB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QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEYsQ0FBQSxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLENBQUEsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFakYsQ0FBQSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRTtBQUNoQixDQUFBLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUN0QixDQUFBLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7QUFFdEIsQ0FBQSxJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtBQUNsRCxDQUFBLE1BQU0sT0FBTyxJQUFJLENBQUM7QUFDbEIsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUEsQ0FBQzs7QUFFRCxDQUFBO0FBQ0EsQ0FBQSxTQUFTLG9CQUFvQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDckMsQ0FBQSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6QyxDQUFBLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzNDLENBQUEsTUFBTSxJQUFJLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDbEUsQ0FBQSxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLENBQUEsT0FBTztBQUNQLENBQUEsS0FBSztBQUNMLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFBLENBQUM7O0FBRUQsQ0FBQTtBQUNBLENBQUEsU0FBUyx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO0FBQ3RELENBQUEsRUFBRSxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7QUFDdkIsQ0FBQSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDdEUsQ0FBQSxJQUFJLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RSxDQUFBLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxDQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDN0osQ0FBQSxNQUFNLFFBQVEsR0FBRyxDQUFDLFFBQVEsQ0FBQztBQUMzQixDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7QUFDSCxDQUFBLEVBQUUsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQSxDQUFDOztBQUVE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RTtBQUN4QyxDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO0FBQ3ZCLENBQUEsTUFBTSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDOUUsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDL0UsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxRQUFRLEVBQUUsVUFBVSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFO0FBQy9ELENBQUEsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7O0FBRWxILENBQUEsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxNQUFNLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtBQUM3RSxDQUFBLE1BQU0sT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMvRCxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzNELENBQUEsR0FBRztBQUNILENBQUEsQ0FBQyxDQUFDLENBQUM7O0FBRUgsQ0FBTyxTQUFTLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDL0IsQ0FBQSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0IsQ0FBQSxDQUFDOztDQzVETSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQy9CLENBQUEsRUFBRSxPQUFPLEVBQUU7QUFDWCxDQUFBLElBQUksUUFBUSxFQUFFLGNBQWM7QUFDNUIsQ0FBQSxJQUFJLE9BQU8sRUFBRSxtQkFBbUI7QUFDaEMsQ0FBQSxJQUFJLFFBQVEsRUFBRSxXQUFXO0FBQ3pCLENBQUEsSUFBSSxXQUFXLEVBQUUsbUJBQW1CO0FBQ3BDLENBQUEsSUFBSSxZQUFZLEVBQUUsV0FBVztBQUM3QixDQUFBLElBQUksZ0JBQWdCLEVBQUUsZ0JBQWdCO0FBQ3RDLENBQUEsSUFBSSxPQUFPLEVBQUUsT0FBTztBQUNwQixDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLElBQUksRUFBRSxPQUFPOztBQUVmLENBQUEsRUFBRSxNQUFNLEVBQUU7QUFDVixDQUFBLElBQUksY0FBYyxFQUFFLElBQUk7QUFDeEIsQ0FBQSxJQUFJLEtBQUssRUFBRSxLQUFLO0FBQ2hCLENBQUEsSUFBSSxLQUFLLEVBQUUsSUFBSTtBQUNmLENBQUEsSUFBSSxTQUFTLEVBQUUsR0FBRztBQUNsQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxNQUFNLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDOUIsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLHdCQUF3QixDQUFDO0FBQ3RELENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxVQUFVLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDbEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLDBCQUEwQixDQUFDO0FBQ3hELENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxRQUFRLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLHNCQUFzQixDQUFDO0FBQ3BELENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxPQUFPLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDL0IsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLHVCQUF1QixDQUFDO0FBQ3JELENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxPQUFPLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDL0IsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLHVCQUF1QixDQUFDO0FBQ3JELENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxRQUFRLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxN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QUFDOztBQUVqRSxDQUFBLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDeEMsQ0FBQSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDOztBQUVwRSxDQUFBLElBQUksSUFBSSxNQUFNLEdBQUc7QUFDakIsQ0FBQSxNQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQzlDLENBQUEsTUFBTSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDakMsQ0FBQSxNQUFNLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07QUFDakMsQ0FBQSxNQUFNLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7QUFDM0MsQ0FBQSxNQUFNLE1BQU0sRUFBRSxFQUFFO0FBQ2hCLENBQUEsTUFBTSxPQUFPLEVBQUUsRUFBRTtBQUNqQixDQUFBLEtBQUssQ0FBQzs7QUFFTixDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRTtBQUM5QyxDQUFBLE1BQU0sTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUks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QztBQUM5RCxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7QUFDaEMsQ0FBQSxNQUFNLE1BQU0sQ0FBQyxTQUFTLEdBQUcsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3RJLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTtBQUNsQyxDQUFBLE1BQU0sTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDcEUsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFO0FBQzlDLENBQUEsTUFBTSxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNsRixDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO0FBQ3BDLENBQUEsTUFBTSxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUNoRCxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDNUIsQ0FBQSxNQUFNLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FB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QSxHQUFHOztBQUVILENBQUEsRUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHLEVBQUU7QUFDL0UsQ0FBQSxJQUFJLFFBQVEsRUFBRSxDQUFDO0FBQ2YsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ2pHLENBQUEsSUFBSSxRQUFRLEVBQUUsQ0FBQztBQUNmLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDakQsQ0FBQSxDQUFDLENBQUM7O0FBRUYsQ0FBQSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTSxFQUFFLElBQUksRUFBRTtBQUM1RCxDQUFBLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pELENBQUEsRUFBRSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUEsQ0FBQyxDQUFDOztBQUVGLENBQUEsaUJBQWlCLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxTQUFTLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0FBQ3JFLENBQUEsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FB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QUFTLENBQUMsQ0FBQztBQUM3RCxDQUFBLE1BQU0sT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM1QyxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtBQUNwRSxDQUFBLE1BQU0sSUFBSSxTQUFTLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hFLENBQUEsTUFBTSxJQUFJLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEUsQ0FBQSxNQUFNLE9BQU8sQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsRyxDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFlBQVksRUFBRSxZQUFZO0FBQzVCLENBQUE7QUFDQSxDQUFBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDcEIsQ0FBQSxNQUFNLE9BQU8sS0FBSyxDQUFDO0FBQ25CLENBQUEsS0FBSztBQUNMLENBQUEsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ25DLENBQUEsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFP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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-cluster-2.0.0.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,185 @@
+/* esri-leaflet-cluster - v2.0.0 - Thu Aug 18 2016 17:12:43 GMT-0700 (PDT)
+ * Copyright (c) 2016 Environmental Systems Research Institute, Inc.
+ * Apache-2.0 */
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet'), require('esri-leaflet')) :
+	typeof define === 'function' && define.amd ? define(['exports', 'leaflet', 'esri-leaflet'], factory) :
+	(factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.Cluster = global.L.esri.Cluster || {}),global.L,global.L.esri));
+}(this, function (exports,L,esriLeaflet) { 'use strict';
+
+	L = 'default' in L ? L['default'] : L;
+
+	var version = "2.0.0";
+
+	var FeatureLayer = esriLeaflet.FeatureManager.extend({
+
+	  statics: {
+	    EVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose',
+	    CLUSTEREVENTS: 'clusterclick clusterdblclick clustermouseover clustermouseout clustermousemove clustercontextmenu'
+	  },
+
+	  /**
+	   * Constructor
+	   */
+
+	  initialize: function (options) {
+	    esriLeaflet.FeatureManager.prototype.initialize.call(this, options);
+
+	    options = L.setOptions(this, options);
+
+	    this._layers = {};
+	    this._leafletIds = {};
+
+	    this.cluster = L.markerClusterGroup(options);
+	    this._key = 'c' + (Math.random() * 1e9).toString(36).replace('.', '_');
+
+	    this.cluster.addEventParent(this);
+	  },
+
+	  /**
+	   * Layer Interface
+	   */
+
+	  onAdd: function (map) {
+	    esriLeaflet.FeatureManager.prototype.onAdd.call(this, map);
+	    this._map.addLayer(this.cluster);
+	  },
+
+	  onRemove: function (map) {
+	    esriLeaflet.FeatureManager.prototype.onRemove.call(this, map);
+	    this._map.removeLayer(this.cluster);
+	  },
+
+	  /**
+	   * Feature Management Methods
+	   */
+
+	  createLayers: function (features) {
+	    var markers = [];
+
+	    for (var i = features.length - 1; i >= 0; i--) {
+	      var geojson = features[i];
+	      var layer = this._layers[geojson.id];
+
+	      if (!layer) {
+	        var newLayer = L.GeoJSON.geometryToLayer(geojson, this.options);
+	        newLayer.feature = L.GeoJSON.asFeature(geojson);
+	        newLayer.defaultOptions = newLayer.options;
+	        newLayer._leaflet_id = this._key + '_' + geojson.id;
+
+	        this.resetStyle(newLayer.feature.id);
+
+	        // cache the layer
+	        this._layers[newLayer.feature.id] = newLayer;
+
+	        this._leafletIds[newLayer._leaflet_id] = geojson.id;
+
+	        if (this.options.onEachFeature) {
+	          this.options.onEachFeature(newLayer.feature, newLayer);
+	        }
+
+	        this.fire('createfeature', {
+	          feature: newLayer.feature
+	        });
+
+	        // add the layer if it is within the time bounds or our layer is not time enabled
+	        if (!this.options.timeField || (this.options.timeField && this._featureWithinTimeRange(geojson))) {
+	          markers.push(newLayer);
+	        }
+	      }
+	    }
+
+	    if (markers.length) {
+	      this.cluster.addLayers(markers);
+	    }
+	  },
+
+	  addLayers: function (ids) {
+	    var layersToAdd = [];
+	    for (var i = ids.length - 1; i >= 0; i--) {
+	      var layer = this._layers[ids[i]];
+	      this.fire('addfeature', {
+	        feature: layer.feature
+	      });
+	      layersToAdd.push(layer);
+	    }
+	    this.cluster.addLayers(layersToAdd);
+	  },
+
+	  removeLayers: function (ids, permanent) {
+	    var layersToRemove = [];
+	    for (var i = ids.length - 1; i >= 0; i--) {
+	      var id = ids[i];
+	      var layer = this._layers[id];
+	      this.fire('removefeature', {
+	        feature: layer.feature,
+	        permanent: permanent
+	      });
+	      layersToRemove.push(layer);
+	      if (this._layers[id] && permanent) {
+	        delete this._layers[id];
+	      }
+	    }
+	    this.cluster.removeLayers(layersToRemove);
+	  },
+
+	  /**
+	   * Styling Methods
+	   */
+
+	  resetStyle: function (id) {
+	    var layer = this._layers[id];
+
+	    if (layer) {
+	      layer.options = layer.defaultOptions;
+	      this.setFeatureStyle(layer.feature.id, this.options.style);
+	    }
+
+	    return this;
+	  },
+
+	  setStyle: function (style) {
+	    this.eachFeature(function (layer) {
+	      this.setFeatureStyle(layer.feature.id, style);
+	    }, this);
+	    return this;
+	  },
+
+	  setFeatureStyle: function (id, style) {
+	    var layer = this._layers[id];
+
+	    if (typeof style === 'function') {
+	      style = style(layer.feature);
+	    }
+	    if (layer.setStyle) {
+	      layer.setStyle(style);
+	    }
+	  },
+
+	  /**
+	   * Utility Methods
+	   */
+
+	  eachFeature: function (fn, context) {
+	    for (var i in this._layers) {
+	      fn.call(context, this._layers[i]);
+	    }
+	    return this;
+	  },
+
+	  getFeature: function (id) {
+	    return this._layers[id];
+	  }
+	});
+
+	function featureLayer (options) {
+	  return new FeatureLayer(options);
+	}
+
+	exports.FeatureLayer = FeatureLayer;
+	exports.featureLayer = featureLayer;
+	exports['default'] = featureLayer;
+	exports.VERSION = version;
+
+}));
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWNsdXN0ZXItZGVidWcuanMiLCJzb3VyY2VzIjpbIi4uL3BhY2thZ2UuanNvbiIsIi4uL3NyYy9DbHVzdGVyZWRGZWF0dXJlTGF5ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsie1xuICBcIm5hbWVcIjogXCJlc3JpLWxlYWZsZXQtY2x1c3RlclwiLFxuICBcImRlc2NyaXB0aW9uXCI6IFwiRXNyaSBMZWFmbGV0IHBsdWdpbiBmb3IgdmlzdWFsaXppbmcgRmVhdHVyZSBMYXllcnMgYXMgY2x1c3RlcnMgd2l0aCBMLm1hcmtlcmNsdXN0ZXIuXCIsXG4gIFwidmVyc2lvblwiOiBcIjIuMC4wXCIsXG4gIFwiYXV0aG9yXCI6IFwiUGF0cmljayBBcmx0IDxwYXJsdEBlc3JpLmNvbT4gKGh0dHA6Ly9wYXRyaWNrYXJsdC5jb20pXCIsXG4gIFwiY29udHJpYnV0b3JzXCI6IFtcbiAgICBcIlBhdHJpY2sgQXJsdCA8cGFybHRAZXNyaS5jb20+IChodHRwOi8vcGF0cmlja2FybHQuY29tKVwiLFxuICAgIFwiSm9obiBHcmF2b2lzIDxqZ3Jhdm9pc0Blc3JpLmNvbT4gKGh0dHA6Ly9qb2huZ3Jhdm9pcy5jb20pXCJcbiAgXSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiZXNyaS1sZWFmbGV0XCI6IFwiXjIuMC4wXCIsXG4gICAgXCJsZWFmbGV0XCI6IFwiXjEuMC4wLXJjLjNcIixcbiAgICBcImxlYWZsZXQubWFya2VyY2x1c3RlclwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vTGVhZmxldC9MZWFmbGV0Lm1hcmtlcmNsdXN0ZXIuZ2l0I3YxLjAuMC1yYy4xXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiY2hhaVwiOiBcIjIuMy4wXCIsXG4gICAgXCJnaC1yZWxlYXNlXCI6IFwiXjIuMC4wXCIsXG4gICAgXCJodHRwLXNlcnZlclwiOiBcIl4wLjguNVwiLFxuICAgIFwiaXNwYXJ0YVwiOiBcIl4zLjAuM1wiLFxuICAgIFwiaXN0YW5idWxcIjogXCJeMC40LjJcIixcbiAgICBcImthcm1hXCI6IFwiXjAuMTIuMjRcIixcbiAgICBcImthcm1hLWNoYWktc2lub25cIjogXCJeMC4xLjNcIixcbiAgICBcImthcm1hLWNvdmVyYWdlXCI6IFwiXjAuNS4zXCIsXG4gICAgXCJrYXJtYS1tb2NoYVwiOiBcIl4wLjEuMFwiLFxuICAgIFwia2FybWEtbW9jaGEtcmVwb3J0ZXJcIjogXCJeMC4yLjVcIixcbiAgICBcImthcm1hLXBoYW50b21qcy1sYXVuY2hlclwiOiBcIl4wLjEuNFwiLFxuICAgIFwia2FybWEtc291cmNlbWFwLWxvYWRlclwiOiBcIl4wLjMuNVwiLFxuICAgIFwibWtkaXJwXCI6IFwiXjAuNS4xXCIsXG4gICAgXCJub2RlLXNhc3NcIjogXCJeMy4yLjBcIixcbiAgICBcInBoYW50b21qc1wiOiBcIl4xLjkuMTdcIixcbiAgICBcInJvbGx1cFwiOiBcIl4wLjI1LjRcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tanNvblwiOiBcIl4yLjAuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1ub2RlLXJlc29sdmVcIjogXCJeMS40LjBcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tdWdsaWZ5XCI6IFwiXjAuMy4xXCIsXG4gICAgXCJzZW1pc3RhbmRhcmRcIjogXCJeNy4wLjRcIixcbiAgICBcInNpbm9uXCI6IFwiXjEuMTEuMVwiLFxuICAgIFwic2lub24tY2hhaVwiOiBcIjIuNy4wXCIsXG4gICAgXCJzbmF6enlcIjogXCJeMi4wLjFcIixcbiAgICBcIndhdGNoXCI6IFwiXjAuMTcuMVwiXG4gIH0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vRXNyaS9lc3JpLWxlYWZsZXQtY2x1c3RlclwiLFxuICBcImpzbmV4dDptYWluXCI6IFwic3JjL0NsdXN0ZXJlZEZlYXR1cmVMYXllci5qc1wiLFxuICBcImpzcG1cIjoge1xuICAgIFwicmVnaXN0cnlcIjogXCJucG1cIixcbiAgICBcImZvcm1hdFwiOiBcImVzNlwiLFxuICAgIFwibWFpblwiOiBcInNyYy9DbHVzdGVyZWRGZWF0dXJlTGF5ZXIuanNcIlxuICB9LFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImFyY2dpc1wiLFxuICAgIFwiZXNyaVwiLFxuICAgIFwiZXNyaSBsZWFmbGV0XCIsXG4gICAgXCJnaXNcIixcbiAgICBcImxlYWZsZXQgcGx1Z2luXCIsXG4gICAgXCJtYXBwaW5nXCJcbiAgXSxcbiAgXCJsaWNlbnNlXCI6IFwiQXBhY2hlLTIuMFwiLFxuICBcIm1haW5cIjogXCJkaXN0L2VzcmktbGVhZmxldC1jbHVzdGVyLWRlYnVnLmpzXCIsXG4gIFwicmVhZG1lRmlsZW5hbWVcIjogXCJSRUFETUUubWRcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vRXNyaS9lc3JpLWxlYWZsZXQtY2x1c3Rlci5naXRcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwicHJlYnVpbGRcIjogXCJta2RpcnAgZGlzdFwiLFxuICAgIFwiYnVpbGRcIjogXCJyb2xsdXAgLWMgcHJvZmlsZXMvZGVidWcuanMgJiByb2xsdXAgLWMgcHJvZmlsZXMvcHJvZHVjdGlvbi5qc1wiLFxuICAgIFwibGludFwiOiBcInNlbWlzdGFuZGFyZCBzcmMvKi5qcyB8IHNuYXp6eVwiLFxuICAgIFwicHJlcHVibGlzaFwiOiBcIm5wbSBydW4gYnVpbGRcIixcbiAgICBcInByZXRlc3RcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJyZWxlYXNlXCI6IFwiLi9zY3JpcHRzL3JlbGVhc2Uuc2hcIixcbiAgICBcInN0YXJ0XCI6IFwid2F0Y2ggJ25wbSBydW4gYnVpbGQnIHNyYyAmIGh0dHAtc2VydmVyIC1wIDU2NzggLWMtMSAtb1wiLFxuICAgIFwidGVzdFwiOiBcIm5wbSBydW4gbGludCAmJiBrYXJtYSBzdGFydFwiXG4gIH1cbn0iLCJleHBvcnQge3ZlcnNpb24gYXMgVkVSU0lPTn0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcblxuaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBGZWF0dXJlTWFuYWdlciB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5cbmV4cG9ydCB2YXIgRmVhdHVyZUxheWVyID0gRmVhdHVyZU1hbmFnZXIuZXh0ZW5kKHtcblxuICBzdGF0aWNzOiB7XG4gICAgRVZFTlRTOiAnY2xpY2sgZGJsY2xpY2sgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlbW92ZSBjb250ZXh0bWVudSBwb3B1cG9wZW4gcG9wdXBjbG9zZScsXG4gICAgQ0xVU1RFUkVWRU5UUzogJ2NsdXN0ZXJjbGljayBjbHVzdGVyZGJsY2xpY2sgY2x1c3Rlcm1vdXNlb3ZlciBjbHVzdGVybW91c2VvdXQgY2x1c3Rlcm1vdXNlbW92ZSBjbHVzdGVyY29udGV4dG1lbnUnXG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqL1xuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgRmVhdHVyZU1hbmFnZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICAgIG9wdGlvbnMgPSBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG5cbiAgICB0aGlzLl9sYXllcnMgPSB7fTtcbiAgICB0aGlzLl9sZWFmbGV0SWRzID0ge307XG5cbiAgICB0aGlzLmNsdXN0ZXIgPSBMLm1hcmtlckNsdXN0ZXJHcm91cChvcHRpb25zKTtcbiAgICB0aGlzLl9rZXkgPSAnYycgKyAoTWF0aC5yYW5kb20oKSAqIDFlOSkudG9TdHJpbmcoMzYpLnJlcGxhY2UoJy4nLCAnXycpO1xuXG4gICAgdGhpcy5jbHVzdGVyLmFkZEV2ZW50UGFyZW50KHRoaXMpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBMYXllciBJbnRlcmZhY2VcbiAgICovXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLCBtYXApO1xuICAgIHRoaXMuX21hcC5hZGRMYXllcih0aGlzLmNsdXN0ZXIpO1xuICB9LFxuXG4gIG9uUmVtb3ZlOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgRmVhdHVyZU1hbmFnZXIucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcywgbWFwKTtcbiAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5jbHVzdGVyKTtcbiAgfSxcblxuICAvKipcbiAgICogRmVhdHVyZSBNYW5hZ2VtZW50IE1ldGhvZHNcbiAgICovXG5cbiAgY3JlYXRlTGF5ZXJzOiBmdW5jdGlvbiAoZmVhdHVyZXMpIHtcbiAgICB2YXIgbWFya2VycyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IGZlYXR1cmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZ2VvanNvbiA9IGZlYXR1cmVzW2ldO1xuICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2dlb2pzb24uaWRdO1xuXG4gICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgIHZhciBuZXdMYXllciA9IEwuR2VvSlNPTi5nZW9tZXRyeVRvTGF5ZXIoZ2VvanNvbiwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgbmV3TGF5ZXIuZmVhdHVyZSA9IEwuR2VvSlNPTi5hc0ZlYXR1cmUoZ2VvanNvbik7XG4gICAgICAgIG5ld0xheWVyLmRlZmF1bHRPcHRpb25zID0gbmV3TGF5ZXIub3B0aW9ucztcbiAgICAgICAgbmV3TGF5ZXIuX2xlYWZsZXRfaWQgPSB0aGlzLl9rZXkgKyAnXycgKyBnZW9qc29uLmlkO1xuXG4gICAgICAgIHRoaXMucmVzZXRTdHlsZShuZXdMYXllci5mZWF0dXJlLmlkKTtcblxuICAgICAgICAvLyBjYWNoZSB0aGUgbGF5ZXJcbiAgICAgICAgdGhpcy5fbGF5ZXJzW25ld0xheWVyLmZlYXR1cmUuaWRdID0gbmV3TGF5ZXI7XG5cbiAgICAgICAgdGhpcy5fbGVhZmxldElkc1tuZXdMYXllci5fbGVhZmxldF9pZF0gPSBnZW9qc29uLmlkO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMub25FYWNoRmVhdHVyZSkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5vbkVhY2hGZWF0dXJlKG5ld0xheWVyLmZlYXR1cmUsIG5ld0xheWVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnY3JlYXRlZmVhdHVyZScsIHtcbiAgICAgICAgICBmZWF0dXJlOiBuZXdMYXllci5mZWF0dXJlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGFkZCB0aGUgbGF5ZXIgaWYgaXQgaXMgd2l0aGluIHRoZSB0aW1lIGJvdW5kcyBvciBvdXIgbGF5ZXIgaXMgbm90IHRpbWUgZW5hYmxlZFxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50aW1lRmllbGQgfHwgKHRoaXMub3B0aW9ucy50aW1lRmllbGQgJiYgdGhpcy5fZmVhdHVyZVdpdGhpblRpbWVSYW5nZShnZW9qc29uKSkpIHtcbiAgICAgICAgICBtYXJrZXJzLnB1c2gobmV3TGF5ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1hcmtlcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNsdXN0ZXIuYWRkTGF5ZXJzKG1hcmtlcnMpO1xuICAgIH1cbiAgfSxcblxuICBhZGRMYXllcnM6IGZ1bmN0aW9uIChpZHMpIHtcbiAgICB2YXIgbGF5ZXJzVG9BZGQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gaWRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRzW2ldXTtcbiAgICAgIHRoaXMuZmlyZSgnYWRkZmVhdHVyZScsIHtcbiAgICAgICAgZmVhdHVyZTogbGF5ZXIuZmVhdHVyZVxuICAgICAgfSk7XG4gICAgICBsYXllcnNUb0FkZC5wdXNoKGxheWVyKTtcbiAgICB9XG4gICAgdGhpcy5jbHVzdGVyLmFkZExheWVycyhsYXllcnNUb0FkZCk7XG4gIH0sXG5cbiAgcmVtb3ZlTGF5ZXJzOiBmdW5jdGlvbiAoaWRzLCBwZXJtYW5lbnQpIHtcbiAgICB2YXIgbGF5ZXJzVG9SZW1vdmUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gaWRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgaWQgPSBpZHNbaV07XG4gICAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgdGhpcy5maXJlKCdyZW1vdmVmZWF0dXJlJywge1xuICAgICAgICBmZWF0dXJlOiBsYXllci5mZWF0dXJlLFxuICAgICAgICBwZXJtYW5lbnQ6IHBlcm1hbmVudFxuICAgICAgfSk7XG4gICAgICBsYXllcnNUb1JlbW92ZS5wdXNoKGxheWVyKTtcbiAgICAgIGlmICh0aGlzLl9sYXllcnNbaWRdICYmIHBlcm1hbmVudCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbHVzdGVyLnJlbW92ZUxheWVycyhsYXllcnNUb1JlbW92ZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFN0eWxpbmcgTWV0aG9kc1xuICAgKi9cblxuICByZXNldFN0eWxlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuXG4gICAgaWYgKGxheWVyKSB7XG4gICAgICBsYXllci5vcHRpb25zID0gbGF5ZXIuZGVmYXVsdE9wdGlvbnM7XG4gICAgICB0aGlzLnNldEZlYXR1cmVTdHlsZShsYXllci5mZWF0dXJlLmlkLCB0aGlzLm9wdGlvbnMuc3R5bGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNldFN0eWxlOiBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICB0aGlzLmVhY2hGZWF0dXJlKGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgdGhpcy5zZXRGZWF0dXJlU3R5bGUobGF5ZXIuZmVhdHVyZS5pZCwgc3R5bGUpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNldEZlYXR1cmVTdHlsZTogZnVuY3Rpb24gKGlkLCBzdHlsZSkge1xuICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG5cbiAgICBpZiAodHlwZW9mIHN0eWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdHlsZSA9IHN0eWxlKGxheWVyLmZlYXR1cmUpO1xuICAgIH1cbiAgICBpZiAobGF5ZXIuc2V0U3R5bGUpIHtcbiAgICAgIGxheWVyLnNldFN0eWxlKHN0eWxlKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFV0aWxpdHkgTWV0aG9kc1xuICAgKi9cblxuICBlYWNoRmVhdHVyZTogZnVuY3Rpb24gKGZuLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgaSBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgIGZuLmNhbGwoY29udGV4dCwgdGhpcy5fbGF5ZXJzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0RmVhdHVyZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xheWVyc1tpZF07XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZUxheWVyIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRmVhdHVyZUxheWVyKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmZWF0dXJlTGF5ZXI7XG4iXSwibmFtZXMiOlsiRmVhdHVyZU1hbmFnZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Q0NLTyxJQUFJLFlBQVksR0FBR0EsMEJBQWMsQ0FBQyxNQUFNLENBQUM7O0FBRWhELENBQUEsRUFBRSxPQUFPLEVBQUU7QUFDWCxDQUFBLElBQUksTUFBTSxFQUFFLDhFQUE4RTtBQUMxRixDQUFBLElBQUksYUFBYSxFQUFFLG1HQUFtRztBQUN0SCxDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUE7QUFDQSxDQUFBOztBQUVBLENBQUEsRUFBRSxVQUFV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
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-geocoder-2.2.4.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1194 @@
+/* esri-leaflet-geocoder - v2.2.4 - Wed Mar 22 2017 15:48:59 GMT-0700 (PDT)
+ * Copyright (c) 2017 Environmental Systems Research Institute, Inc.
+ * Apache-2.0 */
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet'), require('esri-leaflet')) :
+	typeof define === 'function' && define.amd ? define(['exports', 'leaflet', 'esri-leaflet'], factory) :
+	(factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.Geocoding = global.L.esri.Geocoding || {}),global.L,global.L.esri));
+}(this, function (exports,L,esriLeaflet) { 'use strict';
+
+	L = 'default' in L ? L['default'] : L;
+
+	var version = "2.2.4";
+
+	var Geocode = esriLeaflet.Task.extend({
+	  path: 'findAddressCandidates',
+
+	  params: {
+	    outSr: 4326,
+	    forStorage: false,
+	    outFields: '*',
+	    maxLocations: 20
+	  },
+
+	  setters: {
+	    'address': 'address',
+	    'neighborhood': 'neighborhood',
+	    'city': 'city',
+	    'subregion': 'subregion',
+	    'region': 'region',
+	    'postal': 'postal',
+	    'country': 'country',
+	    'text': 'singleLine',
+	    'category': 'category',
+	    'token': 'token',
+	    'key': 'magicKey',
+	    'fields': 'outFields',
+	    'forStorage': 'forStorage',
+	    'maxLocations': 'maxLocations'
+	  },
+
+	  initialize: function (options) {
+	    options = options || {};
+	    options.url = options.url || WorldGeocodingServiceUrl;
+	    esriLeaflet.Task.prototype.initialize.call(this, options);
+	  },
+
+	  within: function (bounds) {
+	    bounds = L.latLngBounds(bounds);
+	    this.params.searchExtent = esriLeaflet.Util.boundsToExtent(bounds);
+	    return this;
+	  },
+
+	  nearby: function (latlng, radius) {
+	    latlng = L.latLng(latlng);
+	    this.params.location = latlng.lng + ',' + latlng.lat;
+	    this.params.distance = Math.min(Math.max(radius, 2000), 50000);
+	    return this;
+	  },
+
+	  run: function (callback, context) {
+	    if (this.options.customParam) {
+	      this.params[this.options.customParam] = this.params.singleLine;
+	      delete this.params.singleLine;
+	    }
+
+	    return this.request(function (error, response) {
+	      var processor = this._processGeocoderResponse;
+	      var results = (!error) ? processor(response) : undefined;
+	      callback.call(context, error, { results: results }, response);
+	    }, this);
+	  },
+
+	  _processGeocoderResponse: function (response) {
+	    var results = [];
+
+	    for (var i = 0; i < response.candidates.length; i++) {
+	      var candidate = response.candidates[i];
+	      if (candidate.extent) {
+	        var bounds = esriLeaflet.Util.extentToBounds(candidate.extent);
+	      }
+
+	      results.push({
+	        text: candidate.address,
+	        bounds: bounds,
+	        score: candidate.score,
+	        latlng: L.latLng(candidate.location.y, candidate.location.x),
+	        properties: candidate.attributes
+	      });
+	    }
+	    return results;
+	  }
+	});
+
+	function geocode (options) {
+	  return new Geocode(options);
+	}
+
+	var ReverseGeocode = esriLeaflet.Task.extend({
+	  path: 'reverseGeocode',
+
+	  params: {
+	    outSR: 4326,
+	    returnIntersection: false
+	  },
+
+	  setters: {
+	    'distance': 'distance',
+	    'language': 'langCode',
+	    'intersection': 'returnIntersection'
+	  },
+
+	  initialize: function (options) {
+	    options = options || {};
+	    options.url = options.url || WorldGeocodingServiceUrl;
+	    esriLeaflet.Task.prototype.initialize.call(this, options);
+	  },
+
+	  latlng: function (latlng) {
+	    latlng = L.latLng(latlng);
+	    this.params.location = latlng.lng + ',' + latlng.lat;
+	    return this;
+	  },
+
+	  run: function (callback, context) {
+	    return this.request(function (error, response) {
+	      var result;
+
+	      if (!error) {
+	        result = {
+	          latlng: L.latLng(response.location.y, response.location.x),
+	          address: response.address
+	        };
+	      } else {
+	        result = undefined;
+	      }
+
+	      callback.call(context, error, result, response);
+	    }, this);
+	  }
+	});
+
+	function reverseGeocode (options) {
+	  return new ReverseGeocode(options);
+	}
+
+	var Suggest = esriLeaflet.Task.extend({
+	  path: 'suggest',
+
+	  params: {},
+
+	  setters: {
+	    text: 'text',
+	    category: 'category',
+	    countries: 'countryCode',
+	    maxSuggestions: 'maxSuggestions'
+	  },
+
+	  initialize: function (options) {
+	    options = options || {};
+	    if (!options.url) {
+	      options.url = WorldGeocodingServiceUrl;
+	      options.supportsSuggest = true;
+	    }
+	    esriLeaflet.Task.prototype.initialize.call(this, options);
+	  },
+
+	  within: function (bounds) {
+	    bounds = L.latLngBounds(bounds);
+	    bounds = bounds.pad(0.5);
+	    var center = bounds.getCenter();
+	    var ne = bounds.getNorthWest();
+	    this.params.location = center.lng + ',' + center.lat;
+	    this.params.distance = Math.min(Math.max(center.distanceTo(ne), 2000), 50000);
+	    this.params.searchExtent = esriLeaflet.Util.boundsToExtent(bounds);
+	    return this;
+	  },
+
+	  nearby: function (latlng, radius) {
+	    latlng = L.latLng(latlng);
+	    this.params.location = latlng.lng + ',' + latlng.lat;
+	    this.params.distance = Math.min(Math.max(radius, 2000), 50000);
+	    return this;
+	  },
+
+	  run: function (callback, context) {
+	    if (this.options.supportsSuggest) {
+	      return this.request(function (error, response) {
+	        callback.call(context, error, response, response);
+	      }, this);
+	    } else {
+	      console.warn('this geocoding service does not support asking for suggestions');
+	    }
+	  }
+
+	});
+
+	function suggest (options) {
+	  return new Suggest(options);
+	}
+
+	var GeocodeService = esriLeaflet.Service.extend({
+	  initialize: function (options) {
+	    options = options || {};
+	    if (options.url) {
+	      esriLeaflet.Service.prototype.initialize.call(this, options);
+	      this._confirmSuggestSupport();
+	    } else {
+	      options.url = WorldGeocodingServiceUrl;
+	      options.supportsSuggest = true;
+	      esriLeaflet.Service.prototype.initialize.call(this, options);
+	    }
+	  },
+
+	  geocode: function () {
+	    return geocode(this);
+	  },
+
+	  reverse: function () {
+	    return reverseGeocode(this);
+	  },
+
+	  suggest: function () {
+	    // requires either the Esri World Geocoding Service or a <10.3 ArcGIS Server Geocoding Service that supports suggest.
+	    return suggest(this);
+	  },
+
+	  _confirmSuggestSupport: function () {
+	    this.metadata(function (error, response) {
+	      if (error) { return; }
+	      // pre 10.3 geocoding services dont list capabilities (and dont support maxLocations)
+	      // only SOME individual services have been configured to support asking for suggestions
+	      if (!response.capabilities) {
+	        this.options.supportsSuggest = false;
+	        this.options.customParam = response.singleLineAddressField.name;
+	      } else if (response.capabilities.indexOf('Suggest') > -1) {
+	        this.options.supportsSuggest = true;
+	      } else {
+	        this.options.supportsSuggest = false;
+	      }
+	    }, this);
+	  }
+	});
+
+	function geocodeService (options) {
+	  return new GeocodeService(options);
+	}
+
+	var GeosearchCore = L.Evented.extend({
+
+	  options: {
+	    zoomToResult: true,
+	    useMapBounds: 12,
+	    searchBounds: null
+	  },
+
+	  initialize: function (control, options) {
+	    L.Util.setOptions(this, options);
+	    this._control = control;
+
+	    if (!options || !options.providers || !options.providers.length) {
+	      throw new Error('You must specify at least one provider');
+	    }
+
+	    this._providers = options.providers;
+	  },
+
+	  _geocode: function (text, key, provider) {
+	    var activeRequests = 0;
+	    var allResults = [];
+	    var bounds;
+
+	    var callback = L.Util.bind(function (error, results) {
+	      activeRequests--;
+	      if (error) {
+	        return;
+	      }
+
+	      if (results) {
+	        allResults = allResults.concat(results);
+	      }
+
+	      if (activeRequests <= 0) {
+	        bounds = this._boundsFromResults(allResults);
+
+	        this.fire('results', {
+	          results: allResults,
+	          bounds: bounds,
+	          latlng: (bounds) ? bounds.getCenter() : undefined,
+	          text: text
+	        }, true);
+
+	        if (this.options.zoomToResult && bounds) {
+	          this._control._map.fitBounds(bounds);
+	        }
+
+	        this.fire('load');
+	      }
+	    }, this);
+
+	    if (key) {
+	      activeRequests++;
+	      provider.results(text, key, this._searchBounds(), callback);
+	    } else {
+	      for (var i = 0; i < this._providers.length; i++) {
+	        activeRequests++;
+	        this._providers[i].results(text, key, this._searchBounds(), callback);
+	      }
+	    }
+	  },
+
+	  _suggest: function (text) {
+	    var activeRequests = this._providers.length;
+
+	    var createCallback = L.Util.bind(function (text, provider) {
+	      return L.Util.bind(function (error, suggestions) {
+	        if (error) { return; }
+
+	        var i;
+
+	        activeRequests = activeRequests - 1;
+
+	        if (text.length < 2) {
+	          this._suggestions.innerHTML = '';
+	          this._suggestions.style.display = 'none';
+	          return;
+	        }
+
+	        if (suggestions.length) {
+	          for (i = 0; i < suggestions.length; i++) {
+	            suggestions[i].provider = provider;
+	          }
+	        } else {
+	          // we still need to update the UI
+	          this._control._renderSuggestions(suggestions);
+	        }
+
+	        if (provider._lastRender !== text && provider.nodes) {
+	          for (i = 0; i < provider.nodes.length; i++) {
+	            if (provider.nodes[i].parentElement) {
+	              this._control._suggestions.removeChild(provider.nodes[i]);
+	            }
+	          }
+
+	          provider.nodes = [];
+	        }
+
+	        if (suggestions.length && this._control._input.value === text) {
+	          this._control.clearSuggestions(provider.nodes);
+
+	          provider._lastRender = text;
+	          provider.nodes = this._control._renderSuggestions(suggestions);
+	          this._control._nodes = [];
+	        }
+	      }, this);
+	    }, this);
+
+	    this._pendingSuggestions = [];
+
+	    for (var i = 0; i < this._providers.length; i++) {
+	      var provider = this._providers[i];
+	      var request = provider.suggestions(text, this._searchBounds(), createCallback(text, provider));
+	      this._pendingSuggestions.push(request);
+	    }
+	  },
+
+	  _searchBounds: function () {
+	    if (this.options.searchBounds !== null) {
+	      return this.options.searchBounds;
+	    }
+
+	    if (this.options.useMapBounds === false) {
+	      return null;
+	    }
+
+	    if (this.options.useMapBounds === true) {
+	      return this._control._map.getBounds();
+	    }
+
+	    if (this.options.useMapBounds <= this._control._map.getZoom()) {
+	      return this._control._map.getBounds();
+	    }
+
+	    return null;
+	  },
+
+	  _boundsFromResults: function (results) {
+	    if (!results.length) {
+	      return;
+	    }
+
+	    var nullIsland = L.latLngBounds([0, 0], [0, 0]);
+	    var resultBounds = [];
+	    var resultLatlngs = [];
+
+	    // collect the bounds and center of each result
+	    for (var i = results.length - 1; i >= 0; i--) {
+	      var result = results[i];
+
+	      resultLatlngs.push(result.latlng);
+
+	      // make sure bounds are valid and not 0,0. sometimes bounds are incorrect or not present
+	      if (result.bounds && result.bounds.isValid() && !result.bounds.equals(nullIsland)) {
+	        resultBounds.push(result.bounds);
+	      }
+	    }
+
+	    // form a bounds object containing all center points
+	    var bounds = L.latLngBounds(resultLatlngs);
+
+	    // and extend it to contain all bounds objects
+	    for (var j = 0; j < resultBounds.length; j++) {
+	      bounds.extend(resultBounds[j]);
+	    }
+
+	    return bounds;
+	  },
+
+	  _getAttribution: function () {
+	    var attribs = [];
+	    var providers = this._providers;
+
+	    for (var i = 0; i < providers.length; i++) {
+	      if (providers[i].options.attribution) {
+	        attribs.push(providers[i].options.attribution);
+	      }
+	    }
+
+	    return attribs.join(', ');
+	  }
+
+	});
+
+	function geosearchCore (control, options) {
+	  return new GeosearchCore(control, options);
+	}
+
+	var ArcgisOnlineProvider = GeocodeService.extend({
+	  options: {
+	    label: 'Places and Addresses',
+	    maxResults: 5
+	  },
+
+	  suggestions: function (text, bounds, callback) {
+	    var request = this.suggest().text(text);
+
+	    if (bounds) {
+	      request.within(bounds);
+	    }
+
+	    if (this.options.countries) {
+	      request.countries(this.options.countries);
+	    }
+
+	    if (this.options.categories) {
+	      request.category(this.options.categories);
+	    }
+
+	    // 15 is the maximum number of suggestions that can be returned
+	    request.maxSuggestions(this.options.maxResults);
+
+	    return request.run(function (error, results, response) {
+	      var suggestions = [];
+	      if (!error) {
+	        while (response.suggestions.length && suggestions.length <= (this.options.maxResults - 1)) {
+	          var suggestion = response.suggestions.shift();
+	          if (!suggestion.isCollection) {
+	            suggestions.push({
+	              text: suggestion.text,
+	              magicKey: suggestion.magicKey
+	            });
+	          }
+	        }
+	      }
+	      callback(error, suggestions);
+	    }, this);
+	  },
+
+	  results: function (text, key, bounds, callback) {
+	    var request = this.geocode().text(text);
+
+	    if (key) {
+	      request.key(key);
+	    }
+	    // in the future Address/StreetName geocoding requests that include a magicKey will always only return one match
+	    request.maxLocations(this.options.maxResults);
+
+	    if (bounds) {
+	      request.within(bounds);
+	    }
+
+	    if (this.options.forStorage) {
+	      request.forStorage(true);
+	    }
+
+	    return request.run(function (error, response) {
+	      callback(error, response.results);
+	    }, this);
+	  }
+	});
+
+	function arcgisOnlineProvider (options) {
+	  return new ArcgisOnlineProvider(options);
+	}
+
+	var Geosearch = L.Control.extend({
+	  includes: L.Mixin.Events,
+
+	  options: {
+	    position: 'topleft',
+	    collapseAfterResult: true,
+	    expanded: false,
+	    allowMultipleResults: true,
+	    placeholder: 'Search for places or addresses',
+	    title: 'Location Search'
+	  },
+
+	  initialize: function (options) {
+	    L.Util.setOptions(this, options);
+
+	    if (!options || !options.providers || !options.providers.length) {
+	      if (!options) {
+	        options = {};
+	      }
+	      options.providers = [ arcgisOnlineProvider() ];
+	    }
+
+	    // instantiate the underlying class and pass along options
+	    this._geosearchCore = geosearchCore(this, options);
+	    this._geosearchCore._providers = options.providers;
+
+	    // bubble each providers events to the control
+	    this._geosearchCore.addEventParent(this);
+	    for (var i = 0; i < this._geosearchCore._providers.length; i++) {
+	      this._geosearchCore._providers[i].addEventParent(this);
+	    }
+
+	    this._geosearchCore._pendingSuggestions = [];
+
+	    L.Control.prototype.initialize.call(options);
+	  },
+
+	  _renderSuggestions: function (suggestions) {
+	    var currentGroup;
+
+	    if (suggestions.length > 0) {
+	      this._suggestions.style.display = 'block';
+	    }
+	    // set the maxHeight of the suggestions box to
+	    // map height
+	    // - suggestions offset (distance from top of suggestions to top of control)
+	    // - control offset (distance from top of control to top of map)
+	    // - 10 (extra padding)
+	    this._suggestions.style.maxHeight = (this._map.getSize().y - this._suggestions.offsetTop - this._wrapper.offsetTop - 10) + 'px';
+
+	    var nodes = [];
+	    var list;
+	    var header;
+	    var suggestionTextArray = [];
+
+	    for (var i = 0; i < suggestions.length; i++) {
+	      var suggestion = suggestions[i];
+	      if (!header && this._geosearchCore._providers.length > 1 && currentGroup !== suggestion.provider.options.label) {
+	        header = L.DomUtil.create('span', 'geocoder-control-header', this._suggestions);
+	        header.textContent = suggestion.provider.options.label;
+	        header.innerText = suggestion.provider.options.label;
+	        currentGroup = suggestion.provider.options.label;
+	        nodes.push(header);
+	      }
+
+	      if (!list) {
+	        list = L.DomUtil.create('ul', 'geocoder-control-list', this._suggestions);
+	      }
+
+	      if (suggestionTextArray.indexOf(suggestion.text) === -1) {
+	        var suggestionItem = L.DomUtil.create('li', 'geocoder-control-suggestion', list);
+
+	        suggestionItem.innerHTML = suggestion.text;
+	        suggestionItem.provider = suggestion.provider;
+	        suggestionItem['data-magic-key'] = suggestion.magicKey;
+	      } else {
+	        for (var j = 0; j < list.childNodes.length; j++) {
+	          // if the same text already appears in the list of suggestions, append an additional ObjectID to its magicKey instead
+	          if (list.childNodes[j].innerHTML === suggestion.text) {
+	            list.childNodes[j]['data-magic-key'] += ',' + suggestion.magicKey;
+	          }
+	        }
+	      }
+	      suggestionTextArray.push(suggestion.text);
+	    }
+
+	    L.DomUtil.removeClass(this._input, 'geocoder-control-loading');
+
+	    nodes.push(list);
+
+	    return nodes;
+	  },
+
+	  _boundsFromResults: function (results) {
+	    if (!results.length) {
+	      return;
+	    }
+
+	    var nullIsland = L.latLngBounds([0, 0], [0, 0]);
+	    var resultBounds = [];
+	    var resultLatlngs = [];
+
+	    // collect the bounds and center of each result
+	    for (var i = results.length - 1; i >= 0; i--) {
+	      var result = results[i];
+
+	      resultLatlngs.push(result.latlng);
+
+	      // make sure bounds are valid and not 0,0. sometimes bounds are incorrect or not present
+	      if (result.bounds && result.bounds.isValid() && !result.bounds.equals(nullIsland)) {
+	        resultBounds.push(result.bounds);
+	      }
+	    }
+
+	    // form a bounds object containing all center points
+	    var bounds = L.latLngBounds(resultLatlngs);
+
+	    // and extend it to contain all bounds objects
+	    for (var j = 0; j < resultBounds.length; j++) {
+	      bounds.extend(resultBounds[j]);
+	    }
+
+	    return bounds;
+	  },
+
+	  clear: function () {
+	    this._suggestions.innerHTML = '';
+	    this._suggestions.style.display = 'none';
+	    this._input.value = '';
+
+	    if (this.options.collapseAfterResult) {
+	      this._input.placeholder = '';
+	      L.DomUtil.removeClass(this._wrapper, 'geocoder-control-expanded');
+	    }
+
+	    if (!this._map.scrollWheelZoom.enabled() && this._map.options.scrollWheelZoom) {
+	      this._map.scrollWheelZoom.enable();
+	    }
+	  },
+
+	  clearSuggestions: function () {
+	    if (this._nodes) {
+	      for (var k = 0; k < this._nodes.length; k++) {
+	        if (this._nodes[k].parentElement) {
+	          this._suggestions.removeChild(this._nodes[k]);
+	        }
+	      }
+	    }
+	  },
+
+	  _setupClick: function () {
+	    L.DomUtil.addClass(this._wrapper, 'geocoder-control-expanded');
+	    this._input.focus();
+	  },
+
+	  disable: function () {
+	    this._input.disabled = true;
+	    L.DomUtil.addClass(this._input, 'geocoder-control-input-disabled');
+	    L.DomEvent.removeListener(this._wrapper, 'click', this._setupClick, this);
+	  },
+
+	  enable: function () {
+	    this._input.disabled = false;
+	    L.DomUtil.removeClass(this._input, 'geocoder-control-input-disabled');
+	    L.DomEvent.addListener(this._wrapper, 'click', this._setupClick, this);
+	  },
+
+	  getAttribution: function () {
+	    var attribs = [];
+
+	    for (var i = 0; i < this._providers.length; i++) {
+	      if (this._providers[i].options.attribution) {
+	        attribs.push(this._providers[i].options.attribution);
+	      }
+	    }
+
+	    return attribs.join(', ');
+	  },
+
+	  onAdd: function (map) {
+	    // include 'Powered by Esri' in map attribution
+	    esriLeaflet.Util.setEsriAttribution(map);
+
+	    this._map = map;
+	    this._wrapper = L.DomUtil.create('div', 'geocoder-control');
+	    this._input = L.DomUtil.create('input', 'geocoder-control-input leaflet-bar', this._wrapper);
+	    this._input.title = this.options.title;
+
+	    if (this.options.expanded) {
+	      L.DomUtil.addClass(this._wrapper, 'geocoder-control-expanded');
+	      this._input.placeholder = this.options.placeholder;
+	    }
+
+	    this._suggestions = L.DomUtil.create('div', 'geocoder-control-suggestions leaflet-bar', this._wrapper);
+
+	    var credits = this._geosearchCore._getAttribution();
+	    map.attributionControl.addAttribution(credits);
+
+	    L.DomEvent.addListener(this._input, 'focus', function (e) {
+	      this._input.placeholder = this.options.placeholder;
+	      L.DomUtil.addClass(this._wrapper, 'geocoder-control-expanded');
+	    }, this);
+
+	    L.DomEvent.addListener(this._wrapper, 'click', this._setupClick, this);
+
+	    L.DomEvent.addListener(this._suggestions, 'mousedown', function (e) {
+	      var suggestionItem = e.target || e.srcElement;
+	      this._geosearchCore._geocode(suggestionItem.innerHTML, suggestionItem['data-magic-key'], suggestionItem.provider);
+	      this.clear();
+	    }, this);
+
+	    L.DomEvent.addListener(this._input, 'blur', function (e) {
+	      this.clear();
+	    }, this);
+
+	    L.DomEvent.addListener(this._input, 'keydown', function (e) {
+	      var text = (e.target || e.srcElement).value;
+
+	      L.DomUtil.addClass(this._wrapper, 'geocoder-control-expanded');
+
+	      var list = this._suggestions.querySelectorAll('.' + 'geocoder-control-suggestion');
+	      var selected = this._suggestions.querySelectorAll('.' + 'geocoder-control-selected')[0];
+	      var selectedPosition;
+
+	      for (var i = 0; i < list.length; i++) {
+	        if (list[i] === selected) {
+	          selectedPosition = i;
+	          break;
+	        }
+	      }
+
+	      switch (e.keyCode) {
+	        case 13:
+	          /*
+	            if an item has been selected, geocode it
+	            if focus is on the input textbox, geocode only if multiple results are allowed and more than two characters are present, or if a single suggestion is displayed.
+	            if less than two characters have been typed, abort the geocode
+	          */
+	          if (selected) {
+	            this._geosearchCore._geocode(selected.innerHTML, selected['data-magic-key'], selected.provider);
+	            this.clear();
+	          } else if (this.options.allowMultipleResults && text.length >= 2) {
+	            this._geosearchCore._geocode(this._input.value, undefined);
+	            this.clear();
+	          } else {
+	            if (list.length === 1) {
+	              L.DomUtil.addClass(list[0], 'geocoder-control-selected');
+	              this._geosearchCore._geocode(list[0].innerHTML, list[0]['data-magic-key'], list[0].provider);
+	            } else {
+	              this.clear();
+	              this._input.blur();
+	            }
+	          }
+	          L.DomEvent.preventDefault(e);
+	          break;
+	        case 38:
+	          if (selected) {
+	            L.DomUtil.removeClass(selected, 'geocoder-control-selected');
+	          }
+
+	          var previousItem = list[selectedPosition - 1];
+
+	          if (selected && previousItem) {
+	            L.DomUtil.addClass(previousItem, 'geocoder-control-selected');
+	          } else {
+	            L.DomUtil.addClass(list[list.length - 1], 'geocoder-control-selected');
+	          }
+	          L.DomEvent.preventDefault(e);
+	          break;
+	        case 40:
+	          if (selected) {
+	            L.DomUtil.removeClass(selected, 'geocoder-control-selected');
+	          }
+
+	          var nextItem = list[selectedPosition + 1];
+
+	          if (selected && nextItem) {
+	            L.DomUtil.addClass(nextItem, 'geocoder-control-selected');
+	          } else {
+	            L.DomUtil.addClass(list[0], 'geocoder-control-selected');
+	          }
+	          L.DomEvent.preventDefault(e);
+	          break;
+	        default:
+	          // when the input changes we should cancel all pending suggestion requests if possible to avoid result collisions
+	          for (var x = 0; x < this._geosearchCore._pendingSuggestions.length; x++) {
+	            var request = this._geosearchCore._pendingSuggestions[x];
+	            if (request && request.abort && !request.id) {
+	              request.abort();
+	            }
+	          }
+	          break;
+	      }
+	    }, this);
+
+	    L.DomEvent.addListener(this._input, 'keyup', L.Util.throttle(function (e) {
+	      var key = e.which || e.keyCode;
+	      var text = (e.target || e.srcElement).value;
+
+	      // require at least 2 characters for suggestions
+	      if (text.length < 2) {
+	        this._suggestions.innerHTML = '';
+	        this._suggestions.style.display = 'none';
+	        L.DomUtil.removeClass(this._input, 'geocoder-control-loading');
+	        return;
+	      }
+
+	      // if this is the escape key it will clear the input so clear suggestions
+	      if (key === 27) {
+	        this._suggestions.innerHTML = '';
+	        this._suggestions.style.display = 'none';
+	        return;
+	      }
+
+	      // if this is NOT the up/down arrows or enter make a suggestion
+	      if (key !== 13 && key !== 38 && key !== 40) {
+	        if (this._input.value !== this._lastValue) {
+	          this._lastValue = this._input.value;
+	          L.DomUtil.addClass(this._input, 'geocoder-control-loading');
+	          this._geosearchCore._suggest(text);
+	        }
+	      }
+	    }, 50, this), this);
+
+	    L.DomEvent.disableClickPropagation(this._wrapper);
+
+	    // when mouse moves over suggestions disable scroll wheel zoom if its enabled
+	    L.DomEvent.addListener(this._suggestions, 'mouseover', function (e) {
+	      if (map.scrollWheelZoom.enabled() && map.options.scrollWheelZoom) {
+	        map.scrollWheelZoom.disable();
+	      }
+	    });
+
+	    // when mouse moves leaves suggestions enable scroll wheel zoom if its disabled
+	    L.DomEvent.addListener(this._suggestions, 'mouseout', function (e) {
+	      if (!map.scrollWheelZoom.enabled() && map.options.scrollWheelZoom) {
+	        map.scrollWheelZoom.enable();
+	      }
+	    });
+
+	    this._geosearchCore.on('load', function (e) {
+	      L.DomUtil.removeClass(this._input, 'geocoder-control-loading');
+	      this.clear();
+	      this._input.blur();
+	    }, this);
+
+	    return this._wrapper;
+	  }
+	});
+
+	function geosearch (options) {
+	  return new Geosearch(options);
+	}
+
+	var FeatureLayerProvider = esriLeaflet.FeatureLayerService.extend({
+	  options: {
+	    label: 'Feature Layer',
+	    maxResults: 5,
+	    bufferRadius: 1000,
+	    formatSuggestion: function (feature) {
+	      return feature.properties[this.options.searchFields[0]];
+	    }
+	  },
+
+	  initialize: function (options) {
+	    esriLeaflet.FeatureLayerService.prototype.initialize.call(this, options);
+	    if (typeof this.options.searchFields === 'string') {
+	      this.options.searchFields = [this.options.searchFields];
+	    }
+	    this._suggestionsQuery = this.query();
+	    this._resultsQuery = this.query();
+	  },
+
+	  suggestions: function (text, bounds, callback) {
+	    var query = this._suggestionsQuery.where(this._buildQuery(text))
+	      .returnGeometry(false);
+
+	    if (bounds) {
+	      query.intersects(bounds);
+	    }
+
+	    if (this.options.idField) {
+	      query.fields([this.options.idField].concat(this.options.searchFields));
+	    }
+
+	    var request = query.run(function (error, results, raw) {
+	      if (error) {
+	        callback(error, []);
+	      } else {
+	        this.options.idField = raw.objectIdFieldName;
+	        var suggestions = [];
+	        for (var i = results.features.length - 1; i >= 0; i--) {
+	          var feature = results.features[i];
+	          suggestions.push({
+	            text: this.options.formatSuggestion.call(this, feature),
+	            magicKey: feature.id
+	          });
+	        }
+	        callback(error, suggestions.slice(0, this.options.maxResults));
+	      }
+	    }, this);
+
+	    return request;
+	  },
+
+	  results: function (text, key, bounds, callback) {
+	    var query = this._resultsQuery;
+
+	    if (key) {
+	      delete query.params.where;
+	      query.featureIds([key]);
+	    } else {
+	      query.where(this._buildQuery(text));
+	    }
+
+	    if (bounds) {
+	      query.within(bounds);
+	    }
+
+	    return query.run(L.Util.bind(function (error, features) {
+	      var results = [];
+	      for (var i = 0; i < features.features.length; i++) {
+	        var feature = features.features[i];
+	        if (feature) {
+	          var bounds = this._featureBounds(feature);
+
+	          var result = {
+	            latlng: bounds.getCenter(),
+	            bounds: bounds,
+	            text: this.options.formatSuggestion.call(this, feature),
+	            properties: feature.properties,
+	            geojson: feature
+	          };
+
+	          results.push(result);
+
+	          // clear query parameters for the next search
+	          delete this._resultsQuery.params['objectIds'];
+	        }
+	      }
+	      callback(error, results);
+	    }, this));
+	  },
+
+	  orderBy: function (fieldName, order) {
+	    this._suggestionsQuery.orderBy(fieldName, order);
+	  },
+
+	  _buildQuery: function (text) {
+	    var queryString = [];
+
+	    for (var i = this.options.searchFields.length - 1; i >= 0; i--) {
+	      var field = 'upper("' + this.options.searchFields[i] + '")';
+
+	      queryString.push(field + " LIKE upper('%" + text + "%')");
+	    }
+
+	    if (this.options.where) {
+	      return this.options.where + ' AND (' + queryString.join(' OR ') + ')';
+	    } else {
+	      return queryString.join(' OR ');
+	    }
+	  },
+
+	  _featureBounds: function (feature) {
+	    var geojson = L.geoJson(feature);
+	    if (feature.geometry.type === 'Point') {
+	      var center = geojson.getBounds().getCenter();
+	      var lngRadius = ((this.options.bufferRadius / 40075017) * 360) / Math.cos((180 / Math.PI) * center.lat);
+	      var latRadius = (this.options.bufferRadius / 40075017) * 360;
+	      return L.latLngBounds([center.lat - latRadius, center.lng - lngRadius], [center.lat + latRadius, center.lng + lngRadius]);
+	    } else {
+	      return geojson.getBounds();
+	    }
+	  }
+	});
+
+	function featureLayerProvider (options) {
+	  return new FeatureLayerProvider(options);
+	}
+
+	var MapServiceProvider = esriLeaflet.MapService.extend({
+	  options: {
+	    layers: [0],
+	    label: 'Map Service',
+	    bufferRadius: 1000,
+	    maxResults: 5,
+	    formatSuggestion: function (feature) {
+	      return feature.properties[feature.displayFieldName] + ' <small>' + feature.layerName + '</small>';
+	    }
+	  },
+
+	  initialize: function (options) {
+	    esriLeaflet.MapService.prototype.initialize.call(this, options);
+	    this._getIdFields();
+	  },
+
+	  suggestions: function (text, bounds, callback) {
+	    var request = this.find().text(text).fields(this.options.searchFields).returnGeometry(false).layers(this.options.layers);
+
+	    return request.run(function (error, results, raw) {
+	      var suggestions = [];
+	      if (!error) {
+	        var count = Math.min(this.options.maxResults, results.features.length);
+	        raw.results = raw.results.reverse();
+	        for (var i = 0; i < count; i++) {
+	          var feature = results.features[i];
+	          var result = raw.results[i];
+	          var layer = result.layerId;
+	          var idField = this._idFields[layer];
+	          feature.layerId = layer;
+	          feature.layerName = this._layerNames[layer];
+	          feature.displayFieldName = this._displayFields[layer];
+	          if (idField) {
+	            suggestions.push({
+	              text: this.options.formatSuggestion.call(this, feature),
+	              magicKey: result.attributes[idField] + ':' + layer
+	            });
+	          }
+	        }
+	      }
+	      callback(error, suggestions.reverse());
+	    }, this);
+	  },
+
+	  results: function (text, key, bounds, callback) {
+	    var results = [];
+	    var request;
+
+	    if (key) {
+	      var featureId = key.split(':')[0];
+	      var layer = key.split(':')[1];
+	      request = this.query().layer(layer).featureIds(featureId);
+	    } else {
+	      request = this.find().text(text).fields(this.options.searchFields).layers(this.options.layers);
+	    }
+
+	    return request.run(function (error, features, response) {
+	      if (!error) {
+	        if (response.results) {
+	          response.results = response.results.reverse();
+	        }
+	        for (var i = 0; i < features.features.length; i++) {
+	          var feature = features.features[i];
+	          layer = layer || response.results[i].layerId;
+
+	          if (feature && layer !== undefined) {
+	            var bounds = this._featureBounds(feature);
+	            feature.layerId = layer;
+	            feature.layerName = this._layerNames[layer];
+	            feature.displayFieldName = this._displayFields[layer];
+
+	            var result = {
+	              latlng: bounds.getCenter(),
+	              bounds: bounds,
+	              text: this.options.formatSuggestion.call(this, feature),
+	              properties: feature.properties,
+	              geojson: feature
+	            };
+
+	            results.push(result);
+	          }
+	        }
+	      }
+	      callback(error, results.reverse());
+	    }, this);
+	  },
+
+	  _featureBounds: function (feature) {
+	    var geojson = L.geoJson(feature);
+	    if (feature.geometry.type === 'Point') {
+	      var center = geojson.getBounds().getCenter();
+	      var lngRadius = ((this.options.bufferRadius / 40075017) * 360) / Math.cos((180 / Math.PI) * center.lat);
+	      var latRadius = (this.options.bufferRadius / 40075017) * 360;
+	      return L.latLngBounds([center.lat - latRadius, center.lng - lngRadius], [center.lat + latRadius, center.lng + lngRadius]);
+	    } else {
+	      return geojson.getBounds();
+	    }
+	  },
+
+	  _layerMetadataCallback: function (layerid) {
+	    return L.Util.bind(function (error, metadata) {
+	      if (error) { return; }
+	      this._displayFields[layerid] = metadata.displayField;
+	      this._layerNames[layerid] = metadata.name;
+	      for (var i = 0; i < metadata.fields.length; i++) {
+	        var field = metadata.fields[i];
+	        if (field.type === 'esriFieldTypeOID') {
+	          this._idFields[layerid] = field.name;
+	          break;
+	        }
+	      }
+	    }, this);
+	  },
+
+	  _getIdFields: function () {
+	    this._idFields = {};
+	    this._displayFields = {};
+	    this._layerNames = {};
+	    for (var i = 0; i < this.options.layers.length; i++) {
+	      var layer = this.options.layers[i];
+	      this.get(layer, {}, this._layerMetadataCallback(layer));
+	    }
+	  }
+	});
+
+	function mapServiceProvider (options) {
+	  return new MapServiceProvider(options);
+	}
+
+	var GeocodeServiceProvider = GeocodeService.extend({
+	  options: {
+	    label: 'Geocode Server',
+	    maxResults: 5
+	  },
+
+	  suggestions: function (text, bounds, callback) {
+	    if (this.options.supportsSuggest) {
+	      var request = this.suggest().text(text);
+	      if (bounds) {
+	        request.within(bounds);
+	      }
+
+	      return request.run(function (error, results, response) {
+	        var suggestions = [];
+	        if (!error) {
+	          while (response.suggestions.length && suggestions.length <= (this.options.maxResults - 1)) {
+	            var suggestion = response.suggestions.shift();
+	            if (!suggestion.isCollection) {
+	              suggestions.push({
+	                text: suggestion.text,
+	                magicKey: suggestion.magicKey
+	              });
+	            }
+	          }
+	        }
+	        callback(error, suggestions);
+	      }, this);
+	    } else {
+	      callback(undefined, []);
+	      return false;
+	    }
+	  },
+
+	  results: function (text, key, bounds, callback) {
+	    var request = this.geocode().text(text);
+
+	    request.maxLocations(this.options.maxResults);
+
+	    if (bounds) {
+	      request.within(bounds);
+	    }
+
+	    return request.run(function (error, response) {
+	      callback(error, response.results);
+	    }, this);
+	  }
+	});
+
+	function geocodeServiceProvider (options) {
+	  return new GeocodeServiceProvider(options);
+	}
+
+	var WorldGeocodingServiceUrl = 'https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/';
+
+	exports.WorldGeocodingServiceUrl = WorldGeocodingServiceUrl;
+	exports.VERSION = version;
+	exports.Geocode = Geocode;
+	exports.geocode = geocode;
+	exports.ReverseGeocode = ReverseGeocode;
+	exports.reverseGeocode = reverseGeocode;
+	exports.Suggest = Suggest;
+	exports.suggest = suggest;
+	exports.GeocodeService = GeocodeService;
+	exports.geocodeService = geocodeService;
+	exports.Geosearch = Geosearch;
+	exports.geosearch = geosearch;
+	exports.GeosearchCore = GeosearchCore;
+	exports.geosearchCore = geosearchCore;
+	exports.ArcgisOnlineProvider = ArcgisOnlineProvider;
+	exports.arcgisOnlineProvider = arcgisOnlineProvider;
+	exports.FeatureLayerProvider = FeatureLayerProvider;
+	exports.featureLayerProvider = featureLayerProvider;
+	exports.MapServiceProvider = MapServiceProvider;
+	exports.mapServiceProvider = mapServiceProvider;
+	exports.GeocodeServiceProvider = GeocodeServiceProvider;
+	exports.geocodeServiceProvider = geocodeServiceProvider;
+
+}));
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWdlb2NvZGVyLWRlYnVnLmpzIiwic291cmNlcyI6WyIuLi9wYWNrYWdlLmpzb24iLCIuLi9zcmMvVGFza3MvR2VvY29kZS5qcyIsIi4uL3NyYy9UYXNrcy9SZXZlcnNlR2VvY29kZS5qcyIsIi4uL3NyYy9UYXNrcy9TdWdnZXN0LmpzIiwiLi4vc3JjL1NlcnZpY2VzL0dlb2NvZGUuanMiLCIuLi9zcmMvQ2xhc3Nlcy9HZW9zZWFyY2hDb3JlLmpzIiwiLi4vc3JjL1Byb3ZpZGVycy9BcmNnaXNPbmxpbmVHZW9jb2Rlci5qcyIsIi4uL3NyYy9Db250cm9scy9HZW9zZWFyY2guanMiLCIuLi9zcmMvUHJvdmlkZXJzL0ZlYXR1cmVMYXllci5qcyIsIi4uL3NyYy9Qcm92aWRlcnMvTWFwU2VydmljZS5qcyIsIi4uL3NyYy9Qcm92aWRlcnMvR2VvY29kZVNlcnZpY2UuanMiLCIuLi9zcmMvRXNyaUxlYWZsZXRHZW9jb2RpbmcuanMiXSwic291cmNlc0NvbnRlbnQiOlsie1xuICBcIm5hbWVcIjogXCJlc3JpLWxlYWZsZXQtZ2VvY29kZXJcIixcbiAgXCJkZXNjcmlwdGlvblwiOiBcIkVzcmkgR2VvY29kaW5nIHV0aWxpdHkgYW5kIHNlYXJjaCBwbHVnaW4gZm9yIExlYWZsZXQuXCIsXG4gIFwidmVyc2lvblwiOiBcIjIuMi40XCIsXG4gIFwiYXV0aG9yXCI6IFwiUGF0cmljayBBcmx0IDxwYXJsdEBlc3JpLmNvbT4gKGh0dHA6Ly9wYXRyaWNrYXJsdC5jb20pXCIsXG4gIFwiY29udHJpYnV0b3JzXCI6IFtcbiAgICBcIlBhdHJpY2sgQXJsdCA8cGFybHRAZXNyaS5jb20+IChodHRwOi8vcGF0cmlja2FybHQuY29tKVwiLFxuICAgIFwiSm9obiBHcmF2b2lzIDxqZ3Jhdm9pc0Blc3JpLmNvbT4gKGh0dHA6Ly9qb2huZ3Jhdm9pcy5jb20pXCJcbiAgXSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiZXNyaS1sZWFmbGV0XCI6IFwiXjIuMC4zXCIsXG4gICAgXCJsZWFmbGV0XCI6IFwiXjEuMC4wXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiY2hhaVwiOiBcIjMuNS4wXCIsXG4gICAgXCJnaC1yZWxlYXNlXCI6IFwiXjIuMC4wXCIsXG4gICAgXCJodHRwLXNlcnZlclwiOiBcIl4wLjguNVwiLFxuICAgIFwiaW1hZ2VtaW5cIjogXCJeMy4yLjBcIixcbiAgICBcImlzcGFydGFcIjogXCJeNC4wLjBcIixcbiAgICBcImlzdGFuYnVsXCI6IFwiXjAuNC4yXCIsXG4gICAgXCJrYXJtYVwiOiBcIl4xLjMuMFwiLFxuICAgIFwia2FybWEtY2hhaS1zaW5vblwiOiBcIl4wLjEuM1wiLFxuICAgIFwia2FybWEtY292ZXJhZ2VcIjogXCJeMS4xLjFcIixcbiAgICBcImthcm1hLW1vY2hhXCI6IFwiXjEuMy4wXCIsXG4gICAgXCJrYXJtYS1tb2NoYS1yZXBvcnRlclwiOiBcIl4yLjIuMVwiLFxuICAgIFwia2FybWEtcGhhbnRvbWpzLWxhdW5jaGVyXCI6IFwiXjAuMi4wXCIsXG4gICAgXCJrYXJtYS1zb3VyY2VtYXAtbG9hZGVyXCI6IFwiXjAuMy41XCIsXG4gICAgXCJta2RpcnBcIjogXCJeMC41LjFcIixcbiAgICBcIm1vY2hhXCI6IFwiXjMuMS4wXCIsXG4gICAgXCJub2RlLXNhc3NcIjogXCJeMy4yLjBcIixcbiAgICBcInBhcmFsbGVsc2hlbGxcIjogXCJeMi4wLjBcIixcbiAgICBcInBoYW50b21qc1wiOiBcIl4xLjkuOFwiLFxuICAgIFwicm9sbHVwXCI6IFwiXjAuMjUuNFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1qc29uXCI6IFwiXjIuMC4wXCIsXG4gICAgXCJyb2xsdXAtcGx1Z2luLW5vZGUtcmVzb2x2ZVwiOiBcIl4xLjQuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi11Z2xpZnlcIjogXCJeMC4zLjFcIixcbiAgICBcInNlbWlzdGFuZGFyZFwiOiBcIl45LjAuMFwiLFxuICAgIFwic2lub25cIjogXCJeMS4xMS4xXCIsXG4gICAgXCJzaW5vbi1jaGFpXCI6IFwiMi44LjBcIixcbiAgICBcInNuYXp6eVwiOiBcIl41LjAuMFwiLFxuICAgIFwidWdsaWZ5LWpzXCI6IFwiXjIuNi4xXCIsXG4gICAgXCJ3YXRjaFwiOiBcIl4wLjE3LjFcIlxuICB9LFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvZXNyaS1sZWFmbGV0LWdlb2NvZGVyXCIsXG4gIFwianNuZXh0Om1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXRHZW9jb2RpbmcuanNcIixcbiAgXCJqc3BtXCI6IHtcbiAgICBcInJlZ2lzdHJ5XCI6IFwibnBtXCIsXG4gICAgXCJmb3JtYXRcIjogXCJlczZcIixcbiAgICBcIm1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXRHZW9jb2RpbmcuanNcIlxuICB9LFxuICBcImxpY2Vuc2VcIjogXCJBcGFjaGUtMi4wXCIsXG4gIFwibWFpblwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LWdlb2NvZGVyLWRlYnVnLmpzXCIsXG4gIFwiYnJvd3NlclwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LWdlb2NvZGVyLWRlYnVnLmpzXCIsXG4gIFwicmVhZG1lRmlsZW5hbWVcIjogXCJSRUFETUUubWRcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdEBnaXRodWIuY29tOkVzcmkvZXNyaS1sZWFmbGV0LWdlb2NvZGVyLmdpdFwiXG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJwcmVidWlsZFwiOiBcIm1rZGlycCBkaXN0XCIsXG4gICAgXCJidWlsZFwiOiBcInJvbGx1cCAtYyBwcm9maWxlcy9kZWJ1Zy5qcyAmIHJvbGx1cCAtYyBwcm9maWxlcy9wcm9kdWN0aW9uLmpzICYgbnBtIHJ1biBjc3MgJiBucG0gcnVuIGltZ1wiLFxuICAgIFwiY3NzXCI6IFwibm9kZS1zYXNzIC4vc3JjL2VzcmktbGVhZmxldC1nZW9jb2Rlci5jc3MgLi9kaXN0L2VzcmktbGVhZmxldC1nZW9jb2Rlci5jc3MgLS1vdXRwdXQtc3R5bGUgY29tcHJlc3NlZFwiLFxuICAgIFwiaW1nXCI6IFwiaW1hZ2VtaW4gLi9zcmMvaW1nIC4vZGlzdC9pbWdcIixcbiAgICBcImxpbnRcIjogXCJzZW1pc3RhbmRhcmQgfCBzbmF6enlcIixcbiAgICBcInByZXB1Ymxpc2hcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJwcmV0ZXN0XCI6IFwibnBtIHJ1biBidWlsZFwiLFxuICAgIFwicmVsZWFzZVwiOiBcIi4vc2NyaXB0cy9yZWxlYXNlLnNoXCIsXG4gICAgXCJzdGFydC13YXRjaFwiOiBcIndhdGNoIFxcXCJucG0gcnVuIGJ1aWxkXFxcIiBzcmNcIixcbiAgICBcInN0YXJ0XCI6IFwicGFyYWxsZWxzaGVsbCBcXFwibnBtIHJ1biBzdGFydC13YXRjaFxcXCIgXFxcImh0dHAtc2VydmVyIC1wIDU2NzggLWMtMSAtb1xcXCJcIixcbiAgICBcInRlc3RcIjogXCJucG0gcnVuIGxpbnQgJiYga2FybWEgc3RhcnRcIlxuICB9LFxuICBcInNlbWlzdGFuZGFyZFwiOiB7XG4gICAgXCJnbG9iYWxzXCI6IFsgXCJleHBlY3RcIiwgXCJMXCIsIFwiWE1MSHR0cFJlcXVlc3RcIiwgXCJzaW5vblwiLCBcInhoclwiIF1cbiAgfSxcbiAgXCJzdHlsZVwiOiBcIi4vZGlzdC9lc3JpLWxlYWZsZXQtZ2VvY29kZXIuY3NzXCJcbn1cbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgVGFzaywgVXRpbCB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5pbXBvcnQgeyBXb3JsZEdlb2NvZGluZ1NlcnZpY2VVcmwgfSBmcm9tICcuLi9Fc3JpTGVhZmxldEdlb2NvZGluZyc7XG5cbmV4cG9ydCB2YXIgR2VvY29kZSA9IFRhc2suZXh0ZW5kKHtcbiAgcGF0aDogJ2ZpbmRBZGRyZXNzQ2FuZGlkYXRlcycsXG5cbiAgcGFyYW1zOiB7XG4gICAgb3V0U3I6IDQzMjYsXG4gICAgZm9yU3RvcmFnZTogZmFsc2UsXG4gICAgb3V0RmllbGRzOiAnKicsXG4gICAgbWF4TG9jYXRpb25zOiAyMFxuICB9LFxuXG4gIHNldHRlcnM6IHtcbiAgICAnYWRkcmVzcyc6ICdhZGRyZXNzJyxcbiAgICAnbmVpZ2hib3Job29kJzogJ25laWdoYm9yaG9vZCcsXG4gICAgJ2NpdHknOiAnY2l0eScsXG4gICAgJ3N1YnJlZ2lvbic6ICdzdWJyZWdpb24nLFxuICAgICdyZWdpb24nOiAncmVnaW9uJyxcbiAgICAncG9zdGFsJzogJ3Bvc3RhbCcsXG4gICAgJ2NvdW50cnknOiAnY291bnRyeScsXG4gICAgJ3RleHQnOiAnc2luZ2xlTGluZScsXG4gICAgJ2NhdGVnb3J5JzogJ2NhdGVnb3J5JyxcbiAgICAndG9rZW4nOiAndG9rZW4nLFxuICAgICdrZXknOiAnbWFnaWNLZXknLFxuICAgICdmaWVsZHMnOiAnb3V0RmllbGRzJyxcbiAgICAnZm9yU3RvcmFnZSc6ICdmb3JTdG9yYWdlJyxcbiAgICAnbWF4TG9jYXRpb25zJzogJ21heExvY2F0aW9ucydcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgfHwgV29ybGRHZW9jb2RpbmdTZXJ2aWNlVXJsO1xuICAgIFRhc2sucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgfSxcblxuICB3aXRoaW46IGZ1bmN0aW9uIChib3VuZHMpIHtcbiAgICBib3VuZHMgPSBMLmxhdExuZ0JvdW5kcyhib3VuZHMpO1xuICAgIHRoaXMucGFyYW1zLnNlYXJjaEV4dGVudCA9IFV0aWwuYm91bmRzVG9FeHRlbnQoYm91bmRzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBuZWFyYnk6IGZ1bmN0aW9uIChsYXRsbmcsIHJhZGl1cykge1xuICAgIGxhdGxuZyA9IEwubGF0TG5nKGxhdGxuZyk7XG4gICAgdGhpcy5wYXJhbXMubG9jYXRpb24gPSBsYXRsbmcubG5nICsgJywnICsgbGF0bG5nLmxhdDtcbiAgICB0aGlzLnBhcmFtcy5kaXN0YW5jZSA9IE1hdGgubWluKE1hdGgubWF4KHJhZGl1cywgMjAwMCksIDUwMDAwKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBydW46IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tUGFyYW0pIHtcbiAgICAgIHRoaXMucGFyYW1zW3RoaXMub3B0aW9ucy5jdXN0b21QYXJhbV0gPSB0aGlzLnBhcmFtcy5zaW5nbGVMaW5lO1xuICAgICAgZGVsZXRlIHRoaXMucGFyYW1zLnNpbmdsZUxpbmU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICB2YXIgcHJvY2Vzc29yID0gdGhpcy5fcHJvY2Vzc0dlb2NvZGVyUmVzcG9uc2U7XG4gICAgICB2YXIgcmVzdWx0cyA9ICghZXJyb3IpID8gcHJvY2Vzc29yKHJlc3BvbnNlKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIHsgcmVzdWx0czogcmVzdWx0cyB9LCByZXNwb25zZSk7XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgX3Byb2Nlc3NHZW9jb2RlclJlc3BvbnNlOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zZS5jYW5kaWRhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2FuZGlkYXRlID0gcmVzcG9uc2UuY2FuZGlkYXRlc1tpXTtcbiAgICAgIGlmIChjYW5kaWRhdGUuZXh0ZW50KSB7XG4gICAgICAgIHZhciBib3VuZHMgPSBVdGlsLmV4dGVudFRvQm91bmRzKGNhbmRpZGF0ZS5leHRlbnQpO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICB0ZXh0OiBjYW5kaWRhdGUuYWRkcmVzcyxcbiAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgIHNjb3JlOiBjYW5kaWRhdGUuc2NvcmUsXG4gICAgICAgIGxhdGxuZzogTC5sYXRMbmcoY2FuZGlkYXRlLmxvY2F0aW9uLnksIGNhbmRpZGF0ZS5sb2NhdGlvbi54KSxcbiAgICAgICAgcHJvcGVydGllczogY2FuZGlkYXRlLmF0dHJpYnV0ZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9jb2RlIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgR2VvY29kZShvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2VvY29kZTtcbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5pbXBvcnQgeyBXb3JsZEdlb2NvZGluZ1NlcnZpY2VVcmwgfSBmcm9tICcuLi9Fc3JpTGVhZmxldEdlb2NvZGluZyc7XG5cbmV4cG9ydCB2YXIgUmV2ZXJzZUdlb2NvZGUgPSBUYXNrLmV4dGVuZCh7XG4gIHBhdGg6ICdyZXZlcnNlR2VvY29kZScsXG5cbiAgcGFyYW1zOiB7XG4gICAgb3V0U1I6IDQzMjYsXG4gICAgcmV0dXJuSW50ZXJzZWN0aW9uOiBmYWxzZVxuICB9LFxuXG4gIHNldHRlcnM6IHtcbiAgICAnZGlzdGFuY2UnOiAnZGlzdGFuY2UnLFxuICAgICdsYW5ndWFnZSc6ICdsYW5nQ29kZScsXG4gICAgJ2ludGVyc2VjdGlvbic6ICdyZXR1cm5JbnRlcnNlY3Rpb24nXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsIHx8IFdvcmxkR2VvY29kaW5nU2VydmljZVVybDtcbiAgICBUYXNrLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIH0sXG5cbiAgbGF0bG5nOiBmdW5jdGlvbiAobGF0bG5nKSB7XG4gICAgbGF0bG5nID0gTC5sYXRMbmcobGF0bG5nKTtcbiAgICB0aGlzLnBhcmFtcy5sb2NhdGlvbiA9IGxhdGxuZy5sbmcgKyAnLCcgKyBsYXRsbmcubGF0O1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJ1bjogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICBsYXRsbmc6IEwubGF0TG5nKHJlc3BvbnNlLmxvY2F0aW9uLnksIHJlc3BvbnNlLmxvY2F0aW9uLngpLFxuICAgICAgICAgIGFkZHJlc3M6IHJlc3BvbnNlLmFkZHJlc3NcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzdWx0LCByZXNwb25zZSk7XG4gICAgfSwgdGhpcyk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcmV2ZXJzZUdlb2NvZGUgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBSZXZlcnNlR2VvY29kZShvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmV2ZXJzZUdlb2NvZGU7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFRhc2ssIFV0aWwgfSBmcm9tICdlc3JpLWxlYWZsZXQnO1xuaW1wb3J0IHsgV29ybGRHZW9jb2RpbmdTZXJ2aWNlVXJsIH0gZnJvbSAnLi4vRXNyaUxlYWZsZXRHZW9jb2RpbmcnO1xuXG5leHBvcnQgdmFyIFN1Z2dlc3QgPSBUYXNrLmV4dGVuZCh7XG4gIHBhdGg6ICdzdWdnZXN0JyxcblxuICBwYXJhbXM6IHt9LFxuXG4gIHNldHRlcnM6IHtcbiAgICB0ZXh0OiAndGV4dCcsXG4gICAgY2F0ZWdvcnk6ICdjYXRlZ29yeScsXG4gICAgY291bnRyaWVzOiAnY291bnRyeUNvZGUnLFxuICAgIG1heFN1Z2dlc3Rpb25zOiAnbWF4U3VnZ2VzdGlvbnMnXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoIW9wdGlvbnMudXJsKSB7XG4gICAgICBvcHRpb25zLnVybCA9IFdvcmxkR2VvY29kaW5nU2VydmljZVVybDtcbiAgICAgIG9wdGlvbnMuc3VwcG9ydHNTdWdnZXN0ID0gdHJ1ZTtcbiAgICB9XG4gICAgVGFzay5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICB9LFxuXG4gIHdpdGhpbjogZnVuY3Rpb24gKGJvdW5kcykge1xuICAgIGJvdW5kcyA9IEwubGF0TG5nQm91bmRzKGJvdW5kcyk7XG4gICAgYm91bmRzID0gYm91bmRzLnBhZCgwLjUpO1xuICAgIHZhciBjZW50ZXIgPSBib3VuZHMuZ2V0Q2VudGVyKCk7XG4gICAgdmFyIG5lID0gYm91bmRzLmdldE5vcnRoV2VzdCgpO1xuICAgIHRoaXMucGFyYW1zLmxvY2F0aW9uID0gY2VudGVyLmxuZyArICcsJyArIGNlbnRlci5sYXQ7XG4gICAgdGhpcy5wYXJhbXMuZGlzdGFuY2UgPSBNYXRoLm1pbihNYXRoLm1heChjZW50ZXIuZGlzdGFuY2VUbyhuZSksIDIwMDApLCA1MDAwMCk7XG4gICAgdGhpcy5wYXJhbXMuc2VhcmNoRXh0ZW50ID0gVXRpbC5ib3VuZHNUb0V4dGVudChib3VuZHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIG5lYXJieTogZnVuY3Rpb24gKGxhdGxuZywgcmFkaXVzKSB7XG4gICAgbGF0bG5nID0gTC5sYXRMbmcobGF0bG5nKTtcbiAgICB0aGlzLnBhcmFtcy5sb2NhdGlvbiA9IGxhdGxuZy5sbmcgKyAnLCcgKyBsYXRsbmcubGF0O1xuICAgIHRoaXMucGFyYW1zLmRpc3RhbmNlID0gTWF0aC5taW4oTWF0aC5tYXgocmFkaXVzLCAyMDAwKSwgNTAwMDApO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJ1bjogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdXBwb3J0c1N1Z2dlc3QpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybigndGhpcyBnZW9jb2Rpbmcgc2VydmljZSBkb2VzIG5vdCBzdXBwb3J0IGFza2luZyBmb3Igc3VnZ2VzdGlvbnMnKTtcbiAgICB9XG4gIH1cblxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWdnZXN0IChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgU3VnZ2VzdChvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3VnZ2VzdDtcbiIsImltcG9ydCB7IFNlcnZpY2UgfSBmcm9tICdlc3JpLWxlYWZsZXQnO1xuaW1wb3J0IHsgV29ybGRHZW9jb2RpbmdTZXJ2aWNlVXJsIH0gZnJvbSAnLi4vRXNyaUxlYWZsZXRHZW9jb2RpbmcnO1xuaW1wb3J0IGdlb2NvZGUgZnJvbSAnLi4vVGFza3MvR2VvY29kZSc7XG5pbXBvcnQgcmV2ZXJzZUdlb2NvZGUgZnJvbSAnLi4vVGFza3MvUmV2ZXJzZUdlb2NvZGUnO1xuaW1wb3J0IHN1Z2dlc3QgZnJvbSAnLi4vVGFza3MvU3VnZ2VzdCc7XG5cbmV4cG9ydCB2YXIgR2VvY29kZVNlcnZpY2UgPSBTZXJ2aWNlLmV4dGVuZCh7XG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKG9wdGlvbnMudXJsKSB7XG4gICAgICBTZXJ2aWNlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgICB0aGlzLl9jb25maXJtU3VnZ2VzdFN1cHBvcnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy51cmwgPSBXb3JsZEdlb2NvZGluZ1NlcnZpY2VVcmw7XG4gICAgICBvcHRpb25zLnN1cHBvcnRzU3VnZ2VzdCA9IHRydWU7XG4gICAgICBTZXJ2aWNlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICB9LFxuXG4gIGdlb2NvZGU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2VvY29kZSh0aGlzKTtcbiAgfSxcblxuICByZXZlcnNlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJldmVyc2VHZW9jb2RlKHRoaXMpO1xuICB9LFxuXG4gIHN1Z2dlc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAvLyByZXF1aXJlcyBlaXRoZXIgdGhlIEVzcmkgV29ybGQgR2VvY29kaW5nIFNlcnZpY2Ugb3IgYSA8MTAuMyBBcmNHSVMgU2VydmVyIEdlb2NvZGluZyBTZXJ2aWNlIHRoYXQgc3VwcG9ydHMgc3VnZ2VzdC5cbiAgICByZXR1cm4gc3VnZ2VzdCh0aGlzKTtcbiAgfSxcblxuICBfY29uZmlybVN1Z2dlc3RTdXBwb3J0OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5tZXRhZGF0YShmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9XG4gICAgICAvLyBwcmUgMTAuMyBnZW9jb2Rpbmcgc2VydmljZXMgZG9udCBsaXN0IGNhcGFiaWxpdGllcyAoYW5kIGRvbnQgc3VwcG9ydCBtYXhMb2NhdGlvbnMpXG4gICAgICAvLyBvbmx5IFNPTUUgaW5kaXZpZHVhbCBzZXJ2aWNlcyBoYXZlIGJlZW4gY29uZmlndXJlZCB0byBzdXBwb3J0IGFza2luZyBmb3Igc3VnZ2VzdGlvbnNcbiAgICAgIGlmICghcmVzcG9uc2UuY2FwYWJpbGl0aWVzKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5zdXBwb3J0c1N1Z2dlc3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vcHRpb25zLmN1c3RvbVBhcmFtID0gcmVzcG9uc2Uuc2luZ2xlTGluZUFkZHJlc3NGaWVsZC5uYW1lO1xuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5jYXBhYmlsaXRpZXMuaW5kZXhPZignU3VnZ2VzdCcpID4gLTEpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnN1cHBvcnRzU3VnZ2VzdCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc3VwcG9ydHNTdWdnZXN0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VvY29kZVNlcnZpY2UgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBHZW9jb2RlU2VydmljZShvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2VvY29kZVNlcnZpY2U7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcblxuZXhwb3J0IHZhciBHZW9zZWFyY2hDb3JlID0gTC5FdmVudGVkLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIHpvb21Ub1Jlc3VsdDogdHJ1ZSxcbiAgICB1c2VNYXBCb3VuZHM6IDEyLFxuICAgIHNlYXJjaEJvdW5kczogbnVsbFxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChjb250cm9sLCBvcHRpb25zKSB7XG4gICAgTC5VdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5fY29udHJvbCA9IGNvbnRyb2w7XG5cbiAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMucHJvdmlkZXJzIHx8ICFvcHRpb25zLnByb3ZpZGVycy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgcHJvdmlkZXInKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcm92aWRlcnMgPSBvcHRpb25zLnByb3ZpZGVycztcbiAgfSxcblxuICBfZ2VvY29kZTogZnVuY3Rpb24gKHRleHQsIGtleSwgcHJvdmlkZXIpIHtcbiAgICB2YXIgYWN0aXZlUmVxdWVzdHMgPSAwO1xuICAgIHZhciBhbGxSZXN1bHRzID0gW107XG4gICAgdmFyIGJvdW5kcztcblxuICAgIHZhciBjYWxsYmFjayA9IEwuVXRpbC5iaW5kKGZ1bmN0aW9uIChlcnJvciwgcmVzdWx0cykge1xuICAgICAgYWN0aXZlUmVxdWVzdHMtLTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHRzKSB7XG4gICAgICAgIGFsbFJlc3VsdHMgPSBhbGxSZXN1bHRzLmNvbmNhdChyZXN1bHRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZVJlcXVlc3RzIDw9IDApIHtcbiAgICAgICAgYm91bmRzID0gdGhpcy5fYm91bmRzRnJvbVJlc3VsdHMoYWxsUmVzdWx0cyk7XG5cbiAgICAgICAgdGhpcy5maXJlKCdyZXN1bHRzJywge1xuICAgICAgICAgIHJlc3VsdHM6IGFsbFJlc3VsdHMsXG4gICAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgICAgbGF0bG5nOiAoYm91bmRzKSA/IGJvdW5kcy5nZXRDZW50ZXIoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB0ZXh0OiB0ZXh0XG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuem9vbVRvUmVzdWx0ICYmIGJvdW5kcykge1xuICAgICAgICAgIHRoaXMuX2NvbnRyb2wuX21hcC5maXRCb3VuZHMoYm91bmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnbG9hZCcpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgaWYgKGtleSkge1xuICAgICAgYWN0aXZlUmVxdWVzdHMrKztcbiAgICAgIHByb3ZpZGVyLnJlc3VsdHModGV4dCwga2V5LCB0aGlzLl9zZWFyY2hCb3VuZHMoKSwgY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3Byb3ZpZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhY3RpdmVSZXF1ZXN0cysrO1xuICAgICAgICB0aGlzLl9wcm92aWRlcnNbaV0ucmVzdWx0cyh0ZXh0LCBrZXksIHRoaXMuX3NlYXJjaEJvdW5kcygpLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIF9zdWdnZXN0OiBmdW5jdGlvbiAodGV4dCkge1xuICAgIHZhciBhY3RpdmVSZXF1ZXN0cyA9IHRoaXMuX3Byb3ZpZGVycy5sZW5ndGg7XG5cbiAgICB2YXIgY3JlYXRlQ2FsbGJhY2sgPSBMLlV0aWwuYmluZChmdW5jdGlvbiAodGV4dCwgcHJvdmlkZXIpIHtcbiAgICAgIHJldHVybiBMLlV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIHN1Z2dlc3Rpb25zKSB7XG4gICAgICAgIGlmIChlcnJvcikgeyByZXR1cm47IH1cblxuICAgICAgICB2YXIgaTtcblxuICAgICAgICBhY3RpdmVSZXF1ZXN0cyA9IGFjdGl2ZVJlcXVlc3RzIC0gMTtcblxuICAgICAgICBpZiAodGV4dC5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgdGhpcy5fc3VnZ2VzdGlvbnMuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgdGhpcy5fc3VnZ2VzdGlvbnMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3VnZ2VzdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1Z2dlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzdWdnZXN0aW9uc1tpXS5wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB3ZSBzdGlsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgVUlcbiAgICAgICAgICB0aGlzLl9jb250cm9sLl9yZW5kZXJTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvdmlkZXIuX2xhc3RSZW5kZXIgIT09IHRleHQgJiYgcHJvdmlkZXIubm9kZXMpIHtcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJvdmlkZXIubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChwcm92aWRlci5ub2Rlc1tpXS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wuX3N1Z2dlc3Rpb25zLnJlbW92ZUNoaWxkKHByb3ZpZGVyLm5vZGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwcm92aWRlci5ub2RlcyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1Z2dlc3Rpb25zLmxlbmd0aCAmJiB0aGlzLl9jb250cm9sLl9pbnB1dC52YWx1ZSA9PT0gdGV4dCkge1xuICAgICAgICAgIHRoaXMuX2NvbnRyb2wuY2xlYXJTdWdnZXN0aW9ucyhwcm92aWRlci5ub2Rlcyk7XG5cbiAgICAgICAgICBwcm92aWRlci5fbGFzdFJlbmRlciA9IHRleHQ7XG4gICAgICAgICAgcHJvdmlkZXIubm9kZXMgPSB0aGlzLl9jb250cm9sLl9yZW5kZXJTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7XG4gICAgICAgICAgdGhpcy5fY29udHJvbC5fbm9kZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcyk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICB0aGlzLl9wZW5kaW5nU3VnZ2VzdGlvbnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fcHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvdmlkZXIgPSB0aGlzLl9wcm92aWRlcnNbaV07XG4gICAgICB2YXIgcmVxdWVzdCA9IHByb3ZpZGVyLnN1Z2dlc3Rpb25zKHRleHQsIHRoaXMuX3NlYXJjaEJvdW5kcygpLCBjcmVhdGVDYWxsYmFjayh0ZXh0LCBwcm92aWRlcikpO1xuICAgICAgdGhpcy5fcGVuZGluZ1N1Z2dlc3Rpb25zLnB1c2gocmVxdWVzdCk7XG4gICAgfVxuICB9LFxuXG4gIF9zZWFyY2hCb3VuZHM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnNlYXJjaEJvdW5kcyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zZWFyY2hCb3VuZHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy51c2VNYXBCb3VuZHMgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnVzZU1hcEJvdW5kcyA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbnRyb2wuX21hcC5nZXRCb3VuZHMoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnVzZU1hcEJvdW5kcyA8PSB0aGlzLl9jb250cm9sLl9tYXAuZ2V0Wm9vbSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29udHJvbC5fbWFwLmdldEJvdW5kcygpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9LFxuXG4gIF9ib3VuZHNGcm9tUmVzdWx0czogZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG51bGxJc2xhbmQgPSBMLmxhdExuZ0JvdW5kcyhbMCwgMF0sIFswLCAwXSk7XG4gICAgdmFyIHJlc3VsdEJvdW5kcyA9IFtdO1xuICAgIHZhciByZXN1bHRMYXRsbmdzID0gW107XG5cbiAgICAvLyBjb2xsZWN0IHRoZSBib3VuZHMgYW5kIGNlbnRlciBvZiBlYWNoIHJlc3VsdFxuICAgIGZvciAodmFyIGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gcmVzdWx0c1tpXTtcblxuICAgICAgcmVzdWx0TGF0bG5ncy5wdXNoKHJlc3VsdC5sYXRsbmcpO1xuXG4gICAgICAvLyBtYWtlIHN1cmUgYm91bmRzIGFyZSB2YWxpZCBhbmQgbm90IDAsMC4gc29tZXRpbWVzIGJvdW5kcyBhcmUgaW5jb3JyZWN0IG9yIG5vdCBwcmVzZW50XG4gICAgICBpZiAocmVzdWx0LmJvdW5kcyAmJiByZXN1bHQuYm91bmRzLmlzVmFsaWQoKSAmJiAhcmVzdWx0LmJvdW5kcy5lcXVhbHMobnVsbElzbGFuZCkpIHtcbiAgICAgICAgcmVzdWx0Qm91bmRzLnB1c2gocmVzdWx0LmJvdW5kcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybSBhIGJvdW5kcyBvYmplY3QgY29udGFpbmluZyBhbGwgY2VudGVyIHBvaW50c1xuICAgIHZhciBib3VuZHMgPSBMLmxhdExuZ0JvdW5kcyhyZXN1bHRMYXRsbmdzKTtcblxuICAgIC8vIGFuZCBleHRlbmQgaXQgdG8gY29udGFpbiBhbGwgYm91bmRzIG9iamVjdHNcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJlc3VsdEJvdW5kcy5sZW5ndGg7IGorKykge1xuICAgICAgYm91bmRzLmV4dGVuZChyZXN1bHRCb3VuZHNbal0pO1xuICAgIH1cblxuICAgIHJldHVybiBib3VuZHM7XG4gIH0sXG5cbiAgX2dldEF0dHJpYnV0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGF0dHJpYnMgPSBbXTtcbiAgICB2YXIgcHJvdmlkZXJzID0gdGhpcy5fcHJvdmlkZXJzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwcm92aWRlcnNbaV0ub3B0aW9ucy5hdHRyaWJ1dGlvbikge1xuICAgICAgICBhdHRyaWJzLnB1c2gocHJvdmlkZXJzW2ldLm9wdGlvbnMuYXR0cmlidXRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhdHRyaWJzLmpvaW4oJywgJyk7XG4gIH1cblxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9zZWFyY2hDb3JlIChjb250cm9sLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgR2Vvc2VhcmNoQ29yZShjb250cm9sLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2Vvc2VhcmNoQ29yZTtcbiIsImltcG9ydCB7IEdlb2NvZGVTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvR2VvY29kZSc7XG5cbmV4cG9ydCB2YXIgQXJjZ2lzT25saW5lUHJvdmlkZXIgPSBHZW9jb2RlU2VydmljZS5leHRlbmQoe1xuICBvcHRpb25zOiB7XG4gICAgbGFiZWw6ICdQbGFjZXMgYW5kIEFkZHJlc3NlcycsXG4gICAgbWF4UmVzdWx0czogNVxuICB9LFxuXG4gIHN1Z2dlc3Rpb25zOiBmdW5jdGlvbiAodGV4dCwgYm91bmRzLCBjYWxsYmFjaykge1xuICAgIHZhciByZXF1ZXN0ID0gdGhpcy5zdWdnZXN0KCkudGV4dCh0ZXh0KTtcblxuICAgIGlmIChib3VuZHMpIHtcbiAgICAgIHJlcXVlc3Qud2l0aGluKGJvdW5kcyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb3VudHJpZXMpIHtcbiAgICAgIHJlcXVlc3QuY291bnRyaWVzKHRoaXMub3B0aW9ucy5jb3VudHJpZXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2F0ZWdvcmllcykge1xuICAgICAgcmVxdWVzdC5jYXRlZ29yeSh0aGlzLm9wdGlvbnMuY2F0ZWdvcmllcyk7XG4gICAgfVxuXG4gICAgLy8gMTUgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN1Z2dlc3Rpb25zIHRoYXQgY2FuIGJlIHJldHVybmVkXG4gICAgcmVxdWVzdC5tYXhTdWdnZXN0aW9ucyh0aGlzLm9wdGlvbnMubWF4UmVzdWx0cyk7XG5cbiAgICByZXR1cm4gcmVxdWVzdC5ydW4oZnVuY3Rpb24gKGVycm9yLCByZXN1bHRzLCByZXNwb25zZSkge1xuICAgICAgdmFyIHN1Z2dlc3Rpb25zID0gW107XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHdoaWxlIChyZXNwb25zZS5zdWdnZXN0aW9ucy5sZW5ndGggJiYgc3VnZ2VzdGlvbnMubGVuZ3RoIDw9ICh0aGlzLm9wdGlvbnMubWF4UmVzdWx0cyAtIDEpKSB7XG4gICAgICAgICAgdmFyIHN1Z2dlc3Rpb24gPSByZXNwb25zZS5zdWdnZXN0aW9ucy5zaGlmdCgpO1xuICAgICAgICAgIGlmICghc3VnZ2VzdGlvbi5pc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICB0ZXh0OiBzdWdnZXN0aW9uLnRleHQsXG4gICAgICAgICAgICAgIG1hZ2ljS2V5OiBzdWdnZXN0aW9uLm1hZ2ljS2V5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKGVycm9yLCBzdWdnZXN0aW9ucyk7XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgcmVzdWx0czogZnVuY3Rpb24gKHRleHQsIGtleSwgYm91bmRzLCBjYWxsYmFjaykge1xuICAgIHZhciByZXF1ZXN0ID0gdGhpcy5nZW9jb2RlKCkudGV4dCh0ZXh0KTtcblxuICAgIGlmIChrZXkpIHtcbiAgICAgIHJlcXVlc3Qua2V5KGtleSk7XG4gICAgfVxuICAgIC8vIGluIHRoZSBmdXR1cmUgQWRkcmVzcy9TdHJlZXROYW1lIGdlb2NvZGluZyByZXF1ZXN0cyB0aGF0IGluY2x1ZGUgYSBtYWdpY0tleSB3aWxsIGFsd2F5cyBvbmx5IHJldHVybiBvbmUgbWF0Y2hcbiAgICByZXF1ZXN0Lm1heExvY2F0aW9ucyh0aGlzLm9wdGlvbnMubWF4UmVzdWx0cyk7XG5cbiAgICBpZiAoYm91bmRzKSB7XG4gICAgICByZXF1ZXN0LndpdGhpbihib3VuZHMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZm9yU3RvcmFnZSkge1xuICAgICAgcmVxdWVzdC5mb3JTdG9yYWdlKHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXF1ZXN0LnJ1bihmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBjYWxsYmFjayhlcnJvciwgcmVzcG9uc2UucmVzdWx0cyk7XG4gICAgfSwgdGhpcyk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gYXJjZ2lzT25saW5lUHJvdmlkZXIgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBBcmNnaXNPbmxpbmVQcm92aWRlcihvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJjZ2lzT25saW5lUHJvdmlkZXI7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IGdlb3NlYXJjaENvcmUgfSBmcm9tICcuLi9DbGFzc2VzL0dlb3NlYXJjaENvcmUnO1xuaW1wb3J0IHsgYXJjZ2lzT25saW5lUHJvdmlkZXIgfSBmcm9tICcuLi9Qcm92aWRlcnMvQXJjZ2lzT25saW5lR2VvY29kZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5cbmV4cG9ydCB2YXIgR2Vvc2VhcmNoID0gTC5Db250cm9sLmV4dGVuZCh7XG4gIGluY2x1ZGVzOiBMLk1peGluLkV2ZW50cyxcblxuICBvcHRpb25zOiB7XG4gICAgcG9zaXRpb246ICd0b3BsZWZ0JyxcbiAgICBjb2xsYXBzZUFmdGVyUmVzdWx0OiB0cnVlLFxuICAgIGV4cGFuZGVkOiBmYWxzZSxcbiAgICBhbGxvd011bHRpcGxlUmVzdWx0czogdHJ1ZSxcbiAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCBmb3IgcGxhY2VzIG9yIGFkZHJlc3NlcycsXG4gICAgdGl0bGU6ICdMb2NhdGlvbiBTZWFyY2gnXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBMLlV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcblxuICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5wcm92aWRlcnMgfHwgIW9wdGlvbnMucHJvdmlkZXJzLmxlbmd0aCkge1xuICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMucHJvdmlkZXJzID0gWyBhcmNnaXNPbmxpbmVQcm92aWRlcigpIF07XG4gICAgfVxuXG4gICAgLy8gaW5zdGFudGlhdGUgdGhlIHVuZGVybHlpbmcgY2xhc3MgYW5kIHBhc3MgYWxvbmcgb3B0aW9uc1xuICAgIHRoaXMuX2dlb3NlYXJjaENvcmUgPSBnZW9zZWFyY2hDb3JlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuX3Byb3ZpZGVycyA9IG9wdGlvbnMucHJvdmlkZXJzO1xuXG4gICAgLy8gYnViYmxlIGVhY2ggcHJvdmlkZXJzIGV2ZW50cyB0byB0aGUgY29udHJvbFxuICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuYWRkRXZlbnRQYXJlbnQodGhpcyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9nZW9zZWFyY2hDb3JlLl9wcm92aWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuX3Byb3ZpZGVyc1tpXS5hZGRFdmVudFBhcmVudCh0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9nZW9zZWFyY2hDb3JlLl9wZW5kaW5nU3VnZ2VzdGlvbnMgPSBbXTtcblxuICAgIEwuQ29udHJvbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKG9wdGlvbnMpO1xuICB9LFxuXG4gIF9yZW5kZXJTdWdnZXN0aW9uczogZnVuY3Rpb24gKHN1Z2dlc3Rpb25zKSB7XG4gICAgdmFyIGN1cnJlbnRHcm91cDtcblxuICAgIGlmIChzdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9zdWdnZXN0aW9ucy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG4gICAgLy8gc2V0IHRoZSBtYXhIZWlnaHQgb2YgdGhlIHN1Z2dlc3Rpb25zIGJveCB0b1xuICAgIC8vIG1hcCBoZWlnaHRcbiAgICAvLyAtIHN1Z2dlc3Rpb25zIG9mZnNldCAoZGlzdGFuY2UgZnJvbSB0b3Agb2Ygc3VnZ2VzdGlvbnMgdG8gdG9wIG9mIGNvbnRyb2wpXG4gICAgLy8gLSBjb250cm9sIG9mZnNldCAoZGlzdGFuY2UgZnJvbSB0b3Agb2YgY29udHJvbCB0byB0b3Agb2YgbWFwKVxuICAgIC8vIC0gMTAgKGV4dHJhIHBhZGRpbmcpXG4gICAgdGhpcy5fc3VnZ2VzdGlvbnMuc3R5bGUubWF4SGVpZ2h0ID0gKHRoaXMuX21hcC5nZXRTaXplKCkueSAtIHRoaXMuX3N1Z2dlc3Rpb25zLm9mZnNldFRvcCAtIHRoaXMuX3dyYXBwZXIub2Zmc2V0VG9wIC0gMTApICsgJ3B4JztcblxuICAgIHZhciBub2RlcyA9IFtdO1xuICAgIHZhciBsaXN0O1xuICAgIHZhciBoZWFkZXI7XG4gICAgdmFyIHN1Z2dlc3Rpb25UZXh0QXJyYXkgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VnZ2VzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdWdnZXN0aW9uID0gc3VnZ2VzdGlvbnNbaV07XG4gICAgICBpZiAoIWhlYWRlciAmJiB0aGlzLl9nZW9zZWFyY2hDb3JlLl9wcm92aWRlcnMubGVuZ3RoID4gMSAmJiBjdXJyZW50R3JvdXAgIT09IHN1Z2dlc3Rpb24ucHJvdmlkZXIub3B0aW9ucy5sYWJlbCkge1xuICAgICAgICBoZWFkZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCdzcGFuJywgJ2dlb2NvZGVyLWNvbnRyb2wtaGVhZGVyJywgdGhpcy5fc3VnZ2VzdGlvbnMpO1xuICAgICAgICBoZWFkZXIudGV4dENvbnRlbnQgPSBzdWdnZXN0aW9uLnByb3ZpZGVyLm9wdGlvbnMubGFiZWw7XG4gICAgICAgIGhlYWRlci5pbm5lclRleHQgPSBzdWdnZXN0aW9uLnByb3ZpZGVyLm9wdGlvbnMubGFiZWw7XG4gICAgICAgIGN1cnJlbnRHcm91cCA9IHN1Z2dlc3Rpb24ucHJvdmlkZXIub3B0aW9ucy5sYWJlbDtcbiAgICAgICAgbm9kZXMucHVzaChoZWFkZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWxpc3QpIHtcbiAgICAgICAgbGlzdCA9IEwuRG9tVXRpbC5jcmVhdGUoJ3VsJywgJ2dlb2NvZGVyLWNvbnRyb2wtbGlzdCcsIHRoaXMuX3N1Z2dlc3Rpb25zKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN1Z2dlc3Rpb25UZXh0QXJyYXkuaW5kZXhPZihzdWdnZXN0aW9uLnRleHQpID09PSAtMSkge1xuICAgICAgICB2YXIgc3VnZ2VzdGlvbkl0ZW0gPSBMLkRvbVV0aWwuY3JlYXRlKCdsaScsICdnZW9jb2Rlci1jb250cm9sLXN1Z2dlc3Rpb24nLCBsaXN0KTtcblxuICAgICAgICBzdWdnZXN0aW9uSXRlbS5pbm5lckhUTUwgPSBzdWdnZXN0aW9uLnRleHQ7XG4gICAgICAgIHN1Z2dlc3Rpb25JdGVtLnByb3ZpZGVyID0gc3VnZ2VzdGlvbi5wcm92aWRlcjtcbiAgICAgICAgc3VnZ2VzdGlvbkl0ZW1bJ2RhdGEtbWFnaWMta2V5J10gPSBzdWdnZXN0aW9uLm1hZ2ljS2V5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsaXN0LmNoaWxkTm9kZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAvLyBpZiB0aGUgc2FtZSB0ZXh0IGFscmVhZHkgYXBwZWFycyBpbiB0aGUgbGlzdCBvZiBzdWdnZXN0aW9ucywgYXBwZW5kIGFuIGFkZGl0aW9uYWwgT2JqZWN0SUQgdG8gaXRzIG1hZ2ljS2V5IGluc3RlYWRcbiAgICAgICAgICBpZiAobGlzdC5jaGlsZE5vZGVzW2pdLmlubmVySFRNTCA9PT0gc3VnZ2VzdGlvbi50ZXh0KSB7XG4gICAgICAgICAgICBsaXN0LmNoaWxkTm9kZXNbal1bJ2RhdGEtbWFnaWMta2V5J10gKz0gJywnICsgc3VnZ2VzdGlvbi5tYWdpY0tleTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN1Z2dlc3Rpb25UZXh0QXJyYXkucHVzaChzdWdnZXN0aW9uLnRleHQpO1xuICAgIH1cblxuICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9pbnB1dCwgJ2dlb2NvZGVyLWNvbnRyb2wtbG9hZGluZycpO1xuXG4gICAgbm9kZXMucHVzaChsaXN0KTtcblxuICAgIHJldHVybiBub2RlcztcbiAgfSxcblxuICBfYm91bmRzRnJvbVJlc3VsdHM6IGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgaWYgKCFyZXN1bHRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBudWxsSXNsYW5kID0gTC5sYXRMbmdCb3VuZHMoWzAsIDBdLCBbMCwgMF0pO1xuICAgIHZhciByZXN1bHRCb3VuZHMgPSBbXTtcbiAgICB2YXIgcmVzdWx0TGF0bG5ncyA9IFtdO1xuXG4gICAgLy8gY29sbGVjdCB0aGUgYm91bmRzIGFuZCBjZW50ZXIgb2YgZWFjaCByZXN1bHRcbiAgICBmb3IgKHZhciBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHJlc3VsdHNbaV07XG5cbiAgICAgIHJlc3VsdExhdGxuZ3MucHVzaChyZXN1bHQubGF0bG5nKTtcblxuICAgICAgLy8gbWFrZSBzdXJlIGJvdW5kcyBhcmUgdmFsaWQgYW5kIG5vdCAwLDAuIHNvbWV0aW1lcyBib3VuZHMgYXJlIGluY29ycmVjdCBvciBub3QgcHJlc2VudFxuICAgICAgaWYgKHJlc3VsdC5ib3VuZHMgJiYgcmVzdWx0LmJvdW5kcy5pc1ZhbGlkKCkgJiYgIXJlc3VsdC5ib3VuZHMuZXF1YWxzKG51bGxJc2xhbmQpKSB7XG4gICAgICAgIHJlc3VsdEJvdW5kcy5wdXNoKHJlc3VsdC5ib3VuZHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZvcm0gYSBib3VuZHMgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGNlbnRlciBwb2ludHNcbiAgICB2YXIgYm91bmRzID0gTC5sYXRMbmdCb3VuZHMocmVzdWx0TGF0bG5ncyk7XG5cbiAgICAvLyBhbmQgZXh0ZW5kIGl0IHRvIGNvbnRhaW4gYWxsIGJvdW5kcyBvYmplY3RzXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCByZXN1bHRCb3VuZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGJvdW5kcy5leHRlbmQocmVzdWx0Qm91bmRzW2pdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm91bmRzO1xuICB9LFxuXG4gIGNsZWFyOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fc3VnZ2VzdGlvbnMuaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5fc3VnZ2VzdGlvbnMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLl9pbnB1dC52YWx1ZSA9ICcnO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsYXBzZUFmdGVyUmVzdWx0KSB7XG4gICAgICB0aGlzLl9pbnB1dC5wbGFjZWhvbGRlciA9ICcnO1xuICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX3dyYXBwZXIsICdnZW9jb2Rlci1jb250cm9sLWV4cGFuZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9tYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZWQoKSAmJiB0aGlzLl9tYXAub3B0aW9ucy5zY3JvbGxXaGVlbFpvb20pIHtcbiAgICAgIHRoaXMuX21hcC5zY3JvbGxXaGVlbFpvb20uZW5hYmxlKCk7XG4gICAgfVxuICB9LFxuXG4gIGNsZWFyU3VnZ2VzdGlvbnM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fbm9kZXMpIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5fbm9kZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgaWYgKHRoaXMuX25vZGVzW2tdLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLl9zdWdnZXN0aW9ucy5yZW1vdmVDaGlsZCh0aGlzLl9ub2Rlc1trXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgX3NldHVwQ2xpY2s6IGZ1bmN0aW9uICgpIHtcbiAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fd3JhcHBlciwgJ2dlb2NvZGVyLWNvbnRyb2wtZXhwYW5kZWQnKTtcbiAgICB0aGlzLl9pbnB1dC5mb2N1cygpO1xuICB9LFxuXG4gIGRpc2FibGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9pbnB1dC5kaXNhYmxlZCA9IHRydWU7XG4gICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2lucHV0LCAnZ2VvY29kZXItY29udHJvbC1pbnB1dC1kaXNhYmxlZCcpO1xuICAgIEwuRG9tRXZlbnQucmVtb3ZlTGlzdGVuZXIodGhpcy5fd3JhcHBlciwgJ2NsaWNrJywgdGhpcy5fc2V0dXBDbGljaywgdGhpcyk7XG4gIH0sXG5cbiAgZW5hYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5faW5wdXQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBMLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5faW5wdXQsICdnZW9jb2Rlci1jb250cm9sLWlucHV0LWRpc2FibGVkJyk7XG4gICAgTC5Eb21FdmVudC5hZGRMaXN0ZW5lcih0aGlzLl93cmFwcGVyLCAnY2xpY2snLCB0aGlzLl9zZXR1cENsaWNrLCB0aGlzKTtcbiAgfSxcblxuICBnZXRBdHRyaWJ1dGlvbjogZnVuY3Rpb24gKCkge1xuICAgIHZhciBhdHRyaWJzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3Byb3ZpZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX3Byb3ZpZGVyc1tpXS5vcHRpb25zLmF0dHJpYnV0aW9uKSB7XG4gICAgICAgIGF0dHJpYnMucHVzaCh0aGlzLl9wcm92aWRlcnNbaV0ub3B0aW9ucy5hdHRyaWJ1dGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnMuam9pbignLCAnKTtcbiAgfSxcblxuICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xuICAgIC8vIGluY2x1ZGUgJ1Bvd2VyZWQgYnkgRXNyaScgaW4gbWFwIGF0dHJpYnV0aW9uXG4gICAgVXRpbC5zZXRFc3JpQXR0cmlidXRpb24obWFwKTtcblxuICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICB0aGlzLl93cmFwcGVyID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2dlb2NvZGVyLWNvbnRyb2wnKTtcbiAgICB0aGlzLl9pbnB1dCA9IEwuRG9tVXRpbC5jcmVhdGUoJ2lucHV0JywgJ2dlb2NvZGVyLWNvbnRyb2wtaW5wdXQgbGVhZmxldC1iYXInLCB0aGlzLl93cmFwcGVyKTtcbiAgICB0aGlzLl9pbnB1dC50aXRsZSA9IHRoaXMub3B0aW9ucy50aXRsZTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZXhwYW5kZWQpIHtcbiAgICAgIEwuRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl93cmFwcGVyLCAnZ2VvY29kZXItY29udHJvbC1leHBhbmRlZCcpO1xuICAgICAgdGhpcy5faW5wdXQucGxhY2Vob2xkZXIgPSB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgdGhpcy5fc3VnZ2VzdGlvbnMgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnLCAnZ2VvY29kZXItY29udHJvbC1zdWdnZXN0aW9ucyBsZWFmbGV0LWJhcicsIHRoaXMuX3dyYXBwZXIpO1xuXG4gICAgdmFyIGNyZWRpdHMgPSB0aGlzLl9nZW9zZWFyY2hDb3JlLl9nZXRBdHRyaWJ1dGlvbigpO1xuICAgIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuYWRkQXR0cmlidXRpb24oY3JlZGl0cyk7XG5cbiAgICBMLkRvbUV2ZW50LmFkZExpc3RlbmVyKHRoaXMuX2lucHV0LCAnZm9jdXMnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5faW5wdXQucGxhY2Vob2xkZXIgPSB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXI7XG4gICAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fd3JhcHBlciwgJ2dlb2NvZGVyLWNvbnRyb2wtZXhwYW5kZWQnKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIEwuRG9tRXZlbnQuYWRkTGlzdGVuZXIodGhpcy5fd3JhcHBlciwgJ2NsaWNrJywgdGhpcy5fc2V0dXBDbGljaywgdGhpcyk7XG5cbiAgICBMLkRvbUV2ZW50LmFkZExpc3RlbmVyKHRoaXMuX3N1Z2dlc3Rpb25zLCAnbW91c2Vkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBzdWdnZXN0aW9uSXRlbSA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDtcbiAgICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuX2dlb2NvZGUoc3VnZ2VzdGlvbkl0ZW0uaW5uZXJIVE1MLCBzdWdnZXN0aW9uSXRlbVsnZGF0YS1tYWdpYy1rZXknXSwgc3VnZ2VzdGlvbkl0ZW0ucHJvdmlkZXIpO1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgTC5Eb21FdmVudC5hZGRMaXN0ZW5lcih0aGlzLl9pbnB1dCwgJ2JsdXInLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgTC5Eb21FdmVudC5hZGRMaXN0ZW5lcih0aGlzLl9pbnB1dCwgJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHRleHQgPSAoZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50KS52YWx1ZTtcblxuICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX3dyYXBwZXIsICdnZW9jb2Rlci1jb250cm9sLWV4cGFuZGVkJyk7XG5cbiAgICAgIHZhciBsaXN0ID0gdGhpcy5fc3VnZ2VzdGlvbnMucXVlcnlTZWxlY3RvckFsbCgnLicgKyAnZ2VvY29kZXItY29udHJvbC1zdWdnZXN0aW9uJyk7XG4gICAgICB2YXIgc2VsZWN0ZWQgPSB0aGlzLl9zdWdnZXN0aW9ucy5xdWVyeVNlbGVjdG9yQWxsKCcuJyArICdnZW9jb2Rlci1jb250cm9sLXNlbGVjdGVkJylbMF07XG4gICAgICB2YXIgc2VsZWN0ZWRQb3NpdGlvbjtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChsaXN0W2ldID09PSBzZWxlY3RlZCkge1xuICAgICAgICAgIHNlbGVjdGVkUG9zaXRpb24gPSBpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgLypcbiAgICAgICAgICAgIGlmIGFuIGl0ZW0gaGFzIGJlZW4gc2VsZWN0ZWQsIGdlb2NvZGUgaXRcbiAgICAgICAgICAgIGlmIGZvY3VzIGlzIG9uIHRoZSBpbnB1dCB0ZXh0Ym94LCBnZW9jb2RlIG9ubHkgaWYgbXVsdGlwbGUgcmVzdWx0cyBhcmUgYWxsb3dlZCBhbmQgbW9yZSB0aGFuIHR3byBjaGFyYWN0ZXJzIGFyZSBwcmVzZW50LCBvciBpZiBhIHNpbmdsZSBzdWdnZXN0aW9uIGlzIGRpc3BsYXllZC5cbiAgICAgICAgICAgIGlmIGxlc3MgdGhhbiB0d28gY2hhcmFjdGVycyBoYXZlIGJlZW4gdHlwZWQsIGFib3J0IHRoZSBnZW9jb2RlXG4gICAgICAgICAgKi9cbiAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuX2dlb2NvZGUoc2VsZWN0ZWQuaW5uZXJIVE1MLCBzZWxlY3RlZFsnZGF0YS1tYWdpYy1rZXknXSwgc2VsZWN0ZWQucHJvdmlkZXIpO1xuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmFsbG93TXVsdGlwbGVSZXN1bHRzICYmIHRleHQubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuX2dlb2NvZGUodGhpcy5faW5wdXQudmFsdWUsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3MobGlzdFswXSwgJ2dlb2NvZGVyLWNvbnRyb2wtc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgdGhpcy5fZ2Vvc2VhcmNoQ29yZS5fZ2VvY29kZShsaXN0WzBdLmlubmVySFRNTCwgbGlzdFswXVsnZGF0YS1tYWdpYy1rZXknXSwgbGlzdFswXS5wcm92aWRlcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICAgIHRoaXMuX2lucHV0LmJsdXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgTC5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdChlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyhzZWxlY3RlZCwgJ2dlb2NvZGVyLWNvbnRyb2wtc2VsZWN0ZWQnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcHJldmlvdXNJdGVtID0gbGlzdFtzZWxlY3RlZFBvc2l0aW9uIC0gMV07XG5cbiAgICAgICAgICBpZiAoc2VsZWN0ZWQgJiYgcHJldmlvdXNJdGVtKSB7XG4gICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3MocHJldmlvdXNJdGVtLCAnZ2VvY29kZXItY29udHJvbC1zZWxlY3RlZCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3MobGlzdFtsaXN0Lmxlbmd0aCAtIDFdLCAnZ2VvY29kZXItY29udHJvbC1zZWxlY3RlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBMLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKHNlbGVjdGVkLCAnZ2VvY29kZXItY29udHJvbC1zZWxlY3RlZCcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBuZXh0SXRlbSA9IGxpc3Rbc2VsZWN0ZWRQb3NpdGlvbiArIDFdO1xuXG4gICAgICAgICAgaWYgKHNlbGVjdGVkICYmIG5leHRJdGVtKSB7XG4gICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3MobmV4dEl0ZW0sICdnZW9jb2Rlci1jb250cm9sLXNlbGVjdGVkJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEwuRG9tVXRpbC5hZGRDbGFzcyhsaXN0WzBdLCAnZ2VvY29kZXItY29udHJvbC1zZWxlY3RlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBMLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIHdoZW4gdGhlIGlucHV0IGNoYW5nZXMgd2Ugc2hvdWxkIGNhbmNlbCBhbGwgcGVuZGluZyBzdWdnZXN0aW9uIHJlcXVlc3RzIGlmIHBvc3NpYmxlIHRvIGF2b2lkIHJlc3VsdCBjb2xsaXNpb25zXG4gICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLl9nZW9zZWFyY2hDb3JlLl9wZW5kaW5nU3VnZ2VzdGlvbnMubGVuZ3RoOyB4KyspIHtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gdGhpcy5fZ2Vvc2VhcmNoQ29yZS5fcGVuZGluZ1N1Z2dlc3Rpb25zW3hdO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QgJiYgcmVxdWVzdC5hYm9ydCAmJiAhcmVxdWVzdC5pZCkge1xuICAgICAgICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgTC5Eb21FdmVudC5hZGRMaXN0ZW5lcih0aGlzLl9pbnB1dCwgJ2tleXVwJywgTC5VdGlsLnRocm90dGxlKGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIga2V5ID0gZS53aGljaCB8fCBlLmtleUNvZGU7XG4gICAgICB2YXIgdGV4dCA9IChlLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQpLnZhbHVlO1xuXG4gICAgICAvLyByZXF1aXJlIGF0IGxlYXN0IDIgY2hhcmFjdGVycyBmb3Igc3VnZ2VzdGlvbnNcbiAgICAgIGlmICh0ZXh0Lmxlbmd0aCA8IDIpIHtcbiAgICAgICAgdGhpcy5fc3VnZ2VzdGlvbnMuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHRoaXMuX3N1Z2dlc3Rpb25zLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9pbnB1dCwgJ2dlb2NvZGVyLWNvbnRyb2wtbG9hZGluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGVzY2FwZSBrZXkgaXQgd2lsbCBjbGVhciB0aGUgaW5wdXQgc28gY2xlYXIgc3VnZ2VzdGlvbnNcbiAgICAgIGlmIChrZXkgPT09IDI3KSB7XG4gICAgICAgIHRoaXMuX3N1Z2dlc3Rpb25zLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLl9zdWdnZXN0aW9ucy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoaXMgaXMgTk9UIHRoZSB1cC9kb3duIGFycm93cyBvciBlbnRlciBtYWtlIGEgc3VnZ2VzdGlvblxuICAgICAgaWYgKGtleSAhPT0gMTMgJiYga2V5ICE9PSAzOCAmJiBrZXkgIT09IDQwKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbnB1dC52YWx1ZSAhPT0gdGhpcy5fbGFzdFZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5fbGFzdFZhbHVlID0gdGhpcy5faW5wdXQudmFsdWU7XG4gICAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2lucHV0LCAnZ2VvY29kZXItY29udHJvbC1sb2FkaW5nJyk7XG4gICAgICAgICAgdGhpcy5fZ2Vvc2VhcmNoQ29yZS5fc3VnZ2VzdCh0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDUwLCB0aGlzKSwgdGhpcyk7XG5cbiAgICBMLkRvbUV2ZW50LmRpc2FibGVDbGlja1Byb3BhZ2F0aW9uKHRoaXMuX3dyYXBwZXIpO1xuXG4gICAgLy8gd2hlbiBtb3VzZSBtb3ZlcyBvdmVyIHN1Z2dlc3Rpb25zIGRpc2FibGUgc2Nyb2xsIHdoZWVsIHpvb20gaWYgaXRzIGVuYWJsZWRcbiAgICBMLkRvbUV2ZW50LmFkZExpc3RlbmVyKHRoaXMuX3N1Z2dlc3Rpb25zLCAnbW91c2VvdmVyJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChtYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZWQoKSAmJiBtYXAub3B0aW9ucy5zY3JvbGxXaGVlbFpvb20pIHtcbiAgICAgICAgbWFwLnNjcm9sbFdoZWVsWm9vbS5kaXNhYmxlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyB3aGVuIG1vdXNlIG1vdmVzIGxlYXZlcyBzdWdnZXN0aW9ucyBlbmFibGUgc2Nyb2xsIHdoZWVsIHpvb20gaWYgaXRzIGRpc2FibGVkXG4gICAgTC5Eb21FdmVudC5hZGRMaXN0ZW5lcih0aGlzLl9zdWdnZXN0aW9ucywgJ21vdXNlb3V0JywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghbWFwLnNjcm9sbFdoZWVsWm9vbS5lbmFibGVkKCkgJiYgbWFwLm9wdGlvbnMuc2Nyb2xsV2hlZWxab29tKSB7XG4gICAgICAgIG1hcC5zY3JvbGxXaGVlbFpvb20uZW5hYmxlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9nZW9zZWFyY2hDb3JlLm9uKCdsb2FkJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9pbnB1dCwgJ2dlb2NvZGVyLWNvbnRyb2wtbG9hZGluZycpO1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgdGhpcy5faW5wdXQuYmx1cigpO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3dyYXBwZXI7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2Vvc2VhcmNoIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgR2Vvc2VhcmNoKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZW9zZWFyY2g7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IEZlYXR1cmVMYXllclNlcnZpY2UgfSBmcm9tICdlc3JpLWxlYWZsZXQnO1xuXG5leHBvcnQgdmFyIEZlYXR1cmVMYXllclByb3ZpZGVyID0gRmVhdHVyZUxheWVyU2VydmljZS5leHRlbmQoe1xuICBvcHRpb25zOiB7XG4gICAgbGFiZWw6ICdGZWF0dXJlIExheWVyJyxcbiAgICBtYXhSZXN1bHRzOiA1LFxuICAgIGJ1ZmZlclJhZGl1czogMTAwMCxcbiAgICBmb3JtYXRTdWdnZXN0aW9uOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgICAgcmV0dXJuIGZlYXR1cmUucHJvcGVydGllc1t0aGlzLm9wdGlvbnMuc2VhcmNoRmllbGRzWzBdXTtcbiAgICB9XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBGZWF0dXJlTGF5ZXJTZXJ2aWNlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuc2VhcmNoRmllbGRzID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5vcHRpb25zLnNlYXJjaEZpZWxkcyA9IFt0aGlzLm9wdGlvbnMuc2VhcmNoRmllbGRzXTtcbiAgICB9XG4gICAgdGhpcy5fc3VnZ2VzdGlvbnNRdWVyeSA9IHRoaXMucXVlcnkoKTtcbiAgICB0aGlzLl9yZXN1bHRzUXVlcnkgPSB0aGlzLnF1ZXJ5KCk7XG4gIH0sXG5cbiAgc3VnZ2VzdGlvbnM6IGZ1bmN0aW9uICh0ZXh0LCBib3VuZHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpcy5fc3VnZ2VzdGlvbnNRdWVyeS53aGVyZSh0aGlzLl9idWlsZFF1ZXJ5KHRleHQpKVxuICAgICAgLnJldHVybkdlb21ldHJ5KGZhbHNlKTtcblxuICAgIGlmIChib3VuZHMpIHtcbiAgICAgIHF1ZXJ5LmludGVyc2VjdHMoYm91bmRzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmlkRmllbGQpIHtcbiAgICAgIHF1ZXJ5LmZpZWxkcyhbdGhpcy5vcHRpb25zLmlkRmllbGRdLmNvbmNhdCh0aGlzLm9wdGlvbnMuc2VhcmNoRmllbGRzKSk7XG4gICAgfVxuXG4gICAgdmFyIHJlcXVlc3QgPSBxdWVyeS5ydW4oZnVuY3Rpb24gKGVycm9yLCByZXN1bHRzLCByYXcpIHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjYWxsYmFjayhlcnJvciwgW10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmlkRmllbGQgPSByYXcub2JqZWN0SWRGaWVsZE5hbWU7XG4gICAgICAgIHZhciBzdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gcmVzdWx0cy5mZWF0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHZhciBmZWF0dXJlID0gcmVzdWx0cy5mZWF0dXJlc1tpXTtcbiAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMub3B0aW9ucy5mb3JtYXRTdWdnZXN0aW9uLmNhbGwodGhpcywgZmVhdHVyZSksXG4gICAgICAgICAgICBtYWdpY0tleTogZmVhdHVyZS5pZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKGVycm9yLCBzdWdnZXN0aW9ucy5zbGljZSgwLCB0aGlzLm9wdGlvbnMubWF4UmVzdWx0cykpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH0sXG5cbiAgcmVzdWx0czogZnVuY3Rpb24gKHRleHQsIGtleSwgYm91bmRzLCBjYWxsYmFjaykge1xuICAgIHZhciBxdWVyeSA9IHRoaXMuX3Jlc3VsdHNRdWVyeTtcblxuICAgIGlmIChrZXkpIHtcbiAgICAgIGRlbGV0ZSBxdWVyeS5wYXJhbXMud2hlcmU7XG4gICAgICBxdWVyeS5mZWF0dXJlSWRzKFtrZXldKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkud2hlcmUodGhpcy5fYnVpbGRRdWVyeSh0ZXh0KSk7XG4gICAgfVxuXG4gICAgaWYgKGJvdW5kcykge1xuICAgICAgcXVlcnkud2l0aGluKGJvdW5kcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJ5LnJ1bihMLlV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIGZlYXR1cmVzKSB7XG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzLmZlYXR1cmVzW2ldO1xuICAgICAgICBpZiAoZmVhdHVyZSkge1xuICAgICAgICAgIHZhciBib3VuZHMgPSB0aGlzLl9mZWF0dXJlQm91bmRzKGZlYXR1cmUpO1xuXG4gICAgICAgICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGxhdGxuZzogYm91bmRzLmdldENlbnRlcigpLFxuICAgICAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgICAgICB0ZXh0OiB0aGlzLm9wdGlvbnMuZm9ybWF0U3VnZ2VzdGlvbi5jYWxsKHRoaXMsIGZlYXR1cmUpLFxuICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgZ2VvanNvbjogZmVhdHVyZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcblxuICAgICAgICAgIC8vIGNsZWFyIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHRoZSBuZXh0IHNlYXJjaFxuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9yZXN1bHRzUXVlcnkucGFyYW1zWydvYmplY3RJZHMnXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FsbGJhY2soZXJyb3IsIHJlc3VsdHMpO1xuICAgIH0sIHRoaXMpKTtcbiAgfSxcblxuICBvcmRlckJ5OiBmdW5jdGlvbiAoZmllbGROYW1lLCBvcmRlcikge1xuICAgIHRoaXMuX3N1Z2dlc3Rpb25zUXVlcnkub3JkZXJCeShmaWVsZE5hbWUsIG9yZGVyKTtcbiAgfSxcblxuICBfYnVpbGRRdWVyeTogZnVuY3Rpb24gKHRleHQpIHtcbiAgICB2YXIgcXVlcnlTdHJpbmcgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSB0aGlzLm9wdGlvbnMuc2VhcmNoRmllbGRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZmllbGQgPSAndXBwZXIoXCInICsgdGhpcy5vcHRpb25zLnNlYXJjaEZpZWxkc1tpXSArICdcIiknO1xuXG4gICAgICBxdWVyeVN0cmluZy5wdXNoKGZpZWxkICsgXCIgTElLRSB1cHBlcignJVwiICsgdGV4dCArIFwiJScpXCIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMud2hlcmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud2hlcmUgKyAnIEFORCAoJyArIHF1ZXJ5U3RyaW5nLmpvaW4oJyBPUiAnKSArICcpJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1ZXJ5U3RyaW5nLmpvaW4oJyBPUiAnKTtcbiAgICB9XG4gIH0sXG5cbiAgX2ZlYXR1cmVCb3VuZHM6IGZ1bmN0aW9uIChmZWF0dXJlKSB7XG4gICAgdmFyIGdlb2pzb24gPSBMLmdlb0pzb24oZmVhdHVyZSk7XG4gICAgaWYgKGZlYXR1cmUuZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgdmFyIGNlbnRlciA9IGdlb2pzb24uZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7XG4gICAgICB2YXIgbG5nUmFkaXVzID0gKCh0aGlzLm9wdGlvbnMuYnVmZmVyUmFkaXVzIC8gNDAwNzUwMTcpICogMzYwKSAvIE1hdGguY29zKCgxODAgLyBNYXRoLlBJKSAqIGNlbnRlci5sYXQpO1xuICAgICAgdmFyIGxhdFJhZGl1cyA9ICh0aGlzLm9wdGlvbnMuYnVmZmVyUmFkaXVzIC8gNDAwNzUwMTcpICogMzYwO1xuICAgICAgcmV0dXJuIEwubGF0TG5nQm91bmRzKFtjZW50ZXIubGF0IC0gbGF0UmFkaXVzLCBjZW50ZXIubG5nIC0gbG5nUmFkaXVzXSwgW2NlbnRlci5sYXQgKyBsYXRSYWRpdXMsIGNlbnRlci5sbmcgKyBsbmdSYWRpdXNdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdlb2pzb24uZ2V0Qm91bmRzKCk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZlYXR1cmVMYXllclByb3ZpZGVyIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRmVhdHVyZUxheWVyUHJvdmlkZXIob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZlYXR1cmVMYXllclByb3ZpZGVyO1xuIiwiaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBNYXBTZXJ2aWNlIH0gZnJvbSAnZXNyaS1sZWFmbGV0JztcblxuZXhwb3J0IHZhciBNYXBTZXJ2aWNlUHJvdmlkZXIgPSBNYXBTZXJ2aWNlLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBsYXllcnM6IFswXSxcbiAgICBsYWJlbDogJ01hcCBTZXJ2aWNlJyxcbiAgICBidWZmZXJSYWRpdXM6IDEwMDAsXG4gICAgbWF4UmVzdWx0czogNSxcbiAgICBmb3JtYXRTdWdnZXN0aW9uOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgICAgcmV0dXJuIGZlYXR1cmUucHJvcGVydGllc1tmZWF0dXJlLmRpc3BsYXlGaWVsZE5hbWVdICsgJyA8c21hbGw+JyArIGZlYXR1cmUubGF5ZXJOYW1lICsgJzwvc21hbGw+JztcbiAgICB9XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBNYXBTZXJ2aWNlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5fZ2V0SWRGaWVsZHMoKTtcbiAgfSxcblxuICBzdWdnZXN0aW9uczogZnVuY3Rpb24gKHRleHQsIGJvdW5kcywgY2FsbGJhY2spIHtcbiAgICB2YXIgcmVxdWVzdCA9IHRoaXMuZmluZCgpLnRleHQodGV4dCkuZmllbGRzKHRoaXMub3B0aW9ucy5zZWFyY2hGaWVsZHMpLnJldHVybkdlb21ldHJ5KGZhbHNlKS5sYXllcnModGhpcy5vcHRpb25zLmxheWVycyk7XG5cbiAgICByZXR1cm4gcmVxdWVzdC5ydW4oZnVuY3Rpb24gKGVycm9yLCByZXN1bHRzLCByYXcpIHtcbiAgICAgIHZhciBzdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICB2YXIgY291bnQgPSBNYXRoLm1pbih0aGlzLm9wdGlvbnMubWF4UmVzdWx0cywgcmVzdWx0cy5mZWF0dXJlcy5sZW5ndGgpO1xuICAgICAgICByYXcucmVzdWx0cyA9IHJhdy5yZXN1bHRzLnJldmVyc2UoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZlYXR1cmUgPSByZXN1bHRzLmZlYXR1cmVzW2ldO1xuICAgICAgICAgIHZhciByZXN1bHQgPSByYXcucmVzdWx0c1tpXTtcbiAgICAgICAgICB2YXIgbGF5ZXIgPSByZXN1bHQubGF5ZXJJZDtcbiAgICAgICAgICB2YXIgaWRGaWVsZCA9IHRoaXMuX2lkRmllbGRzW2xheWVyXTtcbiAgICAgICAgICBmZWF0dXJlLmxheWVySWQgPSBsYXllcjtcbiAgICAgICAgICBmZWF0dXJlLmxheWVyTmFtZSA9IHRoaXMuX2xheWVyTmFtZXNbbGF5ZXJdO1xuICAgICAgICAgIGZlYXR1cmUuZGlzcGxheUZpZWxkTmFtZSA9IHRoaXMuX2Rpc3BsYXlGaWVsZHNbbGF5ZXJdO1xuICAgICAgICAgIGlmIChpZEZpZWxkKSB7XG4gICAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgdGV4dDogdGhpcy5vcHRpb25zLmZvcm1hdFN1Z2dlc3Rpb24uY2FsbCh0aGlzLCBmZWF0dXJlKSxcbiAgICAgICAgICAgICAgbWFnaWNLZXk6IHJlc3VsdC5hdHRyaWJ1dGVzW2lkRmllbGRdICsgJzonICsgbGF5ZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FsbGJhY2soZXJyb3IsIHN1Z2dlc3Rpb25zLnJldmVyc2UoKSk7XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgcmVzdWx0czogZnVuY3Rpb24gKHRleHQsIGtleSwgYm91bmRzLCBjYWxsYmFjaykge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgdmFyIHJlcXVlc3Q7XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICB2YXIgZmVhdHVyZUlkID0ga2V5LnNwbGl0KCc6JylbMF07XG4gICAgICB2YXIgbGF5ZXIgPSBrZXkuc3BsaXQoJzonKVsxXTtcbiAgICAgIHJlcXVlc3QgPSB0aGlzLnF1ZXJ5KCkubGF5ZXIobGF5ZXIpLmZlYXR1cmVJZHMoZmVhdHVyZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdCA9IHRoaXMuZmluZCgpLnRleHQodGV4dCkuZmllbGRzKHRoaXMub3B0aW9ucy5zZWFyY2hGaWVsZHMpLmxheWVycyh0aGlzLm9wdGlvbnMubGF5ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVxdWVzdC5ydW4oZnVuY3Rpb24gKGVycm9yLCBmZWF0dXJlcywgcmVzcG9uc2UpIHtcbiAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdHMpIHtcbiAgICAgICAgICByZXNwb25zZS5yZXN1bHRzID0gcmVzcG9uc2UucmVzdWx0cy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXMuZmVhdHVyZXNbaV07XG4gICAgICAgICAgbGF5ZXIgPSBsYXllciB8fCByZXNwb25zZS5yZXN1bHRzW2ldLmxheWVySWQ7XG5cbiAgICAgICAgICBpZiAoZmVhdHVyZSAmJiBsYXllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgYm91bmRzID0gdGhpcy5fZmVhdHVyZUJvdW5kcyhmZWF0dXJlKTtcbiAgICAgICAgICAgIGZlYXR1cmUubGF5ZXJJZCA9IGxheWVyO1xuICAgICAgICAgICAgZmVhdHVyZS5sYXllck5hbWUgPSB0aGlzLl9sYXllck5hbWVzW2xheWVyXTtcbiAgICAgICAgICAgIGZlYXR1cmUuZGlzcGxheUZpZWxkTmFtZSA9IHRoaXMuX2Rpc3BsYXlGaWVsZHNbbGF5ZXJdO1xuXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICBsYXRsbmc6IGJvdW5kcy5nZXRDZW50ZXIoKSxcbiAgICAgICAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgICAgICAgIHRleHQ6IHRoaXMub3B0aW9ucy5mb3JtYXRTdWdnZXN0aW9uLmNhbGwodGhpcywgZmVhdHVyZSksXG4gICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgZ2VvanNvbjogZmVhdHVyZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYWxsYmFjayhlcnJvciwgcmVzdWx0cy5yZXZlcnNlKCkpO1xuICAgIH0sIHRoaXMpO1xuICB9LFxuXG4gIF9mZWF0dXJlQm91bmRzOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgIHZhciBnZW9qc29uID0gTC5nZW9Kc29uKGZlYXR1cmUpO1xuICAgIGlmIChmZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgIHZhciBjZW50ZXIgPSBnZW9qc29uLmdldEJvdW5kcygpLmdldENlbnRlcigpO1xuICAgICAgdmFyIGxuZ1JhZGl1cyA9ICgodGhpcy5vcHRpb25zLmJ1ZmZlclJhZGl1cyAvIDQwMDc1MDE3KSAqIDM2MCkgLyBNYXRoLmNvcygoMTgwIC8gTWF0aC5QSSkgKiBjZW50ZXIubGF0KTtcbiAgICAgIHZhciBsYXRSYWRpdXMgPSAodGhpcy5vcHRpb25zLmJ1ZmZlclJhZGl1cyAvIDQwMDc1MDE3KSAqIDM2MDtcbiAgICAgIHJldHVybiBMLmxhdExuZ0JvdW5kcyhbY2VudGVyLmxhdCAtIGxhdFJhZGl1cywgY2VudGVyLmxuZyAtIGxuZ1JhZGl1c10sIFtjZW50ZXIubGF0ICsgbGF0UmFkaXVzLCBjZW50ZXIubG5nICsgbG5nUmFkaXVzXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZW9qc29uLmdldEJvdW5kcygpO1xuICAgIH1cbiAgfSxcblxuICBfbGF5ZXJNZXRhZGF0YUNhbGxiYWNrOiBmdW5jdGlvbiAobGF5ZXJpZCkge1xuICAgIHJldHVybiBMLlV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIG1ldGFkYXRhKSB7XG4gICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9XG4gICAgICB0aGlzLl9kaXNwbGF5RmllbGRzW2xheWVyaWRdID0gbWV0YWRhdGEuZGlzcGxheUZpZWxkO1xuICAgICAgdGhpcy5fbGF5ZXJOYW1lc1tsYXllcmlkXSA9IG1ldGFkYXRhLm5hbWU7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGFkYXRhLmZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmllbGQgPSBtZXRhZGF0YS5maWVsZHNbaV07XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZXNyaUZpZWxkVHlwZU9JRCcpIHtcbiAgICAgICAgICB0aGlzLl9pZEZpZWxkc1tsYXllcmlkXSA9IGZpZWxkLm5hbWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfSxcblxuICBfZ2V0SWRGaWVsZHM6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9pZEZpZWxkcyA9IHt9O1xuICAgIHRoaXMuX2Rpc3BsYXlGaWVsZHMgPSB7fTtcbiAgICB0aGlzLl9sYXllck5hbWVzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMubGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbGF5ZXIgPSB0aGlzLm9wdGlvbnMubGF5ZXJzW2ldO1xuICAgICAgdGhpcy5nZXQobGF5ZXIsIHt9LCB0aGlzLl9sYXllck1ldGFkYXRhQ2FsbGJhY2sobGF5ZXIpKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFwU2VydmljZVByb3ZpZGVyIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgTWFwU2VydmljZVByb3ZpZGVyKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBTZXJ2aWNlUHJvdmlkZXI7XG4iLCJpbXBvcnQgeyBHZW9jb2RlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0dlb2NvZGUnO1xuXG5leHBvcnQgdmFyIEdlb2NvZGVTZXJ2aWNlUHJvdmlkZXIgPSBHZW9jb2RlU2VydmljZS5leHRlbmQoe1xuICBvcHRpb25zOiB7XG4gICAgbGFiZWw6ICdHZW9jb2RlIFNlcnZlcicsXG4gICAgbWF4UmVzdWx0czogNVxuICB9LFxuXG4gIHN1Z2dlc3Rpb25zOiBmdW5jdGlvbiAodGV4dCwgYm91bmRzLCBjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuc3VwcG9ydHNTdWdnZXN0KSB7XG4gICAgICB2YXIgcmVxdWVzdCA9IHRoaXMuc3VnZ2VzdCgpLnRleHQodGV4dCk7XG4gICAgICBpZiAoYm91bmRzKSB7XG4gICAgICAgIHJlcXVlc3Qud2l0aGluKGJvdW5kcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXF1ZXN0LnJ1bihmdW5jdGlvbiAoZXJyb3IsIHJlc3VsdHMsIHJlc3BvbnNlKSB7XG4gICAgICAgIHZhciBzdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgd2hpbGUgKHJlc3BvbnNlLnN1Z2dlc3Rpb25zLmxlbmd0aCAmJiBzdWdnZXN0aW9ucy5sZW5ndGggPD0gKHRoaXMub3B0aW9ucy5tYXhSZXN1bHRzIC0gMSkpIHtcbiAgICAgICAgICAgIHZhciBzdWdnZXN0aW9uID0gcmVzcG9uc2Uuc3VnZ2VzdGlvbnMuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmICghc3VnZ2VzdGlvbi5pc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGV4dDogc3VnZ2VzdGlvbi50ZXh0LFxuICAgICAgICAgICAgICAgIG1hZ2ljS2V5OiBzdWdnZXN0aW9uLm1hZ2ljS2V5XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhlcnJvciwgc3VnZ2VzdGlvbnMpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgW10pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcblxuICByZXN1bHRzOiBmdW5jdGlvbiAodGV4dCwga2V5LCBib3VuZHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHJlcXVlc3QgPSB0aGlzLmdlb2NvZGUoKS50ZXh0KHRleHQpO1xuXG4gICAgcmVxdWVzdC5tYXhMb2NhdGlvbnModGhpcy5vcHRpb25zLm1heFJlc3VsdHMpO1xuXG4gICAgaWYgKGJvdW5kcykge1xuICAgICAgcmVxdWVzdC53aXRoaW4oYm91bmRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVxdWVzdC5ydW4oZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgY2FsbGJhY2soZXJyb3IsIHJlc3BvbnNlLnJlc3VsdHMpO1xuICAgIH0sIHRoaXMpO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdlb2NvZGVTZXJ2aWNlUHJvdmlkZXIgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBHZW9jb2RlU2VydmljZVByb3ZpZGVyKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZW9jb2RlU2VydmljZVByb3ZpZGVyO1xuIiwiZXhwb3J0IHsgdmVyc2lvbiBhcyBWRVJTSU9OIH0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcbmV4cG9ydCB2YXIgV29ybGRHZW9jb2RpbmdTZXJ2aWNlVXJsID0gJ2h0dHBzOi8vZ2VvY29kZS5hcmNnaXMuY29tL2FyY2dpcy9yZXN0L3NlcnZpY2VzL1dvcmxkL0dlb2NvZGVTZXJ2ZXIvJztcblxuLy8gaW1wb3J0IHRhc2tzXG5leHBvcnQgeyBHZW9jb2RlLCBnZW9jb2RlIH0gZnJvbSAnLi9UYXNrcy9HZW9jb2RlJztcbmV4cG9ydCB7IFJldmVyc2VHZW9jb2RlLCByZXZlcnNlR2VvY29kZSB9IGZyb20gJy4vVGFza3MvUmV2ZXJzZUdlb2NvZGUnO1xuZXhwb3J0IHsgU3VnZ2VzdCwgc3VnZ2VzdCB9IGZyb20gJy4vVGFza3MvU3VnZ2VzdCc7XG5cbi8vIGltcG9ydCBzZXJ2aWNlXG5leHBvcnQgeyBHZW9jb2RlU2VydmljZSwgZ2VvY29kZVNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2VzL0dlb2NvZGUnO1xuXG4vLyBpbXBvcnQgY29udHJvbFxuZXhwb3J0IHsgR2Vvc2VhcmNoLCBnZW9zZWFyY2ggfSBmcm9tICcuL0NvbnRyb2xzL0dlb3NlYXJjaCc7XG5cbi8vIGltcG9ydCBzdXBwb3J0aW5nIGNsYXNzXG5leHBvcnQgeyBHZW9zZWFyY2hDb3JlLCBnZW9zZWFyY2hDb3JlIH0gZnJvbSAnLi9DbGFzc2VzL0dlb3NlYXJjaENvcmUnO1xuXG4vLyBpbXBvcnQgcHJvdmlkZXJzXG5leHBvcnQgeyBBcmNnaXNPbmxpbmVQcm92aWRlciwgYXJjZ2lzT25saW5lUHJvdmlkZXIgfSBmcm9tICcuL1Byb3ZpZGVycy9BcmNnaXNPbmxpbmVHZW9jb2Rlcic7XG5leHBvcnQgeyBGZWF0dXJlTGF5ZXJQcm92aWRlciwgZmVhdHVyZUxheWVyUHJvdmlkZXIgfSBmcm9tICcuL1Byb3ZpZGVycy9GZWF0dXJlTGF5ZXInO1xuZXhwb3J0IHsgTWFwU2VydmljZVByb3ZpZGVyLCBtYXBTZXJ2aWNlUHJvdmlkZXIgfSBmcm9tICcuL1Byb3ZpZGVycy9NYXBTZXJ2aWNlJztcbmV4cG9ydCB7IEdlb2NvZGVTZXJ2aWNlUHJvdmlkZXIsIGdlb2NvZGVTZXJ2aWNlUHJvdmlkZXIgfSBmcm9tICcuL1Byb3ZpZGVycy9HZW9jb2RlU2VydmljZSc7XG4iXSwibmFtZXMiOlsiVGFzayIsIlV0aWwiLCJTZXJ2aWNlIiwiRmVhdHVyZUxheWVyU2VydmljZSIsIk1hcFNlcnZpY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Q0NJTyxJQUFJLE9BQU8sR0FBR0EsZ0JBQUksQ0FBQyxNQUFNLENBQUM7QUFDakMsQ0FBQSxFQUFFLElBQUksRUFBRSx1QkFBdUI7O0FBRS9CLENBQUEsRUFBRSxNQUFNLEVBQUU7QUFDVixDQUFBLElBQUksS0FBSyxFQUFFLElBQUk7QUFDZixDQUFBLElB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QU07QUFDWCxDQUFBLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDckcsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUM1RCxDQUFBLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNsQixDQUFBLFFBQVEsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO0FBQzlCLENBQUEsVUFBVSxRQUFRLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDeEQsQ0FBQSxTQUFTO0FBQ1QsQ0FBQSxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMzRCxDQUFBLFVBQVUsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxDQUFBLFVBQVUsS0FBSyxHQUFHLEtBQUssSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQzs7QUFFdkQsQ0FBQSxVQUFVLElBQUksT0FBTyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFDOUMsQ0FBQSxZQUFZLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEQsQ0FBQSxZQUFZLE9BQU8sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQ3BDLENBQUEsWUFBWSxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEQsQ0FBQSxZQUFZLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDOztBQUVsRSxDQUFBLFlBQVksSUFBSSxNQUFNLEdBQUc7QUFDekIsQ0FBQSxjQUFjLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFO0FBQ3hDLENBQUEsY0FBYyxNQUFNLEVBQUUsTUFBTTtBQUM1QixDQUFBLGNBQWMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7QUFDckUsQ0FBQSxjQUFjLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtBQUM1QyxDQUFBLGNBQWMsT0FBTyxFQUFFLE9BQU87QUFDOUIsQ0FBQSxhQUFhLENBQUM7O0FBRWQsQ0FBQSxZQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDakMsQ0FBQSxXQUFXO0FBQ1gsQ0FBQSxTQUFTO0FBQ1QsQ0FBQSxPQUFPO0FBQ1AsQ0FBQSxNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDekMsQ0FBQSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDYixDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLGNBQWMsRUFBRSxVQUFVLE9BQU8sRUFBRTtBQUNyQyxDQUFBLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNyQyxDQUFBLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7QUFDM0MsQ0FBQSxNQUFNLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNuRCxDQUFBLE1BQU0sSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5RyxDQUFBLE1BQU0sSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbkUsQ0FBQSxNQUFNLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsU0FBUyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLFNBQVMsRUFBRSxNQUFNLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDaEksQ0FBQSxLQUFLLE1BQU07QUFDWCxDQUFBLE1BQU0sT0FBTyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDakMsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxzQkFBc0IsRUFBRSxVQUFVLE9BQU8sRUFBRTtBQUM3QyxDQUFBLElBQUksT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUU7QUFDbEQsQ0FBQSxNQUFNLElBQUksS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFO0FBQzVCLENBQUEsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7QUFDM0QsQ0FBQSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztBQUNoRCxDQUFBLE1BQU0sS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3ZELENBQUEsUUFBUSxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUEsUUFBUSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssa0JBQWtCLEVBQUU7QUFDL0MsQ0FBQSxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztBQUMvQyxDQUFBLFVBQVUsTUFBTTtBQUNoQixDQUFBLFNBQVM7QUFDVCxDQUFBLE9BQU87QUFDUCxDQUFBLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNiLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsWUFBWSxFQUFFLFlBQVk7QUFDNUIsQ0FBQSxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLENBQUEsSUFBSSxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztBQUM3QixDQUFBLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDMUIsQ0FBQSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDekQsQ0FBQSxNQUFNLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUEsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDOUQsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxHQUFHO0FBQ0gsQ0FBQSxDQUFDLENBQUMsQ0FBQzs7QUFFSCxDQUFPLFNBQVMsa0JBQWtCLEVBQUUsT0FBTyxFQUFFO0FBQzdDLENBQUEsRUFBRSxPQUFPLElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekMsQ0FBQSxDQUFDOztDQ2hJTSxJQUFJLHNCQUFzQixHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUM7QUFDMUQsQ0FBQSxFQUFFLE9BQU8sRUFBRTtBQUNYLENBQUEsSUFBSSxLQUFLLEVBQUUsZ0JBQWdCO0FBQzNCLENBQUEsSUFBSSxVQUFVLEVBQUUsQ0FBQztBQUNqQixDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFdBQVcsRUFBRSxVQUFVLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0FBQ2pELENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFO0FBQ3RDLENBQUEsTUFBTSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlDLENBQUEsTUFBTSxJQUFJLE1BQU0sRUFBRTtBQUNsQixDQUFBLFFBQVEsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvQixDQUFBLE9BQU87O0FBRVAsQ0FBQSxNQUFNLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFO0FBQzdELENBQUEsUUFBUSxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDN0IsQ0FBQSxRQUFRLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDcEIsQ0FBQSxVQUFVLE9BQU8sUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ3JHLENBQUEsWUFBWSxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQzFELENBQUEsWUFBWSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRTtBQUMxQyxDQUFBLGNBQWMsV0FBVyxDQUFDLElBQUksQ0FBQztBQUMvQixDQUFBLGdCQUFnQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7QUFDckMsQ0FBQSxnQkFBZ0IsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO0FBQzdDLENBQUEsZUFBZSxDQUFDLENBQUM7QUFDakIsQ0FBQSxhQUFhO0FBQ2IsQ0FBQSxXQUFXO0FBQ1gsQ0FBQSxTQUFTO0FBQ1QsQ0FBQSxRQUFRLFFBQVEsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDckMsQ0FBQSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDZixDQUFBLEtBQUssTUFBTTtBQUNYLENBQUEsTUFBTSxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzlCLENBQUEsTUFBTSxPQUFPLEtBQUssQ0FBQztBQUNuQixDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtBQUNsRCxDQUFBLElBQUksSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7QUFFNUMsQ0FBQSxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQzs7QUFFbEQsQ0FBQSxJQUFJLElBQUksTUFBTSxFQUFFO0FBQ2hCLENBQUEsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzdCLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBRTtBQUNsRCxDQUFBLE1BQU0sUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDeEMsQ0FBQSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDYixDQUFBLEdBQUc7QUFDSCxDQUFBLENBQUMsQ0FBQyxDQUFDOztBQUVILENBQU8sU0FBUyxzQkFBc0IsRUFBRSxPQUFPLEVBQUU7QUFDakQsQ0FBQSxFQUFFLE9BQU8sSUFBSSxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QyxDQUFBLENBQUM7O0NDcERNLElBQUksd0JBQXdCLEdBQUcsc0VBQXNFLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7In0=
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-gp-2.0.1.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,281 @@
+/* esri-leaflet-gp - v2.0.1 - Fri Sep 09 2016 14:42:04 GMT-0700 (PDT)
+ * Copyright (c) 2016 Environmental Systems Research Institute, Inc.
+ * Apache-2.0 */
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet'), require('esri-leaflet')) :
+	typeof define === 'function' && define.amd ? define(['exports', 'leaflet', 'esri-leaflet'], factory) :
+	(factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.GP = global.L.esri.GP || {}),global.L,global.L.esri));
+}(this, function (exports,L,esriLeaflet) { 'use strict';
+
+	L = 'default' in L ? L['default'] : L;
+
+	var version = "2.0.1";
+
+	var Task$1 = esriLeaflet.Task.extend({
+
+	  includes: L.Mixin.Events,
+
+	  // setters: {}, we don't use these because we don't know the ParamName OR value of custom GP services
+	  params: {},
+	  resultParams: {},
+
+	  initialize: function (options) {
+	    // don't replace parent initialize
+	    esriLeaflet.Task.prototype.initialize.call(this, options);
+
+	    // if path isn't supplied in options, try and determine if its sync or async to set automatically
+	    if (!this.options.path) {
+	      // assume initially, that service is synchronous
+	      this.options.async = false;
+	      this.options.path = 'execute';
+
+	      // the parameters below seem wonky to me, but work for both CORS and JSONP requests
+	      this._service.metadata(function (error, results) {
+	        if (!error) {
+	          if (results.executionType === 'esriExecutionTypeSynchronous') {
+	            this.options.async = false;
+	            this.options.path = 'execute';
+	          } else {
+	            this.options.async = true;
+	            this.options.path = 'submitJob';
+	          }
+	          this.fire('initialized');
+	        } else {
+	          // if check fails, hopefully its synchronous
+	          this.options.async = false;
+	          this.options.path = 'execute';
+	          return;
+	        }
+	      }, this);
+	    } else {
+	      // if path is custom, hopefully its synchronous
+	      if (this.options.async !== true && this.options.path !== 'submitJob') {
+	        this.options.async = false;
+	      }
+	    }
+	  },
+
+	  // doc for various GPInput types can be found here
+	  // http://resources.arcgis.com/en/help/arcgis-rest-api/index.html#/GP_Result/02r3000000q7000000/
+
+	  // set booleans, numbers, strings
+	  setParam: function (paramName, paramValue) {
+	    if (typeof paramValue === 'boolean') {
+	      this.params[paramName] = paramValue;
+	      return;
+	    } else if (typeof paramValue !== 'object') { // strings, numbers
+	      this.params[paramName] = paramValue;
+	      return;
+	    } else {
+	      // otherwise assume its latlng, marker, bounds or geojson
+	      this._setGeometry(paramName, paramValue);
+	    }
+	  },
+
+	  // not sure how best to handle passing more than one parameter at once
+	  // setParams: function(inputArray) {
+	  //   if (L.Util.isArray(inputArray)) {
+	  //     for (var i = 0; i < inputArray.length; i++) {
+	  //       this.setParam(inputArray[i]);
+	  //     }
+	  //   }
+	  // },
+
+	  // give developer opportunity to point out where the output is going to be available
+	  setOutputParam: function (paramName) {
+	    this.params.outputParam = paramName;
+	  },
+
+	  /* necessary because of the design requirement that resultParams be specified
+	  for async elevation services in order to get Zs (unnecessarily confusing)*/
+	  gpAsyncResultParam: function (paramName, paramValue) {
+	    this.resultParams[paramName] = paramValue;
+	  },
+
+	  // we currently expect a single geometry or feature (ported from: Tasks.Query._setGeometry)
+	  _setGeometry: function (paramName, geometry) {
+	    var processedInput = {
+	      'geometryType': '',
+	      'features': []
+	    };
+
+	    // convert bounds to extent and finish
+	    if (geometry instanceof L.LatLngBounds) {
+	      // set geometry + type
+	      processedInput.features.push({'geometry': L.esri.Util.boundsToExtent(geometry)});
+	      processedInput.geometryType = L.esri.Util.geojsonTypeToArcGIS(geometry.type);
+	    }
+
+	    // convert L.Marker > L.LatLng
+	    if (geometry.getLatLng) {
+	      geometry = geometry.getLatLng();
+	    }
+
+	    // convert L.LatLng to a geojson point and continue;
+	    if (geometry instanceof L.LatLng) {
+	      geometry = {
+	        type: 'Point',
+	        coordinates: [geometry.lng, geometry.lat]
+	      };
+	    }
+
+	    // handle L.GeoJSON, pull out the first geometry
+	    if (geometry instanceof L.GeoJSON) {
+	      // reassign geometry to the GeoJSON value  (we are assuming that only one feature is present)
+	      geometry = geometry.getLayers()[0].feature.geometry;
+	      processedInput.features.push({'geometry': esriLeaflet.Util.geojsonToArcGIS(geometry)});
+	      processedInput.geometryType = esriLeaflet.Util.geojsonTypeToArcGIS(geometry.type);
+	    }
+
+	    // Handle L.Polyline and L.Polygon
+	    if (geometry.toGeoJSON) {
+	      geometry = geometry.toGeoJSON();
+	    }
+
+	    // handle GeoJSON feature by pulling out the geometry
+	    if (geometry.type === 'Feature') {
+	      // get the geometry of the geojson feature
+	      geometry = geometry.geometry;
+	    }
+
+	    // confirm that our GeoJSON is a point, line or polygon
+	    if (geometry.type === 'Point' || geometry.type === 'LineString' || geometry.type === 'Polygon') {
+	      processedInput.features.push({'geometry': esriLeaflet.Util.geojsonToArcGIS(geometry)});
+	      processedInput.geometryType = esriLeaflet.Util.geojsonTypeToArcGIS(geometry.type);
+	    } else {
+	      if (console && console.warn) {
+	        console.warn('invalid geometry passed as GP input. Should be an L.LatLng, L.LatLngBounds, L.Marker or GeoJSON Point Line or Polygon object');
+	      }
+	    }
+
+	    this.params[paramName] = processedInput;
+	    return;
+	  },
+
+	  run: function (callback, context) {
+	    this._done = false;
+
+	    if (this.options.async === true) {
+	      /* eslint-disable */
+	      this._service.request(this.options.path, this.params, function (error, response) {
+	        this._currentJobId = response.jobId;
+	        this.checkJob(this._currentJobId, callback, context);
+	      }, this);
+	      /* eslint-enable */
+	    } else {
+	      return this._service.request(this.options.path, this.params, function (error, response) {
+	        callback.call(context, error, (response && this.processGPOutput(response)), response);
+	      }, this);
+	    }
+	  },
+
+	  checkJob: function (jobId, callback, context) {
+	    var pollJob = function () {
+	      /* eslint-disable */
+	      this._service.request('jobs/' + jobId, {}, function polledJob (error, response) {
+	        if (response.jobStatus === 'esriJobSucceeded') {
+	          if (!this._done) {
+	            this._done = true;
+	            // to do:
+	            // refactor to make an array of async requests for output
+	            this._service.request('jobs/' + jobId + '/results/' + this.params.outputParam, this.resultParams, function processJobResult (error, response) {
+	              callback.call(context, error, (response && this.processAsyncOutput(response)), response);
+	            }, this);
+	          }
+	          window.clearInterval(counter);
+	        } else if (response.jobStatus === 'esriJobFailed') {
+	          callback.call(context, 'Job Failed', null);
+	          window.clearInterval(counter);
+	        }
+	      }, this);
+	      /* eslint-enable */
+	    }.bind(this);
+
+	    var counter = window.setInterval(pollJob, this._service.options.asyncInterval * 1000);
+	  },
+
+	  processGPOutput: function (response) {
+	    var processedResponse = {};
+
+	    // grab syncronous results
+	    if (this.options.async === false) {
+	      // loop through results and pass back, parsing esri json
+	      for (var i = 0; i < response.results.length; i++) {
+	        /* jshint ignore:start */
+	        processedResponse[response.results[i].paramName];
+	        /* jshint ignore:end */
+	        if (response.results[i].dataType === 'GPFeatureRecordSetLayer') {
+	          var featureCollection = esriLeaflet.Util.responseToFeatureCollection(response.results[i].value);
+	          processedResponse[response.results[i].paramName] = featureCollection;
+	        } else {
+	          processedResponse[response.results[i].paramName] = response.results[i].value;
+	        }
+	      }
+	    } else { // grab async results slightly differently
+	      processedResponse.jobId = this._currentJobId;
+	      // var responseValue = response.value;
+	    }
+
+	    // if output is a raster layer, we also need to stub out a MapService url using jobid
+	    if (this.options.async === true && response.dataType === 'GPRasterDataLayer') {
+	      var baseURL = this.options.url;
+	      var n = baseURL.indexOf('GPServer');
+	      var serviceURL = baseURL.slice(0, n) + 'MapServer/';
+	      processedResponse.outputMapService = serviceURL + 'jobs/' + this._currentJobId;
+	    }
+
+	    return processedResponse;
+	  },
+
+	  processAsyncOutput: function (response) {
+	    var processedResponse = {};
+	    processedResponse.jobId = this._currentJobId;
+
+	    // if output is a raster layer, we also need to stub out a MapService url using jobid
+	    if (this.options.async === true && response.dataType === 'GPRasterDataLayer') {
+	      var baseURL = this.options.url;
+	      var n = baseURL.indexOf('GPServer');
+	      var serviceURL = baseURL.slice(0, n) + 'MapServer/';
+	      processedResponse.outputMapService = serviceURL + 'jobs/' + this._currentJobId;
+	    }
+
+	    // if output is GPFeatureRecordSetLayer, convert to GeoJSON
+	    if (response.dataType === 'GPFeatureRecordSetLayer') {
+	      var featureCollection = esriLeaflet.Util.responseToFeatureCollection(response.value);
+	      processedResponse[response.paramName] = featureCollection;
+	    } else {
+	      processedResponse[response.paramName] = response.value;
+	    }
+
+	    return processedResponse;
+	  }
+
+	});
+
+	function task (options) {
+	  return new Task$1(options);
+	}
+
+	var Service$1 = esriLeaflet.Service.extend({
+	  options: {
+	    asyncInterval: 1
+	  },
+
+	  createTask: function () {
+	    return new Task$1(this, this.options);
+	  }
+
+	});
+
+	function service (options) {
+	  return new Service$1(options);
+	}
+
+	exports.VERSION = version;
+	exports.Task = Task$1;
+	exports.task = task;
+	exports.Service = Service$1;
+	exports.service = service;
+
+}));
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWdwLWRlYnVnLmpzIiwic291cmNlcyI6WyIuLi9wYWNrYWdlLmpzb24iLCIuLi9zcmMvVGFza3MvR2VvcHJvY2Vzc2luZy5qcyIsIi4uL3NyYy9TZXJ2aWNlcy9HZW9wcm9jZXNzaW5nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIntcbiAgXCJuYW1lXCI6IFwiZXNyaS1sZWFmbGV0LWdwXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJBIExlYWZsZXQgcGx1Z2luIGZvciBpbnRlcmFjdGluZyB3aXRoIEFyY0dJUyBnZW9wcm9jZXNzaW5nIHNlcnZpY2VzLlwiLFxuICBcInZlcnNpb25cIjogXCIyLjAuMVwiLFxuICBcImF1dGhvclwiOiBcIkpvaG4gR3Jhdm9pcyA8amdyYXZvaXNAZXNyaS5jb20+IChodHRwOi8vam9obmdyYXZvaXMuY29tKVwiLFxuICBcImJyb3dzZXJcIjogXCJkaXN0L2VzcmktbGVhZmxldC1ncC1kZWJ1Zy5qc1wiLFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2pncmF2b2lzL2VzcmktbGVhZmxldC1ncC9pc3N1ZXNcIlxuICB9LFxuICBcImNvbnRyaWJ1dG9yc1wiOiBbXG4gICAgXCJKb2huIEdyYXZvaXMgPGpncmF2b2lzQGVzcmkuY29tPiAoaHR0cDovL2pvaG5ncmF2b2lzLmNvbSlcIixcbiAgICBcIk5pY2hvbGFzIEZ1cm5lc3MgPG5mdXJuZXNzQGVzcmkuY29tPiAoaHR0cDovL25peHRhLmdpdGh1Yi5pby8pXCIsXG4gICAgXCJQYXRyaWNrIEFybHQgPHBhcmx0QGVzcmkuY29tPiAoaHR0cDovL3BhdHJpY2thcmx0LmNvbSlcIixcbiAgICBcIlJvd2FuIFdpbnNlbWl1c1wiXG4gIF0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImxlYWZsZXRcIjogXCJeMS4wLjAtcmMuM1wiLFxuICAgIFwiZXNyaS1sZWFmbGV0XCI6IFwiXjIuMC4wXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiY2hhaVwiOiBcIjIuMy4wXCIsXG4gICAgXCJnaC1yZWxlYXNlXCI6IFwiXjIuMC4wXCIsXG4gICAgXCJoaWdobGlnaHQuanNcIjogXCJeOC4wLjBcIixcbiAgICBcImh0dHAtc2VydmVyXCI6IFwiXjAuOC41XCIsXG4gICAgXCJpc3BhcnRhXCI6IFwiXjMuMC4zXCIsXG4gICAgXCJpc3RhbmJ1bFwiOiBcIl4wLjQuMlwiLFxuICAgIFwia2FybWFcIjogXCJeMC4xMi4yNFwiLFxuICAgIFwia2FybWEtY2hhaS1zaW5vblwiOiBcIl4wLjEuM1wiLFxuICAgIFwia2FybWEtY292ZXJhZ2VcIjogXCJeMC41LjNcIixcbiAgICBcImthcm1hLW1vY2hhXCI6IFwiXjAuMS4wXCIsXG4gICAgXCJrYXJtYS1tb2NoYS1yZXBvcnRlclwiOiBcIl4wLjIuNVwiLFxuICAgIFwia2FybWEtcGhhbnRvbWpzLWxhdW5jaGVyXCI6IFwiXjAuMi4wXCIsXG4gICAgXCJrYXJtYS1zb3VyY2VtYXAtbG9hZGVyXCI6IFwiXjAuMy41XCIsXG4gICAgXCJta2RpcnBcIjogXCJeMC41LjFcIixcbiAgICBcInBoYW50b21qc1wiOiBcIl4xLjkuMTdcIixcbiAgICBcInJvbGx1cFwiOiBcIl4wLjI1LjRcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tanNvblwiOiBcIl4yLjAuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1ub2RlLXJlc29sdmVcIjogXCJeMS40LjBcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tdWdsaWZ5XCI6IFwiXjAuMS4wXCIsXG4gICAgXCJzZW1pc3RhbmRhcmRcIjogXCJeNy4wLjVcIixcbiAgICBcInNpbm9uXCI6IFwiXjEuMTEuMVwiLFxuICAgIFwic2lub24tY2hhaVwiOiBcIjIuNy4wXCIsXG4gICAgXCJzbmF6enlcIjogXCJeMi4wLjFcIixcbiAgICBcInVnbGlmeS1qc1wiOiBcIl4yLjYuMVwiLFxuICAgIFwid2F0Y2hcIjogXCJeMC4xNy4xXCJcbiAgfSxcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9qZ3Jhdm9pcy9lc3JpLWxlYWZsZXQtZ3BcIixcbiAgXCJqc25leHQ6bWFpblwiOiBcInNyYy9Fc3JpTGVhZmxldEdQLmpzXCIsXG4gIFwianNwbVwiOiB7XG4gICAgXCJyZWdpc3RyeVwiOiBcIm5wbVwiLFxuICAgIFwiZm9ybWF0XCI6IFwiZXM2XCIsXG4gICAgXCJtYWluXCI6IFwic3JjL0VzcmlMZWFmbGV0R1AuanNcIlxuICB9LFxuICBcImxpY2Vuc2VcIjogXCJBcGFjaGUtMi4wXCIsXG4gIFwibWFpblwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LWdwLWRlYnVnLmpzXCIsXG4gIFwicmVhZG1lRmlsZW5hbWVcIjogXCJSRUFETUUubWRcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdEBnaXRodWIuY29tOmpncmF2b2lzL2VzcmktbGVhZmxldC1ncC5naXRcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwicHJlYnVpbGRcIjogXCJta2RpcnAgZGlzdFwiLFxuICAgIFwiYnVpbGRcIjogXCJyb2xsdXAgLWMgcHJvZmlsZXMvZGVidWcuanMgJiByb2xsdXAgLWMgcHJvZmlsZXMvcHJvZHVjdGlvbi5qc1wiLFxuICAgIFwibGludFwiOiBcInNlbWlzdGFuZGFyZCBzcmMvKiovKi5qcyB8IHNuYXp6eVwiLFxuICAgIFwicHJlcHVibGlzaFwiOiBcIm5wbSBydW4gYnVpbGRcIixcbiAgICBcInByZXRlc3RcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJ0ZXN0XCI6IFwibnBtIHJ1biBsaW50ICYmIGthcm1hIHN0YXJ0XCIsXG4gICAgXCJyZWxlYXNlXCI6IFwiLi9zY3JpcHRzL3JlbGVhc2Uuc2hcIixcbiAgICBcInN0YXJ0XCI6IFwid2F0Y2ggJ25wbSBydW4gYnVpbGQnIHNyYyAmIGh0dHAtc2VydmVyIC1wIDUwMDAgLWMtMSAtb1wiXG4gIH1cbn1cbiIsIi8qXG50byBkbzpcbnNldFBhcmFtKFtdKVxuKi9cblxuaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBUYXNrIGFzIEJhc2VUYXNrLCBVdGlsIH0gZnJvbSAnZXNyaS1sZWFmbGV0JztcblxuZXhwb3J0IHZhciBUYXNrID0gQmFzZVRhc2suZXh0ZW5kKHtcblxuICBpbmNsdWRlczogTC5NaXhpbi5FdmVudHMsXG5cbiAgLy8gc2V0dGVyczoge30sIHdlIGRvbid0IHVzZSB0aGVzZSBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIFBhcmFtTmFtZSBPUiB2YWx1ZSBvZiBjdXN0b20gR1Agc2VydmljZXNcbiAgcGFyYW1zOiB7fSxcbiAgcmVzdWx0UGFyYW1zOiB7fSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIC8vIGRvbid0IHJlcGxhY2UgcGFyZW50IGluaXRpYWxpemVcbiAgICBCYXNlVGFzay5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgLy8gaWYgcGF0aCBpc24ndCBzdXBwbGllZCBpbiBvcHRpb25zLCB0cnkgYW5kIGRldGVybWluZSBpZiBpdHMgc3luYyBvciBhc3luYyB0byBzZXQgYXV0b21hdGljYWxseVxuICAgIGlmICghdGhpcy5vcHRpb25zLnBhdGgpIHtcbiAgICAgIC8vIGFzc3VtZSBpbml0aWFsbHksIHRoYXQgc2VydmljZSBpcyBzeW5jaHJvbm91c1xuICAgICAgdGhpcy5vcHRpb25zLmFzeW5jID0gZmFsc2U7XG4gICAgICB0aGlzLm9wdGlvbnMucGF0aCA9ICdleGVjdXRlJztcblxuICAgICAgLy8gdGhlIHBhcmFtZXRlcnMgYmVsb3cgc2VlbSB3b25reSB0byBtZSwgYnV0IHdvcmsgZm9yIGJvdGggQ09SUyBhbmQgSlNPTlAgcmVxdWVzdHNcbiAgICAgIHRoaXMuX3NlcnZpY2UubWV0YWRhdGEoZnVuY3Rpb24gKGVycm9yLCByZXN1bHRzKSB7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICBpZiAocmVzdWx0cy5leGVjdXRpb25UeXBlID09PSAnZXNyaUV4ZWN1dGlvblR5cGVTeW5jaHJvbm91cycpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hc3luYyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhdGggPSAnZXhlY3V0ZSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hc3luYyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucGF0aCA9ICdzdWJtaXRKb2InO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZpcmUoJ2luaXRpYWxpemVkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWYgY2hlY2sgZmFpbHMsIGhvcGVmdWxseSBpdHMgc3luY2hyb25vdXNcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucGF0aCA9ICdleGVjdXRlJztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBwYXRoIGlzIGN1c3RvbSwgaG9wZWZ1bGx5IGl0cyBzeW5jaHJvbm91c1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5hc3luYyAhPT0gdHJ1ZSAmJiB0aGlzLm9wdGlvbnMucGF0aCAhPT0gJ3N1Ym1pdEpvYicpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmFzeW5jID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIGRvYyBmb3IgdmFyaW91cyBHUElucHV0IHR5cGVzIGNhbiBiZSBmb3VuZCBoZXJlXG4gIC8vIGh0dHA6Ly9yZXNvdXJjZXMuYXJjZ2lzLmNvbS9lbi9oZWxwL2FyY2dpcy1yZXN0LWFwaS9pbmRleC5odG1sIy9HUF9SZXN1bHQvMDJyMzAwMDAwMHE3MDAwMDAwL1xuXG4gIC8vIHNldCBib29sZWFucywgbnVtYmVycywgc3RyaW5nc1xuICBzZXRQYXJhbTogZnVuY3Rpb24gKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcGFyYW1WYWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLnBhcmFtc1twYXJhbU5hbWVdID0gcGFyYW1WYWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbVZhbHVlICE9PSAnb2JqZWN0JykgeyAvLyBzdHJpbmdzLCBudW1iZXJzXG4gICAgICB0aGlzLnBhcmFtc1twYXJhbU5hbWVdID0gcGFyYW1WYWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIGFzc3VtZSBpdHMgbGF0bG5nLCBtYXJrZXIsIGJvdW5kcyBvciBnZW9qc29uXG4gICAgICB0aGlzLl9zZXRHZW9tZXRyeShwYXJhbU5hbWUsIHBhcmFtVmFsdWUpO1xuICAgIH1cbiAgfSxcblxuICAvLyBub3Qgc3VyZSBob3cgYmVzdCB0byBoYW5kbGUgcGFzc2luZyBtb3JlIHRoYW4gb25lIHBhcmFtZXRlciBhdCBvbmNlXG4gIC8vIHNldFBhcmFtczogZnVuY3Rpb24oaW5wdXRBcnJheSkge1xuICAvLyAgIGlmIChMLlV0aWwuaXNBcnJheShpbnB1dEFycmF5KSkge1xuICAvLyAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gIC8vICAgICAgIHRoaXMuc2V0UGFyYW0oaW5wdXRBcnJheVtpXSk7XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9LFxuXG4gIC8vIGdpdmUgZGV2ZWxvcGVyIG9wcG9ydHVuaXR5IHRvIHBvaW50IG91dCB3aGVyZSB0aGUgb3V0cHV0IGlzIGdvaW5nIHRvIGJlIGF2YWlsYWJsZVxuICBzZXRPdXRwdXRQYXJhbTogZnVuY3Rpb24gKHBhcmFtTmFtZSkge1xuICAgIHRoaXMucGFyYW1zLm91dHB1dFBhcmFtID0gcGFyYW1OYW1lO1xuICB9LFxuXG4gIC8qIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHRoZSBkZXNpZ24gcmVxdWlyZW1lbnQgdGhhdCByZXN1bHRQYXJhbXMgYmUgc3BlY2lmaWVkXG4gIGZvciBhc3luYyBlbGV2YXRpb24gc2VydmljZXMgaW4gb3JkZXIgdG8gZ2V0IFpzICh1bm5lY2Vzc2FyaWx5IGNvbmZ1c2luZykqL1xuICBncEFzeW5jUmVzdWx0UGFyYW06IGZ1bmN0aW9uIChwYXJhbU5hbWUsIHBhcmFtVmFsdWUpIHtcbiAgICB0aGlzLnJlc3VsdFBhcmFtc1twYXJhbU5hbWVdID0gcGFyYW1WYWx1ZTtcbiAgfSxcblxuICAvLyB3ZSBjdXJyZW50bHkgZXhwZWN0IGEgc2luZ2xlIGdlb21ldHJ5IG9yIGZlYXR1cmUgKHBvcnRlZCBmcm9tOiBUYXNrcy5RdWVyeS5fc2V0R2VvbWV0cnkpXG4gIF9zZXRHZW9tZXRyeTogZnVuY3Rpb24gKHBhcmFtTmFtZSwgZ2VvbWV0cnkpIHtcbiAgICB2YXIgcHJvY2Vzc2VkSW5wdXQgPSB7XG4gICAgICAnZ2VvbWV0cnlUeXBlJzogJycsXG4gICAgICAnZmVhdHVyZXMnOiBbXVxuICAgIH07XG5cbiAgICAvLyBjb252ZXJ0IGJvdW5kcyB0byBleHRlbnQgYW5kIGZpbmlzaFxuICAgIGlmIChnZW9tZXRyeSBpbnN0YW5jZW9mIEwuTGF0TG5nQm91bmRzKSB7XG4gICAgICAvLyBzZXQgZ2VvbWV0cnkgKyB0eXBlXG4gICAgICBwcm9jZXNzZWRJbnB1dC5mZWF0dXJlcy5wdXNoKHsnZ2VvbWV0cnknOiBMLmVzcmkuVXRpbC5ib3VuZHNUb0V4dGVudChnZW9tZXRyeSl9KTtcbiAgICAgIHByb2Nlc3NlZElucHV0Lmdlb21ldHJ5VHlwZSA9IEwuZXNyaS5VdGlsLmdlb2pzb25UeXBlVG9BcmNHSVMoZ2VvbWV0cnkudHlwZSk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBMLk1hcmtlciA+IEwuTGF0TG5nXG4gICAgaWYgKGdlb21ldHJ5LmdldExhdExuZykge1xuICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZXRMYXRMbmcoKTtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IEwuTGF0TG5nIHRvIGEgZ2VvanNvbiBwb2ludCBhbmQgY29udGludWU7XG4gICAgaWYgKGdlb21ldHJ5IGluc3RhbmNlb2YgTC5MYXRMbmcpIHtcbiAgICAgIGdlb21ldHJ5ID0ge1xuICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICBjb29yZGluYXRlczogW2dlb21ldHJ5LmxuZywgZ2VvbWV0cnkubGF0XVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgTC5HZW9KU09OLCBwdWxsIG91dCB0aGUgZmlyc3QgZ2VvbWV0cnlcbiAgICBpZiAoZ2VvbWV0cnkgaW5zdGFuY2VvZiBMLkdlb0pTT04pIHtcbiAgICAgIC8vIHJlYXNzaWduIGdlb21ldHJ5IHRvIHRoZSBHZW9KU09OIHZhbHVlICAod2UgYXJlIGFzc3VtaW5nIHRoYXQgb25seSBvbmUgZmVhdHVyZSBpcyBwcmVzZW50KVxuICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZXRMYXllcnMoKVswXS5mZWF0dXJlLmdlb21ldHJ5O1xuICAgICAgcHJvY2Vzc2VkSW5wdXQuZmVhdHVyZXMucHVzaCh7J2dlb21ldHJ5JzogVXRpbC5nZW9qc29uVG9BcmNHSVMoZ2VvbWV0cnkpfSk7XG4gICAgICBwcm9jZXNzZWRJbnB1dC5nZW9tZXRyeVR5cGUgPSBVdGlsLmdlb2pzb25UeXBlVG9BcmNHSVMoZ2VvbWV0cnkudHlwZSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEwuUG9seWxpbmUgYW5kIEwuUG9seWdvblxuICAgIGlmIChnZW9tZXRyeS50b0dlb0pTT04pIHtcbiAgICAgIGdlb21ldHJ5ID0gZ2VvbWV0cnkudG9HZW9KU09OKCk7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIEdlb0pTT04gZmVhdHVyZSBieSBwdWxsaW5nIG91dCB0aGUgZ2VvbWV0cnlcbiAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAvLyBnZXQgdGhlIGdlb21ldHJ5IG9mIHRoZSBnZW9qc29uIGZlYXR1cmVcbiAgICAgIGdlb21ldHJ5ID0gZ2VvbWV0cnkuZ2VvbWV0cnk7XG4gICAgfVxuXG4gICAgLy8gY29uZmlybSB0aGF0IG91ciBHZW9KU09OIGlzIGEgcG9pbnQsIGxpbmUgb3IgcG9seWdvblxuICAgIGlmIChnZW9tZXRyeS50eXBlID09PSAnUG9pbnQnIHx8IGdlb21ldHJ5LnR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fCBnZW9tZXRyeS50eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgIHByb2Nlc3NlZElucHV0LmZlYXR1cmVzLnB1c2goeydnZW9tZXRyeSc6IFV0aWwuZ2VvanNvblRvQXJjR0lTKGdlb21ldHJ5KX0pO1xuICAgICAgcHJvY2Vzc2VkSW5wdXQuZ2VvbWV0cnlUeXBlID0gVXRpbC5nZW9qc29uVHlwZVRvQXJjR0lTKGdlb21ldHJ5LnR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdpbnZhbGlkIGdlb21ldHJ5IHBhc3NlZCBhcyBHUCBpbnB1dC4gU2hvdWxkIGJlIGFuIEwuTGF0TG5nLCBMLkxhdExuZ0JvdW5kcywgTC5NYXJrZXIgb3IgR2VvSlNPTiBQb2ludCBMaW5lIG9yIFBvbHlnb24gb2JqZWN0Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wYXJhbXNbcGFyYW1OYW1lXSA9IHByb2Nlc3NlZElucHV0O1xuICAgIHJldHVybjtcbiAgfSxcblxuICBydW46IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXN5bmMgPT09IHRydWUpIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgICB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QodGhpcy5vcHRpb25zLnBhdGgsIHRoaXMucGFyYW1zLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRKb2JJZCA9IHJlc3BvbnNlLmpvYklkO1xuICAgICAgICB0aGlzLmNoZWNrSm9iKHRoaXMuX2N1cnJlbnRKb2JJZCwgY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QodGhpcy5vcHRpb25zLnBhdGgsIHRoaXMucGFyYW1zLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIChyZXNwb25zZSAmJiB0aGlzLnByb2Nlc3NHUE91dHB1dChyZXNwb25zZSkpLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH0sXG5cbiAgY2hlY2tKb2I6IGZ1bmN0aW9uIChqb2JJZCwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB2YXIgcG9sbEpvYiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgICB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QoJ2pvYnMvJyArIGpvYklkLCB7fSwgZnVuY3Rpb24gcG9sbGVkSm9iIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmpvYlN0YXR1cyA9PT0gJ2VzcmlKb2JTdWNjZWVkZWQnKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLl9kb25lKSB7XG4gICAgICAgICAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIHRvIGRvOlxuICAgICAgICAgICAgLy8gcmVmYWN0b3IgdG8gbWFrZSBhbiBhcnJheSBvZiBhc3luYyByZXF1ZXN0cyBmb3Igb3V0cHV0XG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QoJ2pvYnMvJyArIGpvYklkICsgJy9yZXN1bHRzLycgKyB0aGlzLnBhcmFtcy5vdXRwdXRQYXJhbSwgdGhpcy5yZXN1bHRQYXJhbXMsIGZ1bmN0aW9uIHByb2Nlc3NKb2JSZXN1bHQgKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCAocmVzcG9uc2UgJiYgdGhpcy5wcm9jZXNzQXN5bmNPdXRwdXQocmVzcG9uc2UpKSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGNvdW50ZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmpvYlN0YXR1cyA9PT0gJ2VzcmlKb2JGYWlsZWQnKSB7XG4gICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCAnSm9iIEZhaWxlZCcsIG51bGwpO1xuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGNvdW50ZXIpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzKTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICB2YXIgY291bnRlciA9IHdpbmRvdy5zZXRJbnRlcnZhbChwb2xsSm9iLCB0aGlzLl9zZXJ2aWNlLm9wdGlvbnMuYXN5bmNJbnRlcnZhbCAqIDEwMDApO1xuICB9LFxuXG4gIHByb2Nlc3NHUE91dHB1dDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgdmFyIHByb2Nlc3NlZFJlc3BvbnNlID0ge307XG5cbiAgICAvLyBncmFiIHN5bmNyb25vdXMgcmVzdWx0c1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAvLyBsb29wIHRocm91Z2ggcmVzdWx0cyBhbmQgcGFzcyBiYWNrLCBwYXJzaW5nIGVzcmkganNvblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zZS5yZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcHJvY2Vzc2VkUmVzcG9uc2VbcmVzcG9uc2UucmVzdWx0c1tpXS5wYXJhbU5hbWVdO1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgICBpZiAocmVzcG9uc2UucmVzdWx0c1tpXS5kYXRhVHlwZSA9PT0gJ0dQRmVhdHVyZVJlY29yZFNldExheWVyJykge1xuICAgICAgICAgIHZhciBmZWF0dXJlQ29sbGVjdGlvbiA9IFV0aWwucmVzcG9uc2VUb0ZlYXR1cmVDb2xsZWN0aW9uKHJlc3BvbnNlLnJlc3VsdHNbaV0udmFsdWUpO1xuICAgICAgICAgIHByb2Nlc3NlZFJlc3BvbnNlW3Jlc3BvbnNlLnJlc3VsdHNbaV0ucGFyYW1OYW1lXSA9IGZlYXR1cmVDb2xsZWN0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZFJlc3BvbnNlW3Jlc3BvbnNlLnJlc3VsdHNbaV0ucGFyYW1OYW1lXSA9IHJlc3BvbnNlLnJlc3VsdHNbaV0udmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyBncmFiIGFzeW5jIHJlc3VsdHMgc2xpZ2h0bHkgZGlmZmVyZW50bHlcbiAgICAgIHByb2Nlc3NlZFJlc3BvbnNlLmpvYklkID0gdGhpcy5fY3VycmVudEpvYklkO1xuICAgICAgLy8gdmFyIHJlc3BvbnNlVmFsdWUgPSByZXNwb25zZS52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBpZiBvdXRwdXQgaXMgYSByYXN0ZXIgbGF5ZXIsIHdlIGFsc28gbmVlZCB0byBzdHViIG91dCBhIE1hcFNlcnZpY2UgdXJsIHVzaW5nIGpvYmlkXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hc3luYyA9PT0gdHJ1ZSAmJiByZXNwb25zZS5kYXRhVHlwZSA9PT0gJ0dQUmFzdGVyRGF0YUxheWVyJykge1xuICAgICAgdmFyIGJhc2VVUkwgPSB0aGlzLm9wdGlvbnMudXJsO1xuICAgICAgdmFyIG4gPSBiYXNlVVJMLmluZGV4T2YoJ0dQU2VydmVyJyk7XG4gICAgICB2YXIgc2VydmljZVVSTCA9IGJhc2VVUkwuc2xpY2UoMCwgbikgKyAnTWFwU2VydmVyLyc7XG4gICAgICBwcm9jZXNzZWRSZXNwb25zZS5vdXRwdXRNYXBTZXJ2aWNlID0gc2VydmljZVVSTCArICdqb2JzLycgKyB0aGlzLl9jdXJyZW50Sm9iSWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2Nlc3NlZFJlc3BvbnNlO1xuICB9LFxuXG4gIHByb2Nlc3NBc3luY091dHB1dDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgdmFyIHByb2Nlc3NlZFJlc3BvbnNlID0ge307XG4gICAgcHJvY2Vzc2VkUmVzcG9uc2Uuam9iSWQgPSB0aGlzLl9jdXJyZW50Sm9iSWQ7XG5cbiAgICAvLyBpZiBvdXRwdXQgaXMgYSByYXN0ZXIgbGF5ZXIsIHdlIGFsc28gbmVlZCB0byBzdHViIG91dCBhIE1hcFNlcnZpY2UgdXJsIHVzaW5nIGpvYmlkXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hc3luYyA9PT0gdHJ1ZSAmJiByZXNwb25zZS5kYXRhVHlwZSA9PT0gJ0dQUmFzdGVyRGF0YUxheWVyJykge1xuICAgICAgdmFyIGJhc2VVUkwgPSB0aGlzLm9wdGlvbnMudXJsO1xuICAgICAgdmFyIG4gPSBiYXNlVVJMLmluZGV4T2YoJ0dQU2VydmVyJyk7XG4gICAgICB2YXIgc2VydmljZVVSTCA9IGJhc2VVUkwuc2xpY2UoMCwgbikgKyAnTWFwU2VydmVyLyc7XG4gICAgICBwcm9jZXNzZWRSZXNwb25zZS5vdXRwdXRNYXBTZXJ2aWNlID0gc2VydmljZVVSTCArICdqb2JzLycgKyB0aGlzLl9jdXJyZW50Sm9iSWQ7XG4gICAgfVxuXG4gICAgLy8gaWYgb3V0cHV0IGlzIEdQRmVhdHVyZVJlY29yZFNldExheWVyLCBjb252ZXJ0IHRvIEdlb0pTT05cbiAgICBpZiAocmVzcG9uc2UuZGF0YVR5cGUgPT09ICdHUEZlYXR1cmVSZWNvcmRTZXRMYXllcicpIHtcbiAgICAgIHZhciBmZWF0dXJlQ29sbGVjdGlvbiA9IFV0aWwucmVzcG9uc2VUb0ZlYXR1cmVDb2xsZWN0aW9uKHJlc3BvbnNlLnZhbHVlKTtcbiAgICAgIHByb2Nlc3NlZFJlc3BvbnNlW3Jlc3BvbnNlLnBhcmFtTmFtZV0gPSBmZWF0dXJlQ29sbGVjdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkUmVzcG9uc2VbcmVzcG9uc2UucGFyYW1OYW1lXSA9IHJlc3BvbnNlLnZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzZWRSZXNwb25zZTtcbiAgfVxuXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRhc2sgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBUYXNrKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0YXNrO1xuIiwiaW1wb3J0IHsgU2VydmljZSBhcyBCYXNlU2VydmljZSB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi4vVGFza3MvR2VvcHJvY2Vzc2luZyc7XG5cbmV4cG9ydCB2YXIgU2VydmljZSA9IEJhc2VTZXJ2aWNlLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBhc3luY0ludGVydmFsOiAxXG4gIH0sXG5cbiAgY3JlYXRlVGFzazogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgVGFzayh0aGlzLCB0aGlzLm9wdGlvbnMpO1xuICB9XG5cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZSAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IFNlcnZpY2Uob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNlcnZpY2U7XG4iXSwibmFtZXMiOlsiVGFzayIsIkJhc2VUYXNrIiwiVXRpbCIsIlNlcnZpY2UiLCJCYXNlU2VydmljZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztDQ1FPLElBQUlBLE1BQUksR0FBR0MsZ0JBQVEsQ0FBQyxNQUFNLENBQUM7O0FBRWxDLENBQUEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxD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
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-heatmap-2.0.0.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,116 @@
+/* esri-leaflet-heatmap - v2.0.0 - Mon Aug 29 2016 20:03:56 GMT-0700 (PDT)
+ * Copyright (c) 2016 Environmental Systems Research Institute, Inc.
+ * Apache-2.0 */
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet'), require('esri-leaflet')) :
+	typeof define === 'function' && define.amd ? define(['exports', 'leaflet', 'esri-leaflet'], factory) :
+	(factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.Heat = global.L.esri.Heat || {}),global.L,global.L.esri));
+}(this, function (exports,L,esriLeaflet) { 'use strict';
+
+	L = 'default' in L ? L['default'] : L;
+
+	var version = "2.0.0";
+
+	var FeatureLayer = esriLeaflet.FeatureManager.extend({
+	  /**
+	   * Constructor
+	   */
+
+	  initialize: function (options) {
+	    esriLeaflet.FeatureManager.prototype.initialize.call(this, options);
+
+	    options = L.setOptions(this, options);
+
+	    this._cache = {};
+	    this._active = {};
+
+	    this.heat = window.L.heatLayer([], options);
+	  },
+
+	  /**
+	   * Layer Interface
+	   */
+
+	  onAdd: function (map) {
+	    esriLeaflet.FeatureManager.prototype.onAdd.call(this, map);
+	    this._map.addLayer(this.heat);
+	  },
+
+	  onRemove: function (map) {
+	    esriLeaflet.FeatureManager.prototype.onRemove.call(this, map);
+	    this._map.removeLayer(this.heat);
+	  },
+
+	  /**
+	   * Feature Managment Methods
+	   */
+
+	  createLayers: function (features) {
+	    for (var i = features.length - 1; i >= 0; i--) {
+	      var geojson = features[i];
+	      var id = geojson.id;
+	      var latlng = new L.LatLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0]);
+	      this._cache[id] = latlng;
+
+	      // add the layer if it is within the time bounds or our layer is not time enabled
+	      if (!this._active[id] && (!this.options.timeField || (this.options.timeField && this._featureWithinTimeRange(geojson)))) {
+	        this._active[id] = latlng;
+	        this.heat._latlngs.push(latlng);
+	      }
+	    }
+
+	    this.heat.redraw();
+	  },
+
+	  addLayers: function (ids) {
+	    for (var i = ids.length - 1; i >= 0; i--) {
+	      var id = ids[i];
+	      if (!this._active[id]) {
+	        var latlng = this._cache[id];
+	        this.heat._latlngs.push(latlng);
+	        this._active[id] = latlng;
+	      }
+	    }
+	    this.heat.redraw();
+	  },
+
+	  removeLayers: function (ids, permanent) {
+	    var newLatLngs = [];
+	    for (var i = ids.length - 1; i >= 0; i--) {
+	      var id = ids[i];
+	      if (this._active[id]) {
+	        delete this._active[id];
+	      }
+	      if (this._cache[id] && permanent) {
+	        delete this._cache[id];
+	      }
+	    }
+
+	    for (var latlng in this._active) {
+	      newLatLngs.push(this._active[latlng]);
+	    }
+
+	    this.heat.setLatLngs(newLatLngs);
+	  },
+
+	  setOptions: function (options) {
+	    this.heat.setOptions(options);
+	  },
+
+	  redraw: function () {
+	    this.heat.redraw();
+	  }
+
+	});
+
+	function featureLayer (options) {
+	  return new FeatureLayer(options);
+	}
+
+	exports.FeatureLayer = FeatureLayer;
+	exports.featureLayer = featureLayer;
+	exports['default'] = featureLayer;
+	exports.VERSION = version;
+
+}));
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWhlYXRtYXAtZGVidWcuanMiLCJzb3VyY2VzIjpbIi4uL3BhY2thZ2UuanNvbiIsIi4uL3NyYy9IZWF0bWFwRmVhdHVyZUxheWVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIntcbiAgXCJuYW1lXCI6IFwiZXNyaS1sZWFmbGV0LWhlYXRtYXBcIixcbiAgXCJkZXNjcmlwdGlvblwiOiBcIkVzcmkgTGVhZmxldCBwbHVnaW4gZm9yIHZpc3VhbGl6aW5nIEZlYXR1cmUgTGF5ZXJzIGFzIGhlYXRtYXBzIHdpdGggTC5oZWF0LlwiLFxuICBcInZlcnNpb25cIjogXCIyLjAuMFwiLFxuICBcImF1dGhvclwiOiBcIlBhdHJpY2sgQXJsdCA8cGFybHRAZXNyaS5jb20+IChodHRwOi8vcGF0cmlja2FybHQuY29tKVwiLFxuICBcImNvbnRyaWJ1dG9yc1wiOiBbXG4gICAgXCJQYXRyaWNrIEFybHQgPHBhcmx0QGVzcmkuY29tPiAoaHR0cDovL3BhdHJpY2thcmx0LmNvbSlcIixcbiAgICBcIkpvaG4gR3Jhdm9pcyA8amdyYXZvaXNAZXNyaS5jb20+IChodHRwOi8vam9obmdyYXZvaXMuY29tKVwiXG4gIF0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImVzcmktbGVhZmxldFwiOiBcIl4yLjAuMFwiLFxuICAgIFwibGVhZmxldFwiOiBcIl4xLjAuMC1yYy4zXCIsXG4gICAgXCJsZWFmbGV0LmhlYXRcIjogXCJeMC4yLjBcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJjaGFpXCI6IFwiMi4zLjBcIixcbiAgICBcImdoLXJlbGVhc2VcIjogXCJeMi4wLjBcIixcbiAgICBcImh0dHAtc2VydmVyXCI6IFwiXjAuOS4wXCIsXG4gICAgXCJpc3BhcnRhXCI6IFwiXjMuMC4zXCIsXG4gICAgXCJpc3RhbmJ1bFwiOiBcIl4wLjQuMlwiLFxuICAgIFwia2FybWFcIjogXCJeMC4xMi4yNFwiLFxuICAgIFwia2FybWEtY2hhaS1zaW5vblwiOiBcIl4wLjEuM1wiLFxuICAgIFwia2FybWEtY292ZXJhZ2VcIjogXCJeMC41LjNcIixcbiAgICBcImthcm1hLW1vY2hhXCI6IFwiXjAuMS4wXCIsXG4gICAgXCJrYXJtYS1tb2NoYS1yZXBvcnRlclwiOiBcIl4wLjIuNVwiLFxuICAgIFwia2FybWEtcGhhbnRvbWpzLWxhdW5jaGVyXCI6IFwiXjAuMS40XCIsXG4gICAgXCJrYXJtYS1zb3VyY2VtYXAtbG9hZGVyXCI6IFwiXjAuMy41XCIsXG4gICAgXCJta2RpcnBcIjogXCJeMC41LjFcIixcbiAgICBcIm5vZGUtc2Fzc1wiOiBcIl4zLjIuMFwiLFxuICAgIFwicGhhbnRvbWpzXCI6IFwiXjEuOS4xN1wiLFxuICAgIFwicm9sbHVwXCI6IFwiXjAuMjUuNFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1qc29uXCI6IFwiXjIuMC4wXCIsXG4gICAgXCJyb2xsdXAtcGx1Z2luLW5vZGUtcmVzb2x2ZVwiOiBcIl4xLjQuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi11Z2xpZnlcIjogXCJeMC4zLjFcIixcbiAgICBcInNlbWlzdGFuZGFyZFwiOiBcIl43LjAuMlwiLFxuICAgIFwic2lub25cIjogXCJeMS4xMS4xXCIsXG4gICAgXCJzaW5vbi1jaGFpXCI6IFwiMi43LjBcIixcbiAgICBcInNuYXp6eVwiOiBcIl4yLjAuMVwiLFxuICAgIFwid2F0Y2hcIjogXCJeMC4xNy4xXCJcbiAgfSxcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9Fc3JpL2VzcmktbGVhZmxldC1oZWF0bWFwXCIsXG4gIFwianNuZXh0Om1haW5cIjogXCJzcmMvSGVhdG1hcEZlYXR1cmVMYXllci5qc1wiLFxuICBcImpzcG1cIjoge1xuICAgIFwicmVnaXN0cnlcIjogXCJucG1cIixcbiAgICBcImZvcm1hdFwiOiBcImVzNlwiLFxuICAgIFwibWFpblwiOiBcInNyYy9IZWF0bWFwRmVhdHVyZUxheWVyLmpzXCJcbiAgfSxcbiAgXCJsaWNlbnNlXCI6IFwiQXBhY2hlLTIuMFwiLFxuICBcIm1haW5cIjogXCJkaXN0L2VzcmktbGVhZmxldC1oZWF0bWFwLWRlYnVnLmpzXCIsXG4gIFwicmVhZG1lRmlsZW5hbWVcIjogXCJSRUFETUUubWRcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb206RXNyaS9lc3JpLWxlYWZsZXQtaGVhdG1hcC5naXRcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwicHJlYnVpbGRcIjogXCJta2RpcnAgZGlzdFwiLFxuICAgIFwiYnVpbGRcIjogXCJyb2xsdXAgLWMgcHJvZmlsZXMvZGVidWcuanMgJiByb2xsdXAgLWMgcHJvZmlsZXMvcHJvZHVjdGlvbi5qc1wiLFxuICAgIFwibGludFwiOiBcInNlbWlzdGFuZGFyZCBzcmMvKi5qcyAmJiBzZW1pc3RhbmRhcmQgc3BlYy8qLmpzIHwgc25henp5XCIsXG4gICAgXCJwcmVwdWJsaXNoXCI6IFwibnBtIHJ1biBidWlsZFwiLFxuICAgIFwicHJldGVzdFwiOiBcIm5wbSBydW4gYnVpbGRcIixcbiAgICBcInJlbGVhc2VcIjogXCIuL3NjcmlwdHMvcmVsZWFzZS5zaFwiLFxuICAgIFwic3RhcnRcIjogXCJ3YXRjaCAnbnBtIHJ1biBidWlsZCcgc3JjICYgaHR0cC1zZXJ2ZXIgLXAgNjc4OSAtYy0xIC1vXCIsXG4gICAgXCJ0ZXN0XCI6IFwibnBtIHJ1biBsaW50ICYmIGthcm1hIHN0YXJ0XCJcbiAgfVxufVxuIiwiZXhwb3J0IHsgdmVyc2lvbiBhcyBWRVJTSU9OIH0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcblxuaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBGZWF0dXJlTWFuYWdlciB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5cbmV4cG9ydCB2YXIgRmVhdHVyZUxheWVyID0gRmVhdHVyZU1hbmFnZXIuZXh0ZW5kKHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqL1xuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgRmVhdHVyZU1hbmFnZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICAgIG9wdGlvbnMgPSBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG5cbiAgICB0aGlzLl9jYWNoZSA9IHt9O1xuICAgIHRoaXMuX2FjdGl2ZSA9IHt9O1xuXG4gICAgdGhpcy5oZWF0ID0gd2luZG93LkwuaGVhdExheWVyKFtdLCBvcHRpb25zKTtcbiAgfSxcblxuICAvKipcbiAgICogTGF5ZXIgSW50ZXJmYWNlXG4gICAqL1xuXG4gIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgRmVhdHVyZU1hbmFnZXIucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcywgbWFwKTtcbiAgICB0aGlzLl9tYXAuYWRkTGF5ZXIodGhpcy5oZWF0KTtcbiAgfSxcblxuICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgIEZlYXR1cmVNYW5hZ2VyLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsIG1hcCk7XG4gICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuaGVhdCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZlYXR1cmUgTWFuYWdtZW50IE1ldGhvZHNcbiAgICovXG5cbiAgY3JlYXRlTGF5ZXJzOiBmdW5jdGlvbiAoZmVhdHVyZXMpIHtcbiAgICBmb3IgKHZhciBpID0gZmVhdHVyZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBnZW9qc29uID0gZmVhdHVyZXNbaV07XG4gICAgICB2YXIgaWQgPSBnZW9qc29uLmlkO1xuICAgICAgdmFyIGxhdGxuZyA9IG5ldyBMLkxhdExuZyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLCBnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdKTtcbiAgICAgIHRoaXMuX2NhY2hlW2lkXSA9IGxhdGxuZztcblxuICAgICAgLy8gYWRkIHRoZSBsYXllciBpZiBpdCBpcyB3aXRoaW4gdGhlIHRpbWUgYm91bmRzIG9yIG91ciBsYXllciBpcyBub3QgdGltZSBlbmFibGVkXG4gICAgICBpZiAoIXRoaXMuX2FjdGl2ZVtpZF0gJiYgKCF0aGlzLm9wdGlvbnMudGltZUZpZWxkIHx8ICh0aGlzLm9wdGlvbnMudGltZUZpZWxkICYmIHRoaXMuX2ZlYXR1cmVXaXRoaW5UaW1lUmFuZ2UoZ2VvanNvbikpKSkge1xuICAgICAgICB0aGlzLl9hY3RpdmVbaWRdID0gbGF0bG5nO1xuICAgICAgICB0aGlzLmhlYXQuX2xhdGxuZ3MucHVzaChsYXRsbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaGVhdC5yZWRyYXcoKTtcbiAgfSxcblxuICBhZGRMYXllcnM6IGZ1bmN0aW9uIChpZHMpIHtcbiAgICBmb3IgKHZhciBpID0gaWRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgaWQgPSBpZHNbaV07XG4gICAgICBpZiAoIXRoaXMuX2FjdGl2ZVtpZF0pIHtcbiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuX2NhY2hlW2lkXTtcbiAgICAgICAgdGhpcy5oZWF0Ll9sYXRsbmdzLnB1c2gobGF0bG5nKTtcbiAgICAgICAgdGhpcy5fYWN0aXZlW2lkXSA9IGxhdGxuZztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5oZWF0LnJlZHJhdygpO1xuICB9LFxuXG4gIHJlbW92ZUxheWVyczogZnVuY3Rpb24gKGlkcywgcGVybWFuZW50KSB7XG4gICAgdmFyIG5ld0xhdExuZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gaWRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgaWQgPSBpZHNbaV07XG4gICAgICBpZiAodGhpcy5fYWN0aXZlW2lkXSkge1xuICAgICAgICBkZWxldGUgdGhpcy5fYWN0aXZlW2lkXTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9jYWNoZVtpZF0gJiYgcGVybWFuZW50KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9jYWNoZVtpZF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgbGF0bG5nIGluIHRoaXMuX2FjdGl2ZSkge1xuICAgICAgbmV3TGF0TG5ncy5wdXNoKHRoaXMuX2FjdGl2ZVtsYXRsbmddKTtcbiAgICB9XG5cbiAgICB0aGlzLmhlYXQuc2V0TGF0TG5ncyhuZXdMYXRMbmdzKTtcbiAgfSxcblxuICBzZXRPcHRpb25zOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHRoaXMuaGVhdC5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICB9LFxuXG4gIHJlZHJhdzogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaGVhdC5yZWRyYXcoKTtcbiAgfVxuXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZlYXR1cmVMYXllciAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IEZlYXR1cmVMYXllcihvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmVhdHVyZUxheWVyO1xuIl0sIm5hbWVzIjpbIkZlYXR1cmVNYW5hZ2VyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0NDS08sSUFBSSxZQUFZLEdBQUdBLDBCQUFjLENBQUMsTUFBTSxDQUFDO0FBQ2hELENBQUE7QUFDQSxDQUFBO0FBQ0EsQ0FBQTs7QUFFQSxDQUFBLEVBQUUsVUFBVSxFQUFFLFVBQVUsT0FBTyxFQUFFO0FBQ2pDLENBQUEsSUFBSUEsMEJBQWMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7O0FBRTVELENBQUEsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7O0FBRTFDLENBQUEsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNyQixDQUFBLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7O0FBRXRCLENBQUEsSUFBSSxJ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
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-renderers-2.0.2.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1129 @@
+/* esri-leaflet-renderers - v2.0.2 - Wed Jun 15 2016 09:56:55 GMT-0700 (PDT)
+ * Copyright (c) 2016 Environmental Systems Research Institute, Inc.
+ * Apache-2.0 */
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet')) :
+	typeof define === 'function' && define.amd ? define(['exports', 'leaflet'], factory) :
+	(factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.Renderers = global.L.esri.Renderers || {}),global.L));
+}(this, function (exports,L) { 'use strict';
+
+	L = 'default' in L ? L['default'] : L;
+
+	var version = "2.0.2";
+
+	var Symbol = L.Class.extend({
+	  initialize: function (symbolJson, options) {
+	    this._symbolJson = symbolJson;
+	    this.val = null;
+	    this._styles = {};
+	    this._isDefault = false;
+	    this._layerTransparency = 1;
+	    if (options && options.layerTransparency) {
+	      this._layerTransparency = 1 - (options.layerTransparency / 100.0);
+	    }
+	  },
+
+	  // the geojson values returned are in points
+	  pixelValue: function (pointValue) {
+	    return pointValue * 1.333;
+	  },
+
+	  // color is an array [r,g,b,a]
+	  colorValue: function (color) {
+	    return 'rgb(' + color[0] + ',' + color[1] + ',' + color[2] + ')';
+	  },
+
+	  alphaValue: function (color) {
+	    var alpha = color[3] / 255.0;
+	    return alpha * this._layerTransparency;
+	  },
+
+	  getSize: function (feature, sizeInfo) {
+	    var attr = feature.properties;
+	    var field = sizeInfo.field;
+	    var size = 0;
+	    var featureValue = null;
+
+	    if (field) {
+	      featureValue = attr[field];
+	      var minSize = sizeInfo.minSize;
+	      var maxSize = sizeInfo.maxSize;
+	      var minDataValue = sizeInfo.minDataValue;
+	      var maxDataValue = sizeInfo.maxDataValue;
+	      var featureRatio;
+	      var normField = sizeInfo.normalizationField;
+	      var normValue = attr ? parseFloat(attr[normField]) : undefined;
+
+	      if (featureValue === null || (normField && ((isNaN(normValue) || normValue === 0)))) {
+	        return null;
+	      }
+
+	      if (!isNaN(normValue)) {
+	        featureValue /= normValue;
+	      }
+
+	      if (minSize !== null && maxSize !== null && minDataValue !== null && maxDataValue !== null) {
+	        if (featureValue <= minDataValue) {
+	          size = minSize;
+	        } else if (featureValue >= maxDataValue) {
+	          size = maxSize;
+	        } else {
+	          featureRatio = (featureValue - minDataValue) / (maxDataValue - minDataValue);
+	          size = minSize + (featureRatio * (maxSize - minSize));
+	        }
+	      }
+	      size = isNaN(size) ? 0 : size;
+	    }
+	    return size;
+	  },
+
+	  getColor: function (feature, colorInfo) {
+	    // required information to get color
+	    if (!(feature.properties && colorInfo && colorInfo.field && colorInfo.stops)) {
+	      return null;
+	    }
+
+	    var attr = feature.properties;
+	    var featureValue = attr[colorInfo.field];
+	    var lowerBoundColor, upperBoundColor, lowerBound, upperBound;
+	    var normField = colorInfo.normalizationField;
+	    var normValue = attr ? parseFloat(attr[normField]) : undefined;
+	    if (featureValue === null || (normField && ((isNaN(normValue) || normValue === 0)))) {
+	      return null;
+	    }
+
+	    if (!isNaN(normValue)) {
+	      featureValue /= normValue;
+	    }
+
+	    if (featureValue <= colorInfo.stops[0].value) {
+	      return colorInfo.stops[0].color;
+	    }
+	    var lastStop = colorInfo.stops[colorInfo.stops.length - 1];
+	    if (featureValue >= lastStop.value) {
+	      return lastStop.color;
+	    }
+
+	    // go through the stops to find min and max
+	    for (var i = 0; i < colorInfo.stops.length; i++) {
+	      var stopInfo = colorInfo.stops[i];
+
+	      if (stopInfo.value <= featureValue) {
+	        lowerBoundColor = stopInfo.color;
+	        lowerBound = stopInfo.value;
+	      } else if (stopInfo.value > featureValue) {
+	        upperBoundColor = stopInfo.color;
+	        upperBound = stopInfo.value;
+	        break;
+	      }
+	    }
+
+	    // feature falls between two stops, interplate the colors
+	    if (!isNaN(lowerBound) && !isNaN(upperBound)) {
+	      var range = upperBound - lowerBound;
+	      if (range > 0) {
+	        // more weight the further it is from the lower bound
+	        var upperBoundColorWeight = (featureValue - lowerBound) / range;
+	        if (upperBoundColorWeight) {
+	          // more weight the further it is from the upper bound
+	          var lowerBoundColorWeight = (upperBound - featureValue) / range;
+	          if (lowerBoundColorWeight) {
+	            // interpolate the lower and upper bound color by applying the
+	            // weights to each of the rgba colors and adding them together
+	            var interpolatedColor = [];
+	            for (var j = 0; j < 4; j++) {
+	              interpolatedColor[j] = Math.round(lowerBoundColor[j] * lowerBoundColorWeight + upperBoundColor[j] * upperBoundColorWeight);
+	            }
+	            return interpolatedColor;
+	          } else {
+	            // no difference between featureValue and upperBound, 100% of upperBoundColor
+	            return upperBoundColor;
+	          }
+	        } else {
+	          // no difference between featureValue and lowerBound, 100% of lowerBoundColor
+	          return lowerBoundColor;
+	        }
+	      }
+	    }
+	    // if we get to here, none of the cases apply so return null
+	    return null;
+	  }
+	});
+
+	var ShapeMarker = L.Path.extend({
+
+	  initialize: function (latlng, size, options) {
+	    L.setOptions(this, options);
+	    this._size = size;
+	    this._latlng = L.latLng(latlng);
+	    this._svgCanvasIncludes();
+	  },
+
+	  _svgCanvasIncludes: function () {
+	    // implement in sub class
+	  },
+
+	  _project: function () {
+	    this._point = this._map.latLngToLayerPoint(this._latlng);
+	  },
+
+	  _update: function () {
+	    if (this._map) {
+	      this._updatePath();
+	    }
+	  },
+
+	  _updatePath: function () {
+	    // implement in sub class
+	  },
+
+	  setLatLng: function (latlng) {
+	    this._latlng = L.latLng(latlng);
+	    this.redraw();
+	    return this.fire('move', {latlng: this._latlng});
+	  },
+
+	  getLatLng: function () {
+	    return this._latlng;
+	  },
+
+	  setSize: function (size) {
+	    this._size = size;
+	    return this.redraw();
+	  },
+
+	  getSize: function () {
+	    return this._size;
+	  }
+	});
+
+	var CrossMarker = ShapeMarker.extend({
+
+	  initialize: function (latlng, size, options) {
+	    ShapeMarker.prototype.initialize.call(this, latlng, size, options);
+	  },
+
+	  _updatePath: function () {
+	    this._renderer._updateCrossMarker(this);
+	  },
+
+	  _svgCanvasIncludes: function () {
+	    L.Canvas.include({
+	      _updateCrossMarker: function (layer) {
+	        var latlng = layer._point;
+	        var offset = layer._size / 2.0;
+	        var ctx = this._ctx;
+
+	        ctx.beginPath();
+	        ctx.moveTo(latlng.x, latlng.y + offset);
+	        ctx.lineTo(latlng.x, latlng.y - offset);
+	        this._fillStroke(ctx, layer);
+
+	        ctx.moveTo(latlng.x - offset, latlng.y);
+	        ctx.lineTo(latlng.x + offset, latlng.y);
+	        this._fillStroke(ctx, layer);
+	      }
+	    });
+
+	    L.SVG.include({
+	      _updateCrossMarker: function (layer) {
+	        var latlng = layer._point;
+	        var offset = layer._size / 2.0;
+
+	        if (L.Browser.vml) {
+	          latlng._round();
+	          offset = Math.round(offset);
+	        }
+
+	        var str = 'M' + latlng.x + ',' + (latlng.y + offset) +
+	          'L' + latlng.x + ',' + (latlng.y - offset) +
+	          'M' + (latlng.x - offset) + ',' + latlng.y +
+	          'L' + (latlng.x + offset) + ',' + latlng.y;
+
+	        this._setPath(layer, str);
+	      }
+	    });
+	  }
+	});
+
+	var crossMarker = function (latlng, size, options) {
+	  return new CrossMarker(latlng, size, options);
+	};
+
+	var XMarker = ShapeMarker.extend({
+
+	  initialize: function (latlng, size, options) {
+	    ShapeMarker.prototype.initialize.call(this, latlng, size, options);
+	  },
+
+	  _updatePath: function () {
+	    this._renderer._updateXMarker(this);
+	  },
+
+	  _svgCanvasIncludes: function () {
+	    L.Canvas.include({
+	      _updateXMarker: function (layer) {
+	        var latlng = layer._point;
+	        var offset = layer._size / 2.0;
+	        var ctx = this._ctx;
+
+	        ctx.beginPath();
+
+	        ctx.moveTo(latlng.x + offset, latlng.y + offset);
+	        ctx.lineTo(latlng.x - offset, latlng.y - offset);
+	        this._fillStroke(ctx, layer);
+	      }
+	    });
+
+	    L.SVG.include({
+	      _updateXMarker: function (layer) {
+	        var latlng = layer._point;
+	        var offset = layer._size / 2.0;
+
+	        if (L.Browser.vml) {
+	          latlng._round();
+	          offset = Math.round(offset);
+	        }
+
+	        var str = 'M' + (latlng.x + offset) + ',' + (latlng.y + offset) +
+	          'L' + (latlng.x - offset) + ',' + (latlng.y - offset) +
+	          'M' + (latlng.x - offset) + ',' + (latlng.y + offset) +
+	          'L' + (latlng.x + offset) + ',' + (latlng.y - offset);
+
+	        this._setPath(layer, str);
+	      }
+	    });
+	  }
+	});
+
+	var xMarker = function (latlng, size, options) {
+	  return new XMarker(latlng, size, options);
+	};
+
+	var SquareMarker = ShapeMarker.extend({
+	  options: {
+	    fill: true
+	  },
+
+	  initialize: function (latlng, size, options) {
+	    ShapeMarker.prototype.initialize.call(this, latlng, size, options);
+	  },
+
+	  _updatePath: function () {
+	    this._renderer._updateSquareMarker(this);
+	  },
+
+	  _svgCanvasIncludes: function () {
+	    L.Canvas.include({
+	      _updateSquareMarker: function (layer) {
+	        var latlng = layer._point;
+	        var offset = layer._size / 2.0;
+	        var ctx = this._ctx;
+
+	        ctx.beginPath();
+
+	        ctx.moveTo(latlng.x + offset, latlng.y + offset);
+	        ctx.lineTo(latlng.x - offset, latlng.y + offset);
+	        ctx.lineTo(latlng.x - offset, latlng.y - offset);
+	        ctx.lineTo(latlng.x + offset, latlng.y - offset);
+
+	        ctx.closePath();
+
+	        this._fillStroke(ctx, layer);
+	      }
+	    });
+
+	    L.SVG.include({
+	      _updateSquareMarker: function (layer) {
+	        var latlng = layer._point;
+	        var offset = layer._size / 2.0;
+
+	        if (L.Browser.vml) {
+	          latlng._round();
+	          offset = Math.round(offset);
+	        }
+
+	        var str = 'M' + (latlng.x + offset) + ',' + (latlng.y + offset) +
+	          'L' + (latlng.x - offset) + ',' + (latlng.y + offset) +
+	          'L' + (latlng.x - offset) + ',' + (latlng.y - offset) +
+	          'L' + (latlng.x + offset) + ',' + (latlng.y - offset);
+
+	        str = str + (L.Browser.svg ? 'z' : 'x');
+
+	        this._setPath(layer, str);
+	      }
+	    });
+	  }
+	});
+
+	var squareMarker = function (latlng, size, options) {
+	  return new SquareMarker(latlng, size, options);
+	};
+
+	var DiamondMarker = ShapeMarker.extend({
+	  options: {
+	    fill: true
+	  },
+
+	  initialize: function (latlng, size, options) {
+	    ShapeMarker.prototype.initialize.call(this, latlng, size, options);
+	  },
+
+	  _updatePath: function () {
+	    this._renderer._updateDiamondMarker(this);
+	  },
+
+	  _svgCanvasIncludes: function () {
+	    L.Canvas.include({
+	      _updateDiamondMarker: function (layer) {
+	        var latlng = layer._point;
+	        var offset = layer._size / 2.0;
+	        var ctx = this._ctx;
+
+	        ctx.beginPath();
+
+	        ctx.moveTo(latlng.x, latlng.y + offset);
+	        ctx.lineTo(latlng.x - offset, latlng.y);
+	        ctx.lineTo(latlng.x, latlng.y - offset);
+	        ctx.lineTo(latlng.x + offset, latlng.y);
+
+	        ctx.closePath();
+
+	        this._fillStroke(ctx, layer);
+	      }
+	    });
+
+	    L.SVG.include({
+	      _updateDiamondMarker: function (layer) {
+	        var latlng = layer._point;
+	        var offset = layer._size / 2.0;
+
+	        if (L.Browser.vml) {
+	          latlng._round();
+	          offset = Math.round(offset);
+	        }
+
+	        var str = 'M' + latlng.x + ',' + (latlng.y + offset) +
+	          'L' + (latlng.x - offset) + ',' + latlng.y +
+	          'L' + latlng.x + ',' + (latlng.y - offset) +
+	          'L' + (latlng.x + offset) + ',' + latlng.y;
+
+	        str = str + (L.Browser.svg ? 'z' : 'x');
+
+	        this._setPath(layer, str);
+	      }
+	    });
+	  }
+	});
+
+	var diamondMarker = function (latlng, size, options) {
+	  return new DiamondMarker(latlng, size, options);
+	};
+
+	var PointSymbol = Symbol.extend({
+
+	  statics: {
+	    MARKERTYPES: ['esriSMSCircle', 'esriSMSCross', 'esriSMSDiamond', 'esriSMSSquare', 'esriSMSX', 'esriPMS']
+	  },
+
+	  initialize: function (symbolJson, options) {
+	    Symbol.prototype.initialize.call(this, symbolJson, options);
+	    if (options) {
+	      this.serviceUrl = options.url;
+	    }
+	    if (symbolJson) {
+	      if (symbolJson.type === 'esriPMS') {
+	        var url = this.serviceUrl + 'images/' + this._symbolJson.url;
+	        this._iconUrl = options && options.token ? url + '?token=' + options.token : url;
+	        // leaflet does not allow resizing icons so keep a hash of different
+	        // icon sizes to try and keep down on the number of icons created
+	        this._icons = {};
+	        // create base icon
+	        this.icon = this._createIcon(this._symbolJson);
+	      } else {
+	        this._fillStyles();
+	      }
+	    }
+	  },
+
+	  _fillStyles: function () {
+	    if (this._symbolJson.outline && this._symbolJson.size > 0) {
+	      this._styles.stroke = true;
+	      this._styles.weight = this.pixelValue(this._symbolJson.outline.width);
+	      this._styles.color = this.colorValue(this._symbolJson.outline.color);
+	      this._styles.opacity = this.alphaValue(this._symbolJson.outline.color);
+	    } else {
+	      this._styles.stroke = false;
+	    }
+	    if (this._symbolJson.color) {
+	      this._styles.fillColor = this.colorValue(this._symbolJson.color);
+	      this._styles.fillOpacity = this.alphaValue(this._symbolJson.color);
+	    } else {
+	      this._styles.fillOpacity = 0;
+	    }
+
+	    if (this._symbolJson.style === 'esriSMSCircle') {
+	      this._styles.radius = this.pixelValue(this._symbolJson.size) / 2.0;
+	    }
+	  },
+
+	  _createIcon: function (options) {
+	    var width = this.pixelValue(options.width);
+	    var height = width;
+	    if (options.height) {
+	      height = this.pixelValue(options.height);
+	    }
+	    var xOffset = width / 2.0;
+	    var yOffset = height / 2.0;
+
+	    if (options.xoffset) {
+	      xOffset += this.pixelValue(options.xoffset);
+	    }
+	    if (options.yoffset) {
+	      yOffset += this.pixelValue(options.yoffset);
+	    }
+
+	    var icon = L.icon({
+	      iconUrl: this._iconUrl,
+	      iconSize: [width, height],
+	      iconAnchor: [xOffset, yOffset]
+	    });
+	    this._icons[options.width.toString()] = icon;
+	    return icon;
+	  },
+
+	  _getIcon: function (size) {
+	    // check to see if it is already created by size
+	    var icon = this._icons[size.toString()];
+	    if (!icon) {
+	      icon = this._createIcon({width: size});
+	    }
+	    return icon;
+	  },
+
+	  pointToLayer: function (geojson, latlng, visualVariables, options) {
+	    var size = this._symbolJson.size || this._symbolJson.width;
+	    if (!this._isDefault) {
+	      if (visualVariables.sizeInfo) {
+	        var calculatedSize = this.getSize(geojson, visualVariables.sizeInfo);
+	        if (calculatedSize) {
+	          size = calculatedSize;
+	        }
+	      }
+	      if (visualVariables.colorInfo) {
+	        var color = this.getColor(geojson, visualVariables.colorInfo);
+	        if (color) {
+	          this._styles.fillColor = this.colorValue(color);
+	          this._styles.fillOpacity = this.alphaValue(color);
+	        }
+	      }
+	    }
+
+	    if (this._symbolJson.type === 'esriPMS') {
+	      var layerOptions = L.extend({}, {icon: this._getIcon(size)}, options);
+	      return L.marker(latlng, layerOptions);
+	    }
+	    size = this.pixelValue(size);
+
+	    switch (this._symbolJson.style) {
+	      case 'esriSMSSquare':
+	        return squareMarker(latlng, size, L.extend({}, this._styles, options));
+	      case 'esriSMSDiamond':
+	        return diamondMarker(latlng, size, L.extend({}, this._styles, options));
+	      case 'esriSMSCross':
+	        return crossMarker(latlng, size, L.extend({}, this._styles, options));
+	      case 'esriSMSX':
+	        return xMarker(latlng, size, L.extend({}, this._styles, options));
+	    }
+	    this._styles.radius = size / 2.0;
+	    return L.circleMarker(latlng, L.extend({}, this._styles, options));
+	  }
+	});
+
+	function pointSymbol (symbolJson, options) {
+	  return new PointSymbol(symbolJson, options);
+	}
+
+	var LineSymbol = Symbol.extend({
+	  statics: {
+	    // Not implemented 'esriSLSNull'
+	    LINETYPES: ['esriSLSDash', 'esriSLSDot', 'esriSLSDashDotDot', 'esriSLSDashDot', 'esriSLSSolid']
+	  },
+	  initialize: function (symbolJson, options) {
+	    Symbol.prototype.initialize.call(this, symbolJson, options);
+	    this._fillStyles();
+	  },
+
+	  _fillStyles: function () {
+	    // set the defaults that show up on arcgis online
+	    this._styles.lineCap = 'butt';
+	    this._styles.lineJoin = 'miter';
+	    this._styles.fill = false;
+	    this._styles.weight = 0;
+
+	    if (!this._symbolJson) {
+	      return this._styles;
+	    }
+
+	    if (this._symbolJson.color) {
+	      this._styles.color = this.colorValue(this._symbolJson.color);
+	      this._styles.opacity = this.alphaValue(this._symbolJson.color);
+	    }
+
+	    if (!isNaN(this._symbolJson.width)) {
+	      this._styles.weight = this.pixelValue(this._symbolJson.width);
+
+	      var dashValues = [];
+
+	      switch (this._symbolJson.style) {
+	        case 'esriSLSDash':
+	          dashValues = [4, 3];
+	          break;
+	        case 'esriSLSDot':
+	          dashValues = [1, 3];
+	          break;
+	        case 'esriSLSDashDot':
+	          dashValues = [8, 3, 1, 3];
+	          break;
+	        case 'esriSLSDashDotDot':
+	          dashValues = [8, 3, 1, 3, 1, 3];
+	          break;
+	      }
+
+	      // use the dash values and the line weight to set dash array
+	      if (dashValues.length > 0) {
+	        for (var i = 0; i < dashValues.length; i++) {
+	          dashValues[i] *= this._styles.weight;
+	        }
+
+	        this._styles.dashArray = dashValues.join(',');
+	      }
+	    }
+	  },
+
+	  style: function (feature, visualVariables) {
+	    if (!this._isDefault && visualVariables) {
+	      if (visualVariables.sizeInfo) {
+	        var calculatedSize = this.pixelValue(this.getSize(feature, visualVariables.sizeInfo));
+	        if (calculatedSize) {
+	          this._styles.weight = calculatedSize;
+	        }
+	      }
+	      if (visualVariables.colorInfo) {
+	        var color = this.getColor(feature, visualVariables.colorInfo);
+	        if (color) {
+	          this._styles.color = this.colorValue(color);
+	          this._styles.opacity = this.alphaValue(color);
+	        }
+	      }
+	    }
+	    return this._styles;
+	  }
+	});
+
+	function lineSymbol (symbolJson, options) {
+	  return new LineSymbol(symbolJson, options);
+	}
+
+	var PolygonSymbol = Symbol.extend({
+	  statics: {
+	    // not implemented: 'esriSFSBackwardDiagonal','esriSFSCross','esriSFSDiagonalCross','esriSFSForwardDiagonal','esriSFSHorizontal','esriSFSNull','esriSFSVertical'
+	    POLYGONTYPES: ['esriSFSSolid']
+	  },
+	  initialize: function (symbolJson, options) {
+	    Symbol.prototype.initialize.call(this, symbolJson, options);
+	    if (symbolJson) {
+	      this._lineStyles = lineSymbol(symbolJson.outline, options).style();
+	      this._fillStyles();
+	    }
+	  },
+
+	  _fillStyles: function () {
+	    if (this._lineStyles) {
+	      if (this._lineStyles.weight === 0) {
+	        // when weight is 0, setting the stroke to false can still look bad
+	        // (gaps between the polygons)
+	        this._styles.stroke = false;
+	      } else {
+	        // copy the line symbol styles into this symbol's styles
+	        for (var styleAttr in this._lineStyles) {
+	          this._styles[styleAttr] = this._lineStyles[styleAttr];
+	        }
+	      }
+	    }
+
+	    // set the fill for the polygon
+	    if (this._symbolJson) {
+	      if (this._symbolJson.color &&
+	          // don't fill polygon if type is not supported
+	          PolygonSymbol.POLYGONTYPES.indexOf(this._symbolJson.style >= 0)) {
+	        this._styles.fill = true;
+	        this._styles.fillColor = this.colorValue(this._symbolJson.color);
+	        this._styles.fillOpacity = this.alphaValue(this._symbolJson.color);
+	      } else {
+	        this._styles.fill = false;
+	        this._styles.fillOpacity = 0;
+	      }
+	    }
+	  },
+
+	  style: function (feature, visualVariables) {
+	    if (!this._isDefault && visualVariables && visualVariables.colorInfo) {
+	      var color = this.getColor(feature, visualVariables.colorInfo);
+	      if (color) {
+	        this._styles.fillColor = this.colorValue(color);
+	        this._styles.fillOpacity = this.alphaValue(color);
+	      }
+	    }
+	    return this._styles;
+	  }
+	});
+
+	function polygonSymbol (symbolJson, options) {
+	  return new PolygonSymbol(symbolJson, options);
+	}
+
+	var Renderer = L.Class.extend({
+	  options: {
+	    proportionalPolygon: false,
+	    clickable: true
+	  },
+
+	  initialize: function (rendererJson, options) {
+	    this._rendererJson = rendererJson;
+	    this._pointSymbols = false;
+	    this._symbols = [];
+	    this._visualVariables = this._parseVisualVariables(rendererJson.visualVariables);
+	    L.Util.setOptions(this, options);
+	  },
+
+	  _parseVisualVariables: function (visualVariables) {
+	    var visVars = {};
+	    if (visualVariables) {
+	      for (var i = 0; i < visualVariables.length; i++) {
+	        visVars[visualVariables[i].type] = visualVariables[i];
+	      }
+	    }
+	    return visVars;
+	  },
+
+	  _createDefaultSymbol: function () {
+	    if (this._rendererJson.defaultSymbol) {
+	      this._defaultSymbol = this._newSymbol(this._rendererJson.defaultSymbol);
+	      this._defaultSymbol._isDefault = true;
+	    }
+	  },
+
+	  _newSymbol: function (symbolJson) {
+	    if (symbolJson.type === 'esriSMS' || symbolJson.type === 'esriPMS') {
+	      this._pointSymbols = true;
+	      return pointSymbol(symbolJson, this.options);
+	    }
+	    if (symbolJson.type === 'esriSLS') {
+	      return lineSymbol(symbolJson, this.options);
+	    }
+	    if (symbolJson.type === 'esriSFS') {
+	      return polygonSymbol(symbolJson, this.options);
+	    }
+	  },
+
+	  _getSymbol: function () {
+	    // override
+	  },
+
+	  attachStylesToLayer: function (layer) {
+	    if (this._pointSymbols) {
+	      layer.options.pointToLayer = L.Util.bind(this.pointToLayer, this);
+	    } else {
+	      layer.options.style = L.Util.bind(this.style, this);
+	      layer._originalStyle = layer.options.style;
+	    }
+	  },
+
+	  pointToLayer: function (geojson, latlng) {
+	    var sym = this._getSymbol(geojson);
+	    if (sym && sym.pointToLayer) {
+	      // right now custom panes are the only option pushed through
+	      return sym.pointToLayer(geojson, latlng, this._visualVariables, this.options);
+	    }
+	    // invisible symbology
+	    return L.circleMarker(latlng, {radius: 0, opacity: 0});
+	  },
+
+	  style: function (feature) {
+	    var userStyles;
+	    if (this.options.userDefinedStyle) {
+	      userStyles = this.options.userDefinedStyle(feature);
+	    }
+	    // find the symbol to represent this feature
+	    var sym = this._getSymbol(feature);
+	    if (sym) {
+	      return this.mergeStyles(sym.style(feature, this._visualVariables), userStyles);
+	    } else {
+	      // invisible symbology
+	      return this.mergeStyles({opacity: 0, fillOpacity: 0}, userStyles);
+	    }
+	  },
+
+	  mergeStyles: function (styles, userStyles) {
+	    var mergedStyles = {};
+	    var attr;
+	    // copy renderer style attributes
+	    for (attr in styles) {
+	      if (styles.hasOwnProperty(attr)) {
+	        mergedStyles[attr] = styles[attr];
+	      }
+	    }
+	    // override with user defined style attributes
+	    if (userStyles) {
+	      for (attr in userStyles) {
+	        if (userStyles.hasOwnProperty(attr)) {
+	          mergedStyles[attr] = userStyles[attr];
+	        }
+	      }
+	    }
+	    return mergedStyles;
+	  }
+	});
+
+	var SimpleRenderer = Renderer.extend({
+	  initialize: function (rendererJson, options) {
+	    Renderer.prototype.initialize.call(this, rendererJson, options);
+	    this._createSymbol();
+	  },
+
+	  _createSymbol: function () {
+	    if (this._rendererJson.symbol) {
+	      this._symbols.push(this._newSymbol(this._rendererJson.symbol));
+	    }
+	  },
+
+	  _getSymbol: function () {
+	    return this._symbols[0];
+	  }
+	});
+
+	function simpleRenderer (rendererJson, options) {
+	  return new SimpleRenderer(rendererJson, options);
+	}
+
+	var ClassBreaksRenderer = Renderer.extend({
+	  initialize: function (rendererJson, options) {
+	    Renderer.prototype.initialize.call(this, rendererJson, options);
+	    this._field = this._rendererJson.field;
+	    if (this._rendererJson.normalizationType && this._rendererJson.normalizationType === 'esriNormalizeByField') {
+	      this._normalizationField = this._rendererJson.normalizationField;
+	    }
+	    this._createSymbols();
+	  },
+
+	  _createSymbols: function () {
+	    var symbol;
+	    var classbreaks = this._rendererJson.classBreakInfos;
+
+	    this._symbols = [];
+
+	    // create a symbol for each class break
+	    for (var i = classbreaks.length - 1; i >= 0; i--) {
+	      if (this.options.proportionalPolygon && this._rendererJson.backgroundFillSymbol) {
+	        symbol = this._newSymbol(this._rendererJson.backgroundFillSymbol);
+	      } else {
+	        symbol = this._newSymbol(classbreaks[i].symbol);
+	      }
+	      symbol.val = classbreaks[i].classMaxValue;
+	      this._symbols.push(symbol);
+	    }
+	    // sort the symbols in ascending value
+	    this._symbols.sort(function (a, b) {
+	      return a.val > b.val ? 1 : -1;
+	    });
+	    this._createDefaultSymbol();
+	    this._maxValue = this._symbols[this._symbols.length - 1].val;
+	  },
+
+	  _getSymbol: function (feature) {
+	    var val = feature.properties[this._field];
+	    if (this._normalizationField) {
+	      var normValue = feature.properties[this._normalizationField];
+	      if (!isNaN(normValue) && normValue !== 0) {
+	        val = val / normValue;
+	      } else {
+	        return this._defaultSymbol;
+	      }
+	    }
+
+	    if (val > this._maxValue) {
+	      return this._defaultSymbol;
+	    }
+	    var symbol = this._symbols[0];
+	    for (var i = this._symbols.length - 1; i >= 0; i--) {
+	      if (val > this._symbols[i].val) {
+	        break;
+	      }
+	      symbol = this._symbols[i];
+	    }
+	    return symbol;
+	  }
+	});
+
+	function classBreaksRenderer (rendererJson, options) {
+	  return new ClassBreaksRenderer(rendererJson, options);
+	}
+
+	var UniqueValueRenderer = Renderer.extend({
+	  initialize: function (rendererJson, options) {
+	    Renderer.prototype.initialize.call(this, rendererJson, options);
+	    this._field = this._rendererJson.field1;
+	    this._createSymbols();
+	  },
+
+	  _createSymbols: function () {
+	    var symbol;
+	    var uniques = this._rendererJson.uniqueValueInfos;
+
+	    // create a symbol for each unique value
+	    for (var i = uniques.length - 1; i >= 0; i--) {
+	      symbol = this._newSymbol(uniques[i].symbol);
+	      symbol.val = uniques[i].value;
+	      this._symbols.push(symbol);
+	    }
+	    this._createDefaultSymbol();
+	  },
+
+	  _getSymbol: function (feature) {
+	    var val = feature.properties[this._field];
+	    // accumulate values if there is more than one field defined
+	    if (this._rendererJson.fieldDelimiter && this._rendererJson.field2) {
+	      var val2 = feature.properties[this._rendererJson.field2];
+	      if (val2) {
+	        val += this._rendererJson.fieldDelimiter + val2;
+	        var val3 = feature.properties[this._rendererJson.field3];
+	        if (val3) {
+	          val += this._rendererJson.fieldDelimiter + val3;
+	        }
+	      }
+	    }
+
+	    var symbol = this._defaultSymbol;
+	    for (var i = this._symbols.length - 1; i >= 0; i--) {
+	      // using the === operator does not work if the field
+	      // of the unique renderer is not a string
+	      /*eslint-disable */
+	      if (this._symbols[i].val == val) {
+	        symbol = this._symbols[i];
+	      }
+	      /*eslint-enable */
+	    }
+	    return symbol;
+	  }
+	});
+
+	function uniqueValueRenderer (rendererJson, options) {
+	  return new UniqueValueRenderer(rendererJson, options);
+	}
+
+	L.esri.FeatureLayer.addInitHook(function () {
+	  if (this.options.ignoreRenderer) {
+	    return;
+	  }
+	  var oldOnAdd = L.Util.bind(this.onAdd, this);
+	  var oldUnbindPopup = L.Util.bind(this.unbindPopup, this);
+	  var oldOnRemove = L.Util.bind(this.onRemove, this);
+	  L.Util.bind(this.createNewLayer, this);
+
+	  this.metadata(function (error, response) {
+	    if (error) {
+	      return;
+	    } if (response && response.drawingInfo) {
+	      this._setRenderers(response);
+	    } if (this._alreadyAdded) {
+	      this.setStyle(this._originalStyle);
+	    }
+	  }, this);
+
+	  this.onAdd = function (map) {
+	    oldOnAdd(map);
+	    this._addPointLayer(map);
+	    this._alreadyAdded = true;
+	  };
+
+	  this.onRemove = function (map) {
+	    oldOnRemove(map);
+	    if (this._pointLayer) {
+	      var pointLayers = this._pointLayer.getLayers();
+	      for (var i in pointLayers) {
+	        map.removeLayer(pointLayers[i]);
+	      }
+	    }
+	  };
+
+	  this.unbindPopup = function () {
+	    oldUnbindPopup();
+	    if (this._pointLayer) {
+	      var pointLayers = this._pointLayer.getLayers();
+	      for (var i in pointLayers) {
+	        pointLayers[i].unbindPopup();
+	      }
+	    }
+	  };
+
+	  this._addPointLayer = function (map) {
+	    if (this._pointLayer) {
+	      this._pointLayer.addTo(map);
+	      this._pointLayer.bringToFront();
+	    }
+	  };
+
+	  this._createPointLayer = function () {
+	    if (!this._pointLayer) {
+	      this._pointLayer = L.geoJson();
+	      // store the feature ids that have already been added to the map
+	      this._pointLayerIds = {};
+
+	      if (this._popup) {
+	        var popupFunction = function (feature, layer) {
+	          layer.bindPopup(this._popup(feature, layer), this._popupOptions);
+	        };
+	        this._pointLayer.options.onEachFeature = L.Util.bind(popupFunction, this);
+	      }
+	    }
+	  };
+
+	  this.createNewLayer = function (geojson) {
+	    var fLayer = L.GeoJSON.geometryToLayer(geojson, this.options);
+
+	    // add a point layer when the polygon is represented as proportional marker symbols
+	    if (this._hasProportionalSymbols) {
+	      var centroid = this.getPolygonCentroid(geojson.geometry.coordinates);
+	      if (!(isNaN(centroid[0]) || isNaN(centroid[0]))) {
+	        this._createPointLayer();
+
+	        var featureId = geojson.id.toString();
+	        // only add the feature if it does not already exist on the map
+	        if (!this._pointLayerIds[featureId]) {
+	          var pointjson = this.getPointJson(geojson, centroid);
+
+	          this._pointLayer.addData(pointjson);
+	          this._pointLayerIds[featureId] = true;
+	        }
+
+	        this._pointLayer.bringToFront();
+	      }
+	    }
+	    return fLayer;
+	  };
+
+	  this.getPolygonCentroid = function (coordinates) {
+	    var pts = coordinates[0][0];
+	    if (pts.length === 2) {
+	      pts = coordinates[0];
+	    }
+
+	    var twicearea = 0;
+	    var x = 0;
+	    var y = 0;
+	    var nPts = pts.length;
+	    var p1;
+	    var p2;
+	    var f;
+
+	    for (var i = 0, j = nPts - 1; i < nPts; j = i++) {
+	      p1 = pts[i]; p2 = pts[j];
+	      twicearea += p1[0] * p2[1];
+	      twicearea -= p1[1] * p2[0];
+	      f = p1[0] * p2[1] - p2[0] * p1[1];
+	      x += (p1[0] + p2[0]) * f;
+	      y += (p1[1] + p2[1]) * f;
+	    }
+	    f = twicearea * 3;
+	    return [x / f, y / f];
+	  };
+
+	  this.getPointJson = function (geojson, centroid) {
+	    return {
+	      type: 'Feature',
+	      properties: geojson.properties,
+	      id: geojson.id,
+	      geometry: {
+	        type: 'Point',
+	        coordinates: [centroid[0], centroid[1]]
+	      }
+	    };
+	  };
+
+	  this._checkForProportionalSymbols = function (geometryType, renderer) {
+	    this._hasProportionalSymbols = false;
+	    if (geometryType === 'esriGeometryPolygon') {
+	      if (renderer.backgroundFillSymbol) {
+	        this._hasProportionalSymbols = true;
+	      }
+	      // check to see if the first symbol in the classbreaks is a marker symbol
+	      if (renderer.classBreakInfos && renderer.classBreakInfos.length) {
+	        var sym = renderer.classBreakInfos[0].symbol;
+	        if (sym && (sym.type === 'esriSMS' || sym.type === 'esriPMS')) {
+	          this._hasProportionalSymbols = true;
+	        }
+	      }
+	    }
+	  };
+
+	  this._setRenderers = function (geojson) {
+	    var rend;
+	    var rendererInfo = geojson.drawingInfo.renderer;
+
+	    var options = {
+	      url: this.options.url
+	    };
+
+	    if (this.options.token) {
+	      options.token = this.options.token;
+	    }
+	    if (this.options.pane) {
+	      options.pane = this.options.pane;
+	    }
+	    if (geojson.drawingInfo.transparency) {
+	      options.layerTransparency = geojson.drawingInfo.transparency;
+	    }
+	    if (this.options.style) {
+	      options.userDefinedStyle = this.options.style;
+	    }
+
+	    switch (rendererInfo.type) {
+	      case 'classBreaks':
+	        this._checkForProportionalSymbols(geojson.geometryType, rendererInfo);
+	        if (this._hasProportionalSymbols) {
+	          this._createPointLayer();
+	          var pRend = classBreaksRenderer(rendererInfo, options);
+	          pRend.attachStylesToLayer(this._pointLayer);
+	          options.proportionalPolygon = true;
+	        }
+	        rend = classBreaksRenderer(rendererInfo, options);
+	        break;
+	      case 'uniqueValue':
+	        rend = uniqueValueRenderer(rendererInfo, options);
+	        break;
+	      default:
+	        rend = simpleRenderer(rendererInfo, options);
+	    }
+	    rend.attachStylesToLayer(this);
+	  };
+	});
+
+	exports.VERSION = version;
+	exports.Renderer = Renderer;
+	exports.SimpleRenderer = SimpleRenderer;
+	exports.simpleRenderer = simpleRenderer;
+	exports.ClassBreaksRenderer = ClassBreaksRenderer;
+	exports.classBreaksRenderer = classBreaksRenderer;
+	exports.UniqueValueRenderer = UniqueValueRenderer;
+	exports.uniqueValueRenderer = uniqueValueRenderer;
+	exports.Symbol = Symbol;
+	exports.PointSymbol = PointSymbol;
+	exports.pointSymbol = pointSymbol;
+	exports.LineSymbol = LineSymbol;
+	exports.lineSymbol = lineSymbol;
+	exports.PolygonSymbol = PolygonSymbol;
+	exports.polygonSymbol = polygonSymbol;
+
+}));
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LXJlbmRlcmVycy1kZWJ1Zy5qcyIsInNvdXJjZXMiOlsiLi4vcGFja2FnZS5qc29uIiwiLi4vc3JjL1N5bWJvbHMvU3ltYm9sLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xlYWZsZXQtc2hhcGUtbWFya2Vycy9zcmMvU2hhcGVNYXJrZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbGVhZmxldC1zaGFwZS1tYXJrZXJzL3NyYy9Dcm9zc01hcmtlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9sZWFmbGV0LXNoYXBlLW1hcmtlcnMvc3JjL1hNYXJrZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbGVhZmxldC1zaGFwZS1tYXJrZXJzL3NyYy9TcXVhcmVNYXJrZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbGVhZmxldC1zaGFwZS1tYXJrZXJzL3NyYy9EaWFtb25kTWFya2VyLmpzIiwiLi4vc3JjL1N5bWJvbHMvUG9pbnRTeW1ib2wuanMiLCIuLi9zcmMvU3ltYm9scy9MaW5lU3ltYm9sLmpzIiwiLi4vc3JjL1N5bWJvbHMvUG9seWdvblN5bWJvbC5qcyIsIi4uL3NyYy9SZW5kZXJlcnMvUmVuZGVyZXIuanMiLCIuLi9zcmMvUmVuZGVyZXJzL1NpbXBsZVJlbmRlcmVyLmpzIiwiLi4vc3JjL1JlbmRlcmVycy9DbGFzc0JyZWFrc1JlbmRlcmVyLmpzIiwiLi4vc3JjL1JlbmRlcmVycy9VbmlxdWVWYWx1ZVJlbmRlcmVyLmpzIiwiLi4vc3JjL0ZlYXR1cmVMYXllckhvb2suanMiXSwic291cmNlc0NvbnRlbnQiOlsie1xuICBcIm5hbWVcIjogXCJlc3JpLWxlYWZsZXQtcmVuZGVyZXJzXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJlc3JpLWxlYWZsZXQgcGx1Z2luIGZvciByZW5kZXJpbmdcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMi4wLjJcIixcbiAgXCJhdXRob3JcIjogXCJSYWNoZWwgTmVobWVyIDxybmVobWVyQGVzcmkuY29tPlwiLFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VzcmkvZXNyaS1sZWFmbGV0LXJlbmRlcmVycy9pc3N1ZXNcIlxuICB9LFxuICBcImNvbnRyaWJ1dG9yc1wiOiBbXG4gICAgXCJSYWNoZWwgTmVobWVyIDxybmVobWVyQGVzcmkuY29tPlwiLFxuICAgIFwiSm9obiBHcmF2b2lzIDxqZ3Jhdm9pc0Blc3JpLmNvbT5cIlxuICBdLFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgIFwiZXNyaS1sZWFmbGV0XCI6IFwiXjIuMC4wLWJldGEuOFwiLFxuICAgICBcImxlYWZsZXRcIjogXCJeMS4wLjAtYmV0YS4yXCIsXG4gICAgIFwibGVhZmxldC1zaGFwZS1tYXJrZXJzXCI6IFwiXjEuMC40XCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYmFiZWxpZnlcIjogXCJeNi4xLjNcIixcbiAgICBcImNoYWlcIjogXCIyLjMuMFwiLFxuICAgIFwiZ2gtcmVsZWFzZVwiOiBcIl4yLjAuMFwiLFxuICAgIFwiaHR0cC1zZXJ2ZXJcIjogXCJeMC44LjVcIixcbiAgICBcImlzcGFydGFcIjogXCJeMy4wLjNcIixcbiAgICBcImlzdGFuYnVsXCI6IFwiXjAuNC4yXCIsXG4gICAgXCJrYXJtYVwiOiBcIl4wLjEyLjI0XCIsXG4gICAgXCJrYXJtYS1jaGFpLXNpbm9uXCI6IFwiXjAuMS4zXCIsXG4gICAgXCJrYXJtYS1jb3ZlcmFnZVwiOiBcIl4wLjUuM1wiLFxuICAgIFwia2FybWEtbW9jaGFcIjogXCJeMC4xLjBcIixcbiAgICBcImthcm1hLW1vY2hhLXJlcG9ydGVyXCI6IFwiXjAuMi41XCIsXG4gICAgXCJrYXJtYS1waGFudG9tanMtbGF1bmNoZXJcIjogXCJeMC4xLjRcIixcbiAgICBcImthcm1hLXNvdXJjZW1hcC1sb2FkZXJcIjogXCJeMC4zLjVcIixcbiAgICBcIm1rZGlycFwiOiBcIl4wLjUuMVwiLFxuICAgIFwibW9jaGFcIjogXCJeMi4zLjRcIixcbiAgICBcInBoYW50b21qc1wiOiBcIl4xLjkuMTdcIixcbiAgICBcInJvbGx1cFwiOiBcIl4wLjI1LjRcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tanNvblwiOiBcIl4yLjAuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1ub2RlLXJlc29sdmVcIjogXCJeMS40LjBcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tdWdsaWZ5XCI6IFwiXjAuMi4wXCIsXG4gICAgXCJzZW1pc3RhbmRhcmRcIjogXCJeNy4wLjVcIixcbiAgICBcInNpbm9uXCI6IFwiXjEuMTEuMVwiLFxuICAgIFwic2lub24tY2hhaVwiOiBcIjIuNy4wXCIsXG4gICAgXCJ1Z2xpZnktanNcIjogXCJeMi40LjIzXCIsXG4gICAgXCJ3YXRjaFwiOiBcIl4wLjE3LjFcIlxuICB9LFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cDovL2VzcmkuZ2l0aHViLmlvL2VzcmktbGVhZmxldFwiLFxuICBcImpzbmV4dDptYWluXCI6IFwic3JjL0VzcmlMZWFmbGV0UmVuZGVyZXJzLmpzXCIsXG4gIFwianNwbVwiOiB7XG4gICAgXCJyZWdpc3RyeVwiOiBcIm5wbVwiLFxuICAgIFwiZm9ybWF0XCI6IFwiZXM2XCIsXG4gICAgXCJtYWluXCI6IFwic3JjL0VzcmlMZWFmbGV0UmVuZGVyZXJzLmpzXCJcbiAgfSxcbiAgXCJrZXl3b3Jkc1wiOiBbXG4gICAgXCJhcmNnaXNcIixcbiAgICBcImVzcmlcIixcbiAgICBcImVzcmkgbGVhZmxldFwiLFxuICAgIFwiZ2lzXCIsXG4gICAgXCJsZWFmbGV0IHBsdWdpblwiLFxuICAgIFwibWFwcGluZ1wiLFxuICAgIFwicmVuZGVyZXJzXCIsXG4gICAgXCJzeW1ib2xvZ3lcIlxuICBdLFxuICBcImxpY2Vuc2VcIjogXCJBcGFjaGUtMi4wXCIsXG4gIFwibWFpblwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LXJlbmRlcmVycy1kZWJ1Zy5qc1wiLFxuICBcImJyb3dzZXJcIjogXCJkaXN0L2VzcmktbGVhZmxldC1yZW5kZXJlcnMtZGVidWcuanNcIixcbiAgXCJyZWFkbWVGaWxlbmFtZVwiOiBcIlJFQURNRS5tZFwiLFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0QGdpdGh1Yi5jb206RXNyaS9lc3JpLWxlYWZsZXQtcmVuZGVyZXJzLmdpdFwiXG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG5cbiAgICBcInByZWJ1aWxkXCI6IFwibWtkaXJwIGRpc3RcIixcbiAgICBcImJ1aWxkXCI6IFwicm9sbHVwIC1jIHByb2ZpbGVzL2RlYnVnLmpzICYgcm9sbHVwIC1jIHByb2ZpbGVzL3Byb2R1Y3Rpb24uanNcIixcbiAgICBcImxpbnRcIjogXCJzZW1pc3RhbmRhcmQgc3JjLyoqLyouanNcIixcbiAgICBcInByZXB1Ymxpc2hcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJwcmV0ZXN0XCI6IFwibnBtIHJ1biBidWlsZFwiLFxuICAgIFwicmVsZWFzZVwiOiBcIi4vc2NyaXB0cy9yZWxlYXNlLnNoXCIsXG4gICAgXCJzdGFydFwiOiBcIndhdGNoICducG0gcnVuIGJ1aWxkJyBzcmMgJiBodHRwLXNlcnZlciAtcCA1MDAwIC1jLTEgLW9cIixcbiAgICBcInRlc3RcIjogXCJucG0gcnVuIGxpbnQgJiYgbnBtIHJ1biBidWlsZCAmJiBrYXJtYSBzdGFydFwiXG4gIH1cbn1cbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuXG5leHBvcnQgdmFyIFN5bWJvbCA9IEwuQ2xhc3MuZXh0ZW5kKHtcbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKHN5bWJvbEpzb24sIG9wdGlvbnMpIHtcbiAgICB0aGlzLl9zeW1ib2xKc29uID0gc3ltYm9sSnNvbjtcbiAgICB0aGlzLnZhbCA9IG51bGw7XG4gICAgdGhpcy5fc3R5bGVzID0ge307XG4gICAgdGhpcy5faXNEZWZhdWx0ID0gZmFsc2U7XG4gICAgdGhpcy5fbGF5ZXJUcmFuc3BhcmVuY3kgPSAxO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubGF5ZXJUcmFuc3BhcmVuY3kpIHtcbiAgICAgIHRoaXMuX2xheWVyVHJhbnNwYXJlbmN5ID0gMSAtIChvcHRpb25zLmxheWVyVHJhbnNwYXJlbmN5IC8gMTAwLjApO1xuICAgIH1cbiAgfSxcblxuICAvLyB0aGUgZ2VvanNvbiB2YWx1ZXMgcmV0dXJuZWQgYXJlIGluIHBvaW50c1xuICBwaXhlbFZhbHVlOiBmdW5jdGlvbiAocG9pbnRWYWx1ZSkge1xuICAgIHJldHVybiBwb2ludFZhbHVlICogMS4zMzM7XG4gIH0sXG5cbiAgLy8gY29sb3IgaXMgYW4gYXJyYXkgW3IsZyxiLGFdXG4gIGNvbG9yVmFsdWU6IGZ1bmN0aW9uIChjb2xvcikge1xuICAgIHJldHVybiAncmdiKCcgKyBjb2xvclswXSArICcsJyArIGNvbG9yWzFdICsgJywnICsgY29sb3JbMl0gKyAnKSc7XG4gIH0sXG5cbiAgYWxwaGFWYWx1ZTogZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgdmFyIGFscGhhID0gY29sb3JbM10gLyAyNTUuMDtcbiAgICByZXR1cm4gYWxwaGEgKiB0aGlzLl9sYXllclRyYW5zcGFyZW5jeTtcbiAgfSxcblxuICBnZXRTaXplOiBmdW5jdGlvbiAoZmVhdHVyZSwgc2l6ZUluZm8pIHtcbiAgICB2YXIgYXR0ciA9IGZlYXR1cmUucHJvcGVydGllcztcbiAgICB2YXIgZmllbGQgPSBzaXplSW5mby5maWVsZDtcbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgdmFyIGZlYXR1cmVWYWx1ZSA9IG51bGw7XG5cbiAgICBpZiAoZmllbGQpIHtcbiAgICAgIGZlYXR1cmVWYWx1ZSA9IGF0dHJbZmllbGRdO1xuICAgICAgdmFyIG1pblNpemUgPSBzaXplSW5mby5taW5TaXplO1xuICAgICAgdmFyIG1heFNpemUgPSBzaXplSW5mby5tYXhTaXplO1xuICAgICAgdmFyIG1pbkRhdGFWYWx1ZSA9IHNpemVJbmZvLm1pbkRhdGFWYWx1ZTtcbiAgICAgIHZhciBtYXhEYXRhVmFsdWUgPSBzaXplSW5mby5tYXhEYXRhVmFsdWU7XG4gICAgICB2YXIgZmVhdHVyZVJhdGlvO1xuICAgICAgdmFyIG5vcm1GaWVsZCA9IHNpemVJbmZvLm5vcm1hbGl6YXRpb25GaWVsZDtcbiAgICAgIHZhciBub3JtVmFsdWUgPSBhdHRyID8gcGFyc2VGbG9hdChhdHRyW25vcm1GaWVsZF0pIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoZmVhdHVyZVZhbHVlID09PSBudWxsIHx8IChub3JtRmllbGQgJiYgKChpc05hTihub3JtVmFsdWUpIHx8IG5vcm1WYWx1ZSA9PT0gMCkpKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihub3JtVmFsdWUpKSB7XG4gICAgICAgIGZlYXR1cmVWYWx1ZSAvPSBub3JtVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChtaW5TaXplICE9PSBudWxsICYmIG1heFNpemUgIT09IG51bGwgJiYgbWluRGF0YVZhbHVlICE9PSBudWxsICYmIG1heERhdGFWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoZmVhdHVyZVZhbHVlIDw9IG1pbkRhdGFWYWx1ZSkge1xuICAgICAgICAgIHNpemUgPSBtaW5TaXplO1xuICAgICAgICB9IGVsc2UgaWYgKGZlYXR1cmVWYWx1ZSA+PSBtYXhEYXRhVmFsdWUpIHtcbiAgICAgICAgICBzaXplID0gbWF4U2l6ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmZWF0dXJlUmF0aW8gPSAoZmVhdHVyZVZhbHVlIC0gbWluRGF0YVZhbHVlKSAvIChtYXhEYXRhVmFsdWUgLSBtaW5EYXRhVmFsdWUpO1xuICAgICAgICAgIHNpemUgPSBtaW5TaXplICsgKGZlYXR1cmVSYXRpbyAqIChtYXhTaXplIC0gbWluU2l6ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzaXplID0gaXNOYU4oc2l6ZSkgPyAwIDogc2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIHNpemU7XG4gIH0sXG5cbiAgZ2V0Q29sb3I6IGZ1bmN0aW9uIChmZWF0dXJlLCBjb2xvckluZm8pIHtcbiAgICAvLyByZXF1aXJlZCBpbmZvcm1hdGlvbiB0byBnZXQgY29sb3JcbiAgICBpZiAoIShmZWF0dXJlLnByb3BlcnRpZXMgJiYgY29sb3JJbmZvICYmIGNvbG9ySW5mby5maWVsZCAmJiBjb2xvckluZm8uc3RvcHMpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgYXR0ciA9IGZlYXR1cmUucHJvcGVydGllcztcbiAgICB2YXIgZmVhdHVyZVZhbHVlID0gYXR0cltjb2xvckluZm8uZmllbGRdO1xuICAgIHZhciBsb3dlckJvdW5kQ29sb3IsIHVwcGVyQm91bmRDb2xvciwgbG93ZXJCb3VuZCwgdXBwZXJCb3VuZDtcbiAgICB2YXIgbm9ybUZpZWxkID0gY29sb3JJbmZvLm5vcm1hbGl6YXRpb25GaWVsZDtcbiAgICB2YXIgbm9ybVZhbHVlID0gYXR0ciA/IHBhcnNlRmxvYXQoYXR0cltub3JtRmllbGRdKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoZmVhdHVyZVZhbHVlID09PSBudWxsIHx8IChub3JtRmllbGQgJiYgKChpc05hTihub3JtVmFsdWUpIHx8IG5vcm1WYWx1ZSA9PT0gMCkpKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTihub3JtVmFsdWUpKSB7XG4gICAgICBmZWF0dXJlVmFsdWUgLz0gbm9ybVZhbHVlO1xuICAgIH1cblxuICAgIGlmIChmZWF0dXJlVmFsdWUgPD0gY29sb3JJbmZvLnN0b3BzWzBdLnZhbHVlKSB7XG4gICAgICByZXR1cm4gY29sb3JJbmZvLnN0b3BzWzBdLmNvbG9yO1xuICAgIH1cbiAgICB2YXIgbGFzdFN0b3AgPSBjb2xvckluZm8uc3RvcHNbY29sb3JJbmZvLnN0b3BzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChmZWF0dXJlVmFsdWUgPj0gbGFzdFN0b3AudmFsdWUpIHtcbiAgICAgIHJldHVybiBsYXN0U3RvcC5jb2xvcjtcbiAgICB9XG5cbiAgICAvLyBnbyB0aHJvdWdoIHRoZSBzdG9wcyB0byBmaW5kIG1pbiBhbmQgbWF4XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xvckluZm8uc3RvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdG9wSW5mbyA9IGNvbG9ySW5mby5zdG9wc1tpXTtcblxuICAgICAgaWYgKHN0b3BJbmZvLnZhbHVlIDw9IGZlYXR1cmVWYWx1ZSkge1xuICAgICAgICBsb3dlckJvdW5kQ29sb3IgPSBzdG9wSW5mby5jb2xvcjtcbiAgICAgICAgbG93ZXJCb3VuZCA9IHN0b3BJbmZvLnZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChzdG9wSW5mby52YWx1ZSA+IGZlYXR1cmVWYWx1ZSkge1xuICAgICAgICB1cHBlckJvdW5kQ29sb3IgPSBzdG9wSW5mby5jb2xvcjtcbiAgICAgICAgdXBwZXJCb3VuZCA9IHN0b3BJbmZvLnZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmZWF0dXJlIGZhbGxzIGJldHdlZW4gdHdvIHN0b3BzLCBpbnRlcnBsYXRlIHRoZSBjb2xvcnNcbiAgICBpZiAoIWlzTmFOKGxvd2VyQm91bmQpICYmICFpc05hTih1cHBlckJvdW5kKSkge1xuICAgICAgdmFyIHJhbmdlID0gdXBwZXJCb3VuZCAtIGxvd2VyQm91bmQ7XG4gICAgICBpZiAocmFuZ2UgPiAwKSB7XG4gICAgICAgIC8vIG1vcmUgd2VpZ2h0IHRoZSBmdXJ0aGVyIGl0IGlzIGZyb20gdGhlIGxvd2VyIGJvdW5kXG4gICAgICAgIHZhciB1cHBlckJvdW5kQ29sb3JXZWlnaHQgPSAoZmVhdHVyZVZhbHVlIC0gbG93ZXJCb3VuZCkgLyByYW5nZTtcbiAgICAgICAgaWYgKHVwcGVyQm91bmRDb2xvcldlaWdodCkge1xuICAgICAgICAgIC8vIG1vcmUgd2VpZ2h0IHRoZSBmdXJ0aGVyIGl0IGlzIGZyb20gdGhlIHVwcGVyIGJvdW5kXG4gICAgICAgICAgdmFyIGxvd2VyQm91bmRDb2xvcldlaWdodCA9ICh1cHBlckJvdW5kIC0gZmVhdHVyZVZhbHVlKSAvIHJhbmdlO1xuICAgICAgICAgIGlmIChsb3dlckJvdW5kQ29sb3JXZWlnaHQpIHtcbiAgICAgICAgICAgIC8vIGludGVycG9sYXRlIHRoZSBsb3dlciBhbmQgdXBwZXIgYm91bmQgY29sb3IgYnkgYXBwbHlpbmcgdGhlXG4gICAgICAgICAgICAvLyB3ZWlnaHRzIHRvIGVhY2ggb2YgdGhlIHJnYmEgY29sb3JzIGFuZCBhZGRpbmcgdGhlbSB0b2dldGhlclxuICAgICAgICAgICAgdmFyIGludGVycG9sYXRlZENvbG9yID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgICBpbnRlcnBvbGF0ZWRDb2xvcltqXSA9IE1hdGgucm91bmQobG93ZXJCb3VuZENvbG9yW2pdICogbG93ZXJCb3VuZENvbG9yV2VpZ2h0ICsgdXBwZXJCb3VuZENvbG9yW2pdICogdXBwZXJCb3VuZENvbG9yV2VpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZWRDb2xvcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIGZlYXR1cmVWYWx1ZSBhbmQgdXBwZXJCb3VuZCwgMTAwJSBvZiB1cHBlckJvdW5kQ29sb3JcbiAgICAgICAgICAgIHJldHVybiB1cHBlckJvdW5kQ29sb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBmZWF0dXJlVmFsdWUgYW5kIGxvd2VyQm91bmQsIDEwMCUgb2YgbG93ZXJCb3VuZENvbG9yXG4gICAgICAgICAgcmV0dXJuIGxvd2VyQm91bmRDb2xvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBpZiB3ZSBnZXQgdG8gaGVyZSwgbm9uZSBvZiB0aGUgY2FzZXMgYXBwbHkgc28gcmV0dXJuIG51bGxcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufSk7XG5cbi8vIGV4cG9ydCBmdW5jdGlvbiBzeW1ib2wgKHN5bWJvbEpzb24pIHtcbi8vICAgcmV0dXJuIG5ldyBTeW1ib2woc3ltYm9sSnNvbik7XG4vLyB9XG5cbmV4cG9ydCBkZWZhdWx0IFN5bWJvbDtcbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuXG5leHBvcnQgdmFyIFNoYXBlTWFya2VyID0gTC5QYXRoLmV4dGVuZCh7XG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZywgc2l6ZSwgb3B0aW9ucykge1xuICAgIEwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLl9zaXplID0gc2l6ZTtcbiAgICB0aGlzLl9sYXRsbmcgPSBMLmxhdExuZyhsYXRsbmcpO1xuICAgIHRoaXMuX3N2Z0NhbnZhc0luY2x1ZGVzKCk7XG4gIH0sXG5cbiAgX3N2Z0NhbnZhc0luY2x1ZGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gaW1wbGVtZW50IGluIHN1YiBjbGFzc1xuICB9LFxuXG4gIF9wcm9qZWN0OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fcG9pbnQgPSB0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyk7XG4gIH0sXG5cbiAgX3VwZGF0ZTogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVBhdGgoKTtcbiAgICB9XG4gIH0sXG5cbiAgX3VwZGF0ZVBhdGg6IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBpbXBsZW1lbnQgaW4gc3ViIGNsYXNzXG4gIH0sXG5cbiAgc2V0TGF0TG5nOiBmdW5jdGlvbiAobGF0bG5nKSB7XG4gICAgdGhpcy5fbGF0bG5nID0gTC5sYXRMbmcobGF0bG5nKTtcbiAgICB0aGlzLnJlZHJhdygpO1xuICAgIHJldHVybiB0aGlzLmZpcmUoJ21vdmUnLCB7bGF0bG5nOiB0aGlzLl9sYXRsbmd9KTtcbiAgfSxcblxuICBnZXRMYXRMbmc6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGF0bG5nO1xuICB9LFxuXG4gIHNldFNpemU6IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgdGhpcy5fc2l6ZSA9IHNpemU7XG4gICAgcmV0dXJuIHRoaXMucmVkcmF3KCk7XG4gIH0sXG5cbiAgZ2V0U2l6ZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG59KTtcbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgU2hhcGVNYXJrZXIgfSBmcm9tICcuL1NoYXBlTWFya2VyJztcblxuZXhwb3J0IHZhciBDcm9zc01hcmtlciA9IFNoYXBlTWFya2VyLmV4dGVuZCh7XG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZywgc2l6ZSwgb3B0aW9ucykge1xuICAgIFNoYXBlTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbGF0bG5nLCBzaXplLCBvcHRpb25zKTtcbiAgfSxcblxuICBfdXBkYXRlUGF0aDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3JlbmRlcmVyLl91cGRhdGVDcm9zc01hcmtlcih0aGlzKTtcbiAgfSxcblxuICBfc3ZnQ2FudmFzSW5jbHVkZXM6IGZ1bmN0aW9uICgpIHtcbiAgICBMLkNhbnZhcy5pbmNsdWRlKHtcbiAgICAgIF91cGRhdGVDcm9zc01hcmtlcjogZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICAgIHZhciBsYXRsbmcgPSBsYXllci5fcG9pbnQ7XG4gICAgICAgIHZhciBvZmZzZXQgPSBsYXllci5fc2l6ZSAvIDIuMDtcbiAgICAgICAgdmFyIGN0eCA9IHRoaXMuX2N0eDtcblxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5tb3ZlVG8obGF0bG5nLngsIGxhdGxuZy55ICsgb2Zmc2V0KTtcbiAgICAgICAgY3R4LmxpbmVUbyhsYXRsbmcueCwgbGF0bG5nLnkgLSBvZmZzZXQpO1xuICAgICAgICB0aGlzLl9maWxsU3Ryb2tlKGN0eCwgbGF5ZXIpO1xuXG4gICAgICAgIGN0eC5tb3ZlVG8obGF0bG5nLnggLSBvZmZzZXQsIGxhdGxuZy55KTtcbiAgICAgICAgY3R4LmxpbmVUbyhsYXRsbmcueCArIG9mZnNldCwgbGF0bG5nLnkpO1xuICAgICAgICB0aGlzLl9maWxsU3Ryb2tlKGN0eCwgbGF5ZXIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgTC5TVkcuaW5jbHVkZSh7XG4gICAgICBfdXBkYXRlQ3Jvc3NNYXJrZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICB2YXIgbGF0bG5nID0gbGF5ZXIuX3BvaW50O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGF5ZXIuX3NpemUgLyAyLjA7XG5cbiAgICAgICAgaWYgKEwuQnJvd3Nlci52bWwpIHtcbiAgICAgICAgICBsYXRsbmcuX3JvdW5kKCk7XG4gICAgICAgICAgb2Zmc2V0ID0gTWF0aC5yb3VuZChvZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0ciA9ICdNJyArIGxhdGxuZy54ICsgJywnICsgKGxhdGxuZy55ICsgb2Zmc2V0KSArXG4gICAgICAgICAgJ0wnICsgbGF0bG5nLnggKyAnLCcgKyAobGF0bG5nLnkgLSBvZmZzZXQpICtcbiAgICAgICAgICAnTScgKyAobGF0bG5nLnggLSBvZmZzZXQpICsgJywnICsgbGF0bG5nLnkgK1xuICAgICAgICAgICdMJyArIChsYXRsbmcueCArIG9mZnNldCkgKyAnLCcgKyBsYXRsbmcueTtcblxuICAgICAgICB0aGlzLl9zZXRQYXRoKGxheWVyLCBzdHIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59KTtcblxuZXhwb3J0IHZhciBjcm9zc01hcmtlciA9IGZ1bmN0aW9uIChsYXRsbmcsIHNpemUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBDcm9zc01hcmtlcihsYXRsbmcsIHNpemUsIG9wdGlvbnMpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY3Jvc3NNYXJrZXI7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFNoYXBlTWFya2VyIH0gZnJvbSAnLi9TaGFwZU1hcmtlcic7XG5cbmV4cG9ydCB2YXIgWE1hcmtlciA9IFNoYXBlTWFya2VyLmV4dGVuZCh7XG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZywgc2l6ZSwgb3B0aW9ucykge1xuICAgIFNoYXBlTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbGF0bG5nLCBzaXplLCBvcHRpb25zKTtcbiAgfSxcblxuICBfdXBkYXRlUGF0aDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3JlbmRlcmVyLl91cGRhdGVYTWFya2VyKHRoaXMpO1xuICB9LFxuXG4gIF9zdmdDYW52YXNJbmNsdWRlczogZnVuY3Rpb24gKCkge1xuICAgIEwuQ2FudmFzLmluY2x1ZGUoe1xuICAgICAgX3VwZGF0ZVhNYXJrZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICB2YXIgbGF0bG5nID0gbGF5ZXIuX3BvaW50O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGF5ZXIuX3NpemUgLyAyLjA7XG4gICAgICAgIHZhciBjdHggPSB0aGlzLl9jdHg7XG5cbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuXG4gICAgICAgIGN0eC5tb3ZlVG8obGF0bG5nLnggKyBvZmZzZXQsIGxhdGxuZy55ICsgb2Zmc2V0KTtcbiAgICAgICAgY3R4LmxpbmVUbyhsYXRsbmcueCAtIG9mZnNldCwgbGF0bG5nLnkgLSBvZmZzZXQpO1xuICAgICAgICB0aGlzLl9maWxsU3Ryb2tlKGN0eCwgbGF5ZXIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgTC5TVkcuaW5jbHVkZSh7XG4gICAgICBfdXBkYXRlWE1hcmtlcjogZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICAgIHZhciBsYXRsbmcgPSBsYXllci5fcG9pbnQ7XG4gICAgICAgIHZhciBvZmZzZXQgPSBsYXllci5fc2l6ZSAvIDIuMDtcblxuICAgICAgICBpZiAoTC5Ccm93c2VyLnZtbCkge1xuICAgICAgICAgIGxhdGxuZy5fcm91bmQoKTtcbiAgICAgICAgICBvZmZzZXQgPSBNYXRoLnJvdW5kKG9mZnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RyID0gJ00nICsgKGxhdGxuZy54ICsgb2Zmc2V0KSArICcsJyArIChsYXRsbmcueSArIG9mZnNldCkgK1xuICAgICAgICAgICdMJyArIChsYXRsbmcueCAtIG9mZnNldCkgKyAnLCcgKyAobGF0bG5nLnkgLSBvZmZzZXQpICtcbiAgICAgICAgICAnTScgKyAobGF0bG5nLnggLSBvZmZzZXQpICsgJywnICsgKGxhdGxuZy55ICsgb2Zmc2V0KSArXG4gICAgICAgICAgJ0wnICsgKGxhdGxuZy54ICsgb2Zmc2V0KSArICcsJyArIChsYXRsbmcueSAtIG9mZnNldCk7XG5cbiAgICAgICAgdGhpcy5fc2V0UGF0aChsYXllciwgc3RyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSk7XG5cbmV4cG9ydCB2YXIgeE1hcmtlciA9IGZ1bmN0aW9uIChsYXRsbmcsIHNpemUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBYTWFya2VyKGxhdGxuZywgc2l6ZSwgb3B0aW9ucyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCB4TWFya2VyO1xuIiwiaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBTaGFwZU1hcmtlciB9IGZyb20gJy4vU2hhcGVNYXJrZXInO1xuXG5leHBvcnQgdmFyIFNxdWFyZU1hcmtlciA9IFNoYXBlTWFya2VyLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBmaWxsOiB0cnVlXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZywgc2l6ZSwgb3B0aW9ucykge1xuICAgIFNoYXBlTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbGF0bG5nLCBzaXplLCBvcHRpb25zKTtcbiAgfSxcblxuICBfdXBkYXRlUGF0aDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3JlbmRlcmVyLl91cGRhdGVTcXVhcmVNYXJrZXIodGhpcyk7XG4gIH0sXG5cbiAgX3N2Z0NhbnZhc0luY2x1ZGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgTC5DYW52YXMuaW5jbHVkZSh7XG4gICAgICBfdXBkYXRlU3F1YXJlTWFya2VyOiBmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICAgICAgdmFyIGxhdGxuZyA9IGxheWVyLl9wb2ludDtcbiAgICAgICAgdmFyIG9mZnNldCA9IGxheWVyLl9zaXplIC8gMi4wO1xuICAgICAgICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuXG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcblxuICAgICAgICBjdHgubW92ZVRvKGxhdGxuZy54ICsgb2Zmc2V0LCBsYXRsbmcueSArIG9mZnNldCk7XG4gICAgICAgIGN0eC5saW5lVG8obGF0bG5nLnggLSBvZmZzZXQsIGxhdGxuZy55ICsgb2Zmc2V0KTtcbiAgICAgICAgY3R4LmxpbmVUbyhsYXRsbmcueCAtIG9mZnNldCwgbGF0bG5nLnkgLSBvZmZzZXQpO1xuICAgICAgICBjdHgubGluZVRvKGxhdGxuZy54ICsgb2Zmc2V0LCBsYXRsbmcueSAtIG9mZnNldCk7XG5cbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuXG4gICAgICAgIHRoaXMuX2ZpbGxTdHJva2UoY3R4LCBsYXllcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBMLlNWRy5pbmNsdWRlKHtcbiAgICAgIF91cGRhdGVTcXVhcmVNYXJrZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICB2YXIgbGF0bG5nID0gbGF5ZXIuX3BvaW50O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGF5ZXIuX3NpemUgLyAyLjA7XG5cbiAgICAgICAgaWYgKEwuQnJvd3Nlci52bWwpIHtcbiAgICAgICAgICBsYXRsbmcuX3JvdW5kKCk7XG4gICAgICAgICAgb2Zmc2V0ID0gTWF0aC5yb3VuZChvZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0ciA9ICdNJyArIChsYXRsbmcueCArIG9mZnNldCkgKyAnLCcgKyAobGF0bG5nLnkgKyBvZmZzZXQpICtcbiAgICAgICAgICAnTCcgKyAobGF0bG5nLnggLSBvZmZzZXQpICsgJywnICsgKGxhdGxuZy55ICsgb2Zmc2V0KSArXG4gICAgICAgICAgJ0wnICsgKGxhdGxuZy54IC0gb2Zmc2V0KSArICcsJyArIChsYXRsbmcueSAtIG9mZnNldCkgK1xuICAgICAgICAgICdMJyArIChsYXRsbmcueCArIG9mZnNldCkgKyAnLCcgKyAobGF0bG5nLnkgLSBvZmZzZXQpO1xuXG4gICAgICAgIHN0ciA9IHN0ciArIChMLkJyb3dzZXIuc3ZnID8gJ3onIDogJ3gnKTtcblxuICAgICAgICB0aGlzLl9zZXRQYXRoKGxheWVyLCBzdHIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59KTtcblxuZXhwb3J0IHZhciBzcXVhcmVNYXJrZXIgPSBmdW5jdGlvbiAobGF0bG5nLCBzaXplLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgU3F1YXJlTWFya2VyKGxhdGxuZywgc2l6ZSwgb3B0aW9ucyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBzcXVhcmVNYXJrZXI7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFNoYXBlTWFya2VyIH0gZnJvbSAnLi9TaGFwZU1hcmtlcic7XG5cbmV4cG9ydCB2YXIgRGlhbW9uZE1hcmtlciA9IFNoYXBlTWFya2VyLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBmaWxsOiB0cnVlXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZywgc2l6ZSwgb3B0aW9ucykge1xuICAgIFNoYXBlTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbGF0bG5nLCBzaXplLCBvcHRpb25zKTtcbiAgfSxcblxuICBfdXBkYXRlUGF0aDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3JlbmRlcmVyLl91cGRhdGVEaWFtb25kTWFya2VyKHRoaXMpO1xuICB9LFxuXG4gIF9zdmdDYW52YXNJbmNsdWRlczogZnVuY3Rpb24gKCkge1xuICAgIEwuQ2FudmFzLmluY2x1ZGUoe1xuICAgICAgX3VwZGF0ZURpYW1vbmRNYXJrZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICB2YXIgbGF0bG5nID0gbGF5ZXIuX3BvaW50O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGF5ZXIuX3NpemUgLyAyLjA7XG4gICAgICAgIHZhciBjdHggPSB0aGlzLl9jdHg7XG5cbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuXG4gICAgICAgIGN0eC5tb3ZlVG8obGF0bG5nLngsIGxhdGxuZy55ICsgb2Zmc2V0KTtcbiAgICAgICAgY3R4LmxpbmVUbyhsYXRsbmcueCAtIG9mZnNldCwgbGF0bG5nLnkpO1xuICAgICAgICBjdHgubGluZVRvKGxhdGxuZy54LCBsYXRsbmcueSAtIG9mZnNldCk7XG4gICAgICAgIGN0eC5saW5lVG8obGF0bG5nLnggKyBvZmZzZXQsIGxhdGxuZy55KTtcblxuICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG5cbiAgICAgICAgdGhpcy5fZmlsbFN0cm9rZShjdHgsIGxheWVyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIEwuU1ZHLmluY2x1ZGUoe1xuICAgICAgX3VwZGF0ZURpYW1vbmRNYXJrZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICB2YXIgbGF0bG5nID0gbGF5ZXIuX3BvaW50O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGF5ZXIuX3NpemUgLyAyLjA7XG5cbiAgICAgICAgaWYgKEwuQnJvd3Nlci52bWwpIHtcbiAgICAgICAgICBsYXRsbmcuX3JvdW5kKCk7XG4gICAgICAgICAgb2Zmc2V0ID0gTWF0aC5yb3VuZChvZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0ciA9ICdNJyArIGxhdGxuZy54ICsgJywnICsgKGxhdGxuZy55ICsgb2Zmc2V0KSArXG4gICAgICAgICAgJ0wnICsgKGxhdGxuZy54IC0gb2Zmc2V0KSArICcsJyArIGxhdGxuZy55ICtcbiAgICAgICAgICAnTCcgKyBsYXRsbmcueCArICcsJyArIChsYXRsbmcueSAtIG9mZnNldCkgK1xuICAgICAgICAgICdMJyArIChsYXRsbmcueCArIG9mZnNldCkgKyAnLCcgKyBsYXRsbmcueTtcblxuICAgICAgICBzdHIgPSBzdHIgKyAoTC5Ccm93c2VyLnN2ZyA/ICd6JyA6ICd4Jyk7XG5cbiAgICAgICAgdGhpcy5fc2V0UGF0aChsYXllciwgc3RyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSk7XG5cbmV4cG9ydCB2YXIgZGlhbW9uZE1hcmtlciA9IGZ1bmN0aW9uIChsYXRsbmcsIHNpemUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBEaWFtb25kTWFya2VyKGxhdGxuZywgc2l6ZSwgb3B0aW9ucyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBkaWFtb25kTWFya2VyO1xuIiwiaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgU3ltYm9sIGZyb20gJy4vU3ltYm9sJztcbmltcG9ydCB7c3F1YXJlTWFya2VyLCB4TWFya2VyLCBjcm9zc01hcmtlciwgZGlhbW9uZE1hcmtlcn0gZnJvbSAnbGVhZmxldC1zaGFwZS1tYXJrZXJzJztcblxuZXhwb3J0IHZhciBQb2ludFN5bWJvbCA9IFN5bWJvbC5leHRlbmQoe1xuXG4gIHN0YXRpY3M6IHtcbiAgICBNQVJLRVJUWVBFUzogWydlc3JpU01TQ2lyY2xlJywgJ2VzcmlTTVNDcm9zcycsICdlc3JpU01TRGlhbW9uZCcsICdlc3JpU01TU3F1YXJlJywgJ2VzcmlTTVNYJywgJ2VzcmlQTVMnXVxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChzeW1ib2xKc29uLCBvcHRpb25zKSB7XG4gICAgU3ltYm9sLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgc3ltYm9sSnNvbiwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuc2VydmljZVVybCA9IG9wdGlvbnMudXJsO1xuICAgIH1cbiAgICBpZiAoc3ltYm9sSnNvbikge1xuICAgICAgaWYgKHN5bWJvbEpzb24udHlwZSA9PT0gJ2VzcmlQTVMnKSB7XG4gICAgICAgIHZhciB1cmwgPSB0aGlzLnNlcnZpY2VVcmwgKyAnaW1hZ2VzLycgKyB0aGlzLl9zeW1ib2xKc29uLnVybDtcbiAgICAgICAgdGhpcy5faWNvblVybCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50b2tlbiA/IHVybCArICc/dG9rZW49JyArIG9wdGlvbnMudG9rZW4gOiB1cmw7XG4gICAgICAgIC8vIGxlYWZsZXQgZG9lcyBub3QgYWxsb3cgcmVzaXppbmcgaWNvbnMgc28ga2VlcCBhIGhhc2ggb2YgZGlmZmVyZW50XG4gICAgICAgIC8vIGljb24gc2l6ZXMgdG8gdHJ5IGFuZCBrZWVwIGRvd24gb24gdGhlIG51bWJlciBvZiBpY29ucyBjcmVhdGVkXG4gICAgICAgIHRoaXMuX2ljb25zID0ge307XG4gICAgICAgIC8vIGNyZWF0ZSBiYXNlIGljb25cbiAgICAgICAgdGhpcy5pY29uID0gdGhpcy5fY3JlYXRlSWNvbih0aGlzLl9zeW1ib2xKc29uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2ZpbGxTdHlsZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgX2ZpbGxTdHlsZXM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fc3ltYm9sSnNvbi5vdXRsaW5lICYmIHRoaXMuX3N5bWJvbEpzb24uc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMuX3N0eWxlcy5zdHJva2UgPSB0cnVlO1xuICAgICAgdGhpcy5fc3R5bGVzLndlaWdodCA9IHRoaXMucGl4ZWxWYWx1ZSh0aGlzLl9zeW1ib2xKc29uLm91dGxpbmUud2lkdGgpO1xuICAgICAgdGhpcy5fc3R5bGVzLmNvbG9yID0gdGhpcy5jb2xvclZhbHVlKHRoaXMuX3N5bWJvbEpzb24ub3V0bGluZS5jb2xvcik7XG4gICAgICB0aGlzLl9zdHlsZXMub3BhY2l0eSA9IHRoaXMuYWxwaGFWYWx1ZSh0aGlzLl9zeW1ib2xKc29uLm91dGxpbmUuY29sb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdHlsZXMuc3Ryb2tlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zeW1ib2xKc29uLmNvbG9yKSB7XG4gICAgICB0aGlzLl9zdHlsZXMuZmlsbENvbG9yID0gdGhpcy5jb2xvclZhbHVlKHRoaXMuX3N5bWJvbEpzb24uY29sb3IpO1xuICAgICAgdGhpcy5fc3R5bGVzLmZpbGxPcGFjaXR5ID0gdGhpcy5hbHBoYVZhbHVlKHRoaXMuX3N5bWJvbEpzb24uY29sb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdHlsZXMuZmlsbE9wYWNpdHkgPSAwO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zeW1ib2xKc29uLnN0eWxlID09PSAnZXNyaVNNU0NpcmNsZScpIHtcbiAgICAgIHRoaXMuX3N0eWxlcy5yYWRpdXMgPSB0aGlzLnBpeGVsVmFsdWUodGhpcy5fc3ltYm9sSnNvbi5zaXplKSAvIDIuMDtcbiAgICB9XG4gIH0sXG5cbiAgX2NyZWF0ZUljb246IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHdpZHRoID0gdGhpcy5waXhlbFZhbHVlKG9wdGlvbnMud2lkdGgpO1xuICAgIHZhciBoZWlnaHQgPSB3aWR0aDtcbiAgICBpZiAob3B0aW9ucy5oZWlnaHQpIHtcbiAgICAgIGhlaWdodCA9IHRoaXMucGl4ZWxWYWx1ZShvcHRpb25zLmhlaWdodCk7XG4gICAgfVxuICAgIHZhciB4T2Zmc2V0ID0gd2lkdGggLyAyLjA7XG4gICAgdmFyIHlPZmZzZXQgPSBoZWlnaHQgLyAyLjA7XG5cbiAgICBpZiAob3B0aW9ucy54b2Zmc2V0KSB7XG4gICAgICB4T2Zmc2V0ICs9IHRoaXMucGl4ZWxWYWx1ZShvcHRpb25zLnhvZmZzZXQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy55b2Zmc2V0KSB7XG4gICAgICB5T2Zmc2V0ICs9IHRoaXMucGl4ZWxWYWx1ZShvcHRpb25zLnlvZmZzZXQpO1xuICAgIH1cblxuICAgIHZhciBpY29uID0gTC5pY29uKHtcbiAgICAgIGljb25Vcmw6IHRoaXMuX2ljb25VcmwsXG4gICAgICBpY29uU2l6ZTogW3dpZHRoLCBoZWlnaHRdLFxuICAgICAgaWNvbkFuY2hvcjogW3hPZmZzZXQsIHlPZmZzZXRdXG4gICAgfSk7XG4gICAgdGhpcy5faWNvbnNbb3B0aW9ucy53aWR0aC50b1N0cmluZygpXSA9IGljb247XG4gICAgcmV0dXJuIGljb247XG4gIH0sXG5cbiAgX2dldEljb246IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgLy8gY2hlY2sgdG8gc2VlIGlmIGl0IGlzIGFscmVhZHkgY3JlYXRlZCBieSBzaXplXG4gICAgdmFyIGljb24gPSB0aGlzLl9pY29uc1tzaXplLnRvU3RyaW5nKCldO1xuICAgIGlmICghaWNvbikge1xuICAgICAgaWNvbiA9IHRoaXMuX2NyZWF0ZUljb24oe3dpZHRoOiBzaXplfSk7XG4gICAgfVxuICAgIHJldHVybiBpY29uO1xuICB9LFxuXG4gIHBvaW50VG9MYXllcjogZnVuY3Rpb24gKGdlb2pzb24sIGxhdGxuZywgdmlzdWFsVmFyaWFibGVzLCBvcHRpb25zKSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLl9zeW1ib2xKc29uLnNpemUgfHwgdGhpcy5fc3ltYm9sSnNvbi53aWR0aDtcbiAgICBpZiAoIXRoaXMuX2lzRGVmYXVsdCkge1xuICAgICAgaWYgKHZpc3VhbFZhcmlhYmxlcy5zaXplSW5mbykge1xuICAgICAgICB2YXIgY2FsY3VsYXRlZFNpemUgPSB0aGlzLmdldFNpemUoZ2VvanNvbiwgdmlzdWFsVmFyaWFibGVzLnNpemVJbmZvKTtcbiAgICAgICAgaWYgKGNhbGN1bGF0ZWRTaXplKSB7XG4gICAgICAgICAgc2l6ZSA9IGNhbGN1bGF0ZWRTaXplO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodmlzdWFsVmFyaWFibGVzLmNvbG9ySW5mbykge1xuICAgICAgICB2YXIgY29sb3IgPSB0aGlzLmdldENvbG9yKGdlb2pzb24sIHZpc3VhbFZhcmlhYmxlcy5jb2xvckluZm8pO1xuICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICB0aGlzLl9zdHlsZXMuZmlsbENvbG9yID0gdGhpcy5jb2xvclZhbHVlKGNvbG9yKTtcbiAgICAgICAgICB0aGlzLl9zdHlsZXMuZmlsbE9wYWNpdHkgPSB0aGlzLmFscGhhVmFsdWUoY29sb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3N5bWJvbEpzb24udHlwZSA9PT0gJ2VzcmlQTVMnKSB7XG4gICAgICB2YXIgbGF5ZXJPcHRpb25zID0gTC5leHRlbmQoe30sIHtpY29uOiB0aGlzLl9nZXRJY29uKHNpemUpfSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gTC5tYXJrZXIobGF0bG5nLCBsYXllck9wdGlvbnMpO1xuICAgIH1cbiAgICBzaXplID0gdGhpcy5waXhlbFZhbHVlKHNpemUpO1xuXG4gICAgc3dpdGNoICh0aGlzLl9zeW1ib2xKc29uLnN0eWxlKSB7XG4gICAgICBjYXNlICdlc3JpU01TU3F1YXJlJzpcbiAgICAgICAgcmV0dXJuIHNxdWFyZU1hcmtlcihsYXRsbmcsIHNpemUsIEwuZXh0ZW5kKHt9LCB0aGlzLl9zdHlsZXMsIG9wdGlvbnMpKTtcbiAgICAgIGNhc2UgJ2VzcmlTTVNEaWFtb25kJzpcbiAgICAgICAgcmV0dXJuIGRpYW1vbmRNYXJrZXIobGF0bG5nLCBzaXplLCBMLmV4dGVuZCh7fSwgdGhpcy5fc3R5bGVzLCBvcHRpb25zKSk7XG4gICAgICBjYXNlICdlc3JpU01TQ3Jvc3MnOlxuICAgICAgICByZXR1cm4gY3Jvc3NNYXJrZXIobGF0bG5nLCBzaXplLCBMLmV4dGVuZCh7fSwgdGhpcy5fc3R5bGVzLCBvcHRpb25zKSk7XG4gICAgICBjYXNlICdlc3JpU01TWCc6XG4gICAgICAgIHJldHVybiB4TWFya2VyKGxhdGxuZywgc2l6ZSwgTC5leHRlbmQoe30sIHRoaXMuX3N0eWxlcywgb3B0aW9ucykpO1xuICAgIH1cbiAgICB0aGlzLl9zdHlsZXMucmFkaXVzID0gc2l6ZSAvIDIuMDtcbiAgICByZXR1cm4gTC5jaXJjbGVNYXJrZXIobGF0bG5nLCBMLmV4dGVuZCh7fSwgdGhpcy5fc3R5bGVzLCBvcHRpb25zKSk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRTeW1ib2wgKHN5bWJvbEpzb24sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBQb2ludFN5bWJvbChzeW1ib2xKc29uLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcG9pbnRTeW1ib2w7XG4iLCJpbXBvcnQgU3ltYm9sIGZyb20gJy4vU3ltYm9sJztcblxuZXhwb3J0IHZhciBMaW5lU3ltYm9sID0gU3ltYm9sLmV4dGVuZCh7XG4gIHN0YXRpY3M6IHtcbiAgICAvLyBOb3QgaW1wbGVtZW50ZWQgJ2VzcmlTTFNOdWxsJ1xuICAgIExJTkVUWVBFUzogWydlc3JpU0xTRGFzaCcsICdlc3JpU0xTRG90JywgJ2VzcmlTTFNEYXNoRG90RG90JywgJ2VzcmlTTFNEYXNoRG90JywgJ2VzcmlTTFNTb2xpZCddXG4gIH0sXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChzeW1ib2xKc29uLCBvcHRpb25zKSB7XG4gICAgU3ltYm9sLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgc3ltYm9sSnNvbiwgb3B0aW9ucyk7XG4gICAgdGhpcy5fZmlsbFN0eWxlcygpO1xuICB9LFxuXG4gIF9maWxsU3R5bGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gc2V0IHRoZSBkZWZhdWx0cyB0aGF0IHNob3cgdXAgb24gYXJjZ2lzIG9ubGluZVxuICAgIHRoaXMuX3N0eWxlcy5saW5lQ2FwID0gJ2J1dHQnO1xuICAgIHRoaXMuX3N0eWxlcy5saW5lSm9pbiA9ICdtaXRlcic7XG4gICAgdGhpcy5fc3R5bGVzLmZpbGwgPSBmYWxzZTtcbiAgICB0aGlzLl9zdHlsZXMud2VpZ2h0ID0gMDtcblxuICAgIGlmICghdGhpcy5fc3ltYm9sSnNvbikge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc3ltYm9sSnNvbi5jb2xvcikge1xuICAgICAgdGhpcy5fc3R5bGVzLmNvbG9yID0gdGhpcy5jb2xvclZhbHVlKHRoaXMuX3N5bWJvbEpzb24uY29sb3IpO1xuICAgICAgdGhpcy5fc3R5bGVzLm9wYWNpdHkgPSB0aGlzLmFscGhhVmFsdWUodGhpcy5fc3ltYm9sSnNvbi5jb2xvcik7XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTih0aGlzLl9zeW1ib2xKc29uLndpZHRoKSkge1xuICAgICAgdGhpcy5fc3R5bGVzLndlaWdodCA9IHRoaXMucGl4ZWxWYWx1ZSh0aGlzLl9zeW1ib2xKc29uLndpZHRoKTtcblxuICAgICAgdmFyIGRhc2hWYWx1ZXMgPSBbXTtcblxuICAgICAgc3dpdGNoICh0aGlzLl9zeW1ib2xKc29uLnN0eWxlKSB7XG4gICAgICAgIGNhc2UgJ2VzcmlTTFNEYXNoJzpcbiAgICAgICAgICBkYXNoVmFsdWVzID0gWzQsIDNdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlc3JpU0xTRG90JzpcbiAgICAgICAgICBkYXNoVmFsdWVzID0gWzEsIDNdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlc3JpU0xTRGFzaERvdCc6XG4gICAgICAgICAgZGFzaFZhbHVlcyA9IFs4LCAzLCAxLCAzXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZXNyaVNMU0Rhc2hEb3REb3QnOlxuICAgICAgICAgIGRhc2hWYWx1ZXMgPSBbOCwgMywgMSwgMywgMSwgM107XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIHVzZSB0aGUgZGFzaCB2YWx1ZXMgYW5kIHRoZSBsaW5lIHdlaWdodCB0byBzZXQgZGFzaCBhcnJheVxuICAgICAgaWYgKGRhc2hWYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhc2hWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBkYXNoVmFsdWVzW2ldICo9IHRoaXMuX3N0eWxlcy53ZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zdHlsZXMuZGFzaEFycmF5ID0gZGFzaFZhbHVlcy5qb2luKCcsJyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHN0eWxlOiBmdW5jdGlvbiAoZmVhdHVyZSwgdmlzdWFsVmFyaWFibGVzKSB7XG4gICAgaWYgKCF0aGlzLl9pc0RlZmF1bHQgJiYgdmlzdWFsVmFyaWFibGVzKSB7XG4gICAgICBpZiAodmlzdWFsVmFyaWFibGVzLnNpemVJbmZvKSB7XG4gICAgICAgIHZhciBjYWxjdWxhdGVkU2l6ZSA9IHRoaXMucGl4ZWxWYWx1ZSh0aGlzLmdldFNpemUoZmVhdHVyZSwgdmlzdWFsVmFyaWFibGVzLnNpemVJbmZvKSk7XG4gICAgICAgIGlmIChjYWxjdWxhdGVkU2l6ZSkge1xuICAgICAgICAgIHRoaXMuX3N0eWxlcy53ZWlnaHQgPSBjYWxjdWxhdGVkU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHZpc3VhbFZhcmlhYmxlcy5jb2xvckluZm8pIHtcbiAgICAgICAgdmFyIGNvbG9yID0gdGhpcy5nZXRDb2xvcihmZWF0dXJlLCB2aXN1YWxWYXJpYWJsZXMuY29sb3JJbmZvKTtcbiAgICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgICAgdGhpcy5fc3R5bGVzLmNvbG9yID0gdGhpcy5jb2xvclZhbHVlKGNvbG9yKTtcbiAgICAgICAgICB0aGlzLl9zdHlsZXMub3BhY2l0eSA9IHRoaXMuYWxwaGFWYWx1ZShjb2xvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0eWxlcztcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5lU3ltYm9sIChzeW1ib2xKc29uLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgTGluZVN5bWJvbChzeW1ib2xKc29uLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGluZVN5bWJvbDtcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9TeW1ib2wnO1xuaW1wb3J0IGxpbmVTeW1ib2wgZnJvbSAnLi9MaW5lU3ltYm9sJztcblxuZXhwb3J0IHZhciBQb2x5Z29uU3ltYm9sID0gU3ltYm9sLmV4dGVuZCh7XG4gIHN0YXRpY3M6IHtcbiAgICAvLyBub3QgaW1wbGVtZW50ZWQ6ICdlc3JpU0ZTQmFja3dhcmREaWFnb25hbCcsJ2VzcmlTRlNDcm9zcycsJ2VzcmlTRlNEaWFnb25hbENyb3NzJywnZXNyaVNGU0ZvcndhcmREaWFnb25hbCcsJ2VzcmlTRlNIb3Jpem9udGFsJywnZXNyaVNGU051bGwnLCdlc3JpU0ZTVmVydGljYWwnXG4gICAgUE9MWUdPTlRZUEVTOiBbJ2VzcmlTRlNTb2xpZCddXG4gIH0sXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChzeW1ib2xKc29uLCBvcHRpb25zKSB7XG4gICAgU3ltYm9sLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgc3ltYm9sSnNvbiwgb3B0aW9ucyk7XG4gICAgaWYgKHN5bWJvbEpzb24pIHtcbiAgICAgIHRoaXMuX2xpbmVTdHlsZXMgPSBsaW5lU3ltYm9sKHN5bWJvbEpzb24ub3V0bGluZSwgb3B0aW9ucykuc3R5bGUoKTtcbiAgICAgIHRoaXMuX2ZpbGxTdHlsZXMoKTtcbiAgICB9XG4gIH0sXG5cbiAgX2ZpbGxTdHlsZXM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fbGluZVN0eWxlcykge1xuICAgICAgaWYgKHRoaXMuX2xpbmVTdHlsZXMud2VpZ2h0ID09PSAwKSB7XG4gICAgICAgIC8vIHdoZW4gd2VpZ2h0IGlzIDAsIHNldHRpbmcgdGhlIHN0cm9rZSB0byBmYWxzZSBjYW4gc3RpbGwgbG9vayBiYWRcbiAgICAgICAgLy8gKGdhcHMgYmV0d2VlbiB0aGUgcG9seWdvbnMpXG4gICAgICAgIHRoaXMuX3N0eWxlcy5zdHJva2UgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNvcHkgdGhlIGxpbmUgc3ltYm9sIHN0eWxlcyBpbnRvIHRoaXMgc3ltYm9sJ3Mgc3R5bGVzXG4gICAgICAgIGZvciAodmFyIHN0eWxlQXR0ciBpbiB0aGlzLl9saW5lU3R5bGVzKSB7XG4gICAgICAgICAgdGhpcy5fc3R5bGVzW3N0eWxlQXR0cl0gPSB0aGlzLl9saW5lU3R5bGVzW3N0eWxlQXR0cl07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgdGhlIGZpbGwgZm9yIHRoZSBwb2x5Z29uXG4gICAgaWYgKHRoaXMuX3N5bWJvbEpzb24pIHtcbiAgICAgIGlmICh0aGlzLl9zeW1ib2xKc29uLmNvbG9yICYmXG4gICAgICAgICAgLy8gZG9uJ3QgZmlsbCBwb2x5Z29uIGlmIHR5cGUgaXMgbm90IHN1cHBvcnRlZFxuICAgICAgICAgIFBvbHlnb25TeW1ib2wuUE9MWUdPTlRZUEVTLmluZGV4T2YodGhpcy5fc3ltYm9sSnNvbi5zdHlsZSA+PSAwKSkge1xuICAgICAgICB0aGlzLl9zdHlsZXMuZmlsbCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5maWxsQ29sb3IgPSB0aGlzLmNvbG9yVmFsdWUodGhpcy5fc3ltYm9sSnNvbi5jb2xvcik7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5maWxsT3BhY2l0eSA9IHRoaXMuYWxwaGFWYWx1ZSh0aGlzLl9zeW1ib2xKc29uLmNvbG9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5maWxsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5maWxsT3BhY2l0eSA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHN0eWxlOiBmdW5jdGlvbiAoZmVhdHVyZSwgdmlzdWFsVmFyaWFibGVzKSB7XG4gICAgaWYgKCF0aGlzLl9pc0RlZmF1bHQgJiYgdmlzdWFsVmFyaWFibGVzICYmIHZpc3VhbFZhcmlhYmxlcy5jb2xvckluZm8pIHtcbiAgICAgIHZhciBjb2xvciA9IHRoaXMuZ2V0Q29sb3IoZmVhdHVyZSwgdmlzdWFsVmFyaWFibGVzLmNvbG9ySW5mbyk7XG4gICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgdGhpcy5fc3R5bGVzLmZpbGxDb2xvciA9IHRoaXMuY29sb3JWYWx1ZShjb2xvcik7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5maWxsT3BhY2l0eSA9IHRoaXMuYWxwaGFWYWx1ZShjb2xvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdHlsZXM7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9seWdvblN5bWJvbCAoc3ltYm9sSnNvbiwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IFBvbHlnb25TeW1ib2woc3ltYm9sSnNvbiwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHBvbHlnb25TeW1ib2w7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcblxuaW1wb3J0IHBvaW50U3ltYm9sIGZyb20gJy4uL1N5bWJvbHMvUG9pbnRTeW1ib2wnO1xuaW1wb3J0IGxpbmVTeW1ib2wgZnJvbSAnLi4vU3ltYm9scy9MaW5lU3ltYm9sJztcbmltcG9ydCBwb2x5Z29uU3ltYm9sIGZyb20gJy4uL1N5bWJvbHMvUG9seWdvblN5bWJvbCc7XG5cbmV4cG9ydCB2YXIgUmVuZGVyZXIgPSBMLkNsYXNzLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBwcm9wb3J0aW9uYWxQb2x5Z29uOiBmYWxzZSxcbiAgICBjbGlja2FibGU6IHRydWVcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAocmVuZGVyZXJKc29uLCBvcHRpb25zKSB7XG4gICAgdGhpcy5fcmVuZGVyZXJKc29uID0gcmVuZGVyZXJKc29uO1xuICAgIHRoaXMuX3BvaW50U3ltYm9scyA9IGZhbHNlO1xuICAgIHRoaXMuX3N5bWJvbHMgPSBbXTtcbiAgICB0aGlzLl92aXN1YWxWYXJpYWJsZXMgPSB0aGlzLl9wYXJzZVZpc3VhbFZhcmlhYmxlcyhyZW5kZXJlckpzb24udmlzdWFsVmFyaWFibGVzKTtcbiAgICBMLlV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgfSxcblxuICBfcGFyc2VWaXN1YWxWYXJpYWJsZXM6IGZ1bmN0aW9uICh2aXN1YWxWYXJpYWJsZXMpIHtcbiAgICB2YXIgdmlzVmFycyA9IHt9O1xuICAgIGlmICh2aXN1YWxWYXJpYWJsZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlzdWFsVmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZpc1ZhcnNbdmlzdWFsVmFyaWFibGVzW2ldLnR5cGVdID0gdmlzdWFsVmFyaWFibGVzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmlzVmFycztcbiAgfSxcblxuICBfY3JlYXRlRGVmYXVsdFN5bWJvbDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9yZW5kZXJlckpzb24uZGVmYXVsdFN5bWJvbCkge1xuICAgICAgdGhpcy5fZGVmYXVsdFN5bWJvbCA9IHRoaXMuX25ld1N5bWJvbCh0aGlzLl9yZW5kZXJlckpzb24uZGVmYXVsdFN5bWJvbCk7XG4gICAgICB0aGlzLl9kZWZhdWx0U3ltYm9sLl9pc0RlZmF1bHQgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICBfbmV3U3ltYm9sOiBmdW5jdGlvbiAoc3ltYm9sSnNvbikge1xuICAgIGlmIChzeW1ib2xKc29uLnR5cGUgPT09ICdlc3JpU01TJyB8fCBzeW1ib2xKc29uLnR5cGUgPT09ICdlc3JpUE1TJykge1xuICAgICAgdGhpcy5fcG9pbnRTeW1ib2xzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBwb2ludFN5bWJvbChzeW1ib2xKc29uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoc3ltYm9sSnNvbi50eXBlID09PSAnZXNyaVNMUycpIHtcbiAgICAgIHJldHVybiBsaW5lU3ltYm9sKHN5bWJvbEpzb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChzeW1ib2xKc29uLnR5cGUgPT09ICdlc3JpU0ZTJykge1xuICAgICAgcmV0dXJuIHBvbHlnb25TeW1ib2woc3ltYm9sSnNvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG4gIH0sXG5cbiAgX2dldFN5bWJvbDogZnVuY3Rpb24gKCkge1xuICAgIC8vIG92ZXJyaWRlXG4gIH0sXG5cbiAgYXR0YWNoU3R5bGVzVG9MYXllcjogZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgaWYgKHRoaXMuX3BvaW50U3ltYm9scykge1xuICAgICAgbGF5ZXIub3B0aW9ucy5wb2ludFRvTGF5ZXIgPSBMLlV0aWwuYmluZCh0aGlzLnBvaW50VG9MYXllciwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyLm9wdGlvbnMuc3R5bGUgPSBMLlV0aWwuYmluZCh0aGlzLnN0eWxlLCB0aGlzKTtcbiAgICAgIGxheWVyLl9vcmlnaW5hbFN0eWxlID0gbGF5ZXIub3B0aW9ucy5zdHlsZTtcbiAgICB9XG4gIH0sXG5cbiAgcG9pbnRUb0xheWVyOiBmdW5jdGlvbiAoZ2VvanNvbiwgbGF0bG5nKSB7XG4gICAgdmFyIHN5bSA9IHRoaXMuX2dldFN5bWJvbChnZW9qc29uKTtcbiAgICBpZiAoc3ltICYmIHN5bS5wb2ludFRvTGF5ZXIpIHtcbiAgICAgIC8vIHJpZ2h0IG5vdyBjdXN0b20gcGFuZXMgYXJlIHRoZSBvbmx5IG9wdGlvbiBwdXNoZWQgdGhyb3VnaFxuICAgICAgcmV0dXJuIHN5bS5wb2ludFRvTGF5ZXIoZ2VvanNvbiwgbGF0bG5nLCB0aGlzLl92aXN1YWxWYXJpYWJsZXMsIHRoaXMub3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIGludmlzaWJsZSBzeW1ib2xvZ3lcbiAgICByZXR1cm4gTC5jaXJjbGVNYXJrZXIobGF0bG5nLCB7cmFkaXVzOiAwLCBvcGFjaXR5OiAwfSk7XG4gIH0sXG5cbiAgc3R5bGU6IGZ1bmN0aW9uIChmZWF0dXJlKSB7XG4gICAgdmFyIHVzZXJTdHlsZXM7XG4gICAgaWYgKHRoaXMub3B0aW9ucy51c2VyRGVmaW5lZFN0eWxlKSB7XG4gICAgICB1c2VyU3R5bGVzID0gdGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkU3R5bGUoZmVhdHVyZSk7XG4gICAgfVxuICAgIC8vIGZpbmQgdGhlIHN5bWJvbCB0byByZXByZXNlbnQgdGhpcyBmZWF0dXJlXG4gICAgdmFyIHN5bSA9IHRoaXMuX2dldFN5bWJvbChmZWF0dXJlKTtcbiAgICBpZiAoc3ltKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXJnZVN0eWxlcyhzeW0uc3R5bGUoZmVhdHVyZSwgdGhpcy5fdmlzdWFsVmFyaWFibGVzKSwgdXNlclN0eWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGludmlzaWJsZSBzeW1ib2xvZ3lcbiAgICAgIHJldHVybiB0aGlzLm1lcmdlU3R5bGVzKHtvcGFjaXR5OiAwLCBmaWxsT3BhY2l0eTogMH0sIHVzZXJTdHlsZXMpO1xuICAgIH1cbiAgfSxcblxuICBtZXJnZVN0eWxlczogZnVuY3Rpb24gKHN0eWxlcywgdXNlclN0eWxlcykge1xuICAgIHZhciBtZXJnZWRTdHlsZXMgPSB7fTtcbiAgICB2YXIgYXR0cjtcbiAgICAvLyBjb3B5IHJlbmRlcmVyIHN0eWxlIGF0dHJpYnV0ZXNcbiAgICBmb3IgKGF0dHIgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoc3R5bGVzLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgIG1lcmdlZFN0eWxlc1thdHRyXSA9IHN0eWxlc1thdHRyXTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gb3ZlcnJpZGUgd2l0aCB1c2VyIGRlZmluZWQgc3R5bGUgYXR0cmlidXRlc1xuICAgIGlmICh1c2VyU3R5bGVzKSB7XG4gICAgICBmb3IgKGF0dHIgaW4gdXNlclN0eWxlcykge1xuICAgICAgICBpZiAodXNlclN0eWxlcy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICAgIG1lcmdlZFN0eWxlc1thdHRyXSA9IHVzZXJTdHlsZXNbYXR0cl07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFN0eWxlcztcbiAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFJlbmRlcmVyO1xuIiwiaW1wb3J0IFJlbmRlcmVyIGZyb20gJy4vUmVuZGVyZXInO1xuXG5leHBvcnQgdmFyIFNpbXBsZVJlbmRlcmVyID0gUmVuZGVyZXIuZXh0ZW5kKHtcbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKHJlbmRlcmVySnNvbiwgb3B0aW9ucykge1xuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgcmVuZGVyZXJKc29uLCBvcHRpb25zKTtcbiAgICB0aGlzLl9jcmVhdGVTeW1ib2woKTtcbiAgfSxcblxuICBfY3JlYXRlU3ltYm9sOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX3JlbmRlcmVySnNvbi5zeW1ib2wpIHtcbiAgICAgIHRoaXMuX3N5bWJvbHMucHVzaCh0aGlzLl9uZXdTeW1ib2wodGhpcy5fcmVuZGVyZXJKc29uLnN5bWJvbCkpO1xuICAgIH1cbiAgfSxcblxuICBfZ2V0U3ltYm9sOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N5bWJvbHNbMF07XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gc2ltcGxlUmVuZGVyZXIgKHJlbmRlcmVySnNvbiwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IFNpbXBsZVJlbmRlcmVyKHJlbmRlcmVySnNvbiwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNpbXBsZVJlbmRlcmVyO1xuIiwiaW1wb3J0IFJlbmRlcmVyIGZyb20gJy4vUmVuZGVyZXInO1xuXG5leHBvcnQgdmFyIENsYXNzQnJlYWtzUmVuZGVyZXIgPSBSZW5kZXJlci5leHRlbmQoe1xuICBpbml0aWFsaXplOiBmdW5jdGlvbiAocmVuZGVyZXJKc29uLCBvcHRpb25zKSB7XG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCByZW5kZXJlckpzb24sIG9wdGlvbnMpO1xuICAgIHRoaXMuX2ZpZWxkID0gdGhpcy5fcmVuZGVyZXJKc29uLmZpZWxkO1xuICAgIGlmICh0aGlzLl9yZW5kZXJlckpzb24ubm9ybWFsaXphdGlvblR5cGUgJiYgdGhpcy5fcmVuZGVyZXJKc29uLm5vcm1hbGl6YXRpb25UeXBlID09PSAnZXNyaU5vcm1hbGl6ZUJ5RmllbGQnKSB7XG4gICAgICB0aGlzLl9ub3JtYWxpemF0aW9uRmllbGQgPSB0aGlzLl9yZW5kZXJlckpzb24ubm9ybWFsaXphdGlvbkZpZWxkO1xuICAgIH1cbiAgICB0aGlzLl9jcmVhdGVTeW1ib2xzKCk7XG4gIH0sXG5cbiAgX2NyZWF0ZVN5bWJvbHM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3ltYm9sO1xuICAgIHZhciBjbGFzc2JyZWFrcyA9IHRoaXMuX3JlbmRlcmVySnNvbi5jbGFzc0JyZWFrSW5mb3M7XG5cbiAgICB0aGlzLl9zeW1ib2xzID0gW107XG5cbiAgICAvLyBjcmVhdGUgYSBzeW1ib2wgZm9yIGVhY2ggY2xhc3MgYnJlYWtcbiAgICBmb3IgKHZhciBpID0gY2xhc3NicmVha3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucHJvcG9ydGlvbmFsUG9seWdvbiAmJiB0aGlzLl9yZW5kZXJlckpzb24uYmFja2dyb3VuZEZpbGxTeW1ib2wpIHtcbiAgICAgICAgc3ltYm9sID0gdGhpcy5fbmV3U3ltYm9sKHRoaXMuX3JlbmRlcmVySnNvbi5iYWNrZ3JvdW5kRmlsbFN5bWJvbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW1ib2wgPSB0aGlzLl9uZXdTeW1ib2woY2xhc3NicmVha3NbaV0uc3ltYm9sKTtcbiAgICAgIH1cbiAgICAgIHN5bWJvbC52YWwgPSBjbGFzc2JyZWFrc1tpXS5jbGFzc01heFZhbHVlO1xuICAgICAgdGhpcy5fc3ltYm9scy5wdXNoKHN5bWJvbCk7XG4gICAgfVxuICAgIC8vIHNvcnQgdGhlIHN5bWJvbHMgaW4gYXNjZW5kaW5nIHZhbHVlXG4gICAgdGhpcy5fc3ltYm9scy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS52YWwgPiBiLnZhbCA/IDEgOiAtMTtcbiAgICB9KTtcbiAgICB0aGlzLl9jcmVhdGVEZWZhdWx0U3ltYm9sKCk7XG4gICAgdGhpcy5fbWF4VmFsdWUgPSB0aGlzLl9zeW1ib2xzW3RoaXMuX3N5bWJvbHMubGVuZ3RoIC0gMV0udmFsO1xuICB9LFxuXG4gIF9nZXRTeW1ib2w6IGZ1bmN0aW9uIChmZWF0dXJlKSB7XG4gICAgdmFyIHZhbCA9IGZlYXR1cmUucHJvcGVydGllc1t0aGlzLl9maWVsZF07XG4gICAgaWYgKHRoaXMuX25vcm1hbGl6YXRpb25GaWVsZCkge1xuICAgICAgdmFyIG5vcm1WYWx1ZSA9IGZlYXR1cmUucHJvcGVydGllc1t0aGlzLl9ub3JtYWxpemF0aW9uRmllbGRdO1xuICAgICAgaWYgKCFpc05hTihub3JtVmFsdWUpICYmIG5vcm1WYWx1ZSAhPT0gMCkge1xuICAgICAgICB2YWwgPSB2YWwgLyBub3JtVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFN5bWJvbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsID4gdGhpcy5fbWF4VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0U3ltYm9sO1xuICAgIH1cbiAgICB2YXIgc3ltYm9sID0gdGhpcy5fc3ltYm9sc1swXTtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5fc3ltYm9scy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKHZhbCA+IHRoaXMuX3N5bWJvbHNbaV0udmFsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3ltYm9sID0gdGhpcy5fc3ltYm9sc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHN5bWJvbDtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc0JyZWFrc1JlbmRlcmVyIChyZW5kZXJlckpzb24sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBDbGFzc0JyZWFrc1JlbmRlcmVyKHJlbmRlcmVySnNvbiwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzQnJlYWtzUmVuZGVyZXI7XG4iLCJpbXBvcnQgUmVuZGVyZXIgZnJvbSAnLi9SZW5kZXJlcic7XG5cbmV4cG9ydCB2YXIgVW5pcXVlVmFsdWVSZW5kZXJlciA9IFJlbmRlcmVyLmV4dGVuZCh7XG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChyZW5kZXJlckpzb24sIG9wdGlvbnMpIHtcbiAgICBSZW5kZXJlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHJlbmRlcmVySnNvbiwgb3B0aW9ucyk7XG4gICAgdGhpcy5fZmllbGQgPSB0aGlzLl9yZW5kZXJlckpzb24uZmllbGQxO1xuICAgIHRoaXMuX2NyZWF0ZVN5bWJvbHMoKTtcbiAgfSxcblxuICBfY3JlYXRlU3ltYm9sczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzeW1ib2w7XG4gICAgdmFyIHVuaXF1ZXMgPSB0aGlzLl9yZW5kZXJlckpzb24udW5pcXVlVmFsdWVJbmZvcztcblxuICAgIC8vIGNyZWF0ZSBhIHN5bWJvbCBmb3IgZWFjaCB1bmlxdWUgdmFsdWVcbiAgICBmb3IgKHZhciBpID0gdW5pcXVlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgc3ltYm9sID0gdGhpcy5fbmV3U3ltYm9sKHVuaXF1ZXNbaV0uc3ltYm9sKTtcbiAgICAgIHN5bWJvbC52YWwgPSB1bmlxdWVzW2ldLnZhbHVlO1xuICAgICAgdGhpcy5fc3ltYm9scy5wdXNoKHN5bWJvbCk7XG4gICAgfVxuICAgIHRoaXMuX2NyZWF0ZURlZmF1bHRTeW1ib2woKTtcbiAgfSxcblxuICBfZ2V0U3ltYm9sOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgIHZhciB2YWwgPSBmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5fZmllbGRdO1xuICAgIC8vIGFjY3VtdWxhdGUgdmFsdWVzIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZmllbGQgZGVmaW5lZFxuICAgIGlmICh0aGlzLl9yZW5kZXJlckpzb24uZmllbGREZWxpbWl0ZXIgJiYgdGhpcy5fcmVuZGVyZXJKc29uLmZpZWxkMikge1xuICAgICAgdmFyIHZhbDIgPSBmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5fcmVuZGVyZXJKc29uLmZpZWxkMl07XG4gICAgICBpZiAodmFsMikge1xuICAgICAgICB2YWwgKz0gdGhpcy5fcmVuZGVyZXJKc29uLmZpZWxkRGVsaW1pdGVyICsgdmFsMjtcbiAgICAgICAgdmFyIHZhbDMgPSBmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5fcmVuZGVyZXJKc29uLmZpZWxkM107XG4gICAgICAgIGlmICh2YWwzKSB7XG4gICAgICAgICAgdmFsICs9IHRoaXMuX3JlbmRlcmVySnNvbi5maWVsZERlbGltaXRlciArIHZhbDM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3ltYm9sID0gdGhpcy5fZGVmYXVsdFN5bWJvbDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5fc3ltYm9scy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgLy8gdXNpbmcgdGhlID09PSBvcGVyYXRvciBkb2VzIG5vdCB3b3JrIGlmIHRoZSBmaWVsZFxuICAgICAgLy8gb2YgdGhlIHVuaXF1ZSByZW5kZXJlciBpcyBub3QgYSBzdHJpbmdcbiAgICAgIC8qZXNsaW50LWRpc2FibGUgKi9cbiAgICAgIGlmICh0aGlzLl9zeW1ib2xzW2ldLnZhbCA9PSB2YWwpIHtcbiAgICAgICAgc3ltYm9sID0gdGhpcy5fc3ltYm9sc1tpXTtcbiAgICAgIH1cbiAgICAgIC8qZXNsaW50LWVuYWJsZSAqL1xuICAgIH1cbiAgICByZXR1cm4gc3ltYm9sO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZVZhbHVlUmVuZGVyZXIgKHJlbmRlcmVySnNvbiwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IFVuaXF1ZVZhbHVlUmVuZGVyZXIocmVuZGVyZXJKc29uLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdW5pcXVlVmFsdWVSZW5kZXJlcjtcbiIsIiBpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcblxuaW1wb3J0IGNsYXNzQnJlYWtzUmVuZGVyZXIgZnJvbSAnLi9SZW5kZXJlcnMvQ2xhc3NCcmVha3NSZW5kZXJlcic7XG5pbXBvcnQgdW5pcXVlVmFsdWVSZW5kZXJlciBmcm9tICcuL1JlbmRlcmVycy9VbmlxdWVWYWx1ZVJlbmRlcmVyJztcbmltcG9ydCBzaW1wbGVSZW5kZXJlciBmcm9tICcuL1JlbmRlcmVycy9TaW1wbGVSZW5kZXJlcic7XG5cbkwuZXNyaS5GZWF0dXJlTGF5ZXIuYWRkSW5pdEhvb2soZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZVJlbmRlcmVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBvbGRPbkFkZCA9IEwuVXRpbC5iaW5kKHRoaXMub25BZGQsIHRoaXMpO1xuICB2YXIgb2xkVW5iaW5kUG9wdXAgPSBMLlV0aWwuYmluZCh0aGlzLnVuYmluZFBvcHVwLCB0aGlzKTtcbiAgdmFyIG9sZE9uUmVtb3ZlID0gTC5VdGlsLmJpbmQodGhpcy5vblJlbW92ZSwgdGhpcyk7XG4gIEwuVXRpbC5iaW5kKHRoaXMuY3JlYXRlTmV3TGF5ZXIsIHRoaXMpO1xuXG4gIHRoaXMubWV0YWRhdGEoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH0gaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmRyYXdpbmdJbmZvKSB7XG4gICAgICB0aGlzLl9zZXRSZW5kZXJlcnMocmVzcG9uc2UpO1xuICAgIH0gaWYgKHRoaXMuX2FscmVhZHlBZGRlZCkge1xuICAgICAgdGhpcy5zZXRTdHlsZSh0aGlzLl9vcmlnaW5hbFN0eWxlKTtcbiAgICB9XG4gIH0sIHRoaXMpO1xuXG4gIHRoaXMub25BZGQgPSBmdW5jdGlvbiAobWFwKSB7XG4gICAgb2xkT25BZGQobWFwKTtcbiAgICB0aGlzLl9hZGRQb2ludExheWVyKG1hcCk7XG4gICAgdGhpcy5fYWxyZWFkeUFkZGVkID0gdHJ1ZTtcbiAgfTtcblxuICB0aGlzLm9uUmVtb3ZlID0gZnVuY3Rpb24gKG1hcCkge1xuICAgIG9sZE9uUmVtb3ZlKG1hcCk7XG4gICAgaWYgKHRoaXMuX3BvaW50TGF5ZXIpIHtcbiAgICAgIHZhciBwb2ludExheWVycyA9IHRoaXMuX3BvaW50TGF5ZXIuZ2V0TGF5ZXJzKCk7XG4gICAgICBmb3IgKHZhciBpIGluIHBvaW50TGF5ZXJzKSB7XG4gICAgICAgIG1hcC5yZW1vdmVMYXllcihwb2ludExheWVyc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHRoaXMudW5iaW5kUG9wdXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgb2xkVW5iaW5kUG9wdXAoKTtcbiAgICBpZiAodGhpcy5fcG9pbnRMYXllcikge1xuICAgICAgdmFyIHBvaW50TGF5ZXJzID0gdGhpcy5fcG9pbnRMYXllci5nZXRMYXllcnMoKTtcbiAgICAgIGZvciAodmFyIGkgaW4gcG9pbnRMYXllcnMpIHtcbiAgICAgICAgcG9pbnRMYXllcnNbaV0udW5iaW5kUG9wdXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5fYWRkUG9pbnRMYXllciA9IGZ1bmN0aW9uIChtYXApIHtcbiAgICBpZiAodGhpcy5fcG9pbnRMYXllcikge1xuICAgICAgdGhpcy5fcG9pbnRMYXllci5hZGRUbyhtYXApO1xuICAgICAgdGhpcy5fcG9pbnRMYXllci5icmluZ1RvRnJvbnQoKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5fY3JlYXRlUG9pbnRMYXllciA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX3BvaW50TGF5ZXIpIHtcbiAgICAgIHRoaXMuX3BvaW50TGF5ZXIgPSBMLmdlb0pzb24oKTtcbiAgICAgIC8vIHN0b3JlIHRoZSBmZWF0dXJlIGlkcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBtYXBcbiAgICAgIHRoaXMuX3BvaW50TGF5ZXJJZHMgPSB7fTtcblxuICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XG4gICAgICAgIHZhciBwb3B1cEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZlYXR1cmUsIGxheWVyKSB7XG4gICAgICAgICAgbGF5ZXIuYmluZFBvcHVwKHRoaXMuX3BvcHVwKGZlYXR1cmUsIGxheWVyKSwgdGhpcy5fcG9wdXBPcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fcG9pbnRMYXllci5vcHRpb25zLm9uRWFjaEZlYXR1cmUgPSBMLlV0aWwuYmluZChwb3B1cEZ1bmN0aW9uLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5jcmVhdGVOZXdMYXllciA9IGZ1bmN0aW9uIChnZW9qc29uKSB7XG4gICAgdmFyIGZMYXllciA9IEwuR2VvSlNPTi5nZW9tZXRyeVRvTGF5ZXIoZ2VvanNvbiwgdGhpcy5vcHRpb25zKTtcblxuICAgIC8vIGFkZCBhIHBvaW50IGxheWVyIHdoZW4gdGhlIHBvbHlnb24gaXMgcmVwcmVzZW50ZWQgYXMgcHJvcG9ydGlvbmFsIG1hcmtlciBzeW1ib2xzXG4gICAgaWYgKHRoaXMuX2hhc1Byb3BvcnRpb25hbFN5bWJvbHMpIHtcbiAgICAgIHZhciBjZW50cm9pZCA9IHRoaXMuZ2V0UG9seWdvbkNlbnRyb2lkKGdlb2pzb24uZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgaWYgKCEoaXNOYU4oY2VudHJvaWRbMF0pIHx8IGlzTmFOKGNlbnRyb2lkWzBdKSkpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlUG9pbnRMYXllcigpO1xuXG4gICAgICAgIHZhciBmZWF0dXJlSWQgPSBnZW9qc29uLmlkLnRvU3RyaW5nKCk7XG4gICAgICAgIC8vIG9ubHkgYWRkIHRoZSBmZWF0dXJlIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3Qgb24gdGhlIG1hcFxuICAgICAgICBpZiAoIXRoaXMuX3BvaW50TGF5ZXJJZHNbZmVhdHVyZUlkXSkge1xuICAgICAgICAgIHZhciBwb2ludGpzb24gPSB0aGlzLmdldFBvaW50SnNvbihnZW9qc29uLCBjZW50cm9pZCk7XG5cbiAgICAgICAgICB0aGlzLl9wb2ludExheWVyLmFkZERhdGEocG9pbnRqc29uKTtcbiAgICAgICAgICB0aGlzLl9wb2ludExheWVySWRzW2ZlYXR1cmVJZF0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcG9pbnRMYXllci5icmluZ1RvRnJvbnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZMYXllcjtcbiAgfTtcblxuICB0aGlzLmdldFBvbHlnb25DZW50cm9pZCA9IGZ1bmN0aW9uIChjb29yZGluYXRlcykge1xuICAgIHZhciBwdHMgPSBjb29yZGluYXRlc1swXVswXTtcbiAgICBpZiAocHRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgcHRzID0gY29vcmRpbmF0ZXNbMF07XG4gICAgfVxuXG4gICAgdmFyIHR3aWNlYXJlYSA9IDA7XG4gICAgdmFyIHggPSAwO1xuICAgIHZhciB5ID0gMDtcbiAgICB2YXIgblB0cyA9IHB0cy5sZW5ndGg7XG4gICAgdmFyIHAxO1xuICAgIHZhciBwMjtcbiAgICB2YXIgZjtcblxuICAgIGZvciAodmFyIGkgPSAwLCBqID0gblB0cyAtIDE7IGkgPCBuUHRzOyBqID0gaSsrKSB7XG4gICAgICBwMSA9IHB0c1tpXTsgcDIgPSBwdHNbal07XG4gICAgICB0d2ljZWFyZWEgKz0gcDFbMF0gKiBwMlsxXTtcbiAgICAgIHR3aWNlYXJlYSAtPSBwMVsxXSAqIHAyWzBdO1xuICAgICAgZiA9IHAxWzBdICogcDJbMV0gLSBwMlswXSAqIHAxWzFdO1xuICAgICAgeCArPSAocDFbMF0gKyBwMlswXSkgKiBmO1xuICAgICAgeSArPSAocDFbMV0gKyBwMlsxXSkgKiBmO1xuICAgIH1cbiAgICBmID0gdHdpY2VhcmVhICogMztcbiAgICByZXR1cm4gW3ggLyBmLCB5IC8gZl07XG4gIH07XG5cbiAgdGhpcy5nZXRQb2ludEpzb24gPSBmdW5jdGlvbiAoZ2VvanNvbiwgY2VudHJvaWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgcHJvcGVydGllczogZ2VvanNvbi5wcm9wZXJ0aWVzLFxuICAgICAgaWQ6IGdlb2pzb24uaWQsXG4gICAgICBnZW9tZXRyeToge1xuICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICBjb29yZGluYXRlczogW2NlbnRyb2lkWzBdLCBjZW50cm9pZFsxXV1cbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIHRoaXMuX2NoZWNrRm9yUHJvcG9ydGlvbmFsU3ltYm9scyA9IGZ1bmN0aW9uIChnZW9tZXRyeVR5cGUsIHJlbmRlcmVyKSB7XG4gICAgdGhpcy5faGFzUHJvcG9ydGlvbmFsU3ltYm9scyA9IGZhbHNlO1xuICAgIGlmIChnZW9tZXRyeVR5cGUgPT09ICdlc3JpR2VvbWV0cnlQb2x5Z29uJykge1xuICAgICAgaWYgKHJlbmRlcmVyLmJhY2tncm91bmRGaWxsU3ltYm9sKSB7XG4gICAgICAgIHRoaXMuX2hhc1Byb3BvcnRpb25hbFN5bWJvbHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIGNsYXNzYnJlYWtzIGlzIGEgbWFya2VyIHN5bWJvbFxuICAgICAgaWYgKHJlbmRlcmVyLmNsYXNzQnJlYWtJbmZvcyAmJiByZW5kZXJlci5jbGFzc0JyZWFrSW5mb3MubGVuZ3RoKSB7XG4gICAgICAgIHZhciBzeW0gPSByZW5kZXJlci5jbGFzc0JyZWFrSW5mb3NbMF0uc3ltYm9sO1xuICAgICAgICBpZiAoc3ltICYmIChzeW0udHlwZSA9PT0gJ2VzcmlTTVMnIHx8IHN5bS50eXBlID09PSAnZXNyaVBNUycpKSB7XG4gICAgICAgICAgdGhpcy5faGFzUHJvcG9ydGlvbmFsU3ltYm9scyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5fc2V0UmVuZGVyZXJzID0gZnVuY3Rpb24gKGdlb2pzb24pIHtcbiAgICB2YXIgcmVuZDtcbiAgICB2YXIgcmVuZGVyZXJJbmZvID0gZ2VvanNvbi5kcmF3aW5nSW5mby5yZW5kZXJlcjtcblxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIG9wdGlvbnMudG9rZW4gPSB0aGlzLm9wdGlvbnMudG9rZW47XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMucGFuZSkge1xuICAgICAgb3B0aW9ucy5wYW5lID0gdGhpcy5vcHRpb25zLnBhbmU7XG4gICAgfVxuICAgIGlmIChnZW9qc29uLmRyYXdpbmdJbmZvLnRyYW5zcGFyZW5jeSkge1xuICAgICAgb3B0aW9ucy5sYXllclRyYW5zcGFyZW5jeSA9IGdlb2pzb24uZHJhd2luZ0luZm8udHJhbnNwYXJlbmN5O1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnN0eWxlKSB7XG4gICAgICBvcHRpb25zLnVzZXJEZWZpbmVkU3R5bGUgPSB0aGlzLm9wdGlvbnMuc3R5bGU7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZW5kZXJlckluZm8udHlwZSkge1xuICAgICAgY2FzZSAnY2xhc3NCcmVha3MnOlxuICAgICAgICB0aGlzLl9jaGVja0ZvclByb3BvcnRpb25hbFN5bWJvbHMoZ2VvanNvbi5nZW9tZXRyeVR5cGUsIHJlbmRlcmVySW5mbyk7XG4gICAgICAgIGlmICh0aGlzLl9oYXNQcm9wb3J0aW9uYWxTeW1ib2xzKSB7XG4gICAgICAgICAgdGhpcy5fY3JlYXRlUG9pbnRMYXllcigpO1xuICAgICAgICAgIHZhciBwUmVuZCA9IGNsYXNzQnJlYWtzUmVuZGVyZXIocmVuZGVyZXJJbmZvLCBvcHRpb25zKTtcbiAgICAgICAgICBwUmVuZC5hdHRhY2hTdHlsZXNUb0xheWVyKHRoaXMuX3BvaW50TGF5ZXIpO1xuICAgICAgICAgIG9wdGlvbnMucHJvcG9ydGlvbmFsUG9seWdvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZCA9IGNsYXNzQnJlYWtzUmVuZGVyZXIocmVuZGVyZXJJbmZvLCBvcHRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1bmlxdWVWYWx1ZSc6XG4gICAgICAgIHJlbmQgPSB1bmlxdWVWYWx1ZVJlbmRlcmVyKHJlbmRlcmVySW5mbywgb3B0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmVuZCA9IHNpbXBsZVJlbmRlcmVyKHJlbmRlcmVySW5mbywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJlbmQuYXR0YWNoU3R5bGVzVG9MYXllcih0aGlzKTtcbiAgfTtcbn0pO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Q0NFTyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUNuQyxDQUFBLEVBQUUsVUFBVSxFQUFFLFVBQVUsVUFBVSxFQUFFLE9BQU8sRUFBRTtBQUM3QyxDQUFBLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7QUFDbEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ3BCLENBQUEsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUN0QixDQUFBLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFDNUIsQ0FBQSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtBQUM5QyxDQUFBLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUN4RSxDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxVQUFVLEVBQUUsVUFBVSxVQUFVLEVBQUU7QUFDcEMsQ0FBQSxJQUFJLE9BQU8sVUFBVSxHQUFHLEtBQUssQ0FBQztBQUM5QixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxVQUFVLEVBQUUsVUFBVSxLQUFLLEVBQUU7QUFDL0IsQ0FBQSxJQUFJLE9BQU8sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3JFLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsVUFBVSxFQUFFLFVBQVUsS0FBSyxFQUFFO0FBQy9CLENBQUEsSUFBSSxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ2pDLENBQUEsSUFBSSxPQUFPLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7QUFDM0MsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxPQUFPLEVBQUUsVUFBVSxPQUFPLEVBQUUsUUFBUSxFQUFFO0FBQ3hDLENBQUEsSUFBSSxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO0FBQ2xDLENBQUEsSUFBSSxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO0FBQy9CLENBQUEsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7QUFDakIsQ0FBQSxJQUFJLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQzs7QUFFNUIsQ0FBQSxJQUFJLElBQUksS0FBSyxFQUFFO0FBQ2YsQ0FBQSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakMsQ0FBQSxNQUFNLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7QUFDckMsQ0FBQSxNQUFNLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7QUFDckMsQ0FBQSxNQUFNLElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7QUFDL0MsQ0FBQSxNQUFNLElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7QUFDL0MsQ0FBQSxNQUFNLElBQUksWUFBWSxDQUFDO0FBQ3ZCLENBQUEsTUFBTSxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUM7QUFDbEQsQ0FBQSxNQUFNLElBQUksU0FBUyxHQUFHLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDOztBQUVyRSxDQUFBLE1BQU0sSUFBSSxZQUFZLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMzRixDQUFBLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsQ0FBQSxPQUFPOztBQUVQLENBQUEsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFO0FBQzdCLENBQUEsUUFBUSxZQUFZLElBQUksU0FBUyxDQUFDO0FBQ2xDLENBQUEsT0FBTzs7QUFFUCxDQUFBLE1BQU0sSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksWUFBWSxLQUFLLElBQUksSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFO0FBQ2xHLENBQUEsUUFBUSxJQUFJLFlBQVksSUFBSSxZQUFZLEVBQUU7QUFDMUMsQ0FBQSxVQUFVLElBQUksR0FBRyxPQUFPLENBQUM7QUFDekIsQ0FBQSxTQUFTLE1BQU0sSUFBSSxZQUFZLElBQUksWUFBWSxFQUFFO0FBQ2pELENBQUEsVUFBVSxJQUFJLEdBQUcsT0FBTyxDQUFDO0FBQ3pCLENBQUEsU0FBUyxNQUFNO0FBQ2YsQ0FBQSxVQUFVLFlBQVksR0FBRyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsQ0FBQztBQUN2RixDQUFBLFVBQVUsSUFBSSxHQUFHLE9BQU8sR0FBRyxDQUFDLFlBQVksR0FBRyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLENBQUEsU0FBUztBQUNULENBQUEsT0FBTztBQUNQLENBQUEsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDcEMsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsUUFBUSxFQUFFLFVBQVUsT0FBTyxFQUFFLFNBQVMsRUFBRTtBQUMxQyxDQUFBO0FBQ0EsQ0FBQSxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ2xGLENBQUEsTUFBTSxPQUFPLElBQUksQ0FBQztBQUNsQixDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFDbEMsQ0FBQSxJQUFJLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0MsQ0FBQSxJQUFJLElBQUksZUFBZSxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO0FBQ2pFLENBQUEsSUFBSSxJQUFJLFNBQVMsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUM7QUFDakQsQ0FBQSxJQUFJLElBQUksU0FBUyxHQUFHLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ25FLENBQUEsSUFBSSxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3pGLENBQUEsTUFBTSxPQUFPLElBQUksQ0FBQztBQUNsQixDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUU7QUFDM0IsQ0FBQSxNQUFNLFlBQVksSUFBSSxTQUFTLENBQUM7QUFDaEMsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxJQUFJLFlBQVksSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTtBQUNsRCxDQUFBLE1BQU0sT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN0QyxDQUFBLEtBQUs7QUFDTCxDQUFBLElBQUksSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFBLElBQUksSUFBSSxZQUFZLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtBQUN4QyxDQUFBLE1BQU0sT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO0FBQzVCLENBQUEsS0FBSzs7QUFFTCxDQUFBO0FBQ0EsQ0FBQSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNyRCxDQUFBLE1BQU0sSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFeEMsQ0FBQSxNQUFNLElBQUksUUFBUSxDQUFDLEtBQUssSUFBSSxZQUFZLEVBQUU7QUFDMUMsQ0FBQSxRQUFRLGVBQWUsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO0FBQ3pDLENBQUEsUUFBUSxVQUFVLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztBQUNwQyxDQUFBLE9BQU8sTUFBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEdBQUcsWUFBWSxFQUFFO0FBQ2hELENBQUEsUUFBUSxlQUFlLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztBQUN6QyxDQUFBLFFBQVEsVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7QUFDcEMsQ0FBQSxRQUFRLE1BQU07QUFDZCxDQUFBLE9BQU87QUFDUCxDQUFBLEtBQUs7O0FBRUwsQ0FBQTtBQUNBLENBQUEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFO0FBQ2xELENBQUEsTUFBTSxJQUFJLEtBQUssR0FBRyxVQUFVLEdBQUcsVUFBVSxDQUFDO0FBQzFDLENBQUEsTUFBTSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7QUFDckIsQ0FBQTtBQUNBLENBQUEsUUFBUSxJQUFJLHFCQUFxQixHQUFHLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUN4RSxDQUFBLFFBQVEsSUFBSSxxQkFBcUIsRUFBRTtBQUNuQyxDQUFBO0FBQ0EsQ0FBQSxVQUFVLElBQUkscUJBQXFCLEdBQUcsQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQzFFLENBQUEsVUFBVSxJQUFJLHFCQUFxQixFQUFFO0FBQ3JDLENBQUE7QUFDQSxDQUFBO0FBQ0EsQ0FBQSxZQUFZLElBQUksaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLENBQUEsWUFBWSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3hDLENBQUEsY0FBYyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxxQkFBcUIsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcscUJBQXFCLENBQUMsQ0FBQztBQUN6SSxDQUFBLGFBQWE7QUFDYixDQUFBLFlBQVksT0FBTyxpQkFBaUIsQ0FBQztBQUNyQyxDQUFBLFdBQVcsTUFBTTtBQUNqQixDQUFBO0FBQ0EsQ0FBQSxZQUFZLE9BQU8sZUFBZSxDQUFDO0FBQ25DLENBQUEsV0FBVztBQUNYLENBQUEsU0FBUyxNQUFNO0FBQ2YsQ0FBQTtBQUNBLENBQUEsVUFBVSxPQUFPLGVBQWUsQ0FBQztBQUNqQyxDQUFBLFNBQVM7QUFDVCxDQUFBLE9BQU87QUFDUCxDQUFBLEtBQUs7QUFDTCxDQUFBO0FBQ0EsQ0FBQSxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUEsR0FBRztBQUNILENBQUEsQ0FBQyxDQUFDLENBQUM7O0NDeklJLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDOztBQUV2QyxDQUFBLEVBQUUsVUFBVSxFQUFFLFVBQVUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDL0MsQ0FBQSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hDLENBQUEsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN0QixDQUFBLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3BDLENBQUEsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztBQUM5QixDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLGtCQUFrQixFQUFFLFlBQVk7QUFDbEMsQ0FBQTtBQUNBLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsUUFBUSxFQUFFLFlBQVk7QUFDeEIsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0QsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxPQUFPLEVBQUUsWUFBWTtBQUN2QixDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ25CLENBQUEsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDekIsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxXQUFXLEVBQUUsWUFBWTtBQUMzQixDQUFBO0FBQ0EsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxTQUFTLEVBQUUsVUFBVSxNQUFNLEVBQUU7QUFDL0IsQ0FBQSxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNwQyxDQUFBLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ2xCLENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3JELENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsU0FBUyxFQUFFLFlBQVk7QUFDekIsQ0FBQSxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN4QixDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRTtBQUMzQixDQUFBLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDdEIsQ0FBQSxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3pCLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsT0FBTyxFQUFFLFlBQVk7QUFDdkIsQ0FBQSxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztBQUN0QixDQUFBLEdBQUc7QUFDSCxDQUFBLENBQUMsQ0FBQyxDQUFDOztDQzVDSSxJQUFJLFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDOztBQUU1QyxDQUFBLEVBQUUsVUFBVSxFQUFFLFVBQVUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDL0MsQ0FBQSxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2RSxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFdBQVcsRUFBRSxZQUFZO0FBQzNCLENBQUEsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVDLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsa0JBQWtCLEVBQUUsWUFBWTtBQUNsQyxDQUFBLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDckIsQ0FBQSxNQUFNLGtCQUFrQixFQUFFLFVBQVUsS0FBSyxFQUFFO0FBQzNDLENBQUEsUUFBUSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQ2xDLENBQUEsUUFBUSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztBQUN2QyxDQUFBLFFBQVEsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQzs7QUFFNUIsQ0FBQSxRQUFRLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUN4QixDQUFBLFFBQVEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDaEQsQ0FBQSxRQUFRLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ2hELENBQUEsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzs7QUFFckMsQ0FBQSxRQUFRLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hELENBQUEsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRCxDQUFBLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDckMsQ0FBQSxPQUFPO0FBQ1AsQ0FBQSxLQUFLLENBQUMsQ0FBQzs7QUFFUCxDQUFBLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7QUFDbEIsQ0FBQSxNQUFNLGtCQUFrQixFQUFFLFVBQVUsS0FBSyxFQUFFO0FBQzNDLENBQUEsUUFBUSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQ2xDLENBQUEsUUFBUSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQzs7QUFFdkMsQ0FBQSxRQUFRLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7QUFDM0IsQ0FBQSxVQUFVLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUMxQixDQUFBLFVBQVUsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEMsQ0FBQSxTQUFTOztBQUVULENBQUEsUUFBUSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUM1RCxDQUFBLFVBQVUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDcEQsQ0FBQSxVQUFVLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ3BELENBQUEsVUFBVSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDOztBQUVyRCxDQUFBLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDbEMsQ0FBQSxPQUFPO0FBQ1AsQ0FBQSxLQUFLLENBQUMsQ0FBQztBQUNQLENBQUEsR0FBRztBQUNILENBQUEsQ0FBQyxDQUFDLENBQUM7O0FBRUgsQ0FBTyxJQUFJLFdBQVcsR0FBRyxVQUFVLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQzFELENBQUEsRUFBRSxPQUFPLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEQsQ0FBQSxDQUFDLENBQUM7O0NDbkRLLElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7O0FBRXhDLENBQUEsRUFBRSxVQUFVLEVBQUUsVUFBVSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUMvQyxDQUFBLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZFLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsV0FBVyxFQUFFLFlBQVk7QUFDM0IsQ0FBQSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hDLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsa0JBQWtCLEVBQUUsWUFBWTtBQUNsQyxDQUFBLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDckIsQ0FBQSxNQUFNLGNBQWMsRUFBRSxVQUFVLEtBQUssRUFBRTtBQUN2QyxDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUNsQyxDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDdkMsQ0FBQSxRQUFRLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7O0FBRTVCLENBQUEsUUFBUSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7O0FBRXhCLENBQUEsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDekQsQ0FBQSxRQUFRLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUN6RCxDQUFBLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDckMsQ0FBQSxPQUFPO0FBQ1AsQ0FBQSxLQUFLLENBQUMsQ0FBQzs7QUFFUCxDQUFBLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7QUFDbEIsQ0FBQSxNQUFNLGNBQWMsRUFBRSxVQUFVLEtBQUssRUFBRTtBQUN2QyxDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUNsQyxDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7O0FBRXZDLENBQUEsUUFBUSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQzNCLENBQUEsVUFBVSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDMUIsQ0FBQSxVQUFVLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RDLENBQUEsU0FBUzs7QUFFVCxDQUFBLFFBQVEsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUN2RSxDQUFBLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUMvRCxDQUFBLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUMvRCxDQUFBLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDOztBQUVoRSxDQUFBLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDbEMsQ0FBQSxPQUFPO0FBQ1AsQ0FBQSxLQUFLLENBQUMsQ0FBQztBQUNQLENBQUEsR0FBRztBQUNILENBQUEsQ0FBQyxDQUFDLENBQUM7O0FBRUgsQ0FBTyxJQUFJLE9BQU8sR0FBRyxVQUFVLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQ3RELENBQUEsRUFBRSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDNUMsQ0FBQSxDQUFDLENBQUM7O0NDaERLLElBQUksWUFBWSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7QUFDN0MsQ0FBQSxFQUFFLE9BQU8sRUFBRTtBQUNYLENBQUEsSUFBSSxJQUFJLEVBQUUsSUFBSTtBQUNkLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsVUFBVSxFQUFFLFVBQVUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDL0MsQ0FBQSxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2RSxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFdBQVcsRUFBRSxZQUFZO0FBQzNCLENBQUEsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdDLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsa0JBQWtCLEVBQUUsWUFBWTtBQUNsQyxDQUFBLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDckIsQ0FBQSxNQUFNLG1CQUFtQixFQUFFLFVBQVUsS0FBSyxFQUFFO0FBQzVDLENBQUEsUUFBUSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQ2xDLENBQUEsUUFBUSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztBQUN2QyxDQUFBLFFBQVEsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQzs7QUFFNUIsQ0FBQSxRQUFRLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7QUFFeEIsQ0FBQSxRQUFRLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUN6RCxDQUFBLFFBQVEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ3pELENBQUEsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDekQsQ0FBQSxRQUFRLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQzs7QUFFekQsQ0FBQSxRQUFRLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7QUFFeEIsQ0FBQSxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3JDLENBQUEsT0FBTztBQUNQLENBQUEsS0FBSyxDQUFDLENBQUM7O0FBRVAsQ0FBQSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO0FBQ2xCLENBQUEsTUFBTSxtQkFBbUIsRUFBRSxVQUFVLEtBQUssRUFBRTtBQUM1QyxDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUNsQyxDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7O0FBRXZDLENBQUEsUUFBUSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQzNCLENBQUEsVUFBVSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDMUIsQ0FBQSxVQUFVLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RDLENBQUEsU0FBUzs7QUFFVCxDQUFBLFFBQVEsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUN2RSxDQUFBLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUMvRCxDQUFBLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUMvRCxDQUFBLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDOztBQUVoRSxDQUFBLFFBQVEsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzs7QUFFaEQsQ0FBQSxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLENBQUEsT0FBTztBQUNQLENBQUEsS0FBSyxDQUFDLENBQUM7QUFDUCxDQUFBLEdBQUc7QUFDSCxDQUFBLENBQUMsQ0FBQyxDQUFDOztBQUVILENBQU8sSUFBSSxZQUFZLEdBQUcsVUFBVSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUMzRCxDQUFBLEVBQUUsT0FBTyxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2pELENBQUEsQ0FBQyxDQUFDOztDQzFESyxJQUFJLGFBQWEsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO0FBQzlDLENBQUEsRUFBRSxPQUFPLEVBQUU7QUFDWCxDQUFBLElBQUksSUFBSSxFQUFFLElBQUk7QUFDZCxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFVBQVUsRUFBRSxVQUFVLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQy9DLENBQUEsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdkUsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxXQUFXLEVBQUUsWUFBWTtBQUMzQixDQUFBLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5QyxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLGtCQUFrQixFQUFFLFlBQVk7QUFDbEMsQ0FBQSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3JCLENBQUEsTUFBTSxvQkFBb0IsRUFBRSxVQUFVLEtBQUssRUFBRTtBQUM3QyxDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUNsQyxDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDdkMsQ0FBQSxRQUFRLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7O0FBRTVCLENBQUEsUUFBUSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7O0FBRXhCLENBQUEsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUNoRCxDQUFBLFFBQVEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEQsQ0FBQSxRQUFRLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ2hELENBQUEsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFaEQsQ0FBQSxRQUFRLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7QUFFeEIsQ0FBQSxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3JDLENBQUEsT0FBTztBQUNQLENBQUEsS0FBSyxDQUFDLENBQUM7O0FBRVAsQ0FBQSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO0FBQ2xCLENBQUEsTUFBTSxvQkFBb0IsRUFBRSxVQUFVLEtBQUssRUFBRTtBQUM3QyxDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUNsQyxDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7O0FBRXZDLENBQUEsUUFBUSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQzNCLENBQUEsVUFBVSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDMUIsQ0FBQSxVQUFVLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RDLENBQUEsU0FBUzs7QUFFVCxDQUFBLFFBQVEsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDNUQsQ0FBQSxVQUFVLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ3BELENBQUEsVUFBVSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNwRCxDQUFBLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQzs7QUFFckQsQ0FBQSxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7O0FBRWhELENBQUEsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNsQyxDQUFBLE9BQU87QUFDUCxDQUFBLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQSxHQUFHO0FBQ0gsQ0FBQSxDQUFDLENBQUMsQ0FBQzs7QUFFSCxDQUFPLElBQUksYUFBYSxHQUFHLFVBQVUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDNUQsQ0FBQSxFQUFFLE9BQU8sSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsRCxDQUFBLENBQUMsQ0FBQzs7Q0N6REssSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQzs7QUFFdkMsQ0FBQSxFQUFFLE9BQU8sRUFBRTtBQUNYLENBQUEsSUFBSSxXQUFXLEVBQUUsQ0FBQyxlQUFlLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDO0FBQzVHLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsVUFBVSxFQUFFLFVBQVUsVUFBVSxFQUFFLE9BQU8sRUFBRTtBQUM3QyxDQUFBLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEUsQ0FBQSxJQUFJLElBQUksT0FBTyxFQUFFO0FBQ2pCLENBQUEsTUFBTSxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7QUFDcEMsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxJQUFJLElBQUksVUFBVSxFQUFFO0FBQ3BCLENBQUEsTUFBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO0FBQ3pDLENBQUEsUUFBUSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztBQUNyRSxDQUFBLFFBQVEsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO0FBQ3pGLENBQUE7QUFDQSxDQUFBO0FBQ0EsQ0FBQSxRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLENBQUE7QUFDQSxDQUFBLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN2RCxDQUFBLE9BQU8sTUFBTTtBQUNiLENBQUEsUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDM0IsQ0FBQSxPQUFPO0FBQ1AsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxXQUFXLEVBQUUsWUFBWTtBQUMzQixDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7QUFDL0QsQ0FBQSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztBQUNqQyxDQUFBLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1RSxDQUFBLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMzRSxDQUFBLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3RSxDQUFBLEtBQUssTUFBTTtBQUNYLENBQUEsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDbEMsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUU7QUFDaEMsQ0FBQSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2RSxDQUFBLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pFLENBQUEsS0FBSyxNQUFNO0FBQ1gsQ0FBQSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztBQUNuQyxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEtBQUssZUFBZSxFQUFFO0FBQ3BELENBQUEsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3pFLENBQUEsS0FBSztBQUNMLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsV0FBVyxFQUFFLFVBQVUsT0FBTyxFQUFFO0FBQ2xDLENBQUEsSUFBSSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQyxDQUFBLElBQUksSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0FBQ3ZCLENBQUEsSUFBSSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7QUFDeEIsQ0FBQSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvQyxDQUFBLEtBQUs7QUFDTCxDQUFBLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQztBQUM5QixDQUFBLElBQUksSUFBSSxPQUFPLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQzs7QUFFL0IsQ0FBQSxJQUFJLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtBQUN6QixDQUFBLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2xELENBQUEsS0FBSztBQUNMLENBQUEsSUFBSSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7QUFDekIsQ0FBQSxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNsRCxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDdEIsQ0FBQSxNQUFNLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUTtBQUM1QixDQUFBLE1BQU0sUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztBQUMvQixDQUFBLE1BQU0sVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztBQUNwQyxDQUFBLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNqRCxDQUFBLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxRQUFRLEVBQUUsVUFBVSxJQUFJLEVBQUU7QUFDNUIsQ0FBQTtBQUNBLENBQUEsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQzVDLENBQUEsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ2YsQ0FBQSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDN0MsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsWUFBWSxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFO0FBQ3JFLENBQUEsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztBQUMvRCxDQUFBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDMUIsQ0FBQSxNQUFNLElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRTtBQUNwQyxDQUFBLFFBQVEsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzdFLENBQUEsUUFBUSxJQUFJLGNBQWMsRUFBRTtBQUM1QixDQUFBLFVBQVUsSUFBSSxHQUFHLGNBQWMsQ0FBQztBQUNoQyxDQUFBLFNBQVM7QUFDVCxDQUFBLE9BQU87QUFDUCxDQUFBLE1BQU0sSUFBSSxlQUFlLENBQUMsU0FBUyxFQUFFO0FBQ3JDLENBQUEsUUFBUSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdEUsQ0FBQSxRQUFRLElBQUksS0FBSyxFQUFFO0FBQ25CLENBQUEsVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzFELENBQUEsVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVELENBQUEsU0FBUztBQUNULENBQUEsT0FBTztBQUNQLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7QUFDN0MsQ0FBQSxNQUFNLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM1RSxDQUFBLE1BQU0sT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztBQUM1QyxDQUFBLEtBQUs7QUFDTCxDQUFBLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7O0FBRWpDLENBQUEsSUFBSSxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSztBQUNsQyxDQUFBLE1BQU0sS0FBSyxlQUFlO0FBQzFCLENBQUEsUUFBUSxPQUFPLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUMvRSxDQUFBLE1BQU0sS0FBSyxnQkFBZ0I7QUFDM0IsQ0FBQSxRQUFRLE9BQU8sYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLENBQUEsTUFBTSxLQUFLLGNBQWM7QUFDekIsQ0FBQSxRQUFRLE9BQU8sV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzlFLENBQUEsTUFBTSxLQUFLLFVBQVU7QUFDckIsQ0FBQSxRQUFRLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUEsS0FBSztBQUNMLENBQUEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ3JDLENBQUEsSUFBSSxPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN2RSxDQUFBLEdBQUc7QUFDSCxDQUFBLENBQUMsQ0FBQyxDQUFDOztBQUVILENBQU8sU0FBUyxXQUFXLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRTtBQUNsRCxDQUFBLEVBQUUsT0FBTyxJQUFJLFdBQVcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDOUMsQ0FBQSxDQUFDOztDQzVITSxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ3RDLENBQUEsRUFBRSxPQUFPLEVBQUU7QUFDWCxDQUFBO0FBQ0EsQ0FBQSxJQUFJLFNBQVMsRUFBRSxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDO0FBQ25HLENBQUEsR0FBRztBQUNILENBQUEsRUFBRSxVQUFVLEVBQUUsVUFBVSxVQUFVLEVBQUUsT0FBTyxFQUFFO0FBQzdDLENBQUEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoRSxDQUFBLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ3ZCLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsV0FBVyxFQUFFLFlBQVk7QUFDM0IsQ0FBQTtBQUNBLENBQUEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFDbEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztBQUNwQyxDQUFBLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQzlCLENBQUEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7O0FBRTVCLENBQUEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUMzQixDQUFBLE1BQU0sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQzFCLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRTtBQUNoQyxDQUFBLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ25FLENBQUEsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckUsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDeEMsQ0FBQSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7QUFFcEUsQ0FBQSxNQUFNLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQzs7QUFFMUIsQ0FBQSxNQUFNLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLO0FBQ3BDLENBQUEsUUFBUSxLQUFLLGFBQWE7QUFDMUIsQ0FBQSxVQUFVLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5QixDQUFBLFVBQVUsTUFBTTtBQUNoQixDQUFBLFFBQVEsS0FBSyxZQUFZO0FBQ3pCLENBQUEsVUFBVSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUIsQ0FBQSxVQUFVLE1BQU07QUFDaEIsQ0FBQSxRQUFRLEtBQUssZ0JBQWdCO0FBQzdCLENBQUEsVUFBVSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFBLFVBQVUsTUFBTTtBQUNoQixDQUFBLFFBQVEsS0FBSyxtQkFBbUI7QUFDaEMsQ0FBQSxVQUFVLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUMsQ0FBQSxVQUFVLE1BQU07QUFDaEIsQ0FBQSxPQUFPOztBQUVQLENBQUE7QUFDQSxDQUFBLE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNqQyxDQUFBLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDcEQsQ0FBQSxVQUFVLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUMvQyxDQUFBLFNBQVM7O0FBRVQsQ0FBQSxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEQsQ0FBQSxPQUFPO0FBQ1AsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxLQUFLLEVBQUUsVUFBVSxPQUFPLEVBQUUsZUFBZSxFQUFFO0FBQzdDLENBQUEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxlQUFlLEVBQUU7QUFDN0MsQ0FBQSxNQUFNLElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRTtBQUNwQyxDQUFBLFFBQVEsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUM5RixDQUFBLFFBQVEsSUFBSSxjQUFjLEVBQUU7QUFDNUIsQ0FBQSxVQUFVLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQztBQUMvQyxDQUFBLFNBQVM7QUFDVCxDQUFBLE9BQU87QUFDUCxDQUFBLE1BQU0sSUFBSSxlQUFlLENBQUMsU0FBUyxFQUFFO0FBQ3JDLENBQUEsUUFBUSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdEUsQ0FBQSxRQUFRLElBQUksS0FBSyxFQUFFO0FBQ25CLENBQUEsVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RELENBQUEsVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hELENBQUEsU0FBUztBQUNULENBQUEsT0FBTztBQUNQLENBQUEsS0FBSztBQUNMLENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDeEIsQ0FBQSxHQUFHO0FBQ0gsQ0FBQSxDQUFDLENBQUMsQ0FBQzs7QUFFSCxDQUFPLFNBQVMsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUU7QUFDakQsQ0FBQSxFQUFFLE9BQU8sSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzdDLENBQUEsQ0FBQzs7Q0M5RU0sSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUN6QyxDQUFBLEVBQUUsT0FBTyxFQUFFO0FBQ1gsQ0FBQTtBQUNBLENBQUEsSUFBSSxZQUFZLEVBQUUsQ0FBQyxjQUFjLENBQUM7QUFDbEMsQ0FBQSxHQUFHO0FBQ0gsQ0FBQSxFQUFFLFVBQVUsRUFBRSxVQUFVLFVBQVUsRUFBRSxPQUFPLEVBQUU7QUFDN0MsQ0FBQSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hFLENBQUEsSUFBSSxJQUFJLFVBQVUsRUFBRTtBQUNwQixDQUFBLE1BQU0sSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUN6RSxDQUFBLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ3pCLENBQUEsS0FBSztBQUNMLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsV0FBVyxFQUFFLFlBQVk7QUFDM0IsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUMxQixDQUFBLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDekMsQ0FBQTtBQUNBLENBQUE7QUFDQSxDQUFBLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0FBQ3BDLENBQUEsT0FBTyxNQUFNO0FBQ2IsQ0FBQTtBQUNBLENBQUEsUUFBUSxLQUFLLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7QUFDaEQsQ0FBQSxVQUFVLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNoRSxDQUFBLFNBQVM7QUFDVCxDQUFBLE9BQU87QUFDUCxDQUFBLEtBQUs7O0FBRUwsQ0FBQTtBQUNBLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7QUFDMUIsQ0FBQSxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLO0FBQ2hDLENBQUE7QUFDQSxDQUFBLFVBQVUsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDM0UsQ0FBQSxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNqQyxDQUFBLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pFLENBQUEsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0UsQ0FBQSxPQUFPLE1BQU07QUFDYixDQUFBLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQ2xDLENBQUEsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDckMsQ0FBQSxPQUFPO0FBQ1AsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxLQUFLLEVBQUUsVUFBVSxPQUFPLEVBQUUsZUFBZSxFQUFFO0FBQzdDLENBQUEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxlQUFlLElBQUksZUFBZSxDQUFDLFNBQVMsRUFBRTtBQUMxRSxDQUFBLE1BQU0sSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3BFLENBQUEsTUFBTSxJQUFJLEtBQUssRUFBRTtBQUNqQixDQUFBLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4RCxDQUFBLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxRCxDQUFBLE9BQU87QUFDUCxDQUFBLEtBQUs7QUFDTCxDQUFBLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUEsR0FBRztBQUNILENBQUEsQ0FBQyxDQUFDLENBQUM7O0FBRUgsQ0FBTyxTQUFTLGFBQWEsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFO0FBQ3BELENBQUEsRUFBRSxPQUFPLElBQUksYUFBYSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoRCxDQUFBLENBQUM7O0NDckRNLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQ3JDLENBQUEsRUFBRSxPQUFPLEVBQUU7QUFDWCxDQUFBLElBQUksbUJBQW1CLEVBQUUsS0FBSztBQUM5QixDQUFBLElBQUksU0FBUyxFQUFFLElBQUk7QUFDbkIsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxVQUFVLEVBQUUsVUFBVSxZQUFZLEVBQUUsT0FBTyxFQUFFO0FBQy9DLENBQUEsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztBQUN0QyxDQUFBLElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7QUFDL0IsQ0FBQSxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLENBQUEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNyRixDQUFBLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3JDLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxlQUFlLEVBQUU7QUFDcEQsQ0FBQSxJQUFJLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNyQixDQUFBLElBQUksSUFBSSxlQUFlLEVBQUU7QUFDekIsQ0FBQSxNQUFNLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3ZELENBQUEsUUFBUSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5RCxDQUFBLE9BQU87QUFDUCxDQUFBLEtBQUs7QUFDTCxDQUFBLElBQUksT0FBTyxPQUFPLENBQUM7QUFDbkIsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxvQkFBb0IsRUFBRSxZQUFZO0FBQ3BDLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFO0FBQzFDLENBQUEsTUFBTSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUM5RSxDQUFBLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQzVDLENBQUEsS0FBSztBQUNMLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsVUFBVSxFQUFFLFVBQVUsVUFBVSxFQUFFO0FBQ3BDLENBQUEsSUFBSSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO0FBQ3hFLENBQUEsTUFBTSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztBQUNoQyxDQUFBLE1BQU0sT0FBTyxXQUFXLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNuRCxDQUFBLEtBQUs7QUFDTCxDQUFBLElBQUksSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtBQUN2QyxDQUFBLE1BQU0sT0FBTyxVQUFVLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNsRCxDQUFBLEtBQUs7QUFDTCxDQUFBLElBQUksSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtBQUN2QyxDQUFBLE1BQU0sT0FBTyxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNyRCxDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFVBQVUsRUFBRSxZQUFZO0FBQzFCLENBQUE7QUFDQSxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLG1CQUFtQixFQUFFLFVBQVUsS0FBSyxFQUFFO0FBQ3hDLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7QUFDNUIsQ0FBQSxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEUsQ0FBQSxLQUFLLE1BQU07QUFDWCxDQUFBLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRCxDQUFBLE1BQU0sS0FBSyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUNqRCxDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFlBQVksRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDM0MsQ0FBQSxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkMsQ0FBQSxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLEVBQUU7QUFDakMsQ0FBQTtBQUNBLENBQUEsTUFBTSxPQUFPLEdBQUcsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BGLENBQUEsS0FBSztBQUNMLENBQUE7QUFDQSxDQUFBLElBQUksT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxLQUFLLEVBQUUsVUFBVSxPQUFPLEVBQUU7QUFDNUIsQ0FBQSxJQUFJLElBQUksVUFBVSxDQUFDO0FBQ25CLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7QUFDdkMsQ0FBQSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzFELENBQUEsS0FBSztBQUNMLENBQUE7QUFDQSxDQUFBLElBQUksSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2QyxDQUFBLElBQUksSUFBSSxHQUFHLEVBQUU7QUFDYixDQUFBLE1BQU0sT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3JGLENBQUEsS0FBSyxNQUFNO0FBQ1gsQ0FBQTtBQUNBLENBQUEsTUFBTSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN4RSxDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFdBQVcsRUFBRSxVQUFVLE1BQU0sRUFBRSxVQUFVLEVBQUU7QUFDN0MsQ0FBQSxJQUFJLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUMxQixDQUFBLElBQUksSUFBSSxJQUFJLENBQUM7QUFDYixDQUFBO0FBQ0EsQ0FBQSxJQUFJLEtBQUssSUFBSSxJQUFJLE1BQU0sRUFBRTtBQUN6QixDQUFBLE1BQU0sSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3ZDLENBQUEsUUFBUSxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFDLENBQUEsT0FBTztBQUNQLENBQUEsS0FBSztBQUNMLENBQUE7QUFDQSxDQUFBLElBQUksSUFBSSxVQUFVLEVBQUU7QUFDcEIsQ0FBQSxNQUFNLEtBQUssSUFBSSxJQUFJLFVBQVUsRUFBRTtBQUMvQixDQUFBLFFBQVEsSUFBSSxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQzdDLENBQUEsVUFBVSxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hELENBQUEsU0FBUztBQUNULENBQUEsT0FBTztBQUNQLENBQUEsS0FBSztBQUNMLENBQUEsSUFBSSxPQUFPLFlBQVksQ0FBQztBQUN4QixDQUFBLEdBQUc7QUFDSCxDQUFBLENBQUMsQ0FBQyxDQUFDOztDQ3pHSSxJQUFJLGNBQWMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO0FBQzVDLENBQUEsRUFBRSxVQUFVLEVBQUUsVUFBVSxZQUFZLEVBQUUsT0FBTyxFQUFFO0FBQy9DLENBQUEsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNwRSxDQUFBLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0FBQ3pCLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsYUFBYSxFQUFFLFlBQVk7QUFDN0IsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUU7QUFDbkMsQ0FBQSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLENBQUEsS0FBSztBQUNMLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsVUFBVSxFQUFFLFlBQVk7QUFDMUIsQ0FBQSxJQUFJLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixDQUFBLEdBQUc7QUFDSCxDQUFBLENBQUMsQ0FBQyxDQUFDOztBQUVILENBQU8sU0FBUyxjQUFjLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRTtBQUN2RCxDQUFBLEVBQUUsT0FBTyxJQUFJLGNBQWMsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbkQsQ0FBQSxDQUFDOztDQ25CTSxJQUFJLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7QUFDakQsQ0FBQSxFQUFFLFVBQVUsRUFBRSxVQUFVLFlBQVksRUFBRSxPQUFPLEVBQUU7QUFDL0MsQ0FBQSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3BFLENBQUEsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO0FBQzNDLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsS0FBSyxzQkFBc0IsRUFBRTtBQUNqSCxDQUFBLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUM7QUFDdkUsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztBQUMxQixDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLGNBQWMsRUFBRSxZQUFZO0FBQzlCLENBQUEsSUFBSSxJQUFJLE1BQU0sQ0FBQztBQUNmLENBQUEsSUFBSSxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQzs7QUFFekQsQ0FBQSxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDOztBQUV2QixDQUFBO0FBQ0EsQ0FBQSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0RCxDQUFBLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUU7QUFDdkYsQ0FBQSxRQUFRLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUMxRSxDQUFBLE9BQU8sTUFBTTtBQUNiLENBQUEsUUFBUSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDeEQsQ0FBQSxPQUFPO0FBQ1AsQ0FBQSxNQUFNLE1BQU0sQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztBQUNoRCxDQUFBLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDakMsQ0FBQSxLQUFLO0FBQ0wsQ0FBQTtBQUNBLENBQUEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdkMsQ0FBQSxNQUFNLE9BQU8sQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFBLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0FBQ2hDLENBQUEsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ2pFLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsVUFBVSxFQUFFLFVBQVUsT0FBTyxFQUFFO0FBQ2pDLENBQUEsSUFBSSxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM5QyxDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7QUFDbEMsQ0FBQSxNQUFNLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDbkUsQ0FBQSxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxLQUFLLENBQUMsRUFBRTtBQUNoRCxDQUFBLFFBQVEsR0FBRyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUM7QUFDOUIsQ0FBQSxPQUFPLE1BQU07QUFDYixDQUFBLFFBQVEsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0FBQ25DLENBQUEsT0FBTztBQUNQLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRTtBQUM5QixDQUFBLE1BQU0sT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0FBQ2pDLENBQUEsS0FBSztBQUNMLENBQUEsSUFBSSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLENBQUEsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3hELENBQUEsTUFBTSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRTtBQUN0QyxDQUFBLFFBQVEsTUFBTTtBQUNkLENBQUEsT0FBTztBQUNQLENBQUEsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxDQUFBLEtBQUs7QUFDTCxDQUFBLElBQUksT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQSxHQUFHO0FBQ0gsQ0FBQSxDQUFDLENBQUMsQ0FBQzs7QUFFSCxDQUFPLFNBQVMsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRTtBQUM1RCxDQUFBLEVBQUUsT0FBTyxJQUFJLG1CQUFtQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4RCxDQUFBLENBQUM7O0NDN0RNLElBQUksbUJBQW1CLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztBQUNqRCxDQUFBLEVBQUUsVUFBVSxFQUFFLFVBQVUsWUFBWSxFQUFFLE9BQU8sRUFBRTtBQUMvQyxDQUFBLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDcEUsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7QUFDNUMsQ0FBQSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztBQUMxQixDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLGNBQWMsRUFBRSxZQUFZO0FBQzlCLENBQUEsSUFBSSxJQUFJLE1BQU0sQ0FBQztBQUNmLENBQUEsSUFBSSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDOztBQUV0RCxDQUFBO0FBQ0EsQ0FBQSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNsRCxDQUFBLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2xELENBQUEsTUFBTSxNQUFNLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDcEMsQ0FBQSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2pDLENBQUEsS0FBSztBQUNMLENBQUEsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztBQUNoQyxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFVBQVUsRUFBRSxVQUFVLE9BQU8sRUFBRTtBQUNqQyxDQUFBLElBQUksSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUMsQ0FBQTtBQUNBLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO0FBQ3hFLENBQUEsTUFBTSxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0QsQ0FBQSxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ2hCLENBQUEsUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBQ3hELENBQUEsUUFBUSxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDakUsQ0FBQSxRQUFRLElBQUksSUFBSSxFQUFFO0FBQ2xCLENBQUEsVUFBVSxHQUFHLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBQzFELENBQUEsU0FBUztBQUNULENBQUEsT0FBTztBQUNQLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztBQUNyQyxDQUFBLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN4RCxDQUFBO0FBQ0EsQ0FBQTtBQUNBLENBQUE7QUFDQSxDQUFBLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUU7QUFDdkMsQ0FBQSxRQUFRLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLENBQUEsT0FBTztBQUNQLENBQUE7QUFDQSxDQUFBLEtBQUs7QUFDTCxDQUFBLElBQUksT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQSxHQUFHO0FBQ0gsQ0FBQSxDQUFDLENBQUMsQ0FBQzs7QUFFSCxDQUFPLFNBQVMsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRTtBQUM1RCxDQUFBLEVBQUUsT0FBTyxJQUFJLG1CQUFtQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4RCxDQUFBLENBQUM7O0NDOUNELENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxZQUFZO0FBQzVDLENBQUEsRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFO0FBQ25DLENBQUEsSUFBSSxPQUFPO0FBQ1gsQ0FBQSxHQUFHO0FBQ0gsQ0FBQSxFQUFFLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDL0MsQ0FBQSxFQUFFLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0QsQ0FBQSxFQUFFLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckQsQ0FBQSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7O0FBRXpDLENBQUEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBRTtBQUMzQyxDQUFBLElBQUksSUFBSSxLQUFLLEVBQUU7QUFDZixDQUFBLE1BQU0sT0FBTztBQUNiLENBQUEsS0FBSyxDQUFDLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUU7QUFDNUMsQ0FBQSxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbkMsQ0FBQSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO0FBQzlCLENBQUEsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN6QyxDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQzs7QUFFWCxDQUFBLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLEdBQUcsRUFBRTtBQUM5QixDQUFBLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLENBQUEsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLENBQUEsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztBQUM5QixDQUFBLEdBQUcsQ0FBQzs7QUFFSixDQUFBLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLEdBQUcsRUFBRTtBQUNqQyxDQUFBLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JCLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7QUFDMUIsQ0FBQSxNQUFNLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDckQsQ0FBQSxNQUFNLEtBQUssSUFBSSxDQUFDLElBQUksV0FBVyxFQUFFO0FBQ2pDLENBQUEsUUFBUSxHQUFHLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLENBQUEsT0FBTztBQUNQLENBQUEsS0FBSztBQUNMLENBQUEsR0FBRyxDQUFDOztBQUVKLENBQUEsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVk7QUFDakMsQ0FBQSxJQUFJLGNBQWMsRUFBRSxDQUFDO0FBQ3JCLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7QUFDMUIsQ0FBQSxNQUFNLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDckQsQ0FBQSxNQUFNLEtBQUssSUFBSSxDQUFDLElBQUksV0FBVyxFQUFFO0FBQ2pDLENBQUEsUUFBUSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDckMsQ0FBQSxPQUFPO0FBQ1AsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxHQUFHLENBQUM7O0FBRUosQ0FBQSxFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxHQUFHLEVBQUU7QUFDdkMsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUMxQixDQUFBLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEMsQ0FBQSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDdEMsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxHQUFHLENBQUM7O0FBRUosQ0FBQSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZO0FBQ3ZDLENBQUEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUMzQixDQUFBLE1BQU0sSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDckMsQ0FBQTtBQUNBLENBQUEsTUFBTSxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQzs7QUFFL0IsQ0FBQSxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUN2QixDQUFBLFFBQVEsSUFBSSxhQUFhLEdBQUcsVUFBVSxPQUFPLEVBQUUsS0FBSyxFQUFFO0FBQ3RELENBQUEsVUFBVSxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUMzRSxDQUFBLFNBQVMsQ0FBQztBQUNWLENBQUEsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2xGLENBQUEsT0FBTztBQUNQLENBQUEsS0FBSztBQUNMLENBQUEsR0FBRyxDQUFDOztBQUVKLENBQUEsRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLFVBQVUsT0FBTyxFQUFFO0FBQzNDLENBQUEsSUFBSSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDOztBQUVsRSxDQUFBO0FBQ0EsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO0FBQ3RDLENBQUEsTUFBTSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUMzRSxDQUFBLE1BQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3ZELENBQUEsUUFBUSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7QUFFakMsQ0FBQSxRQUFRLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDOUMsQ0FBQTtBQUNBLENBQUEsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRTtBQUM3QyxDQUFBLFVBQVUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7O0FBRS9ELENBQUEsVUFBVSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM5QyxDQUFBLFVBQVUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDaEQsQ0FBQSxTQUFTOztBQUVULENBQUEsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ3hDLENBQUEsT0FBTztBQUNQLENBQUEsS0FBSztBQUNMLENBQUEsSUFBSSxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFBLEdBQUcsQ0FBQzs7QUFFSixDQUFBLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFVBQVUsV0FBVyxFQUFFO0FBQ25ELENBQUEsSUFBSSxJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDMUIsQ0FBQSxNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDdEIsQ0FBQSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLENBQUEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxDQUFBLElBQUksSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUMxQixDQUFBLElBQUksSUFBSSxFQUFFLENBQUM7QUFDWCxDQUFBLElBQUksSUFBSSxFQUFFLENBQUM7QUFDWCxDQUFBLElBQUksSUFBSSxDQUFDLENBQUM7O0FBRVYsQ0FBQSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO0FBQ3JELENBQUEsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFBLE1BQU0sU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQSxNQUFNLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUEsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLENBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLENBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLENBQUEsS0FBSztBQUNMLENBQUEsSUFBSSxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztBQUN0QixDQUFBLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFCLENBQUEsR0FBRyxDQUFDOztBQUVKLENBQUEsRUFBRSxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsT0FBTyxFQUFFLFFBQVEsRUFBRTtBQUNuRCxDQUFBLElBQUksT0FBTztBQUNYLENBQUEsTUFBTSxJQUFJLEVBQUUsU0FBUztBQUNyQixDQUFBLE1BQU0sVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO0FBQ3BDLENBQUEsTUFBTSxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7QUFDcEIsQ0FBQSxNQUFNLFFBQVEsRUFBRTtBQUNoQixDQUFBLFFBQVEsSUFBSSxFQUFFLE9BQU87QUFDckIsQ0FBQSxRQUFRLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsQ0FBQSxPQUFPO0FBQ1AsQ0FBQSxLQUFLLENBQUM7QUFDTixDQUFBLEdBQUcsQ0FBQzs7QUFFSixDQUFBLEVBQUUsSUFBSSxDQUFDLDRCQUE0QixHQUFHLFVBQVUsWUFBWSxFQUFFLFFBQVEsRUFBRTtBQUN4RSxDQUFBLElBQUksSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztBQUN6QyxDQUFBLElBQUksSUFBSSxZQUFZLEtBQUsscUJBQXFCLEVBQUU7QUFDaEQsQ0FBQSxNQUFNLElBQUksUUFBUSxDQUFDLG9CQUFvQixFQUFFO0FBQ3pDLENBQUEsUUFBUSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0FBQzVDLENBQUEsT0FBTztBQUNQLENBQUE7QUFDQSxDQUFBLE1BQU0sSUFBSSxRQUFRLENBQUMsZUFBZSxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFO0FBQ3ZFLENBQUEsUUFBUSxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNyRCxDQUFBLFFBQVEsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxFQUFFO0FBQ3ZFLENBQUEsVUFBVSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0FBQzlDLENBQUEsU0FBUztBQUNULENBQUEsT0FBTztBQUNQLENBQUEsS0FBSztBQUNMLENBQUEsR0FBRyxDQUFDOztBQUVKLENBQUEsRUFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsT0FBTyxFQUFFO0FBQzFDLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQztBQUNiLENBQUEsSUFBSSxJQUFJLFlBQVksR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQzs7QUFFcEQsQ0FBQSxJQUFJLElBQUksT0FBTyxHQUFHO0FBQ2xCLENBQUEsTUFBTSxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHO0FBQzNCLENBQUEsS0FBSyxDQUFDOztBQUVOLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO0FBQzVCLENBQUEsTUFBTSxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ3pDLENBQUEsS0FBSztBQUNMLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO0FBQzNCLENBQUEsTUFBTSxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3ZDLENBQUEsS0FBSztBQUNMLENBQUEsSUFBSSxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFO0FBQzFDLENBQUEsTUFBTSxPQUFPLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUM7QUFDbkUsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDNUIsQ0FBQSxNQUFNLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUNwRCxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLFFBQVEsWUFBWSxDQUFDLElBQUk7QUFDN0IsQ0FBQSxNQUFNLEtBQUssYUFBYTtBQUN4QixDQUFBLFFBQVEsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDOUUsQ0FBQSxRQUFRLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO0FBQzFDLENBQUEsVUFBVSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztBQUNuQyxDQUFBLFVBQVUsSUFBSSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2pFLENBQUEsVUFBVSxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RELENBQUEsVUFBVSxPQUFPLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBQzdDLENBQUEsU0FBUztBQUNULENBQUEsUUFBUSxJQUFJLEdBQUcsbUJBQW1CLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzFELENBQUEsUUFBUSxNQUFNO0FBQ2QsQ0FBQSxNQUFNLEtBQUssYUFBYTtBQUN4QixDQUFBLFFBQVEsSUFBSSxHQUFHLG1CQUFtQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMxRCxDQUFBLFFBQVEsTUFBTTtBQUNkLENBQUEsTUFBTTtBQUNOLENBQUEsUUFBUSxJQUFJLEdBQUcsY0FBYyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNyRCxDQUFBLEtBQUs7QUFDTCxDQUFBLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLENBQUEsR0FBRyxDQUFDO0FBQ0osQ0FBQSxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-vector-1.0.6.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,785 @@
+/* esri-leaflet-vector - v1.0.6 - Wed Jan 04 2017 15:02:16 GMT-0800 (PST)
+ * Copyright (c) 2017 Environmental Systems Research Institute, Inc.
+ * Apache-2.0 */
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet'), require('esri-leaflet')) :
+	typeof define === 'function' && define.amd ? define(['exports', 'leaflet', 'esri-leaflet'], factory) :
+	(factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.Vector = global.L.esri.Vector || {}),global.L,global.L.esri));
+}(this, function (exports,L$1,esriLeaflet) { 'use strict';
+
+	L$1 = 'default' in L$1 ? L$1['default'] : L$1;
+
+	var version = "1.0.6";
+
+	(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.mapboxgl = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+	"use strict";function Buffer(t){t?(this.array=t.array,this.pos=t.pos):(this.array=new ArrayBuffer(this.defaultLength),this.length=this.defaultLength,this.setupViews())}module.exports=Buffer,Buffer.prototype={pos:0,itemSize:4,defaultLength:8192,arrayType:"ARRAY_BUFFER",get index(){return this.pos/this.itemSize},setupViews:function(){this.ubytes=new Uint8Array(this.array),this.bytes=new Int8Array(this.array),this.ushorts=new Uint16Array(this.array),this.shorts=new Int16Array(this.array)},bind:function(t){var e=t[this.arrayType];this.buffer?t.bindBuffer(e,this.buffer):(this.buffer=t.createBuffer(),t.bindBuffer(e,this.buffer),t.bufferData(e,this.array.slice(0,this.pos),t.STATIC_DRAW),this.array=null)},destroy:function(t){this.buffer&&t.deleteBuffer(this.buffer)},resize:function(){if(this.length<this.pos+this.itemSize){for(;this.length<this.pos+this.itemSize;)this.length=2*Math.round(1.5*this.length/2);this.array=new ArrayBuffer(this.length);var t=new Uint8Array(this.array);t.set(this.ubytes),this.setupViews()}}};
+	},{}],2:[function(require,module,exports){
+	"use strict";var LineVertexBuffer=require("./line_vertex_buffer"),LineElementBuffer=require("./line_element_buffer"),FillVertexBuffer=require("./fill_vertex_buffer"),FillElementBuffer=require("./triangle_element_buffer"),OutlineElementBuffer=require("./outline_element_buffer"),GlyphVertexBuffer=require("./glyph_vertex_buffer"),GlyphElementBuffer=require("./triangle_element_buffer"),IconVertexBuffer=require("./icon_vertex_buffer"),IconElementBuffer=require("./triangle_element_buffer"),CollisionBoxVertexBuffer=require("./collision_box_vertex_buffer"),CircleVertexBuffer=require("./circle_vertex_buffer"),CircleElementBuffer=require("./triangle_element_buffer");module.exports=function(e){return e=e||{},{glyphVertex:new GlyphVertexBuffer(e.glyphVertex),glyphElement:new GlyphElementBuffer(e.glyphElement),iconVertex:new IconVertexBuffer(e.iconVertex),iconElement:new IconElementBuffer(e.iconElement),circleVertex:new CircleVertexBuffer(e.circleVertex),circleElement:new CircleElementBuffer(e.circleElement),fillVertex:new FillVertexBuffer(e.fillVertex),fillElement:new FillElementBuffer(e.fillElement),outlineElement:new OutlineElementBuffer(e.outlineElement),lineVertex:new LineVertexBuffer(e.lineVertex),lineElement:new LineElementBuffer(e.lineElement),collisionBoxVertex:new CollisionBoxVertexBuffer(e.collisionBoxVertex)}};
+	},{"./circle_vertex_buffer":3,"./collision_box_vertex_buffer":4,"./fill_vertex_buffer":5,"./glyph_vertex_buffer":6,"./icon_vertex_buffer":7,"./line_element_buffer":8,"./line_vertex_buffer":9,"./outline_element_buffer":10,"./triangle_element_buffer":11}],3:[function(require,module,exports){
+	"use strict";function CircleVertexBuffer(e){Buffer.call(this,e)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=CircleVertexBuffer,CircleVertexBuffer.prototype=util.inherit(Buffer,{defaultLength:32768,itemSize:4,add:function(e,t,i,r){var f=this.pos,s=f/2;this.resize(),this.shorts[s+0]=2*e+(i+1)/2,this.shorts[s+1]=2*t+(r+1)/2,this.pos+=this.itemSize},bind:function(e,t,i){Buffer.prototype.bind.call(this,e),e.vertexAttribPointer(t.a_pos,2,e.SHORT,!1,this.itemSize,i+0)}});
+	},{"../../util/util":106,"./buffer":1}],4:[function(require,module,exports){
+	"use strict";function CollisionBoxVertexBuffer(t){Buffer.call(this,t)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=CollisionBoxVertexBuffer,CollisionBoxVertexBuffer.prototype=util.inherit(Buffer,{itemSize:12,defaultLength:32768,add:function(t,i,e,r){var s=this.pos,o=s/2,u=this.index;return this.resize(),this.shorts[o+0]=t.x,this.shorts[o+1]=t.y,this.shorts[o+2]=Math.round(i.x),this.shorts[o+3]=Math.round(i.y),this.ubytes[s+8]=Math.floor(10*e),this.ubytes[s+9]=Math.floor(10*r),this.pos+=this.itemSize,u}});
+	},{"../../util/util":106,"./buffer":1}],5:[function(require,module,exports){
+	"use strict";function FillVertexBuffer(e){Buffer.call(this,e)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=FillVertexBuffer,FillVertexBuffer.prototype=util.inherit(Buffer,{itemSize:4,add:function(e,i){var t=this.pos/2;this.resize(),this.shorts[t+0]=e,this.shorts[t+1]=i,this.pos+=this.itemSize}});
+	},{"../../util/util":106,"./buffer":1}],6:[function(require,module,exports){
+	"use strict";function GlyphVertexBuffer(t){Buffer.call(this,t)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=GlyphVertexBuffer,GlyphVertexBuffer.prototype=util.inherit(Buffer,{defaultLength:32768,itemSize:16,add:function(t,e,r,i,s,h,o,f,u){var a=this.pos,l=a/2;this.resize(),this.shorts[l+0]=t,this.shorts[l+1]=e,this.shorts[l+2]=Math.round(64*r),this.shorts[l+3]=Math.round(64*i),this.ubytes[a+8]=Math.floor(s/4),this.ubytes[a+9]=Math.floor(h/4),this.ubytes[a+10]=Math.floor(10*u),this.ubytes[a+12]=Math.floor(10*o),this.ubytes[a+13]=Math.floor(10*Math.min(f,25)),this.pos+=this.itemSize},bind:function(t,e,r){Buffer.prototype.bind.call(this,t);var i=this.itemSize;t.vertexAttribPointer(e.a_pos,2,t.SHORT,!1,i,r+0),t.vertexAttribPointer(e.a_offset,2,t.SHORT,!1,i,r+4),t.vertexAttribPointer(e.a_data1,4,t.UNSIGNED_BYTE,!1,i,r+8),t.vertexAttribPointer(e.a_data2,2,t.UNSIGNED_BYTE,!1,i,r+12)}});
+	},{"../../util/util":106,"./buffer":1}],7:[function(require,module,exports){
+	"use strict";function IconVertexBuffer(t){Buffer.call(this,t)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=IconVertexBuffer,IconVertexBuffer.prototype=util.inherit(Buffer,{defaultLength:32768,itemSize:16,add:function(t,e,i,r,s,o,h,u,f){var a=this.pos,n=a/2;this.resize(),this.shorts[n+0]=t,this.shorts[n+1]=e,this.shorts[n+2]=Math.round(64*i),this.shorts[n+3]=Math.round(64*r),this.ubytes[a+8]=s/4,this.ubytes[a+9]=o/4,this.ubytes[a+10]=Math.floor(10*(f||0)),this.ubytes[a+12]=Math.floor(10*(h||0)),this.ubytes[a+13]=Math.floor(10*Math.min(u||25,25)),this.pos+=this.itemSize},bind:function(t,e,i){Buffer.prototype.bind.call(this,t);var r=this.itemSize;t.vertexAttribPointer(e.a_pos,2,t.SHORT,!1,r,i+0),t.vertexAttribPointer(e.a_offset,2,t.SHORT,!1,r,i+4),t.vertexAttribPointer(e.a_data1,4,t.UNSIGNED_BYTE,!1,r,i+8),t.vertexAttribPointer(e.a_data2,2,t.UNSIGNED_BYTE,!1,r,i+12)}});
+	},{"../../util/util":106,"./buffer":1}],8:[function(require,module,exports){
+	"use strict";function LineElementBuffer(e){Buffer.call(this,e)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=LineElementBuffer,LineElementBuffer.prototype=util.inherit(Buffer,{itemSize:6,arrayType:"ELEMENT_ARRAY_BUFFER",add:function(e,t,i){var r=this.pos/2;this.resize(),this.ushorts[r+0]=e,this.ushorts[r+1]=t,this.ushorts[r+2]=i,this.pos+=this.itemSize}});
+	},{"../../util/util":106,"./buffer":1}],9:[function(require,module,exports){
+	"use strict";function LineVertexBuffer(e){Buffer.call(this,e)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=LineVertexBuffer,LineVertexBuffer.extrudeScale=63,LineVertexBuffer.prototype=util.inherit(Buffer,{itemSize:8,defaultLength:32768,add:function(e,t,r,i,s){var u=this.pos,f=u/2,h=this.index,o=LineVertexBuffer.extrudeScale;return this.resize(),this.shorts[f+0]=2*Math.floor(e.x)|r,this.shorts[f+1]=2*Math.floor(e.y)|i,this.bytes[u+4]=Math.round(o*t.x),this.bytes[u+5]=Math.round(o*t.y),this.bytes[u+6]=(s||0)/128,this.bytes[u+7]=(s||0)%128,this.pos+=this.itemSize,h}});
+	},{"../../util/util":106,"./buffer":1}],10:[function(require,module,exports){
+	"use strict";function OutlineElementBuffer(e){Buffer.call(this,e)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=OutlineElementBuffer,OutlineElementBuffer.prototype=util.inherit(Buffer,{itemSize:4,arrayType:"ELEMENT_ARRAY_BUFFER",add:function(e,t){var i=this.pos/2;this.resize(),this.ushorts[i+0]=e,this.ushorts[i+1]=t,this.pos+=this.itemSize}});
+	},{"../../util/util":106,"./buffer":1}],11:[function(require,module,exports){
+	"use strict";function TriangleElementBuffer(e){Buffer.call(this,e)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=TriangleElementBuffer,TriangleElementBuffer.prototype=util.inherit(Buffer,{itemSize:6,arrayType:"ELEMENT_ARRAY_BUFFER",add:function(e,t,i){var r=this.pos/2;this.resize(),this.ushorts[r+0]=e,this.ushorts[r+1]=t,this.ushorts[r+2]=i,this.pos+=this.itemSize}});
+	},{"../../util/util":106,"./buffer":1}],12:[function(require,module,exports){
+	"use strict";function CircleBucket(e){this.buffers=e,this.elementGroups=new ElementGroups(e.circleVertex,e.circleElement)}var ElementGroups=require("./element_groups");module.exports=CircleBucket,CircleBucket.prototype.addFeatures=function(){for(var e=4096,r=0;r<this.features.length;r++)for(var t=this.features[r].loadGeometry()[0],s=0;s<t.length;s++){this.elementGroups.makeRoomFor(6);var u=t[s].x,i=t[s].y;if(!(0>u||u>=e||0>i||i>=e)){var l=this.buffers.circleVertex.index-this.elementGroups.current.vertexStartIndex;this.buffers.circleVertex.add(u,i,-1,-1),this.buffers.circleVertex.add(u,i,1,-1),this.buffers.circleVertex.add(u,i,1,1),this.buffers.circleVertex.add(u,i,-1,1),this.elementGroups.elementBuffer.add(l,l+1,l+2),this.elementGroups.elementBuffer.add(l,l+3,l+2),this.elementGroups.current.vertexLength+=4,this.elementGroups.current.elementLength+=2}}};
+	},{"./element_groups":14}],13:[function(require,module,exports){
+	"use strict";function createBucket(e,t,i,r,l){var c=new StyleDeclarationSet("layout",e.type,e.layout,{}).values(),a={lastIntegerZoom:1/0,lastIntegerZoomTime:0,lastZoom:0},u={};for(var o in c)u[o]=c[o].calculate(i,a);"symbol"===e.type&&(c["text-size"]&&(u["text-max-size"]=c["text-size"].calculate(18,a),u["text-size"]=c["text-size"].calculate(i+1,a)),c["icon-size"]&&(u["icon-max-size"]=c["icon-size"].calculate(18,a),u["icon-size"]=c["icon-size"].calculate(i+1,a)));var s="line"===e.type?LineBucket:"fill"===e.type?FillBucket:"symbol"===e.type?SymbolBucket:"circle"===e.type?CircleBucket:null,n=new s(t,new LayoutProperties[e.type](u),r,i,l);return n.id=e.id,n.type=e.type,n["source-layer"]=e["source-layer"],n.interactive=e.interactive,n.minZoom=e.minzoom,n.maxZoom=e.maxzoom,n.filter=featureFilter(e.filter),n.features=[],n}module.exports=createBucket;var LineBucket=require("./line_bucket"),FillBucket=require("./fill_bucket"),SymbolBucket=require("./symbol_bucket"),CircleBucket=require("./circle_bucket"),LayoutProperties=require("../style/layout_properties"),featureFilter=require("feature-filter"),StyleDeclarationSet=require("../style/style_declaration_set");
+	},{"../style/layout_properties":53,"../style/style_declaration_set":59,"./circle_bucket":12,"./fill_bucket":16,"./line_bucket":17,"./symbol_bucket":18,"feature-filter":108}],14:[function(require,module,exports){
+	"use strict";function ElementGroups(e,t,n){this.vertexBuffer=e,this.elementBuffer=t,this.secondElementBuffer=n,this.groups=[]}function ElementGroup(e,t,n){this.vertexStartIndex=e,this.elementStartIndex=t,this.secondElementStartIndex=n,this.elementLength=0,this.vertexLength=0,this.secondElementLength=0}module.exports=ElementGroups,ElementGroups.prototype.makeRoomFor=function(e){(!this.current||this.current.vertexLength+e>65535)&&(this.current=new ElementGroup(this.vertexBuffer.index,this.elementBuffer&&this.elementBuffer.index,this.secondElementBuffer&&this.secondElementBuffer.index),this.groups.push(this.current))};
+	},{}],15:[function(require,module,exports){
+	"use strict";function FeatureTree(t,e){this.x=t.x,this.y=t.y,this.z=t.z-Math.log(e)/Math.LN2,this.rtree=rbush(9),this.toBeInserted=[]}function geometryIntersectsBox(t,e,n){return"Point"===e?pointIntersectsBox(t,n):"LineString"===e?lineIntersectsBox(t,n):"Polygon"===e?polyIntersectsBox(t,n)||lineIntersectsBox(t,n):!1}function polyIntersectsBox(t,e){return polyContainsPoint(t,new Point(e[0],e[1]))||polyContainsPoint(t,new Point(e[0],e[3]))||polyContainsPoint(t,new Point(e[2],e[1]))||polyContainsPoint(t,new Point(e[2],e[3]))?!0:lineIntersectsBox(t,e)}function lineIntersectsBox(t,e){for(var n=0;n<t.length;n++)for(var r=t[n],o=0,i=r.length-1;o<r.length;i=o++){var s=r[o],a=r[i],u=new Point(s.y,s.x),l=new Point(a.y,a.x);if(segmentCrossesHorizontal(s,a,e[0],e[2],e[1])||segmentCrossesHorizontal(s,a,e[0],e[2],e[3])||segmentCrossesHorizontal(u,l,e[1],e[3],e[0])||segmentCrossesHorizontal(u,l,e[1],e[3],e[2]))return!0}return pointIntersectsBox(t,e)}function segmentCrossesHorizontal(t,e,n,r,o){if(e.y===t.y)return e.y===o&&Math.min(t.x,e.x)<=r&&Math.max(t.x,e.x)>=n;var i=(o-t.y)/(e.y-t.y),s=t.x+i*(e.x-t.x);return s>=n&&r>=s&&1>=i&&i>=0}function pointIntersectsBox(t,e){for(var n=0;n<t.length;n++)for(var r=t[n],o=0;o<r.length;o++)if(r[o].x>=e[0]&&r[o].y>=e[1]&&r[o].x<=e[2]&&r[o].y<=e[3])return!0;return!1}function geometryContainsPoint(t,e,n,r){return"Point"===e?pointContainsPoint(t,n,r):"LineString"===e?lineContainsPoint(t,n,r):"Polygon"===e?polyContainsPoint(t,n)||lineContainsPoint(t,n,r):!1}function distToSegmentSquared(t,e,n){var r=e.distSqr(n);if(0===r)return t.distSqr(e);var o=((t.x-e.x)*(n.x-e.x)+(t.y-e.y)*(n.y-e.y))/r;return 0>o?t.distSqr(e):o>1?t.distSqr(n):t.distSqr(n.sub(e)._mult(o)._add(e))}function lineContainsPoint(t,e,n){for(var r=n*n,o=0;o<t.length;o++)for(var i=t[o],s=1;s<i.length;s++){var a=i[s-1],u=i[s];if(distToSegmentSquared(e,a,u)<r)return!0}return!1}function polyContainsPoint(t,e){for(var n,r,o,i=!1,s=0;s<t.length;s++){n=t[s];for(var a=0,u=n.length-1;a<n.length;u=a++)r=n[a],o=n[u],r.y>e.y!=o.y>e.y&&e.x<(o.x-r.x)*(e.y-r.y)/(o.y-r.y)+r.x&&(i=!i)}return i}function pointContainsPoint(t,e,n){for(var r=n*n,o=0;o<t.length;o++)for(var i=t[o],s=0;s<i.length;s++)if(i[s].distSqr(e)<=r)return!0;return!1}var rbush=require("rbush"),Point=require("point-geometry"),vt=require("vector-tile"),util=require("../util/util");module.exports=FeatureTree,FeatureTree.prototype.insert=function(t,e,n){t.layers=e,t.feature=n,this.toBeInserted.push(t)},FeatureTree.prototype._load=function(){this.rtree.load(this.toBeInserted),this.toBeInserted=[]},FeatureTree.prototype.query=function(t,e){this.toBeInserted.length&&this._load();var n,r,o=t.params||{},i=t.x,s=t.y,a=[];"undefined"!=typeof i&&"undefined"!=typeof s?(n=(o.radius||0)*(t.tileExtent||4096)/t.scale,r=[i-n,s-n,i+n,s+n]):r=[t.minX,t.minY,t.maxX,t.maxY];for(var u=this.rtree.search(r),l=0;l<u.length;l++){var y=u[l].feature,x=u[l].layers,f=vt.VectorTileFeature.types[y.type];if((!o.$type||f===o.$type)&&(!n||geometryContainsPoint(y.loadGeometry(),f,new Point(i,s),n))&&geometryIntersectsBox(y.loadGeometry(),f,r)){var h=y.toGeoJSON(this.x,this.y,this.z);o.includeGeometry||(h.geometry=null);for(var d=0;d<x.length;d++){var g=x[d];o.layerIds&&o.layerIds.indexOf(g)<0||a.push(util.extend({layer:g},h))}}}e(null,a)};
+	},{"../util/util":106,"point-geometry":137,"rbush":139,"vector-tile":144}],16:[function(require,module,exports){
+	"use strict";function FillBucket(e){this.buffers=e,this.elementGroups=new ElementGroups(e.fillVertex,e.fillElement,e.outlineElement)}var ElementGroups=require("./element_groups");module.exports=FillBucket,FillBucket.prototype.addFeatures=function(){for(var e=this.features,t=0;t<e.length;t++){var l=e[t],r=l.loadGeometry();r&&this.addFeature(r)}},FillBucket.prototype.addFeature=function(e){for(var t=0;t<e.length;t++)this.addFill(e[t])},FillBucket.prototype.addFill=function(e){if(!(e.length<3)){var t=e.length;this.elementGroups.makeRoomFor(t+1);for(var l,r,n,i=this.elementGroups.current,o=this.buffers.fillVertex,u=this.buffers.fillElement,s=this.buffers.outlineElement,d=o.index-i.vertexStartIndex,a=0;a<e.length;a++)r=o.index-i.vertexStartIndex,n=e[a],o.add(n.x,n.y),i.vertexLength++,a>=2&&(n.x!==e[0].x||n.y!==e[0].y)&&(u.add(d,l,r),i.elementLength++),a>=1&&(s.add(l,r),i.secondElementLength++),l=r}};
+	},{"./element_groups":14}],17:[function(require,module,exports){
+	"use strict";function LineBucket(e,t){this.buffers=e,this.elementGroups=new ElementGroups(e.lineVertex,e.lineElement),this.layoutProperties=t}var ElementGroups=require("./element_groups");module.exports=LineBucket,LineBucket.prototype.addFeatures=function(){for(var e=this.features,t=0;t<e.length;t++){var r=e[t],i=r.loadGeometry();i&&this.addFeature(i)}},LineBucket.prototype.addFeature=function(e){for(var t=this.layoutProperties,r=0;r<e.length;r++)this.addLine(e[r],t["line-join"],t["line-cap"],t["line-miter-limit"],t["line-round-limit"])},LineBucket.prototype.addLine=function(e,t,r,i,s){for(var n=e.length;n>2&&e[n-1].equals(e[n-2]);)n--;if(!(e.length<2)){"bevel"===t&&(i=1.05);var u=e[0],h=e[n-1],d=u.equals(h);if(this.elementGroups.makeRoomFor(10*n),2!==n||!d){var a,l,o,f,m,p,x,v=r,c=d?"butt":r,V=1,b=0,_=!0;this.e1=this.e2=this.e3=-1,d&&(a=e[n-2],m=u.sub(a)._unit()._perp());for(var y=0;n>y;y++)if(o=d&&y===n-1?e[1]:e[y+1],!o||!e[y].equals(o)){m&&(f=m),a&&(l=a),a=e[y],l&&(b+=a.dist(l)),m=o?o.sub(a)._unit()._perp():f,f=f||m;var L=f.add(m)._unit(),C=L.x*m.x+L.y*m.y,g=1/C,k=l&&o,G=k?t:o?v:c;if(k&&"round"===G&&(s>g?G="miter":2>=g&&(G="fakeround")),"miter"===G&&g>i&&(G="bevel"),"bevel"===G&&(g>2&&(G="flipbevel"),i>g&&(G="miter")),"miter"===G)L._mult(g),this.addCurrentVertex(a,V,b,L,0,0,!1);else if("flipbevel"===G){if(g>100)L=m.clone();else{var B=f.x*m.y-f.y*m.x>0?-1:1,q=g*f.add(m).mag()/f.sub(m).mag();L._perp()._mult(q*B)}this.addCurrentVertex(a,V,b,L,0,0,!1),V=-V}else if("bevel"===G||"fakeround"===G){var P=V*(f.x*m.y-f.y*m.x)>0,S=-Math.sqrt(g*g-1);if(P?(x=0,p=S):(p=0,x=S),_||this.addCurrentVertex(a,V,b,f,p,x,!1),"fakeround"===G){for(var E,F=Math.floor(8*(.5-(C-.5))),I=0;F>I;I++)E=m.mult((I+1)/(F+1))._add(f)._unit(),this.addPieSliceVertex(a,V,b,E,P);this.addPieSliceVertex(a,V,b,L,P);for(var M=F-1;M>=0;M--)E=f.mult((M+1)/(F+1))._add(m)._unit(),this.addPieSliceVertex(a,V,b,E,P)}o&&this.addCurrentVertex(a,V,b,m,-p,-x,!1)}else"butt"===G?(_||this.addCurrentVertex(a,V,b,f,0,0,!1),o&&this.addCurrentVertex(a,V,b,m,0,0,!1)):"square"===G?(_||(this.addCurrentVertex(a,V,b,f,1,1,!1),this.e1=this.e2=-1,V=1),o&&this.addCurrentVertex(a,V,b,m,-1,-1,!1)):"round"===G&&(_||(this.addCurrentVertex(a,V,b,f,0,0,!1),this.addCurrentVertex(a,V,b,f,1,1,!0),this.e1=this.e2=-1,V=1),o&&(this.addCurrentVertex(a,V,b,m,-1,-1,!0),this.addCurrentVertex(a,V,b,m,0,0,!1)));_=!1}}}},LineBucket.prototype.addCurrentVertex=function(e,t,r,i,s,n,u){var h,d=u?1:0,a=this.buffers.lineVertex,l=this.buffers.lineElement,o=this.elementGroups.current,f=this.elementGroups.current.vertexStartIndex;h=i.mult(t),s&&h._sub(i.perp()._mult(s)),this.e3=a.add(e,h,d,0,r)-f,this.e1>=0&&this.e2>=0&&(l.add(this.e1,this.e2,this.e3),o.elementLength++),this.e1=this.e2,this.e2=this.e3,h=i.mult(-t),n&&h._sub(i.perp()._mult(n)),this.e3=a.add(e,h,d,1,r)-f,this.e1>=0&&this.e2>=0&&(l.add(this.e1,this.e2,this.e3),o.elementLength++),this.e1=this.e2,this.e2=this.e3,o.vertexLength+=2},LineBucket.prototype.addPieSliceVertex=function(e,t,r,i,s){var n=this.buffers.lineVertex,u=this.buffers.lineElement,h=this.elementGroups.current,d=this.elementGroups.current.vertexStartIndex,a=s;i=i.mult(t*(s?-1:1)),this.e3=n.add(e,i,0,a,r)-d,h.vertexLength+=1,this.e1>=0&&this.e2>=0&&(u.add(this.e1,this.e2,this.e3),h.elementLength++),s?this.e2=this.e3:this.e1=this.e3};
+	},{"./element_groups":14}],18:[function(require,module,exports){
+	"use strict";function SymbolBucket(e,t,o,i,s){this.buffers=e,this.layoutProperties=t,this.overscaling=o,this.zoom=i,this.collisionDebug=s;var n=512*o,a=4096;this.tilePixelRatio=a/n,this.compareText={},this.symbolInstances=[]}function SymbolInstance(e,t,o,i,s,n,a,l,r,c,h,u){this.x=e.x,this.y=e.y,this.hasText=!!o,this.hasIcon=!!i,this.hasText&&(this.glyphQuads=n?getGlyphQuads(e,o,a,t,s,r):[],this.textCollisionFeature=new CollisionFeature(t,e,o,a,l,r)),this.hasIcon&&(this.iconQuads=n?getIconQuads(e,i,c,t,s,u):[],this.iconCollisionFeature=new CollisionFeature(t,e,i,c,h,u))}var ElementGroups=require("./element_groups"),Anchor=require("../symbol/anchor"),getAnchors=require("../symbol/get_anchors"),resolveTokens=require("../util/token"),Quads=require("../symbol/quads"),Shaping=require("../symbol/shaping"),resolveText=require("../symbol/resolve_text"),resolveIcons=require("../symbol/resolve_icons"),mergeLines=require("../symbol/mergelines"),shapeText=Shaping.shapeText,shapeIcon=Shaping.shapeIcon,getGlyphQuads=Quads.getGlyphQuads,getIconQuads=Quads.getIconQuads,clipLine=require("../symbol/clip_line"),Point=require("point-geometry"),CollisionFeature=require("../symbol/collision_feature");module.exports=SymbolBucket,SymbolBucket.prototype.needsPlacement=!0,SymbolBucket.prototype.addFeatures=function(e){var t=this.layoutProperties,o=this.features,i=this.textFeatures,s=.5,n=.5;switch(t["text-anchor"]){case"right":case"top-right":case"bottom-right":s=1;break;case"left":case"top-left":case"bottom-left":s=0}switch(t["text-anchor"]){case"bottom":case"bottom-right":case"bottom-left":n=1;break;case"top":case"top-right":case"top-left":n=0}for(var a="right"===t["text-justify"]?1:"left"===t["text-justify"]?0:.5,l=24,r=t["text-line-height"]*l,c="line"!==t["symbol-placement"]?t["text-max-width"]*l:0,h=t["text-letter-spacing"]*l,u=[t["text-offset"][0]*l,t["text-offset"][1]*l],m=t["text-font"].join(","),p=[],x=0;x<o.length;x++)p.push(o[x].loadGeometry());if("line"===t["symbol-placement"]){var y=mergeLines(o,i,p);p=y.geometries,o=y.features,i=y.textFeatures}for(var d,g,f=0;f<o.length;f++)if(p[f]){if(d=i[f]?shapeText(i[f],this.stacks[m],c,r,s,n,a,h,u):null,t["icon-image"]){var b=resolveTokens(o[f].properties,t["icon-image"]),v=this.icons[b];g=shapeIcon(v,t),v&&(void 0===this.sdfIcons?this.sdfIcons=v.sdf:this.sdfIcons!==v.sdf&&console.warn("Style sheet warning: Cannot mix SDF and non-SDF icons in one bucket"))}else g=null;(d||g)&&this.addFeature(p[f],d,g)}this.placeFeatures(e,this.buffers,this.collisionDebug)},SymbolBucket.prototype.addFeature=function(e,t,o){var i=this.layoutProperties,s=24,n=i["text-size"]/s,a=this.tilePixelRatio*n,l=this.tilePixelRatio*i["text-max-size"]/s,r=this.tilePixelRatio*i["icon-size"],c=this.tilePixelRatio*i["symbol-spacing"],h=i["symbol-avoid-edges"],u=i["text-padding"]*this.tilePixelRatio,m=i["icon-padding"]*this.tilePixelRatio,p=i["text-max-angle"]/180*Math.PI,x="map"===i["text-rotation-alignment"]&&"line"===i["symbol-placement"],y="map"===i["icon-rotation-alignment"]&&"line"===i["symbol-placement"],d=i["text-allow-overlap"]||i["icon-allow-overlap"]||i["text-ignore-placement"]||i["icon-ignore-placement"],g="line"===i["symbol-placement"],f=c/2;g&&(e=clipLine(e,0,0,4096,4096));for(var b=0;b<e.length;b++)for(var v=e[b],I=g?getAnchors(v,c,p,t,o,s,l,this.overscaling):[new Anchor(v[0].x,v[0].y,0)],S=0,F=I.length;F>S;S++){var P=I[S];if(!(t&&g&&this.anchorIsTooClose(t.text,f,P))){var M=!(P.x<0||P.x>4096||P.y<0||P.y>4096);if(!h||M){var k=M||d;this.symbolInstances.push(new SymbolInstance(P,v,t,o,i,k,a,u,x,r,m,y))}}}},SymbolBucket.prototype.anchorIsTooClose=function(e,t,o){var i=this.compareText;if(e in i){for(var s=i[e],n=s.length-1;n>=0;n--)if(o.dist(s[n])<t)return!0}else i[e]=[];return i[e].push(o),!1},SymbolBucket.prototype.placeFeatures=function(e,t,o){this.buffers=t;var i=this.elementGroups={text:new ElementGroups(t.glyphVertex,t.glyphElement),icon:new ElementGroups(t.iconVertex,t.iconElement),sdfIcons:this.sdfIcons},s=this.layoutProperties,n=e.maxScale;i.text["text-size"]=s["text-size"],i.icon["icon-size"]=s["icon-size"];var a="map"===s["text-rotation-alignment"]&&"line"===s["symbol-placement"],l="map"===s["icon-rotation-alignment"]&&"line"===s["symbol-placement"],r=s["text-allow-overlap"]||s["icon-allow-overlap"]||s["text-ignore-placement"]||s["icon-ignore-placement"];if(r){var c=e.angle,h=Math.sin(c),u=Math.cos(c);this.symbolInstances.sort(function(e,t){var o=h*e.x+u*e.y,i=h*t.x+u*t.y;return i-o})}for(var m=0;m<this.symbolInstances.length;m++){var p=this.symbolInstances[m],x=p.hasText,y=p.hasIcon,d=s["text-optional"]||!x,g=s["icon-optional"]||!y,f=x&&!s["text-allow-overlap"]?e.placeCollisionFeature(p.textCollisionFeature):e.minScale,b=y&&!s["icon-allow-overlap"]?e.placeCollisionFeature(p.iconCollisionFeature):e.minScale;d||g?!g&&f?f=Math.max(b,f):!d&&b&&(b=Math.max(b,f)):b=f=Math.max(b,f),x&&(s["text-ignore-placement"]||e.insertCollisionFeature(p.textCollisionFeature,f),n>=f&&this.addSymbols(t.glyphVertex,t.glyphElement,i.text,p.glyphQuads,f,s["text-keep-upright"],a,e.angle)),y&&(s["icon-ignore-placement"]||e.insertCollisionFeature(p.iconCollisionFeature,b),n>=b&&this.addSymbols(t.iconVertex,t.iconElement,i.icon,p.iconQuads,b,s["icon-keep-upright"],l,e.angle))}o&&this.addToDebugBuffers(e)},SymbolBucket.prototype.addSymbols=function(e,t,o,i,s,n,a,l){o.makeRoomFor(4*i.length);for(var r=o.current,c=this.zoom,h=Math.max(Math.log(s)/Math.LN2+c,0),u=0;u<i.length;u++){var m=i[u],p=m.angle,x=(p+l+Math.PI)%(2*Math.PI);if(!(n&&a&&(x<=Math.PI/2||x>3*Math.PI/2))){var y=m.tl,d=m.tr,g=m.bl,f=m.br,b=m.tex,v=m.anchorPoint,I=Math.max(c+Math.log(m.minScale)/Math.LN2,h),S=Math.min(c+Math.log(m.maxScale)/Math.LN2,25);if(!(I>=S)){I===h&&(I=0);var F=e.index-r.vertexStartIndex;e.add(v.x,v.y,y.x,y.y,b.x,b.y,I,S,h),e.add(v.x,v.y,d.x,d.y,b.x+b.w,b.y,I,S,h),e.add(v.x,v.y,g.x,g.y,b.x,b.y+b.h,I,S,h),e.add(v.x,v.y,f.x,f.y,b.x+b.w,b.y+b.h,I,S,h),r.vertexLength+=4,t.add(F,F+1,F+2),t.add(F+1,F+2,F+3),r.elementLength+=2}}}},SymbolBucket.prototype.getDependencies=function(e,t,o){function i(e){return e||s?o(e):void(s=!0)}var s=!1;this.getTextDependencies(e,t,i),this.getIconDependencies(e,t,i)},SymbolBucket.prototype.getIconDependencies=function(e,t,o){function i(e,t){return e?o(e):(this.icons=t,void o())}if(this.layoutProperties["icon-image"]){var s=this.features,n=resolveIcons(s,this.layoutProperties);n.length?t.send("get icons",{icons:n},i.bind(this)):o()}else o()},SymbolBucket.prototype.getTextDependencies=function(e,t,o){var i=this.features,s=this.layoutProperties["text-font"],n=this.stacks=e.stacks;void 0===n[s]&&(n[s]={});var a=n[s],l=resolveText(i,this.layoutProperties,a);this.textFeatures=l.textFeatures,t.send("get glyphs",{uid:e.uid,fontstack:s,codepoints:l.codepoints},function(e,t){if(e)return o(e);for(var i in t)a[i]=t[i];o()})},SymbolBucket.prototype.addToDebugBuffers=function(e){this.elementGroups.collisionBox=new ElementGroups(this.buffers.collisionBoxVertex),this.elementGroups.collisionBox.makeRoomFor(0);for(var t=this.buffers.collisionBoxVertex,o=-e.angle,i=e.yStretch,s=0;s<this.symbolInstances.length;s++)for(var n=0;2>n;n++){var a=this.symbolInstances[s][0===n?"textCollisionFeature":"iconCollisionFeature"];if(a)for(var l=a.boxes,r=0;r<l.length;r++){var c=l[r],h=c.anchorPoint,u=new Point(c.x1,c.y1*i)._rotate(o),m=new Point(c.x2,c.y1*i)._rotate(o),p=new Point(c.x1,c.y2*i)._rotate(o),x=new Point(c.x2,c.y2*i)._rotate(o),y=Math.max(0,Math.min(25,this.zoom+Math.log(c.maxScale)/Math.LN2)),d=Math.max(0,Math.min(25,this.zoom+Math.log(c.placementScale)/Math.LN2));t.add(h,u,y,d),t.add(h,m,y,d),t.add(h,m,y,d),t.add(h,x,y,d),t.add(h,x,y,d),t.add(h,p,y,d),t.add(h,p,y,d),t.add(h,u,y,d),this.elementGroups.collisionBox.current.vertexLength+=8}}};
+	},{"../symbol/anchor":62,"../symbol/clip_line":65,"../symbol/collision_feature":67,"../symbol/get_anchors":69,"../symbol/mergelines":72,"../symbol/quads":73,"../symbol/resolve_icons":74,"../symbol/resolve_text":75,"../symbol/shaping":76,"../util/token":105,"./element_groups":14,"point-geometry":137}],19:[function(require,module,exports){
+	"use strict";function Coordinate(o,t,n){this.column=o,this.row=t,this.zoom=n}module.exports=Coordinate,Coordinate.prototype={clone:function(){return new Coordinate(this.column,this.row,this.zoom)},zoomTo:function(o){return this.clone()._zoomTo(o)},sub:function(o){return this.clone()._sub(o)},_zoomTo:function(o){var t=Math.pow(2,o-this.zoom);return this.column*=t,this.row*=t,this.zoom=o,this},_sub:function(o){return o=o.zoomTo(this.zoom),this.column-=o.column,this.row-=o.row,this}};
+	},{}],20:[function(require,module,exports){
+	"use strict";function LngLat(t,n){if(isNaN(t)||isNaN(n))throw new Error("Invalid LngLat object: ("+t+", "+n+")");if(this.lng=+t,this.lat=+n,this.lat>90||this.lat<-90)throw new Error("Invalid LngLat latitude value: must be between -90 and 90")}module.exports=LngLat;var wrap=require("../util/util").wrap;LngLat.prototype.wrap=function(){return new LngLat(wrap(this.lng,-180,180),this.lat)},LngLat.convert=function(t){return t instanceof LngLat?t:Array.isArray(t)?new LngLat(t[0],t[1]):t};
+	},{"../util/util":106}],21:[function(require,module,exports){
+	"use strict";function LngLatBounds(t,n){if(t)for(var e=n?[t,n]:t,s=0,i=e.length;i>s;s++)this.extend(e[s])}module.exports=LngLatBounds;var LngLat=require("./lng_lat");LngLatBounds.prototype={extend:function(t){var n,e,s=this._sw,i=this._ne;if(t instanceof LngLat)n=t,e=t;else{if(!(t instanceof LngLatBounds))return t?this.extend(LngLat.convert(t)||LngLatBounds.convert(t)):this;if(n=t._sw,e=t._ne,!n||!e)return this}return s||i?(s.lng=Math.min(n.lng,s.lng),s.lat=Math.min(n.lat,s.lat),i.lng=Math.max(e.lng,i.lng),i.lat=Math.max(e.lat,i.lat)):(this._sw=new LngLat(n.lng,n.lat),this._ne=new LngLat(e.lng,e.lat)),this},getCenter:function(){return new LngLat((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)},getSouthWest:function(){return this._sw},getNorthEast:function(){return this._ne},getNorthWest:function(){return new LngLat(this.getWest(),this.getNorth())},getSouthEast:function(){return new LngLat(this.getEast(),this.getSouth())},getWest:function(){return this._sw.lng},getSouth:function(){return this._sw.lat},getEast:function(){return this._ne.lng},getNorth:function(){return this._ne.lat}},LngLatBounds.convert=function(t){return!t||t instanceof LngLatBounds?t:new LngLatBounds(t)};
+	},{"./lng_lat":20}],22:[function(require,module,exports){
+	"use strict";function Transform(t,i){this.tileSize=512,this._minZoom=t||0,this._maxZoom=i||22,this.latRange=[-85.05113,85.05113],this.width=0,this.height=0,this.zoom=0,this.center=new LngLat(0,0),this.angle=0,this._altitude=1.5,this._pitch=0}var LngLat=require("./lng_lat"),Point=require("point-geometry"),Coordinate=require("./coordinate"),wrap=require("../util/util").wrap,interp=require("../util/interpolate"),vec4=require("gl-matrix").vec4,mat4=require("gl-matrix").mat4;module.exports=Transform,Transform.prototype={get minZoom(){return this._minZoom},set minZoom(t){this._minZoom=t,this.zoom=Math.max(this.zoom,t)},get maxZoom(){return this._maxZoom},set maxZoom(t){this._maxZoom=t,this.zoom=Math.min(this.zoom,t)},get worldSize(){return this.tileSize*this.scale},get centerPoint(){return this.size._div(2)},get size(){return new Point(this.width,this.height)},get bearing(){return-this.angle/Math.PI*180},set bearing(t){this.angle=-wrap(t,-180,180)*Math.PI/180},get pitch(){return this._pitch/Math.PI*180},set pitch(t){this._pitch=Math.min(60,t)/180*Math.PI},get altitude(){return this._altitude},set altitude(t){this._altitude=Math.max(.75,t)},get zoom(){return this._zoom},set zoom(t){t=Math.min(Math.max(t,this.minZoom),this.maxZoom),this._zoom=t,this.scale=this.zoomScale(t),this.tileZoom=Math.floor(t),this.zoomFraction=t-this.tileZoom,this._constrain()},get center(){return this._center},set center(t){this._center=t,this._constrain()},zoomScale:function(t){return Math.pow(2,t)},scaleZoom:function(t){return Math.log(t)/Math.LN2},project:function(t,i){return new Point(this.lngX(t.lng,i),this.latY(t.lat,i))},unproject:function(t,i){return new LngLat(this.xLng(t.x,i),this.yLat(t.y,i))},get x(){return this.lngX(this.center.lng)},get y(){return this.latY(this.center.lat)},get point(){return new Point(this.x,this.y)},lngX:function(t,i){return(180+t)*(i||this.worldSize)/360},latY:function(t,i){var n=180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360));return(180-n)*(i||this.worldSize)/360},xLng:function(t,i){return 360*t/(i||this.worldSize)-180},yLat:function(t,i){var n=180-360*t/(i||this.worldSize);return 360/Math.PI*Math.atan(Math.exp(n*Math.PI/180))-90},panBy:function(t){var i=this.centerPoint._add(t);this.center=this.pointLocation(i)},setLocationAtPoint:function(t,i){var n=this.locationCoordinate(t),o=this.pointCoordinate(i),e=this.pointCoordinate(this.centerPoint),a=o._sub(n);this.center=this.coordinateLocation(e._sub(a))},setZoomAround:function(t,i){var n;i&&(n=this.locationPoint(i)),this.zoom=t,i&&this.setLocationAtPoint(i,n)},setBearingAround:function(t,i){var n;i&&(n=this.locationPoint(i)),this.bearing=t,i&&this.setLocationAtPoint(i,n)},locationPoint:function(t){return this.coordinatePoint(this.locationCoordinate(t))},pointLocation:function(t){return this.coordinateLocation(this.pointCoordinate(t))},locationCoordinate:function(t){var i=this.zoomScale(this.tileZoom)/this.worldSize,n=LngLat.convert(t);return new Coordinate(this.lngX(n.lng)*i,this.latY(n.lat)*i,this.tileZoom)},coordinateLocation:function(t){var i=this.zoomScale(t.zoom);return new LngLat(this.xLng(t.column,i),this.yLat(t.row,i))},pointCoordinate:function(t,i){void 0===i&&(i=0);var n=this.coordinatePointMatrix(this.tileZoom),o=mat4.invert(new Float64Array(16),n);if(!o)throw new Error("failed to invert matrix");var e=vec4.transformMat4([],[t.x,t.y,0,1],o),a=vec4.transformMat4([],[t.x,t.y,1,1],o),r=e[3],h=a[3],s=e[0]/r,c=a[0]/h,u=e[1]/r,l=a[1]/h,m=e[2]/r,g=a[2]/h,f=m===g?0:(i-m)/(g-m);return new Coordinate(interp(s,c,f),interp(u,l,f),this.tileZoom)},coordinatePoint:function(t){var i=this.coordinatePointMatrix(t.zoom),n=vec4.transformMat4([],[t.column,t.row,0,1],i);return new Point(n[0]/n[3],n[1]/n[3])},coordinatePointMatrix:function(t){var i=this.getProjMatrix(),n=this.worldSize/this.zoomScale(t);return mat4.scale(i,i,[n,n,1]),mat4.multiply(i,this.getPixelMatrix(),i),i},getPixelMatrix:function(){var t=mat4.create();return mat4.scale(t,t,[this.width/2,-this.height/2,1]),mat4.translate(t,t,[1,-1,0]),t},_constrain:function(){if(this.center&&this.width&&this.height&&!this._constraining){this._constraining=!0;var t,i,n,o,e,a,r,h,s=this.size;this.latRange&&(t=this.latY(this.latRange[1]),i=this.latY(this.latRange[0]),e=i-t<s.y?s.y/(i-t):0),this.lngRange&&(n=this.lngX(this.lngRange[0]),o=this.lngX(this.lngRange[1]),a=o-n<s.x?s.x/(o-n):0);var c=Math.max(a||0,e||0);if(c)return this.center=this.unproject(new Point(a?(o+n)/2:this.x,e?(i+t)/2:this.y)),this.zoom+=this.scaleZoom(c),void(this._constraining=!1);if(this.latRange){var u=this.y,l=s.y/2;t>u-l&&(h=t+l),u+l>i&&(h=i-l)}if(this.lngRange){var m=this.x,g=s.x/2;n>m-g&&(r=n+g),m+g>o&&(r=o-g)}(void 0!==r||void 0!==h)&&(this.center=this.unproject(new Point(void 0!==r?r:this.x,void 0!==h?h:this.y))),this._constraining=!1}},getProjMatrix:function(){var t=new Float64Array(16),i=Math.atan(.5/this.altitude),n=Math.sin(i)*this.altitude/Math.sin(Math.PI/2-this._pitch-i),o=Math.cos(Math.PI/2-this._pitch)*n+this.altitude;return mat4.perspective(t,2*Math.atan(this.height/2/this.altitude),this.width/this.height,.1,o),mat4.translate(t,t,[0,0,-this.altitude]),mat4.scale(t,t,[1,-1,1/this.height]),mat4.rotateX(t,t,this._pitch),mat4.rotateZ(t,t,this.angle),mat4.translate(t,t,[-this.x,-this.y,0]),t}};
+	},{"../util/interpolate":102,"../util/util":106,"./coordinate":19,"./lng_lat":20,"gl-matrix":116,"point-geometry":137}],23:[function(require,module,exports){
+	"use strict";var simplexFont={" ":[16,[]],"!":[10,[5,21,5,7,-1,-1,5,2,4,1,5,0,6,1,5,2]],'"':[16,[4,21,4,14,-1,-1,12,21,12,14]],"#":[21,[11,25,4,-7,-1,-1,17,25,10,-7,-1,-1,4,12,18,12,-1,-1,3,6,17,6]],$:[20,[8,25,8,-4,-1,-1,12,25,12,-4,-1,-1,17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],"%":[24,[21,21,3,0,-1,-1,8,21,10,19,10,17,9,15,7,14,5,14,3,16,3,18,4,20,6,21,8,21,10,20,13,19,16,19,19,20,21,21,-1,-1,17,7,15,6,14,4,14,2,16,0,18,0,20,1,21,3,21,5,19,7,17,7]],"&":[26,[23,12,23,13,22,14,21,14,20,13,19,11,17,6,15,3,13,1,11,0,7,0,5,1,4,2,3,4,3,6,4,8,5,9,12,13,13,14,14,16,14,18,13,20,11,21,9,20,8,18,8,16,9,13,11,10,16,3,18,1,20,0,22,0,23,1,23,2]],"'":[10,[5,19,4,20,5,21,6,20,6,18,5,16,4,15]],"(":[14,[11,25,9,23,7,20,5,16,4,11,4,7,5,2,7,-2,9,-5,11,-7]],")":[14,[3,25,5,23,7,20,9,16,10,11,10,7,9,2,7,-2,5,-5,3,-7]],"*":[16,[8,21,8,9,-1,-1,3,18,13,12,-1,-1,13,18,3,12]],"+":[26,[13,18,13,0,-1,-1,4,9,22,9]],",":[10,[6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"-":[26,[4,9,22,9]],".":[10,[5,2,4,1,5,0,6,1,5,2]],"/":[22,[20,25,2,-7]],0:[20,[9,21,6,20,4,17,3,12,3,9,4,4,6,1,9,0,11,0,14,1,16,4,17,9,17,12,16,17,14,20,11,21,9,21]],1:[20,[6,17,8,18,11,21,11,0]],2:[20,[4,16,4,17,5,19,6,20,8,21,12,21,14,20,15,19,16,17,16,15,15,13,13,10,3,0,17,0]],3:[20,[5,21,16,21,10,13,13,13,15,12,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],4:[20,[13,21,3,7,18,7,-1,-1,13,21,13,0]],5:[20,[15,21,5,21,4,12,5,13,8,14,11,14,14,13,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],6:[20,[16,18,15,20,12,21,10,21,7,20,5,17,4,12,4,7,5,3,7,1,10,0,11,0,14,1,16,3,17,6,17,7,16,10,14,12,11,13,10,13,7,12,5,10,4,7]],7:[20,[17,21,7,0,-1,-1,3,21,17,21]],8:[20,[8,21,5,20,4,18,4,16,5,14,7,13,11,12,14,11,16,9,17,7,17,4,16,2,15,1,12,0,8,0,5,1,4,2,3,4,3,7,4,9,6,11,9,12,13,13,15,14,16,16,16,18,15,20,12,21,8,21]],9:[20,[16,14,15,11,13,9,10,8,9,8,6,9,4,11,3,14,3,15,4,18,6,20,9,21,10,21,13,20,15,18,16,14,16,9,15,4,13,1,10,0,8,0,5,1,4,3]],":":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,5,2,4,1,5,0,6,1,5,2]],";":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"<":[24,[20,18,4,9,20,0]],"=":[26,[4,12,22,12,-1,-1,4,6,22,6]],">":[24,[4,18,20,9,4,0]],"?":[18,[3,16,3,17,4,19,5,20,7,21,11,21,13,20,14,19,15,17,15,15,14,13,13,12,9,10,9,7,-1,-1,9,2,8,1,9,0,10,1,9,2]],"@":[27,[18,13,17,15,15,16,12,16,10,15,9,14,8,11,8,8,9,6,11,5,14,5,16,6,17,8,-1,-1,12,16,10,14,9,11,9,8,10,6,11,5,-1,-1,18,16,17,8,17,6,19,5,21,5,23,7,24,10,24,12,23,15,22,17,20,19,18,20,15,21,12,21,9,20,7,19,5,17,4,15,3,12,3,9,4,6,5,4,7,2,9,1,12,0,15,0,18,1,20,2,21,3,-1,-1,19,16,18,8,18,6,19,5]],A:[18,[9,21,1,0,-1,-1,9,21,17,0,-1,-1,4,7,14,7]],B:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,-1,-1,4,11,13,11,16,10,17,9,18,7,18,4,17,2,16,1,13,0,4,0]],C:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5]],D:[21,[4,21,4,0,-1,-1,4,21,11,21,14,20,16,18,17,16,18,13,18,8,17,5,16,3,14,1,11,0,4,0]],E:[19,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11,-1,-1,4,0,17,0]],F:[18,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11]],G:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,18,8,-1,-1,13,8,18,8]],H:[22,[4,21,4,0,-1,-1,18,21,18,0,-1,-1,4,11,18,11]],I:[8,[4,21,4,0]],J:[16,[12,21,12,5,11,2,10,1,8,0,6,0,4,1,3,2,2,5,2,7]],K:[21,[4,21,4,0,-1,-1,18,21,4,7,-1,-1,9,12,18,0]],L:[17,[4,21,4,0,-1,-1,4,0,16,0]],M:[24,[4,21,4,0,-1,-1,4,21,12,0,-1,-1,20,21,12,0,-1,-1,20,21,20,0]],N:[22,[4,21,4,0,-1,-1,4,21,18,0,-1,-1,18,21,18,0]],O:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21]],P:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,14,17,12,16,11,13,10,4,10]],Q:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21,-1,-1,12,4,18,-2]],R:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,4,11,-1,-1,11,11,18,0]],S:[20,[17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],T:[16,[8,21,8,0,-1,-1,1,21,15,21]],U:[22,[4,21,4,6,5,3,7,1,10,0,12,0,15,1,17,3,18,6,18,21]],V:[18,[1,21,9,0,-1,-1,17,21,9,0]],W:[24,[2,21,7,0,-1,-1,12,21,7,0,-1,-1,12,21,17,0,-1,-1,22,21,17,0]],X:[20,[3,21,17,0,-1,-1,17,21,3,0]],Y:[18,[1,21,9,11,9,0,-1,-1,17,21,9,11]],Z:[20,[17,21,3,0,-1,-1,3,21,17,21,-1,-1,3,0,17,0]],"[":[14,[4,25,4,-7,-1,-1,5,25,5,-7,-1,-1,4,25,11,25,-1,-1,4,-7,11,-7]],"\\":[14,[0,21,14,-3]],"]":[14,[9,25,9,-7,-1,-1,10,25,10,-7,-1,-1,3,25,10,25,-1,-1,3,-7,10,-7]],"^":[16,[6,15,8,18,10,15,-1,-1,3,12,8,17,13,12,-1,-1,8,17,8,0]],_:[16,[0,-2,16,-2]],"`":[10,[6,21,5,20,4,18,4,16,5,15,6,16,5,17]],a:[19,[15,14,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],b:[19,[4,21,4,0,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],c:[18,[15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],d:[19,[15,21,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],e:[18,[3,8,15,8,15,10,14,12,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],f:[12,[10,21,8,21,6,20,5,17,5,0,-1,-1,2,14,9,14]],g:[19,[15,14,15,-2,14,-5,13,-6,11,-7,8,-7,6,-6,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],h:[19,[4,21,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],i:[8,[3,21,4,20,5,21,4,22,3,21,-1,-1,4,14,4,0]],j:[10,[5,21,6,20,7,21,6,22,5,21,-1,-1,6,14,6,-3,5,-6,3,-7,1,-7]],k:[17,[4,21,4,0,-1,-1,14,14,4,4,-1,-1,8,8,15,0]],l:[8,[4,21,4,0]],m:[30,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0,-1,-1,15,10,18,13,20,14,23,14,25,13,26,10,26,0]],n:[19,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],o:[19,[8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3,16,6,16,8,15,11,13,13,11,14,8,14]],p:[19,[4,14,4,-7,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],q:[19,[15,14,15,-7,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],r:[13,[4,14,4,0,-1,-1,4,8,5,11,7,13,9,14,12,14]],s:[17,[14,11,13,13,10,14,7,14,4,13,3,11,4,9,6,8,11,7,13,6,14,4,14,3,13,1,10,0,7,0,4,1,3,3]],t:[12,[5,21,5,4,6,1,8,0,10,0,-1,-1,2,14,9,14]],u:[19,[4,14,4,4,5,1,7,0,10,0,12,1,15,4,-1,-1,15,14,15,0]],v:[16,[2,14,8,0,-1,-1,14,14,8,0]],w:[22,[3,14,7,0,-1,-1,11,14,7,0,-1,-1,11,14,15,0,-1,-1,19,14,15,0]],x:[17,[3,14,14,0,-1,-1,14,14,3,0]],y:[16,[2,14,8,0,-1,-1,14,14,8,0,6,-4,4,-6,2,-7,1,-7]],z:[17,[14,14,3,0,-1,-1,3,14,14,14,-1,-1,3,0,14,0]],"{":[14,[9,25,7,24,6,23,5,21,5,19,6,17,7,16,8,14,8,12,6,10,-1,-1,7,24,6,22,6,20,7,18,8,17,9,15,9,13,8,11,4,9,8,7,9,5,9,3,8,1,7,0,6,-2,6,-4,7,-6,-1,-1,6,8,8,6,8,4,7,2,6,1,5,-1,5,-3,6,-5,7,-6,9,-7]],"|":[8,[4,25,4,-7]],"}":[14,[5,25,7,24,8,23,9,21,9,19,8,17,7,16,6,14,6,12,8,10,-1,-1,7,24,8,22,8,20,7,18,6,17,5,15,5,13,6,11,10,9,6,7,5,5,5,3,6,1,7,0,8,-2,8,-4,7,-6,-1,-1,8,8,6,6,6,4,7,2,8,1,9,-1,9,-3,8,-5,7,-6,5,-7]],"~":[24,[3,6,3,8,4,11,6,12,8,12,10,11,14,8,16,7,18,7,20,8,21,10,-1,-1,3,8,4,10,6,11,8,11,10,10,14,7,16,6,18,6,20,7,21,10,21,12]]};module.exports=function(l,n,t,e){e=e||1;var r,o,u,s,i,x,f,p,h=[];for(r=0,o=l.length;o>r;r++)if(i=simplexFont[l[r]]){for(p=null,u=0,s=i[1].length;s>u;u+=2)-1===i[1][u]&&-1===i[1][u+1]?p=null:(x=n+i[1][u]*e,f=t-i[1][u+1]*e,p&&h.push(p.x,p.y,x,f),p={x:x,y:f});n+=i[0]*e}return h};
+	},{}],24:[function(require,module,exports){
+	"use strict";var mapboxgl=module.exports={};mapboxgl.Map=require("./ui/map"),mapboxgl.Control=require("./ui/control/control"),mapboxgl.Navigation=require("./ui/control/navigation"),mapboxgl.Attribution=require("./ui/control/attribution"),mapboxgl.Popup=require("./ui/popup"),mapboxgl.GeoJSONSource=require("./source/geojson_source"),mapboxgl.VideoSource=require("./source/video_source"),mapboxgl.ImageSource=require("./source/image_source"),mapboxgl.Style=require("./style/style"),mapboxgl.LngLat=require("./geo/lng_lat"),mapboxgl.LngLatBounds=require("./geo/lng_lat_bounds"),mapboxgl.Point=require("point-geometry"),mapboxgl.Evented=require("./util/evented"),mapboxgl.util=require("./util/util"),mapboxgl.supported=require("./util/browser").supported;var ajax=require("./util/ajax");mapboxgl.util.getJSON=ajax.getJSON,mapboxgl.util.getArrayBuffer=ajax.getArrayBuffer;var config=require("./util/config");mapboxgl.config=config,Object.defineProperty(mapboxgl,"accessToken",{get:function(){return config.ACCESS_TOKEN},set:function(e){config.ACCESS_TOKEN=e}});
+	},{"./geo/lng_lat":20,"./geo/lng_lat_bounds":21,"./source/geojson_source":39,"./source/image_source":41,"./source/video_source":48,"./style/style":56,"./ui/control/attribution":79,"./ui/control/control":80,"./ui/control/navigation":81,"./ui/map":91,"./ui/popup":92,"./util/ajax":94,"./util/browser":95,"./util/config":99,"./util/evented":100,"./util/util":106,"point-geometry":137}],25:[function(require,module,exports){
+	"use strict";function drawBackground(t,a,r){var e,i=t.gl,o=a.paint["background-color"],n=a.paint["background-pattern"],l=a.paint["background-opacity"],u=n?t.spriteAtlas.getPosition(n.from,!0):null,m=n?t.spriteAtlas.getPosition(n.to,!0):null;if(u&&m){e=t.patternShader,i.switchShader(e,r),i.uniform1i(e.u_image,0),i.uniform2fv(e.u_pattern_tl_a,u.tl),i.uniform2fv(e.u_pattern_br_a,u.br),i.uniform2fv(e.u_pattern_tl_b,m.tl),i.uniform2fv(e.u_pattern_br_b,m.br),i.uniform1f(e.u_opacity,l);var c=t.transform,f=u.size,s=m.size,_=c.locationCoordinate(c.center),S=1/Math.pow(2,c.zoomFraction);i.uniform1f(e.u_mix,n.t);var d=mat3.create();mat3.scale(d,d,[1/(f[0]*n.fromScale),1/(f[1]*n.fromScale)]),mat3.translate(d,d,[_.column*c.tileSize%(f[0]*n.fromScale),_.row*c.tileSize%(f[1]*n.fromScale)]),mat3.rotate(d,d,-c.angle),mat3.scale(d,d,[S*c.width/2,-S*c.height/2]);var p=mat3.create();mat3.scale(p,p,[1/(s[0]*n.toScale),1/(s[1]*n.toScale)]),mat3.translate(p,p,[_.column*c.tileSize%(s[0]*n.toScale),_.row*c.tileSize%(s[1]*n.toScale)]),mat3.rotate(p,p,-c.angle),mat3.scale(p,p,[S*c.width/2,-S*c.height/2]),i.uniformMatrix3fv(e.u_patternmatrix_a,!1,d),i.uniformMatrix3fv(e.u_patternmatrix_b,!1,p),t.spriteAtlas.bind(i,!0)}else e=t.fillShader,i.switchShader(e,r),i.uniform4fv(e.u_color,o);i.disable(i.STENCIL_TEST),i.bindBuffer(i.ARRAY_BUFFER,t.backgroundBuffer),i.vertexAttribPointer(e.a_pos,t.backgroundBuffer.itemSize,i.SHORT,!1,0,0),i.drawArrays(i.TRIANGLE_STRIP,0,t.backgroundBuffer.itemCount),i.enable(i.STENCIL_TEST),i.stencilMask(0),i.stencilFunc(i.EQUAL,128,128)}var mat3=require("gl-matrix").mat3;module.exports=drawBackground;
+	},{"gl-matrix":116}],26:[function(require,module,exports){
+	"use strict";function drawCircles(e,r,i,a){if(a.buffers){i=e.translateMatrix(i,a,r.paint["circle-translate"],r.paint["circle-translate-anchor"]);var t=a.elementGroups[r.ref||r.id];if(t){var l=e.gl;l.disable(l.STENCIL_TEST),l.switchShader(e.circleShader,i,a.exMatrix);var c=a.buffers.circleVertex,n=e.circleShader,s=a.buffers.circleElement,u=1/browser.devicePixelRatio/r.paint["circle-radius"];l.uniform4fv(n.u_color,r.paint["circle-color"]),l.uniform1f(n.u_blur,Math.max(r.paint["circle-blur"],u)),l.uniform1f(n.u_size,r.paint["circle-radius"]);for(var o=0;o<t.groups.length;o++){var f=t.groups[o],d=f.vertexStartIndex*c.itemSize;c.bind(l,n,d),s.bind(l,n,d);var S=3*f.elementLength,b=f.elementStartIndex*s.itemSize;l.drawElements(l.TRIANGLES,S,l.UNSIGNED_SHORT,b)}l.enable(l.STENCIL_TEST)}}}var browser=require("../util/browser.js");module.exports=drawCircles;
+	},{"../util/browser.js":95}],27:[function(require,module,exports){
+	"use strict";function drawPlacementDebug(r,e,o,t){var a=t.elementGroups[e.ref||e.id].collisionBox;if(a){var i=r.gl,n=t.buffers.collisionBoxVertex,s=r.collisionBoxShader;i.enable(i.STENCIL_TEST),i.switchShader(s,o),n.bind(i,s),i.lineWidth(1);var u=12;i.vertexAttribPointer(s.a_pos,2,i.SHORT,!1,u,0),i.vertexAttribPointer(s.a_extrude,2,i.SHORT,!1,u,4),i.vertexAttribPointer(s.a_data,2,i.UNSIGNED_BYTE,!1,u,8),i.uniform1f(s.u_scale,Math.pow(2,r.transform.zoom-t.coord.z)),i.uniform1f(s.u_zoom,10*r.transform.zoom),i.uniform1f(s.u_maxzoom,10*(t.coord.z+1));var d=a.groups[0].vertexStartIndex,l=a.groups[0].vertexLength;i.drawArrays(i.LINES,d,l),i.disable(i.STENCIL_TEST)}}module.exports=drawPlacementDebug;
+	},{}],28:[function(require,module,exports){
+	"use strict";function drawDebug(e,r){var t=e.gl;t.blendFunc(t.ONE,t.ONE_MINUS_SRC_ALPHA),t.switchShader(e.debugShader,r.posMatrix),t.bindBuffer(t.ARRAY_BUFFER,e.debugBuffer),t.vertexAttribPointer(e.debugShader.a_pos,e.debugBuffer.itemSize,t.SHORT,!1,0,0),t.uniform4f(e.debugShader.u_color,1,0,0,1),t.lineWidth(4),t.drawArrays(t.LINE_STRIP,0,e.debugBuffer.itemCount);var i=textVertices(r.coord.toString(),50,200,5);t.bindBuffer(t.ARRAY_BUFFER,e.debugTextBuffer),t.bufferData(t.ARRAY_BUFFER,new Int16Array(i),t.STREAM_DRAW),t.vertexAttribPointer(e.debugShader.a_pos,e.debugTextBuffer.itemSize,t.SHORT,!1,0,0),t.lineWidth(8*browser.devicePixelRatio),t.uniform4f(e.debugShader.u_color,1,1,1,1),t.drawArrays(t.LINES,0,i.length/e.debugTextBuffer.itemSize),t.lineWidth(2*browser.devicePixelRatio),t.uniform4f(e.debugShader.u_color,0,0,0,1),t.drawArrays(t.LINES,0,i.length/e.debugTextBuffer.itemSize),t.blendFunc(t.ONE_MINUS_DST_ALPHA,t.ONE)}var textVertices=require("../lib/debugtext"),browser=require("../util/browser");module.exports=drawDebug;
+	},{"../lib/debugtext":23,"../util/browser":95}],29:[function(require,module,exports){
+	"use strict";function drawFill(e,t,r,i){if(i.buffers){var a=i.elementGroups[t.ref||t.id];if(a){var l,n,o,f,s=e.gl,u=e.translateMatrix(r,i,t.paint["fill-translate"],t.paint["fill-translate-anchor"]),c=t.paint["fill-color"];s.stencilMask(63),s.clear(s.STENCIL_BUFFER_BIT),s.stencilFunc(s.NOTEQUAL,128,128),s.stencilOpSeparate(s.FRONT,s.INCR_WRAP,s.KEEP,s.KEEP),s.stencilOpSeparate(s.BACK,s.DECR_WRAP,s.KEEP,s.KEEP),s.colorMask(!1,!1,!1,!1),s.switchShader(e.fillShader,u),l=i.buffers.fillVertex,l.bind(s),n=i.buffers.fillElement,n.bind(s);for(var m,S,E=0;E<a.groups.length;E++)o=a.groups[E],m=o.vertexStartIndex*l.itemSize,s.vertexAttribPointer(e.fillShader.a_pos,2,s.SHORT,!1,4,m+0),f=3*o.elementLength,S=o.elementStartIndex*n.itemSize,s.drawElements(s.TRIANGLES,f,s.UNSIGNED_SHORT,S);s.colorMask(!0,!0,!0,!0),s.stencilOp(s.KEEP,s.KEEP,s.KEEP),s.stencilMask(0);var d=t.paint["fill-outline-color"];if(t.paint["fill-antialias"]===!0&&(!t.paint["fill-pattern"]||d)){s.switchShader(e.outlineShader,u),s.lineWidth(2*browser.devicePixelRatio),d?s.stencilFunc(s.EQUAL,128,128):s.stencilFunc(s.EQUAL,128,191),s.uniform2f(e.outlineShader.u_world,s.drawingBufferWidth,s.drawingBufferHeight),s.uniform4fv(e.outlineShader.u_color,d?d:c),l=i.buffers.fillVertex,n=i.buffers.outlineElement,n.bind(s);for(var p=0;p<a.groups.length;p++)o=a.groups[p],m=o.vertexStartIndex*l.itemSize,s.vertexAttribPointer(e.outlineShader.a_pos,2,s.SHORT,!1,4,m+0),f=2*o.secondElementLength,S=o.secondElementStartIndex*n.itemSize,s.drawElements(s.LINES,f,s.UNSIGNED_SHORT,S)}var _,h=t.paint["fill-pattern"],v=t.paint["fill-opacity"]||1;if(h){var x=e.spriteAtlas.getPosition(h.from,!0),b=e.spriteAtlas.getPosition(h.to,!0);if(!x||!b)return;_=e.patternShader,s.switchShader(_,r),s.uniform1i(_.u_image,0),s.uniform2fv(_.u_pattern_tl_a,x.tl),s.uniform2fv(_.u_pattern_br_a,x.br),s.uniform2fv(_.u_pattern_tl_b,b.tl),s.uniform2fv(_.u_pattern_br_b,b.br),s.uniform1f(_.u_opacity,v),s.uniform1f(_.u_mix,h.t);var A=i.tileExtent/i.tileSize/Math.pow(2,e.transform.tileZoom-i.coord.z),R=mat3.create();mat3.scale(R,R,[1/(x.size[0]*A*h.fromScale),1/(x.size[1]*A*h.fromScale)]);var g=mat3.create();mat3.scale(g,g,[1/(b.size[0]*A*h.toScale),1/(b.size[1]*A*h.toScale)]),s.uniformMatrix3fv(_.u_patternmatrix_a,!1,R),s.uniformMatrix3fv(_.u_patternmatrix_b,!1,g),e.spriteAtlas.bind(s,!0)}else _=e.fillShader,s.switchShader(_,r),s.uniform4fv(_.u_color,c);s.stencilFunc(s.NOTEQUAL,0,63),s.bindBuffer(s.ARRAY_BUFFER,e.tileExtentBuffer),s.vertexAttribPointer(_.a_pos,e.tileExtentBuffer.itemSize,s.SHORT,!1,0,0),s.drawArrays(s.TRIANGLE_STRIP,0,e.tileExtentBuffer.itemCount),s.stencilMask(0),s.stencilFunc(s.EQUAL,128,128)}}}var browser=require("../util/browser"),mat3=require("gl-matrix").mat3;module.exports=drawFill;
+	},{"../util/browser":95,"gl-matrix":116}],30:[function(require,module,exports){
+	"use strict";var browser=require("../util/browser"),mat2=require("gl-matrix").mat2;module.exports=function(t,i,e,r){if(r.buffers){var a=r.elementGroups[i.ref||i.id];if(a){var n=t.gl;if(!(i.paint["line-width"]<=0)){var o=1/browser.devicePixelRatio,f=i.paint["line-blur"]+o,l=i.paint["line-width"]/2,u=-1,m=0,s=0;i.paint["line-gap-width"]>0&&(u=i.paint["line-gap-width"]/2+.5*o,l=i.paint["line-width"],m=u-o/2);var _=m+l+o/2+s,h=i.paint["line-color"],d=t.transform.scale/(1<<r.coord.z)/(r.tileExtent/r.tileSize),p=t.translateMatrix(e,r,i.paint["line-translate"],i.paint["line-translate-anchor"]),v=t.transform,c=mat2.create();mat2.scale(c,c,[1,Math.cos(v._pitch)]),mat2.rotate(c,c,t.transform.angle);var x,b=Math.sqrt(v.height*v.height/4*(1+v.altitude*v.altitude)),w=v.height/2*Math.tan(v._pitch),g=(b+w)/b-1,S=r.tileSize/t.transform.tileSize,M=i.paint["line-dasharray"],z=i.paint["line-pattern"];if(M){x=t.linesdfpatternShader,n.switchShader(x,p,r.exMatrix),n.uniform2fv(x.u_linewidth,[_,u]),n.uniform1f(x.u_ratio,d),n.uniform1f(x.u_blur,f),n.uniform4fv(x.u_color,h);var A=t.lineAtlas.getDash(M.from,"round"===i.layout["line-cap"]),y=t.lineAtlas.getDash(M.to,"round"===i.layout["line-cap"]);t.lineAtlas.bind(n);var E=Math.pow(2,Math.floor(Math.log(t.transform.scale)/Math.LN2)-r.coord.z)/8*S,P=[E/A.width/M.fromScale,-A.height/2],R=t.lineAtlas.width/(M.fromScale*A.width*256*browser.devicePixelRatio)/2,I=[E/y.width/M.toScale,-y.height/2],N=t.lineAtlas.width/(M.toScale*y.width*256*browser.devicePixelRatio)/2;n.uniform2fv(x.u_patternscale_a,P),n.uniform1f(x.u_tex_y_a,A.y),n.uniform2fv(x.u_patternscale_b,I),n.uniform1f(x.u_tex_y_b,y.y),n.uniform1i(x.u_image,0),n.uniform1f(x.u_sdfgamma,Math.max(R,N)),n.uniform1f(x.u_mix,M.t),n.uniform1f(x.u_extra,g),n.uniformMatrix2fv(x.u_antialiasingmatrix,!1,c)}else if(z){var T=t.spriteAtlas.getPosition(z.from,!0),q=t.spriteAtlas.getPosition(z.to,!0);if(!T||!q)return;var D=r.tileExtent/r.tileSize/Math.pow(2,t.transform.tileZoom-r.coord.z)*S;t.spriteAtlas.bind(n,!0),x=t.linepatternShader,n.switchShader(x,p,r.exMatrix),n.uniform2fv(x.u_linewidth,[_,u]),n.uniform1f(x.u_ratio,d),n.uniform1f(x.u_blur,f),n.uniform2fv(x.u_pattern_size_a,[T.size[0]*D*z.fromScale,q.size[1]]),n.uniform2fv(x.u_pattern_size_b,[q.size[0]*D*z.toScale,q.size[1]]),n.uniform2fv(x.u_pattern_tl_a,T.tl),n.uniform2fv(x.u_pattern_br_a,T.br),n.uniform2fv(x.u_pattern_tl_b,q.tl),n.uniform2fv(x.u_pattern_br_b,q.br),n.uniform1f(x.u_fade,z.t),n.uniform1f(x.u_opacity,i.paint["line-opacity"]),n.uniform1f(x.u_extra,g),n.uniformMatrix2fv(x.u_antialiasingmatrix,!1,c)}else x=t.lineShader,n.switchShader(x,p,r.exMatrix),n.uniform2fv(x.u_linewidth,[_,u]),n.uniform1f(x.u_ratio,d),n.uniform1f(x.u_blur,f),n.uniform1f(x.u_extra,g),n.uniformMatrix2fv(x.u_antialiasingmatrix,!1,c),n.uniform4fv(x.u_color,h);var G=r.buffers.lineVertex;G.bind(n);var L=r.buffers.lineElement;L.bind(n);for(var H=0;H<a.groups.length;H++){var O=a.groups[H],B=O.vertexStartIndex*G.itemSize;n.vertexAttribPointer(x.a_pos,2,n.SHORT,!1,8,B+0),n.vertexAttribPointer(x.a_data,4,n.BYTE,!1,8,B+4);var U=3*O.elementLength,V=O.elementStartIndex*L.itemSize;n.drawElements(n.TRIANGLES,U,n.UNSIGNED_SHORT,V)}}}}};
+	},{"../util/browser":95,"gl-matrix":116}],31:[function(require,module,exports){
+	"use strict";function drawRaster(t,r,e,a){var i=t.gl;i.disable(i.STENCIL_TEST);var o=t.rasterShader;i.switchShader(o,e),i.uniform1f(o.u_brightness_low,r.paint["raster-brightness-min"]),i.uniform1f(o.u_brightness_high,r.paint["raster-brightness-max"]),i.uniform1f(o.u_saturation_factor,saturationFactor(r.paint["raster-saturation"])),i.uniform1f(o.u_contrast_factor,contrastFactor(r.paint["raster-contrast"])),i.uniform3fv(o.u_spin_weights,spinWeights(r.paint["raster-hue-rotate"]));var n,u,s=a.source&&a.source._pyramid.findLoadedParent(a.coord,0,{}),c=getOpacities(a,s,r,t.transform);i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,a.texture),s?(i.activeTexture(i.TEXTURE1),i.bindTexture(i.TEXTURE_2D,s.texture),n=Math.pow(2,s.coord.z-a.coord.z),u=[a.coord.x*n%1,a.coord.y*n%1]):c[1]=0,i.uniform2fv(o.u_tl_parent,u||[0,0]),i.uniform1f(o.u_scale_parent,n||1),i.uniform1f(o.u_buffer_scale,1),i.uniform1f(o.u_opacity0,c[0]),i.uniform1f(o.u_opacity1,c[1]),i.uniform1i(o.u_image0,0),i.uniform1i(o.u_image1,1),i.bindBuffer(i.ARRAY_BUFFER,a.boundsBuffer||t.tileExtentBuffer),i.vertexAttribPointer(o.a_pos,2,i.SHORT,!1,8,0),i.vertexAttribPointer(o.a_texture_pos,2,i.SHORT,!1,8,4),i.drawArrays(i.TRIANGLE_STRIP,0,4),i.enable(i.STENCIL_TEST)}function spinWeights(t){t*=Math.PI/180;var r=Math.sin(t),e=Math.cos(t);return[(2*e+1)/3,(-Math.sqrt(3)*r-e+1)/3,(Math.sqrt(3)*r-e+1)/3]}function contrastFactor(t){return t>0?1/(1-t):1+t}function saturationFactor(t){return t>0?1-1/(1.001-t):-t}function getOpacities(t,r,e,a){if(!t.source)return[1,0];var i=(new Date).getTime(),o=e.paint["raster-fade-duration"],n=(i-t.timeAdded)/o,u=r?(i-r.timeAdded)/o:-1,s=t.source._pyramid.coveringZoomLevel(a),c=r?Math.abs(r.coord.z-s)>Math.abs(t.coord.z-s):!1,f=[];!r||c?(f[0]=util.clamp(n,0,1),f[1]=1-f[0]):(f[0]=util.clamp(1-u,0,1),f[1]=1-f[0]);var d=e.paint["raster-opacity"];return f[0]*=d,f[1]*=d,f}var util=require("../util/util");module.exports=drawRaster;
+	},{"../util/util":106}],32:[function(require,module,exports){
+	"use strict";function drawSymbols(e,t,r,a){if(a.buffers){var o=a.elementGroups[t.ref||t.id];if(o){var i=!(t.layout["text-allow-overlap"]||t.layout["icon-allow-overlap"]||t.layout["text-ignore-placement"]||t.layout["icon-ignore-placement"]),n=e.gl;i&&n.disable(n.STENCIL_TEST),o.text.groups.length&&drawSymbol(e,t,r,a,o.text,"text",!0),o.icon.groups.length&&drawSymbol(e,t,r,a,o.icon,"icon",o.sdfIcons),drawCollisionDebug(e,t,r,a),i&&n.enable(n.STENCIL_TEST)}}}function drawSymbol(e,t,r,a,o,i,n){var l=e.gl;r=e.translateMatrix(r,a,t.paint[i+"-translate"],t.paint[i+"-translate-anchor"]);var m,f,u,s=e.transform,d="map"===t.layout[i+"-rotation-alignment"],h=d;h?(m=mat4.create(),f=a.tileExtent/a.tileSize/Math.pow(2,e.transform.zoom-a.coord.z),u=1/Math.cos(s._pitch)):(m=mat4.clone(a.exMatrix),f=e.transform.altitude,u=1),mat4.scale(m,m,[f,f,1]);var p=t.paint[i+"-size"],g=p/defaultSizes[i];mat4.scale(m,m,[g,g,1]);var S,c,x,b,v=Math.sqrt(s.height*s.height/4*(1+s.altitude*s.altitude)),_=s.height/2*Math.tan(s._pitch),z=(v+_)/v-1,w="text"===i;if(w||e.style.sprite.loaded()){l.activeTexture(l.TEXTURE0),S=n?e.sdfShader:e.iconShader,w?(e.glyphAtlas.updateTexture(l),c=a.buffers.glyphVertex,x=a.buffers.glyphElement,b=[e.glyphAtlas.width/4,e.glyphAtlas.height/4]):(e.spriteAtlas.bind(l,d||e.options.rotating||e.options.zooming||1!==g||n||e.transform.pitch),c=a.buffers.iconVertex,x=a.buffers.iconElement,b=[e.spriteAtlas.width/4,e.spriteAtlas.height/4]),l.switchShader(S,r,m),l.uniform1i(S.u_texture,0),l.uniform2fv(S.u_texsize,b),l.uniform1i(S.u_skewed,h),l.uniform1f(S.u_extra,z);var y=Math.log(p/o[i+"-size"])/Math.LN2||0;l.uniform1f(S.u_zoom,10*(e.transform.zoom-y));var E=e.frameHistory.getFadeProperties(300);l.uniform1f(S.u_fadedist,10*E.fadedist),l.uniform1f(S.u_minfadezoom,Math.floor(10*E.minfadezoom)),l.uniform1f(S.u_maxfadezoom,Math.floor(10*E.maxfadezoom)),l.uniform1f(S.u_fadezoom,10*(e.transform.zoom+E.bump));var T,I,N,M;if(x.bind(l),n){var A=8,L=1.19,R=6,G=.105*defaultSizes[i]/p/browser.devicePixelRatio;l.uniform1f(S.u_gamma,G*u),l.uniform4fv(S.u_color,t.paint[i+"-color"]),l.uniform1f(S.u_buffer,.75);for(var D=0;D<o.groups.length;D++)T=o.groups[D],I=T.vertexStartIndex*c.itemSize,c.bind(l,S,I),N=3*T.elementLength,M=T.elementStartIndex*x.itemSize,l.drawElements(l.TRIANGLES,N,l.UNSIGNED_SHORT,M);if(t.paint[i+"-halo-width"]){l.uniform1f(S.u_gamma,(t.paint[i+"-halo-blur"]*L/g/A+G)*u),l.uniform4fv(S.u_color,t.paint[i+"-halo-color"]),l.uniform1f(S.u_buffer,(R-t.paint[i+"-halo-width"]/g)/A);for(var q=0;q<o.groups.length;q++)T=o.groups[q],I=T.vertexStartIndex*c.itemSize,c.bind(l,S,I),N=3*T.elementLength,M=T.elementStartIndex*x.itemSize,l.drawElements(l.TRIANGLES,N,l.UNSIGNED_SHORT,M)}}else{l.uniform1f(S.u_opacity,t.paint["icon-opacity"]);for(var C=0;C<o.groups.length;C++)T=o.groups[C],I=T.vertexStartIndex*c.itemSize,c.bind(l,S,I),N=3*T.elementLength,M=T.elementStartIndex*x.itemSize,l.drawElements(l.TRIANGLES,N,l.UNSIGNED_SHORT,M)}}}var browser=require("../util/browser"),mat4=require("gl-matrix").mat4,drawCollisionDebug=require("./draw_collision_debug");module.exports=drawSymbols;var defaultSizes={icon:1,text:24};
+	},{"../util/browser":95,"./draw_collision_debug":27,"gl-matrix":116}],33:[function(require,module,exports){
+	"use strict";function drawVertices(e,r,t,i){function o(r,t,i,o){f.switchShader(e.dotShader,i),f.uniform1f(e.dotShader.u_size,4*browser.devicePixelRatio),f.uniform1f(e.dotShader.u_blur,.25),f.uniform4fv(e.dotShader.u_color,[.1,0,0,.1]),r.bind(f,e.dotShader,0);for(var a=0;a<t.length;a++){var s=t[a],u=s.vertexStartIndex,d=s.vertexLength;f.vertexAttribPointer(e.dotShader.a_pos,2,f.SHORT,!1,o,0),f.drawArrays(f.POINTS,u,d)}}var f=e.gl;if(i&&i.buffers){var a=i.elementGroups[r.ref||r.id];if(a){if(f.blendFunc(f.ONE,f.ONE_MINUS_SRC_ALPHA),"fill"===r.type)o(i.buffers.fillVertex,a.groups,t,4);else if("symbol"===r.type)o(i.buffers.iconVertex,a.icon.groups,t,16),o(i.buffers.glyphVertex,a.text.groups,t,16);else if("line"===r.type){var s=mat4.clone(t);mat4.scale(s,s,[.5,.5,1]),o(i.buffers.lineVertex,a.groups,s,8)}f.blendFunc(f.ONE_MINUS_DST_ALPHA,f.ONE)}}}var browser=require("../util/browser"),mat4=require("gl-matrix").mat4;module.exports=drawVertices;
+	},{"../util/browser":95,"gl-matrix":116}],34:[function(require,module,exports){
+	"use strict";function FrameHistory(){this.frameHistory=[]}module.exports=FrameHistory,FrameHistory.prototype.getFadeProperties=function(t){void 0===t&&(t=300);for(var e=(new Date).getTime();this.frameHistory.length>3&&this.frameHistory[1].time+t<e;)this.frameHistory.shift();this.frameHistory[1].time+t<e&&(this.frameHistory[0].z=this.frameHistory[1].z);var r=this.frameHistory.length;3>r&&console.warn("there should never be less than three frames in the history");var i=this.frameHistory[0].z,s=this.frameHistory[r-1],o=s.z,a=Math.min(i,o),m=Math.max(i,o),h=s.z-this.frameHistory[1].z,f=s.time-this.frameHistory[1].time,y=h/(f/t);isNaN(y)&&console.warn("fadedist should never be NaN");var n=(e-s.time)/t*y;return{fadedist:y,minfadezoom:a,maxfadezoom:m,bump:n}},FrameHistory.prototype.record=function(t){var e=(new Date).getTime();this.frameHistory.length||this.frameHistory.push({time:0,z:t},{time:0,z:t}),(2===this.frameHistory.length||this.frameHistory[this.frameHistory.length-1].z!==t)&&this.frameHistory.push({time:e,z:t})};
+	},{}],35:[function(require,module,exports){
+	"use strict";var shaders=require("./shaders"),util=require("../util/util");exports.extend=function(r){var t=r.lineWidth,e=r.getParameter(r.ALIASED_LINE_WIDTH_RANGE);return r.lineWidth=function(i){t.call(r,util.clamp(i,e[0],e[1]))},r.getShader=function(r,t){var e=t===this.FRAGMENT_SHADER?"fragment":"vertex";if(!shaders[r]||!shaders[r][e])throw new Error("Could not find shader "+r);var i=this.createShader(t),a=shaders[r][e];if("undefined"==typeof orientation&&(a=a.replace(/ highp /g," ")),this.shaderSource(i,a),this.compileShader(i),!this.getShaderParameter(i,this.COMPILE_STATUS))throw new Error(this.getShaderInfoLog(i));return i},r.initializeShader=function(r,t,e){var i={program:this.createProgram(),fragment:this.getShader(r,this.FRAGMENT_SHADER),vertex:this.getShader(r,this.VERTEX_SHADER),attributes:[]};if(this.attachShader(i.program,i.vertex),this.attachShader(i.program,i.fragment),this.linkProgram(i.program),this.getProgramParameter(i.program,this.LINK_STATUS)){for(var a=0;a<t.length;a++)i[t[a]]=this.getAttribLocation(i.program,t[a]),i.attributes.push(i[t[a]]);for(var h=0;h<e.length;h++)i[e[h]]=this.getUniformLocation(i.program,e[h])}else console.error(this.getProgramInfoLog(i.program));return i},r.switchShader=function(r,t,e){if(t||console.trace("posMatrix does not have required argument"),this.currentShader!==r){this.useProgram(r.program);for(var i=this.currentShader?this.currentShader.attributes:[],a=r.attributes,h=0;h<i.length;h++)a.indexOf(i[h])<0&&this.disableVertexAttribArray(i[h]);for(var o=0;o<a.length;o++)i.indexOf(a[o])<0&&this.enableVertexAttribArray(a[o]);this.currentShader=r}r.posMatrix!==t&&(this.uniformMatrix4fv(r.u_matrix,!1,t),r.posMatrix=t),e&&r.exMatrix!==e&&r.u_exmatrix&&(this.uniformMatrix4fv(r.u_exmatrix,!1,e),r.exMatrix=e)},r.vertexAttrib2fv=function(t,e){r.vertexAttrib2f(t,e[0],e[1])},r.vertexAttrib3fv=function(t,e){r.vertexAttrib3f(t,e[0],e[1],e[2])},r.vertexAttrib4fv=function(t,e){r.vertexAttrib4f(t,e[0],e[1],e[2],e[3])},r};
+	},{"../util/util":106,"./shaders":38}],36:[function(require,module,exports){
+	"use strict";function LineAtlas(t,i){this.width=t,this.height=i,this.nextRow=0,this.bytes=4,this.data=new Uint8Array(this.width*this.height*this.bytes),this.positions={}}module.exports=LineAtlas,LineAtlas.prototype.setSprite=function(t){this.sprite=t},LineAtlas.prototype.getDash=function(t,i){var e=t.join(",")+i;return this.positions[e]||(this.positions[e]=this.addDash(t,i)),this.positions[e]},LineAtlas.prototype.addDash=function(t,i){var e=i?7:0,h=2*e+1,s=128;if(this.nextRow+h>this.height)return console.warn("LineAtlas out of space"),null;for(var a=0,r=0;r<t.length;r++)a+=t[r];for(var n=this.width/a,o=n/2,d=t.length%2===1,E=-e;e>=E;E++)for(var T=this.nextRow+e+E,l=this.width*T,R=d?-t[t.length-1]:0,u=t[0],g=1,p=0;p<this.width;p++){for(;p/n>u;)R=u,u+=t[g],d&&g===t.length-1&&(u+=t[0]),g++;var x,f=Math.abs(p-R*n),A=Math.abs(p-u*n),w=Math.min(f,A),_=g%2===1;if(i){var y=e?E/e*(o+1):0;if(_){var D=o-Math.abs(y);x=Math.sqrt(w*w+D*D)}else x=o-Math.sqrt(w*w+y*y)}else x=(_?1:-1)*w;this.data[3+4*(l+p)]=Math.max(0,Math.min(255,x+s))}var c={y:(this.nextRow+e+.5)/this.height,height:2*e/this.height,width:a};return this.nextRow+=h,this.dirty=!0,c},LineAtlas.prototype.bind=function(t){this.texture?(t.bindTexture(t.TEXTURE_2D,this.texture),this.dirty&&(this.dirty=!1,t.texSubImage2D(t.TEXTURE_2D,0,0,0,this.width,this.height,t.RGBA,t.UNSIGNED_BYTE,this.data))):(this.texture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texture),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,this.data))},LineAtlas.prototype.debug=function(){var t=document.createElement("canvas");document.body.appendChild(t),t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.background="#ff0",t.width=this.width,t.height=this.height;for(var i=t.getContext("2d"),e=i.getImageData(0,0,this.width,this.height),h=0;h<this.data.length;h++)if(this.sdf){var s=4*h;e.data[s]=e.data[s+1]=e.data[s+2]=0,e.data[s+3]=this.data[h]}else e.data[h]=this.data[h];i.putImageData(e,0,0)};
+	},{}],37:[function(require,module,exports){
+	"use strict";function Painter(t,e){this.gl=glutil.extend(t),this.transform=e,this.reusableTextures={},this.preFbos={},this.frameHistory=new FrameHistory,this.setup()}var glutil=require("./gl_util"),browser=require("../util/browser"),mat4=require("gl-matrix").mat4,FrameHistory=require("./frame_history");module.exports=Painter,Painter.prototype.resize=function(t,e){var i=this.gl;this.width=t*browser.devicePixelRatio,this.height=e*browser.devicePixelRatio,i.viewport(0,0,this.width,this.height)},Painter.prototype.setup=function(){var t=this.gl;t.verbose=!0,t.enable(t.BLEND),t.blendFunc(t.ONE_MINUS_DST_ALPHA,t.ONE),t.enable(t.STENCIL_TEST),this.debugShader=t.initializeShader("debug",["a_pos"],["u_matrix","u_color"]),this.rasterShader=t.initializeShader("raster",["a_pos","a_texture_pos"],["u_matrix","u_brightness_low","u_brightness_high","u_saturation_factor","u_spin_weights","u_contrast_factor","u_opacity0","u_opacity1","u_image0","u_image1","u_tl_parent","u_scale_parent","u_buffer_scale"]),this.circleShader=t.initializeShader("circle",["a_pos"],["u_matrix","u_exmatrix","u_blur","u_size","u_color"]),this.lineShader=t.initializeShader("line",["a_pos","a_data"],["u_matrix","u_linewidth","u_color","u_ratio","u_blur","u_extra","u_antialiasingmatrix"]),this.linepatternShader=t.initializeShader("linepattern",["a_pos","a_data"],["u_matrix","u_linewidth","u_ratio","u_pattern_size_a","u_pattern_size_b","u_pattern_tl_a","u_pattern_br_a","u_pattern_tl_b","u_pattern_br_b","u_blur","u_fade","u_opacity","u_extra","u_antialiasingmatrix"]),this.linesdfpatternShader=t.initializeShader("linesdfpattern",["a_pos","a_data"],["u_matrix","u_linewidth","u_color","u_ratio","u_blur","u_patternscale_a","u_tex_y_a","u_patternscale_b","u_tex_y_b","u_image","u_sdfgamma","u_mix","u_extra","u_antialiasingmatrix"]),this.dotShader=t.initializeShader("dot",["a_pos"],["u_matrix","u_size","u_color","u_blur"]),this.sdfShader=t.initializeShader("sdf",["a_pos","a_offset","a_data1","a_data2"],["u_matrix","u_exmatrix","u_texture","u_texsize","u_color","u_gamma","u_buffer","u_zoom","u_fadedist","u_minfadezoom","u_maxfadezoom","u_fadezoom","u_skewed","u_extra"]),this.iconShader=t.initializeShader("icon",["a_pos","a_offset","a_data1","a_data2"],["u_matrix","u_exmatrix","u_texture","u_texsize","u_zoom","u_fadedist","u_minfadezoom","u_maxfadezoom","u_fadezoom","u_opacity","u_skewed","u_extra"]),this.outlineShader=t.initializeShader("outline",["a_pos"],["u_matrix","u_color","u_world"]),this.patternShader=t.initializeShader("pattern",["a_pos"],["u_matrix","u_pattern_tl_a","u_pattern_br_a","u_pattern_tl_b","u_pattern_br_b","u_mix","u_patternmatrix_a","u_patternmatrix_b","u_opacity","u_image"]),this.fillShader=t.initializeShader("fill",["a_pos"],["u_matrix","u_color"]),this.collisionBoxShader=t.initializeShader("collisionbox",["a_pos","a_extrude","a_data"],["u_matrix","u_scale","u_zoom","u_maxzoom"]),this.identityMatrix=mat4.create(),this.backgroundBuffer=t.createBuffer(),this.backgroundBuffer.itemSize=2,this.backgroundBuffer.itemCount=4,t.bindBuffer(t.ARRAY_BUFFER,this.backgroundBuffer),t.bufferData(t.ARRAY_BUFFER,new Int16Array([-1,-1,1,-1,-1,1,1,1]),t.STATIC_DRAW),this.setExtent(4096),this.debugTextBuffer=t.createBuffer(),this.debugTextBuffer.itemSize=2},Painter.prototype.setExtent=function(t){if(t&&t!==this.tileExtent){this.tileExtent=t;var e=this.gl;this.tileExtentBuffer=e.createBuffer(),this.tileExtentBuffer.itemSize=4,this.tileExtentBuffer.itemCount=4,e.bindBuffer(e.ARRAY_BUFFER,this.tileExtentBuffer),e.bufferData(e.ARRAY_BUFFER,new Int16Array([0,0,0,0,this.tileExtent,0,32767,0,0,this.tileExtent,0,32767,this.tileExtent,this.tileExtent,32767,32767]),e.STATIC_DRAW),this.debugBuffer=e.createBuffer(),this.debugBuffer.itemSize=2,this.debugBuffer.itemCount=5,e.bindBuffer(e.ARRAY_BUFFER,this.debugBuffer),e.bufferData(e.ARRAY_BUFFER,new Int16Array([0,0,this.tileExtent-1,0,this.tileExtent-1,this.tileExtent-1,0,this.tileExtent-1,0,0]),e.STATIC_DRAW)}},Painter.prototype.clearColor=function(){var t=this.gl;t.clearColor(0,0,0,0),t.clear(t.COLOR_BUFFER_BIT)},Painter.prototype.clearStencil=function(){var t=this.gl;t.clearStencil(0),t.stencilMask(255),t.clear(t.STENCIL_BUFFER_BIT)},Painter.prototype.drawClippingMask=function(t){var e=this.gl;e.switchShader(this.fillShader,t.posMatrix),e.colorMask(!1,!1,!1,!1),e.clearStencil(0),e.stencilMask(191),e.clear(e.STENCIL_BUFFER_BIT),e.stencilFunc(e.EQUAL,192,64),e.stencilMask(192),e.stencilOp(e.REPLACE,e.KEEP,e.KEEP),e.bindBuffer(e.ARRAY_BUFFER,this.tileExtentBuffer),e.vertexAttribPointer(this.fillShader.a_pos,this.tileExtentBuffer.itemSize,e.SHORT,!1,8,0),e.drawArrays(e.TRIANGLE_STRIP,0,this.tileExtentBuffer.itemCount),e.stencilFunc(e.EQUAL,128,128),e.stencilOp(e.KEEP,e.KEEP,e.REPLACE),e.stencilMask(0),e.colorMask(!0,!0,!0,!0)},Painter.prototype.prepareBuffers=function(){},Painter.prototype.bindDefaultFramebuffer=function(){var t=this.gl;t.bindFramebuffer(t.FRAMEBUFFER,null)};var draw={symbol:require("./draw_symbol"),circle:require("./draw_circle"),line:require("./draw_line"),fill:require("./draw_fill"),raster:require("./draw_raster"),background:require("./draw_background"),debug:require("./draw_debug"),vertices:require("./draw_vertices")};Painter.prototype.render=function(t,e){this.style=t,this.options=e,this.lineAtlas=t.lineAtlas,this.spriteAtlas=t.spriteAtlas,this.spriteAtlas.setSprite(t.sprite),this.glyphAtlas=t.glyphAtlas,this.glyphAtlas.bind(this.gl),this.frameHistory.record(this.transform.zoom),this.prepareBuffers(),this.clearColor();for(var i=t._groups.length-1;i>=0;i--){var r=t._groups[i],a=t.sources[r.source];a?(this.clearStencil(),a.render(r,this)):void 0===r.source&&this.drawLayers(r,this.identityMatrix)}},Painter.prototype.drawTile=function(t,e){this.setExtent(t.tileExtent),this.drawClippingMask(t),this.drawLayers(e,t.posMatrix,t),this.options.debug&&draw.debug(this,t)},Painter.prototype.drawLayers=function(t,e,i){for(var r=t.length-1;r>=0;r--){var a=t[r];a.hidden||(draw[a.type](this,a,e,i),this.options.vertices&&draw.vertices(this,a,e,i))}},Painter.prototype.drawStencilBuffer=function(){var t=this.gl;t.switchShader(this.fillShader,this.identityMatrix),t.blendFunc(t.ONE,t.ONE_MINUS_SRC_ALPHA),t.stencilMask(0),t.stencilFunc(t.EQUAL,128,128),t.bindBuffer(t.ARRAY_BUFFER,this.backgroundBuffer),t.vertexAttribPointer(this.fillShader.a_pos,this.backgroundBuffer.itemSize,t.SHORT,!1,0,0),t.uniform4fv(this.fillShader.u_color,[0,0,0,.5]),t.drawArrays(t.TRIANGLE_STRIP,0,this.tileExtentBuffer.itemCount),t.blendFunc(t.ONE_MINUS_DST_ALPHA,t.ONE)},Painter.prototype.translateMatrix=function(t,e,i,r){if(!i[0]&&!i[1])return t;if("viewport"===r){var a=Math.sin(-this.transform.angle),s=Math.cos(-this.transform.angle);i=[i[0]*s-i[1]*a,i[0]*a+i[1]*s]}var u=this.transform.scale/(1<<e.coord.z)/(e.tileExtent/e.tileSize),n=[i[0]/u,i[1]/u,0],_=new Float32Array(16);return mat4.translate(_,t,n),_},Painter.prototype.saveTexture=function(t){var e=this.reusableTextures[t.size];e?e.push(t):this.reusableTextures[t.size]=[t]},Painter.prototype.getTexture=function(t){var e=this.reusableTextures[t];return e&&e.length>0?e.pop():null};
+	},{"../util/browser":95,"./draw_background":25,"./draw_circle":26,"./draw_debug":28,"./draw_fill":29,"./draw_line":30,"./draw_raster":31,"./draw_symbol":32,"./draw_vertices":33,"./frame_history":34,"./gl_util":35,"gl-matrix":116}],38:[function(require,module,exports){
+	"use strict";var glify=void 0;module.exports={debug:{vertex:"precision mediump float;attribute vec2 a_pos;uniform mat4 u_matrix;void main(){gl_Position=u_matrix*vec4(a_pos,step(32767.,a_pos.x),1);}",fragment:"precision mediump float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}"},dot:{vertex:"precision mediump float;uniform mat4 u_matrix;uniform float u_size;attribute vec2 a_pos;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);gl_PointSize=u_size;}",fragment:"precision mediump float;uniform vec4 u_color;uniform float u_blur;void main(){float a,b;a=length(gl_PointCoord-.5);b=smoothstep(.5,.5-u_blur,a);gl_FragColor=u_color*b;}"},fill:{vertex:"precision mediump float;attribute vec2 a_pos;uniform mat4 u_matrix;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);}",fragment:"precision mediump float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}"},circle:{vertex:"precision mediump float;uniform float u_size;attribute vec2 a_pos;uniform mat4 u_matrix,u_exmatrix;varying vec2 a;void main(){a=vec2(mod(a_pos,2.)*2.-1.);vec4 b=u_exmatrix*vec4(a*u_size,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5),0,1);gl_Position+=b*gl_Position.w;}",fragment:"precision mediump float;uniform vec4 u_color;uniform float u_blur,u_size;varying vec2 a;void main(){float b=smoothstep(1.-u_blur,1.,length(a));gl_FragColor=u_color*(1.-b);}"},line:{vertex:"precision mediump float;attribute vec2 a_pos;attribute vec4 a_data;uniform highp mat4 u_matrix;uniform float u_ratio,u_extra;uniform vec2 u_linewidth;uniform mat2 u_antialiasingmatrix;varying vec2 a;varying float b,c;void main(){vec2 d,e;d=a_data.xy;e=mod(a_pos,2.);e.y=sign(e.y-.5);a=e;vec4 f=vec4(u_linewidth.s*d*.015873016,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5)+f.xy/u_ratio,0,1);float g,h,i;g=gl_Position.y/gl_Position.w;h=length(d)/length(u_antialiasingmatrix*d);i=1./(1.-min(g*u_extra,.9));c=i*h;}",fragment:"precision mediump float;uniform vec2 u_linewidth;uniform vec4 u_color;uniform float u_blur;varying vec2 a;varying float b,c;void main(){float d,e,f;d=length(a)*u_linewidth.s;e=u_blur*c;f=clamp(min(d-(u_linewidth.t-e),u_linewidth.s-d)/e,0.,1.);gl_FragColor=u_color*f;}"},linepattern:{vertex:"precision mediump float;attribute vec2 a_pos;attribute vec4 a_data;uniform highp mat4 u_matrix;uniform float u_ratio,u_extra;uniform vec2 u_linewidth;uniform vec4 u_color;uniform mat2 u_antialiasingmatrix;varying vec2 a;varying float b,c;void main(){vec2 d,f,g,h;d=a_data.xy;float e,i,j,k;e=a_data.z*128.+a_data.w;f=mod(a_pos,2.);f.y=sign(f.y-.5);a=f;g=d*.015873016;h=u_linewidth.s*g;gl_Position=u_matrix*vec4(floor(a_pos*.5)+h.xy/u_ratio,0,1);b=e;i=gl_Position.y/gl_Position.w;j=length(d)/length(u_antialiasingmatrix*d);k=1./(1.-min(i*u_extra,.9));c=k*j;}",fragment:"precision mediump float;uniform vec2 u_linewidth,u_pattern_size_a,u_pattern_size_b,u_pattern_tl_a,u_pattern_br_a,u_pattern_tl_b,u_pattern_br_b;uniform float u_point,u_blur,u_fade,u_opacity;uniform sampler2D u_image;varying vec2 a;varying float b,c;void main(){float d,e,f,g,h,i,j;d=length(a)*u_linewidth.s;e=u_blur*c;f=clamp(min(d-(u_linewidth.t-e),u_linewidth.s-d)/e,0.,1.);g=mod(b/u_pattern_size_a.x,1.);h=mod(b/u_pattern_size_b.x,1.);i=.5+a.y*u_linewidth.s/u_pattern_size_a.y;j=.5+a.y*u_linewidth.s/u_pattern_size_b.y;vec2 k,l;k=mix(u_pattern_tl_a,u_pattern_br_a,vec2(g,i));l=mix(u_pattern_tl_b,u_pattern_br_b,vec2(h,j));vec4 m=mix(texture2D(u_image,k),texture2D(u_image,l),u_fade);f*=u_opacity;gl_FragColor=m*f;}"},linesdfpattern:{vertex:"precision mediump float;attribute vec2 a_pos;attribute vec4 a_data;uniform highp mat4 u_matrix;uniform vec2 u_linewidth,u_patternscale_a,u_patternscale_b;uniform float u_ratio,u_tex_y_a,u_tex_y_b,u_extra;uniform mat2 u_antialiasingmatrix;varying vec2 a,b,c;varying float d;void main(){vec2 e,g;e=a_data.xy;float f,i,j,k;f=a_data.z*128.+a_data.w;g=mod(a_pos,2.);g.y=sign(g.y-.5);a=g;vec4 h=vec4(u_linewidth.s*e*.015873016,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5)+h.xy/u_ratio,0,1);b=vec2(f*u_patternscale_a.x,g.y*u_patternscale_a.y+u_tex_y_a);c=vec2(f*u_patternscale_b.x,g.y*u_patternscale_b.y+u_tex_y_b);i=gl_Position.y/gl_Position.w;j=length(e)/length(u_antialiasingmatrix*e);k=1./(1.-min(i*u_extra,.9));d=k*j;}",fragment:"precision mediump float;uniform vec2 u_linewidth;uniform vec4 u_color;uniform float u_blur,u_sdfgamma,u_mix;uniform sampler2D u_image;varying vec2 a,b,c;varying float d;void main(){float e,f,g,h,i,j;e=length(a)*u_linewidth.s;f=u_blur*d;g=clamp(min(e-(u_linewidth.t-f),u_linewidth.s-e)/f,0.,1.);h=texture2D(u_image,b).a;i=texture2D(u_image,c).a;j=mix(h,i,u_mix);g*=smoothstep(.5-u_sdfgamma,.5+u_sdfgamma,j);gl_FragColor=u_color*g;}"},outline:{vertex:"precision mediump float;attribute vec2 a_pos;uniform highp mat4 u_matrix;uniform vec2 u_world;varying vec2 a;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(gl_Position.xy/gl_Position.w+1.)/2.*u_world;}",fragment:"precision mediump float;uniform vec4 u_color;varying vec2 a;void main(){float b,c;b=length(a-gl_FragCoord.xy);c=smoothstep(1.,0.,b);gl_FragColor=u_color*c;}"},pattern:{vertex:"precision mediump float;uniform mat4 u_matrix;uniform mat3 u_patternmatrix_a,u_patternmatrix_b;attribute vec2 a_pos;varying vec2 a,b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(u_patternmatrix_a*vec3(a_pos,1)).xy;b=(u_patternmatrix_b*vec3(a_pos,1)).xy;}",fragment:"precision mediump float;uniform float u_opacity,u_mix;uniform vec2 u_pattern_tl_a,u_pattern_br_a,u_pattern_tl_b,u_pattern_br_b;uniform sampler2D u_image;varying vec2 a,b;void main(){vec2 c,d,f,g;c=mod(a,1.);d=mix(u_pattern_tl_a,u_pattern_br_a,c);vec4 e,h;e=texture2D(u_image,d);f=mod(b,1.);g=mix(u_pattern_tl_b,u_pattern_br_b,f);h=texture2D(u_image,g);gl_FragColor=mix(e,h,u_mix)*u_opacity;}"},raster:{vertex:"precision mediump float;uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent,u_buffer_scale;attribute vec2 a_pos,a_texture_pos;varying vec2 a,b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(a_texture_pos/32767.-.5)/u_buffer_scale+.5;b=a*u_scale_parent+u_tl_parent;}",fragment:"precision mediump float;uniform float u_opacity0,u_opacity1,u_brightness_low,u_brightness_high,u_saturation_factor,u_contrast_factor;uniform sampler2D u_image0,u_image1;varying vec2 a,b;uniform vec3 u_spin_weights;void main(){vec4 c,d,e;c=texture2D(u_image0,a);d=texture2D(u_image1,b);e=c*u_opacity0+d*u_opacity1;vec3 f,h,i;f=e.rgb;f=vec3(dot(f,u_spin_weights.xyz),dot(f,u_spin_weights.zxy),dot(f,u_spin_weights.yzx));float g=(e.r+e.g+e.b)/3.;f+=(g-f)*u_saturation_factor;f=(f-.5)*u_contrast_factor+.5;h=vec3(u_brightness_low);i=vec3(u_brightness_high);gl_FragColor=vec4(mix(h,i,f),e.a);}"},icon:{vertex:"precision mediump float;attribute vec2 a_pos,a_offset;attribute vec4 a_data1,a_data2;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_zoom,u_fadedist,u_minfadezoom,u_maxfadezoom,u_fadezoom,u_opacity,u_extra;uniform bool u_skewed;uniform vec2 u_texsize;varying vec2 a;varying float b;void main(){vec2 c,e;c=a_data1.xy;float d,f,g,h,i,j;d=a_data1[2];e=a_data2.st;f=e[0];g=e[1];h=10.;i=2.-step(f,u_zoom)-(1.-step(g,u_zoom));j=clamp((u_fadezoom-d)/u_fadedist,0.,1.);if(u_fadedist>=0.)b=j;else b=1.-j;if(u_maxfadezoom<d)b=0.;if(u_minfadezoom>=d)b=1.;i+=step(b,0.);if(u_skewed){vec4 k=u_exmatrix*vec4(a_offset/64.,0,0);gl_Position=u_matrix*vec4(a_pos+k.xy,0,1);gl_Position.z+=i*gl_Position.w;}else{vec4 k=u_exmatrix*vec4(a_offset/64.,i,0);gl_Position=u_matrix*vec4(a_pos,0,1)+k;}a=c/u_texsize;b*=u_opacity;}",fragment:"precision mediump float;uniform sampler2D u_texture;varying vec2 a;varying float b;void main(){gl_FragColor=texture2D(u_texture,a)*b;}"},sdf:{vertex:"precision mediump float;attribute vec2 a_pos,a_offset;attribute vec4 a_data1,a_data2;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_zoom,u_fadedist,u_minfadezoom,u_maxfadezoom,u_fadezoom,u_extra;uniform bool u_skewed;uniform vec2 u_texsize;varying vec2 a;varying float b,c;void main(){vec2 d,f;d=a_data1.xy;float e,g,h,i,j,k,l;e=a_data1[2];f=a_data2.st;g=f[0];h=f[1];i=2.-step(g,u_zoom)-(1.-step(h,u_zoom));j=clamp((u_fadezoom-e)/u_fadedist,0.,1.);if(u_fadedist>=0.)b=j;else b=1.-j;if(u_maxfadezoom<e)b=0.;if(u_minfadezoom>=e)b=1.;i+=step(b,0.);if(u_skewed){vec4 k=u_exmatrix*vec4(a_offset/64.,0,0);gl_Position=u_matrix*vec4(a_pos+k.xy,0,1);gl_Position.z+=i*gl_Position.w;}else{vec4 k=u_exmatrix*vec4(a_offset/64.,i,0);gl_Position=u_matrix*vec4(a_pos,0,1)+k;}k=gl_Position.y/gl_Position.w;l=1./(1.-k*u_extra);c=l;a=d/u_texsize;}",fragment:"precision mediump float;uniform sampler2D u_texture;uniform vec4 u_color;uniform float u_buffer,u_gamma;varying vec2 a;varying float b,c;void main(){float d,e,f;d=u_gamma*c;e=texture2D(u_texture,a).a;f=smoothstep(u_buffer-d,u_buffer+d,e)*b;gl_FragColor=u_color*f;}"},collisionbox:{vertex:"precision mediump float;attribute vec2 a_pos,a_extrude,a_data;uniform mat4 u_matrix;uniform float u_scale;varying float a,b;void main(){gl_Position=u_matrix*vec4(a_pos+a_extrude/u_scale,0,1);a=a_data.x;b=a_data.y;}",fragment:"precision mediump float;uniform float u_zoom,u_maxzoom;varying float a,b;void main(){float c=.5;gl_FragColor=vec4(0,1,0,1)*c;if(b>u_zoom)gl_FragColor=vec4(1,0,0,1)*c;if(u_zoom>=a)gl_FragColor=vec4(0,0,0,1)*c*.25;if(b>=u_maxzoom)gl_FragColor=vec4(0,0,1,1)*c*.2;}"}};
+	},{}],39:[function(require,module,exports){
+	"use strict";function GeoJSONSource(i){i=i||{},this._data=i.data,void 0!==i.maxzoom&&(this.maxzoom=i.maxzoom),this.geojsonVtOptions={maxZoom:this.maxzoom},void 0!==i.buffer&&(this.geojsonVtOptions.buffer=i.buffer),void 0!==i.tolerance&&(this.geojsonVtOptions.tolerance=i.tolerance),this._pyramid=new TilePyramid({tileSize:512,minzoom:this.minzoom,maxzoom:this.maxzoom,cacheSize:20,load:this._loadTile.bind(this),abort:this._abortTile.bind(this),unload:this._unloadTile.bind(this),add:this._addTile.bind(this),remove:this._removeTile.bind(this)})}var util=require("../util/util"),Evented=require("../util/evented"),TilePyramid=require("./tile_pyramid"),Source=require("./source"),urlResolve=require("resolve-url");module.exports=GeoJSONSource,GeoJSONSource.prototype=util.inherit(Evented,{minzoom:0,maxzoom:14,_dirty:!0,setData:function(i){return this._data=i,this._dirty=!0,this.fire("change"),this.map&&this.update(this.map.transform),this},onAdd:function(i){this.map=i},loaded:function(){return this._loaded&&this._pyramid.loaded()},update:function(i){this._dirty&&this._updateData(),this._loaded&&this._pyramid.update(this.used,i)},reload:function(){this._loaded&&this._pyramid.reload()},render:Source._renderTiles,featuresAt:Source._vectorFeaturesAt,featuresIn:Source._vectorFeaturesIn,_updateData:function(){this._dirty=!1;var i=this._data;"string"==typeof i&&(i=urlResolve(window.location.href,i)),this.workerID=this.dispatcher.send("parse geojson",{data:i,tileSize:512,source:this.id,geojsonVtOptions:this.geojsonVtOptions},function(i){return i?void this.fire("error",{error:i}):(this._loaded=!0,this._pyramid.reload(),void this.fire("change"))}.bind(this))},_loadTile:function(i){var t=i.coord.z>this.maxzoom?Math.pow(2,i.coord.z-this.maxzoom):1,e={uid:i.uid,coord:i.coord,zoom:i.coord.z,maxZoom:this.maxzoom,tileSize:512,source:this.id,overscaling:t,angle:this.map.transform.angle,pitch:this.map.transform.pitch,collisionDebug:this.map.collisionDebug};i.workerID=this.dispatcher.send("load geojson tile",e,function(t,e){if(i.unloadVectorData(this.map.painter),!i.aborted){if(t)return void this.fire("tile.error",{tile:i});i.loadVectorData(e),this.fire("tile.load",{tile:i})}}.bind(this),this.workerID)},_abortTile:function(i){i.aborted=!0},_addTile:function(i){this.fire("tile.add",{tile:i})},_removeTile:function(i){this.fire("tile.remove",{tile:i})},_unloadTile:function(i){i.unloadVectorData(this.map.painter),this.glyphAtlas.removeGlyphs(i.uid),this.dispatcher.send("remove tile",{uid:i.uid,source:this.id},null,i.workerID)}});
+	},{"../util/evented":100,"../util/util":106,"./source":43,"./tile_pyramid":46,"resolve-url":140}],40:[function(require,module,exports){
+	"use strict";function GeoJSONWrapper(e){this.features=e,this.length=e.length}function FeatureWrapper(e){this.type=e.type,this.rawGeometry=1===e.type?[e.geometry]:e.geometry,this.properties=e.tags,this.extent=4096}var Point=require("point-geometry"),VectorTileFeature=require("vector-tile").VectorTileFeature;module.exports=GeoJSONWrapper,GeoJSONWrapper.prototype.feature=function(e){return new FeatureWrapper(this.features[e])},FeatureWrapper.prototype.loadGeometry=function(){var e=this.rawGeometry;this.geometry=[];for(var t=0;t<e.length;t++){for(var r=e[t],o=[],a=0;a<r.length;a++)o.push(new Point(r[a][0],r[a][1]));this.geometry.push(o)}return this.geometry},FeatureWrapper.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var e=this.geometry,t=1/0,r=-(1/0),o=1/0,a=-(1/0),p=0;p<e.length;p++)for(var i=e[p],n=0;n<i.length;n++){var h=i[n];t=Math.min(t,h.x),r=Math.max(r,h.x),o=Math.min(o,h.y),a=Math.max(a,h.y)}return[t,o,r,a]},FeatureWrapper.prototype.toGeoJSON=VectorTileFeature.prototype.toGeoJSON;
+	},{"point-geometry":137,"vector-tile":144}],41:[function(require,module,exports){
+	"use strict";function ImageSource(e){this.coordinates=e.coordinates,ajax.getImage(e.url,function(e,t){e||(this.image=t,this.image.addEventListener("load",function(){this.map._rerender()}.bind(this)),this._loaded=!0,this.map&&(this.createTile(),this.fire("change")))}.bind(this))}var util=require("../util/util"),Tile=require("./tile"),LngLat=require("../geo/lng_lat"),Point=require("point-geometry"),Evented=require("../util/evented"),ajax=require("../util/ajax");module.exports=ImageSource,ImageSource.prototype=util.inherit(Evented,{onAdd:function(e){this.map=e,this.image&&this.createTile()},createTile:function(){var e=this.map,t=this.coordinates.map(function(t){var i=LngLat.convert(t);return e.transform.locationCoordinate(i).zoomTo(0)}),i=util.getCoordinatesCenter(t),r=4096,a=t.map(function(e){var t=e.zoomTo(i.zoom);return new Point(Math.round((t.column-i.column)*r),Math.round((t.row-i.row)*r))}),n=e.painter.gl,o=32767,u=new Int16Array([a[0].x,a[0].y,0,0,a[1].x,a[1].y,o,0,a[3].x,a[3].y,0,o,a[2].x,a[2].y,o,o]);this.tile=new Tile,this.tile.buckets={},this.tile.boundsBuffer=n.createBuffer(),n.bindBuffer(n.ARRAY_BUFFER,this.tile.boundsBuffer),n.bufferData(n.ARRAY_BUFFER,u,n.STATIC_DRAW),this.center=i},loaded:function(){return this.image&&this.image.complete},update:function(){},reload:function(){},render:function(e,t){if(this._loaded&&this.loaded()){var i=this.center;this.tile.calculateMatrices(i.zoom,i.column,i.row,this.map.transform,t);var r=t.gl;this.tile.texture?(r.bindTexture(r.TEXTURE_2D,this.tile.texture),r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,r.UNSIGNED_BYTE,this.image)):(this.tile.texture=r.createTexture(),r.bindTexture(r.TEXTURE_2D,this.tile.texture),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,this.image)),t.drawLayers(e,this.tile.posMatrix,this.tile)}},featuresAt:function(e,t,i){return i(null,[])}});
+	},{"../geo/lng_lat":20,"../util/ajax":94,"../util/evented":100,"../util/util":106,"./tile":44,"point-geometry":137}],42:[function(require,module,exports){
+	"use strict";function RasterTileSource(e){util.extend(this,util.pick(e,["url","tileSize"])),Source._loadTileJSON.call(this,e)}var util=require("../util/util"),ajax=require("../util/ajax"),Evented=require("../util/evented"),Source=require("./source"),normalizeURL=require("../util/mapbox").normalizeTileURL;module.exports=RasterTileSource,RasterTileSource.prototype=util.inherit(Evented,{minzoom:0,maxzoom:22,roundZoom:!0,tileSize:512,_loaded:!1,onAdd:function(e){this.map=e},loaded:function(){return this._pyramid&&this._pyramid.loaded()},update:function(e){this._pyramid&&this._pyramid.update(this.used,e,this.map.style.rasterFadeDuration)},reload:function(){},render:Source._renderTiles,_loadTile:function(e){function t(t,i){if(delete e.request,!e.aborted){if(t)return void this.fire("tile.error",{tile:e});var r=this.map.painter.gl;e.texture=this.map.painter.getTexture(i.width),e.texture?(r.bindTexture(r.TEXTURE_2D,e.texture),r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,r.UNSIGNED_BYTE,i)):(e.texture=r.createTexture(),r.bindTexture(r.TEXTURE_2D,e.texture),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR_MIPMAP_NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,i),e.texture.size=i.width),r.generateMipmap(r.TEXTURE_2D),e.timeAdded=(new Date).getTime(),this.map.animationLoop.set(this.style.rasterFadeDuration),e.source=this,e.loaded=!0,this.fire("tile.load",{tile:e})}}var i=normalizeURL(e.coord.url(this.tiles),this.url);e.request=ajax.getImage(i,t.bind(this))},_abortTile:function(e){e.aborted=!0,e.request&&(e.request.abort(),delete e.request)},_addTile:function(e){this.fire("tile.add",{tile:e})},_removeTile:function(e){this.fire("tile.remove",{tile:e})},_unloadTile:function(e){e.texture&&this.map.painter.saveTexture(e.texture)},featuresAt:function(e,t,i){i(null,[])},featuresIn:function(e,t,i){i(null,[])}});
+	},{"../util/ajax":94,"../util/evented":100,"../util/mapbox":103,"../util/util":106,"./source":43}],43:[function(require,module,exports){
+	"use strict";var util=require("../util/util"),ajax=require("../util/ajax"),browser=require("../util/browser"),TilePyramid=require("./tile_pyramid"),TileCoord=require("./tile_coord"),normalizeURL=require("../util/mapbox").normalizeSourceURL;exports._loadTileJSON=function(i){var e=function(i){this._pyramid=new TilePyramid({index:i,tileSize:this.tileSize,cacheSize:20,minzoom:this.minzoom,maxzoom:this.maxzoom,roundZoom:this.roundZoom,reparseOverscaled:this.reparseOverscaled,load:this._loadTile.bind(this),abort:this._abortTile.bind(this),unload:this._unloadTile.bind(this),add:this._addTile.bind(this),remove:this._removeTile.bind(this),redoPlacement:this._redoTilePlacement?this._redoTilePlacement.bind(this):void 0})}.bind(this),r=function(i,r){return i?void this.fire("error",{error:i}):(util.extend(this,util.pick(r,["tiles","minzoom","maxzoom","attribution"])),void(r.index?ajax.getJSON(normalizeURL(r.index),function(i,r){return i?void this.fire("error",{error:i}):(e(r.index),void this.fire("load"))}.bind(this)):(e(),this.fire("load"))))}.bind(this);i.url?ajax.getJSON(normalizeURL(i.url),r):browser.frame(r.bind(this,null,i))},exports._renderTiles=function(i,e){if(this._pyramid)for(var r=this._pyramid.renderedIDs(),t=0;t<r.length;t++){var o=this._pyramid.getTile(r[t]),n=TileCoord.fromID(r[t]),a=n.z,s=n.x,l=n.y,d=n.w;a=Math.min(a,this.maxzoom),(o.tileExtent>4096||o.parentId)&&(o.tileExtent=4096),s+=d*(1<<a),o.calculateMatrices(a,s,l,e.transform,e),e.drawTile(o,i)}},exports._vectorFeaturesAt=function(i,e,r){if(!this._pyramid)return r(null,[]);var t=this._pyramid.tileAt(i);return t?void this.dispatcher.send("query features",{uid:t.tile.uid,x:t.x,y:t.y,tileExtent:t.tile.tileExtent,scale:t.scale,source:this.id,params:e},r,t.tile.workerID):r(null,[])},exports._vectorFeaturesIn=function(i,e,r){if(!this._pyramid)return r(null,[]);var t=this._pyramid.tilesIn(i);return t?void util.asyncAll(t,function(i,r){this.dispatcher.send("query features",{uid:i.tile.uid,source:this.id,minX:i.minX,maxX:i.maxX,minY:i.minY,maxY:i.maxY,params:e},r,i.tile.workerID)}.bind(this),function(i,e){r(i,Array.prototype.concat.apply([],e))}):r(null,[])},exports.create=function(i){var e={vector:require("./vector_tile_source"),raster:require("./raster_tile_source"),geojson:require("./geojson_source"),video:require("./video_source"),image:require("./image_source")};for(var r in e)if(i instanceof e[r])return i;return new e[i.type](i)};
+	},{"../util/ajax":94,"../util/browser":95,"../util/mapbox":103,"../util/util":106,"./geojson_source":39,"./image_source":41,"./raster_tile_source":42,"./tile_coord":45,"./tile_pyramid":46,"./vector_tile_source":47,"./video_source":48}],44:[function(require,module,exports){
+	"use strict";function Tile(t,e){this.coord=t,this.uid=util.uniqueId(),this.loaded=!1,this.uses=0,this.tileSize=e}var glmatrix=require("gl-matrix"),mat2=glmatrix.mat2,mat4=glmatrix.mat4,util=require("../util/util"),BufferSet=require("../data/buffer/buffer_set");module.exports=Tile,Tile.prototype={tileExtent:4096,calculateMatrices:function(t,e,i,r){var s=Math.pow(2,t),o=r.worldSize/s;this.scale=o,this.posMatrix=new Float64Array(16),mat4.identity(this.posMatrix),mat4.translate(this.posMatrix,this.posMatrix,[e*o,i*o,0]),mat4.scale(this.posMatrix,this.posMatrix,[o/this.tileExtent,o/this.tileExtent,1]),mat4.multiply(this.posMatrix,r.getProjMatrix(),this.posMatrix),this.exMatrix=mat4.create(),mat4.ortho(this.exMatrix,0,r.width,r.height,0,0,-1),this.rotationMatrix=mat2.create(),mat2.rotate(this.rotationMatrix,this.rotationMatrix,r.angle),this.posMatrix=new Float32Array(this.posMatrix)},positionAt:function(t,e){return t=t.zoomTo(Math.min(this.coord.z,e)),{x:(t.column-this.coord.x)*this.tileExtent,y:(t.row-this.coord.y)*this.tileExtent,scale:this.scale}},loadVectorData:function(t){this.loaded=!0,t&&(this.buffers=new BufferSet(t.buffers),this.elementGroups=t.elementGroups,this.tileExtent=t.extent)},reloadSymbolData:function(t,e){if(this.buffers){this.buffers.glyphVertex.destroy(e.gl),this.buffers.glyphElement.destroy(e.gl),this.buffers.iconVertex.destroy(e.gl),this.buffers.iconElement.destroy(e.gl),this.buffers.collisionBoxVertex.destroy(e.gl);var i=new BufferSet(t.buffers);this.buffers.glyphVertex=i.glyphVertex,this.buffers.glyphElement=i.glyphElement,this.buffers.iconVertex=i.iconVertex,this.buffers.iconElement=i.iconElement,this.buffers.collisionBoxVertex=i.collisionBoxVertex;for(var r in t.elementGroups)this.elementGroups[r]=t.elementGroups[r]}},unloadVectorData:function(t){for(var e in this.buffers)this.buffers[e].destroy(t.gl);this.buffers=null}};
+	},{"../data/buffer/buffer_set":2,"../util/util":106,"gl-matrix":116}],45:[function(require,module,exports){
+	"use strict";function TileCoord(t,i,o,r){isNaN(r)&&(r=0),this.z=+t,this.x=+i,this.y=+o,this.w=+r,r*=2,0>r&&(r=-1*r-1);var e=1<<this.z;this.id=32*(e*e*r+e*this.y+this.x)+this.z}function edge(t,i){if(t.row>i.row){var o=t;t=i,i=o}return{x0:t.column,y0:t.row,x1:i.column,y1:i.row,dx:i.column-t.column,dy:i.row-t.row}}function scanSpans(t,i,o,r,e){var n=Math.max(o,Math.floor(i.y0)),h=Math.min(r,Math.ceil(i.y1));if(t.x0===i.x0&&t.y0===i.y0?t.x0+i.dy/t.dy*t.dx<i.x1:t.x1-i.dy/t.dy*t.dx<i.x0){var s=t;t=i,i=s}for(var d=t.dx/t.dy,a=i.dx/i.dy,l=t.dx>0,y=i.dx<0,x=n;h>x;x++){var c=d*Math.max(0,Math.min(t.dy,x+l-t.y0))+t.x0,u=a*Math.max(0,Math.min(i.dy,x+y-i.y0))+i.x0;e(Math.floor(u),Math.ceil(c),x)}}function scanTriangle(t,i,o,r,e,n){var h,s=edge(t,i),d=edge(i,o),a=edge(o,t);s.dy>d.dy&&(h=s,s=d,d=h),s.dy>a.dy&&(h=s,s=a,a=h),d.dy>a.dy&&(h=d,d=a,a=h),s.dy&&scanSpans(a,s,r,e,n),d.dy&&scanSpans(a,d,r,e,n)}module.exports=TileCoord,TileCoord.prototype.toString=function(){return this.z+"/"+this.x+"/"+this.y},TileCoord.fromID=function(t){var i=t%32,o=1<<i,r=(t-i)/32,e=r%o,n=(r-e)/o%o,h=Math.floor(r/(o*o));return h%2!==0&&(h=-1*h-1),h/=2,new TileCoord(i,e,n,h)},TileCoord.prototype.url=function(t,i){return t[(this.x+this.y)%t.length].replace("{prefix}",(this.x%16).toString(16)+(this.y%16).toString(16)).replace("{z}",Math.min(this.z,i||this.z)).replace("{x}",this.x).replace("{y}",this.y)},TileCoord.prototype.parent=function(t){return 0===this.z?null:this.z>t?new TileCoord(this.z-1,this.x,this.y,this.w):new TileCoord(this.z-1,Math.floor(this.x/2),Math.floor(this.y/2),this.w)},TileCoord.prototype.wrapped=function(){return new TileCoord(this.z,this.x,this.y,0)},TileCoord.prototype.children=function(t){if(this.z>=t)return[new TileCoord(this.z+1,this.x,this.y,this.w)];var i=this.z+1,o=2*this.x,r=2*this.y;return[new TileCoord(i,o,r,this.w),new TileCoord(i,o+1,r,this.w),new TileCoord(i,o,r+1,this.w),new TileCoord(i,o+1,r+1,this.w)]},TileCoord.cover=function(t,i,o){function r(t,i,r){var h,s,d;if(r>=0&&e>=r)for(h=t;i>h;h++)s=(h%e+e)%e,d=new TileCoord(o,s,r,Math.floor(h/e)),n[d.id]=d}var e=1<<t,n={};return scanTriangle(i[0],i[1],i[2],0,e,r),scanTriangle(i[2],i[3],i[0],0,e,r),Object.keys(n).map(function(t){return n[t]})};
+	},{}],46:[function(require,module,exports){
+	"use strict";function TilePyramid(i){this.tileSize=i.tileSize,this.minzoom=i.minzoom,this.maxzoom=i.maxzoom,this.roundZoom=i.roundZoom,this.reparseOverscaled=i.reparseOverscaled,this.index=i.index,this._load=i.load,this._abort=i.abort,this._unload=i.unload,this._add=i.add,this._remove=i.remove,this._redoPlacement=i.redoPlacement,this._tiles={},this._cache=new Cache(i.cacheSize,function(i){return this._unload(i)}.bind(this))}var Tile=require("./tile"),TileCoord=require("./tile_coord"),Point=require("point-geometry"),Cache=require("../util/mru_cache"),util=require("../util/util");module.exports=TilePyramid,TilePyramid.prototype={loaded:function(){for(var i in this._tiles)if(!this._tiles[i].loaded)return!1;return!0},orderedIDs:function(){return Object.keys(this._tiles).sort(function(i,e){return e%32-i%32}).map(function(i){return+i})},renderedIDs:function(){return this.orderedIDs().filter(function(i){return this._tiles[i].loaded&&!this._coveredTiles[i]}.bind(this))},reload:function(){this._cache.reset();for(var i in this._tiles)this._load(this._tiles[i])},getTile:function(i){return this._tiles[i]},getZoom:function(i){return i.zoom+Math.log(i.tileSize/this.tileSize)/Math.LN2},coveringZoomLevel:function(i){return(this.roundZoom?Math.round:Math.floor)(this.getZoom(i))},coveringTiles:function(i){var e=this.coveringZoomLevel(i),t=e;if(e<this.minzoom)return[];e>this.maxzoom&&(e=this.maxzoom);var o=i,r=o.locationCoordinate(o.center)._zoomTo(e),n=new Point(r.column-.5,r.row-.5);return TileCoord.cover(e,[o.pointCoordinate(new Point(0,0))._zoomTo(e),o.pointCoordinate(new Point(o.width,0))._zoomTo(e),o.pointCoordinate(new Point(o.width,o.height))._zoomTo(e),o.pointCoordinate(new Point(0,o.height))._zoomTo(e)],this.reparseOverscaled?t:e).sort(function(i,e){return n.dist(i)-n.dist(e)})},findLoadedChildren:function(i,e,t){for(var o=!0,r=i.z,n=i.children(this.maxzoom),s=0;s<n.length;s++){var d=n[s].id;this._tiles[d]&&this._tiles[d].loaded?t[d]=!0:(o=!1,e>r&&this.findLoadedChildren(n[s],e,t))}return o},findLoadedParent:function(i,e,t){for(var o=i.z-1;o>=e;o--){i=i.parent(this.maxzoom);var r=this._tiles[i.id];if(r&&r.loaded)return t[i.id]=!0,r}},update:function(i,e,t){var o,r,n,s=(this.roundZoom?Math.round:Math.floor)(this.getZoom(e)),d=util.clamp(s-10,this.minzoom,this.maxzoom),h=util.clamp(s+1,this.minzoom,this.maxzoom),a={},l=(new Date).getTime();this._coveredTiles={};var m=i?this.coveringTiles(e):[];for(o=0;o<m.length;o++)r=m[o],n=this.addTile(r),a[r.id]=!0,n.loaded||this.findLoadedChildren(r,h,a)||this.findLoadedParent(r,d,a);for(var u in a)r=TileCoord.fromID(u),n=this._tiles[u],n&&n.timeAdded>l-(t||0)&&(this.findLoadedChildren(r,h,a)?(this._coveredTiles[u]=!0,a[u]=!0):this.findLoadedParent(r,d,a));var c=util.keysDifference(this._tiles,a);for(o=0;o<c.length;o++)this.removeTile(+c[o])},addTile:function(i){var e=this._tiles[i.id];if(e)return e;var t=i.wrapped();if(e=this._tiles[t.id],e||(e=this._cache.get(t.id),e&&this._redoPlacement&&this._redoPlacement(e)),!e){var o=i.z,r=o>this.maxzoom?Math.pow(2,o-this.maxzoom):1;e=new Tile(t,this.tileSize*r),this.index&&(e.parentId=this.indexSearch(i.id)),this._load(e)}return e.uses++,this._tiles[i.id]=e,this._add(e,i),e},removeTile:function(i){var e=this._tiles[i];e&&(e.uses--,delete this._tiles[i],this._remove(e),e.uses>0||(e.loaded?this._cache.add(e.coord.wrapped().id,e):(this._abort(e),this._unload(e))))},clearTiles:function(){for(var i in this._tiles)this.removeTile(i);this._cache.reset()},tileAt:function(i){for(var e=this.orderedIDs(),t=0;t<e.length;t++){var o=this._tiles[e[t]],r=o.positionAt(i,this.maxzoom);if(r&&r.x>=0&&r.x<o.tileExtent&&r.y>=0&&r.y<o.tileExtent)return{tile:o,x:r.x,y:r.y,scale:r.scale}}},tilesIn:function(i){for(var e=[],t=this.orderedIDs(),o=0;o<t.length;o++){var r=this._tiles[t[o]],n=[r.positionAt(i[0],this.maxzoom),r.positionAt(i[1],this.maxzoom)];n[0].x<r.tileExtent&&n[0].y<r.tileExtent&&n[1].x>=0&&n[1].y>=0&&e.push({tile:r,minX:n[0].x,maxX:n[1].x,minY:n[0].y,maxY:n[1].y})}return e},indexSearch:function(i){for(var e=TileCoord.fromID(i),t=[i],o=e;0!==o.z;)o=o.parent(),t.push(o.id);for(var r,n=this.index,s=t.pop(),d=function(i){return i.id};t.length;)if(i=t.pop(),e=TileCoord.fromID(s),r=e.children(this.maxzoom).map(d).indexOf(i),n){if(0===n[r]){s=i;break}if(1===n[r]){s=i;break}s=i,n=n[r]}return 0===t.length?null:s}};
+	},{"../util/mru_cache":104,"../util/util":106,"./tile":44,"./tile_coord":45,"point-geometry":137}],47:[function(require,module,exports){
+	"use strict";function VectorTileSource(e){if(util.extend(this,util.pick(e,["url","tileSize"])),512!==this.tileSize)throw new Error("vector tile sources must have a tileSize of 512");Source._loadTileJSON.call(this,e)}var util=require("../util/util"),Evented=require("../util/evented"),Source=require("./source"),TileCoord=require("./tile_coord");module.exports=VectorTileSource,VectorTileSource.prototype=util.inherit(Evented,{minzoom:0,maxzoom:22,tileSize:512,reparseOverscaled:!0,_loaded:!1,onAdd:function(e){this.map=e},loaded:function(){return this._pyramid&&this._pyramid.loaded()},update:function(e){this._pyramid&&this._pyramid.update(this.used,e)},reload:function(){this._pyramid&&this._pyramid.reload()},redoPlacement:function(){if(this._pyramid)for(var e=this._pyramid.orderedIDs(),i=0;i<e.length;i++){var t=this._pyramid.getTile(e[i]);this._redoTilePlacement(t)}},render:Source._renderTiles,featuresAt:Source._vectorFeaturesAt,featuresIn:Source._vectorFeaturesIn,_loadTile:function(e){var i=e.coord.z>this.maxzoom?Math.pow(2,e.coord.z-this.maxzoom):1,t={url:e.coord.url(this.tiles,this.maxzoom),uid:e.uid,coord:e.coord,zoom:e.coord.z,maxZoom:this.maxzoom,tileSize:this.tileSize*i,source:this.id,overscaling:i,angle:this.map.transform.angle,pitch:this.map.transform.pitch,collisionDebug:this.map.collisionDebug,parentId:e.parentId};e.parentId&&(t.url=TileCoord.fromID(e.parentId).url(this.tiles,this.maxzoom)),e.workerID?this.dispatcher.send("reload tile",t,this._tileLoaded.bind(this,e),e.workerID):e.workerID=this.dispatcher.send("load tile",t,this._tileLoaded.bind(this,e))},_tileLoaded:function(e,i,t){if(!e.aborted){if(i)return void this.fire("tile.error",{tile:e});e.loadVectorData(t),e.redoWhenDone&&(e.redoWhenDone=!1,this._redoTilePlacement(e)),this.fire("tile.load",{tile:e}),this.fire("tile.stats",t.bucketStats)}},_abortTile:function(e){e.aborted=!0,this.dispatcher.send("abort tile",{uid:e.uid,source:this.id},null,e.workerID)},_addTile:function(e){this.fire("tile.add",{tile:e})},_removeTile:function(e){this.fire("tile.remove",{tile:e})},_unloadTile:function(e){e.unloadVectorData(this.map.painter),this.glyphAtlas.removeGlyphs(e.uid),this.dispatcher.send("remove tile",{uid:e.uid,source:this.id},null,e.workerID)},_redoTilePlacement:function(e){function i(i,t){e.reloadSymbolData(t,this.map.painter),this.fire("tile.load",{tile:e}),e.redoingPlacement=!1,e.redoWhenDone&&(this._redoTilePlacement(e),e.redoWhenDone=!1)}return!e.loaded||e.redoingPlacement?void(e.redoWhenDone=!0):(e.redoingPlacement=!0,void this.dispatcher.send("redo placement",{uid:e.uid,source:this.id,angle:this.map.transform.angle,pitch:this.map.transform.pitch,collisionDebug:this.map.collisionDebug},i.bind(this),e.workerID))}});
+	},{"../util/evented":100,"../util/util":106,"./source":43,"./tile_coord":45}],48:[function(require,module,exports){
+	"use strict";function VideoSource(e){this.coordinates=e.coordinates,ajax.getVideo(e.urls,function(e,t){if(!e){this.video=t,this.video.loop=!0;var i;this.video.addEventListener("playing",function(){i=this.map.style.animationLoop.set(1/0),this.map._rerender()}.bind(this)),this.video.addEventListener("pause",function(){this.map.style.animationLoop.cancel(i)}.bind(this)),this._loaded=!0,this.map&&(this.video.play(),this.createTile(),this.fire("change"))}}.bind(this))}var util=require("../util/util"),Tile=require("./tile"),LngLat=require("../geo/lng_lat"),Point=require("point-geometry"),Evented=require("../util/evented"),ajax=require("../util/ajax");module.exports=VideoSource,VideoSource.prototype=util.inherit(Evented,{roundZoom:!0,getVideo:function(){return this.video},onAdd:function(e){this.map=e,this.video&&(this.video.play(),this.createTile())},createTile:function(){var e=this.map,t=this.coordinates.map(function(t){var i=LngLat.convert(t);return e.transform.locationCoordinate(i).zoomTo(0)}),i=util.getCoordinatesCenter(t),r=4096,o=t.map(function(e){var t=e.zoomTo(i.zoom);return new Point(Math.round((t.column-i.column)*r),Math.round((t.row-i.row)*r))}),n=e.painter.gl,a=32767,u=new Int16Array([o[0].x,o[0].y,0,0,o[1].x,o[1].y,a,0,o[3].x,o[3].y,0,a,o[2].x,o[2].y,a,a]);this.tile=new Tile,this.tile.buckets={},this.tile.boundsBuffer=n.createBuffer(),n.bindBuffer(n.ARRAY_BUFFER,this.tile.boundsBuffer),n.bufferData(n.ARRAY_BUFFER,u,n.STATIC_DRAW),this.center=i},loaded:function(){return this.video&&this.video.readyState>=2},update:function(){},reload:function(){},render:function(e,t){if(this._loaded&&!(this.video.readyState<2)){var i=this.center;this.tile.calculateMatrices(i.zoom,i.column,i.row,this.map.transform,t);var r=t.gl;this.tile.texture?(r.bindTexture(r.TEXTURE_2D,this.tile.texture),r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,r.UNSIGNED_BYTE,this.video)):(this.tile.texture=r.createTexture(),r.bindTexture(r.TEXTURE_2D,this.tile.texture),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,this.video)),t.drawLayers(e,this.tile.posMatrix,this.tile)}},featuresAt:function(e,t,i){return i(null,[])},featuresIn:function(e,t,i){return i(null,[])}});
+	},{"../geo/lng_lat":20,"../util/ajax":94,"../util/evented":100,"../util/util":106,"./tile":44,"point-geometry":137}],49:[function(require,module,exports){
+	"use strict";function Worker(e){this.self=e,this.actor=new Actor(e,this),this.loading={},this.loaded={},this.layers=[],this.geoJSONIndexes={}}var Actor=require("../util/actor"),WorkerTile=require("./worker_tile"),util=require("../util/util"),ajax=require("../util/ajax"),vt=require("vector-tile"),Protobuf=require("pbf"),TileCoord=require("./tile_coord"),geojsonvt=require("geojson-vt"),GeoJSONWrapper=require("./geojson_wrapper");module.exports=function(e){return new Worker(e)},util.extend(Worker.prototype,{"set layers":function(e){this.layers=e},"load tile":function(e,r){function t(t,s){if(delete this.loading[o][i],t)return r(t);if(a.data=new vt.VectorTile(new Protobuf(new Uint8Array(s))),e.parentId&&a.data.layers){var l=this.getChildPosition(e.coord.id,e.parentId);a.parse(a.data,this.layers,this.actor,r,l.dz,l.xPos,l.yPos)}else a.parse(a.data,this.layers,this.actor,r);this.loaded[o]=this.loaded[o]||{},this.loaded[o][i]=a}var o=e.source,i=e.uid;this.loading[o]||(this.loading[o]={});var a=this.loading[o][i]=new WorkerTile(e);a.xhr=ajax.getArrayBuffer(e.url,t.bind(this))},"reload tile":function(e,r){var t=this.loaded[e.source],o=e.uid;if(t&&t[o]){var i=t[o];i.parse(i.data,this.layers,this.actor,r)}},"abort tile":function(e){var r=this.loading[e.source],t=e.uid;r&&r[t]&&(r[t].xhr.abort(),delete r[t])},"remove tile":function(e){var r=this.loaded[e.source],t=e.uid;r&&r[t]&&delete r[t]},"redo placement":function(e,r){var t=this.loaded[e.source],o=this.loading[e.source],i=e.uid;if(t&&t[i]){var a=t[i],s=a.redoPlacement(e.angle,e.pitch,e.collisionDebug);s.result&&r(null,s.result,s.transferables)}else o&&o[i]&&(o[i].angle=e.angle)},"parse geojson":function(e,r){var t=function(t,o){return t?r(t):(this.geoJSONIndexes[e.source]=geojsonvt(o,e.geojsonVtOptions),void r(null))}.bind(this);"string"==typeof e.data?ajax.getJSON(e.data,t):t(null,e.data)},"load geojson tile":function(e,r){var t=e.source,o=e.coord,i=this.geoJSONIndexes[t].getTile(o.z,o.x,o.y);if(!i)return r(null,null);var a=new WorkerTile(e);a.parse(new GeoJSONWrapper(i.features),this.layers,this.actor,r),this.loaded[t]=this.loaded[t]||{},this.loaded[t][e.uid]=a},"query features":function(e,r){var t=this.loaded[e.source]&&this.loaded[e.source][e.uid];t?t.featureTree.query(e,r):r(null,[])},getChildPosition:function(e,r){var t=TileCoord.fromID(e),o=TileCoord.fromID(r),i=t.z-o.z,a=t.x&(1<<i)-1,s=t.y&(1<<i)-1;return{dz:i,xPos:a,yPos:s}}});
+	},{"../util/actor":93,"../util/ajax":94,"../util/util":106,"./geojson_wrapper":40,"./tile_coord":45,"./worker_tile":50,"geojson-vt":111,"pbf":136,"vector-tile":144}],50:[function(require,module,exports){
+	"use strict";function WorkerTile(e){this.coord=e.coord,this.uid=e.uid,this.zoom=e.zoom,this.maxZoom=e.maxZoom,this.tileSize=e.tileSize,this.source=e.source,this.overscaling=e.overscaling,this.angle=e.angle,this.pitch=e.pitch,this.collisionDebug=e.collisionDebug,this.stacks={}}var FeatureTree=require("../data/feature_tree"),CollisionTile=require("../symbol/collision_tile"),BufferSet=require("../data/buffer/buffer_set"),createBucket=require("../data/create_bucket");module.exports=WorkerTile,WorkerTile.prototype.parse=function(e,t,r,i,s,o,n){function a(e,t,r,i,s){for(var o=0;o<e.length;o++){var n=e.feature(o);n.dz=r,n.xPos=i,n.yPos=s;for(var a in t){var l=t[a];l.filter(n)&&l.features.push(n)}}}function l(e){return function(t){e.dependenciesLoaded=!0,u(v,e,t)}}function u(e,t,r){if((!t.getDependencies||t.dependenciesLoaded)&&(!t.needsPlacement||t.previousPlaced)){if(!r){var i=Date.now();t.features.length&&t.addFeatures(g);var s=Date.now()-i;if(t.interactive)for(var o=0;o<t.features.length;o++){var n=t.features[o];e.featureTree.insert(n.bbox(),t.layers,n)}"undefined"!=typeof self&&(self.bucketStats=self.bucketStats||{_total:0},self.bucketStats._total+=s,self.bucketStats[t.id]=(self.bucketStats[t.id]||0)+s),t.features=null}return w--,w?void(t.next&&(t.next.previousPlaced=!0,u(e,t.next))):void f()}}function f(){if(v.status="done",v.redoPlacementAfterDone){var e=v.redoPlacement(v.angle,v.pitch).result;m.glyphVertex=e.buffers.glyphVertex,m.iconVertex=e.buffers.iconVertex,m.collisionBoxVertex=e.buffers.collisionBoxVertex}var t=[],r={};for(d in m)t.push(m[d].array);for(d in b)r[d]=b[d].elementGroups;i(null,{elementGroups:r,buffers:m,extent:T,bucketStats:"undefined"!=typeof self?self.bucketStats:null},t)}this.status="parsing",this.featureTree=new FeatureTree(this.coord,this.overscaling);var c,d,h,p,v=this,m=new BufferSet,g=new CollisionTile(this.angle,this.pitch),b={},x=this.bucketsInOrder=[],y={};for(c=0;c<t.length;c++)if(h=t[c],h.source===this.source&&!h.ref){var k=h.minzoom;if(!(k&&this.zoom<k&&k<this.maxZoom)){var P=h.maxzoom;if(!(P&&this.zoom>=P)){var S=h.layout.visibility;if("none"!==S)if(p=createBucket(h,m,this.zoom,this.overscaling,this.collisionDebug),p.layers=[h.id],b[p.id]=p,x.push(p),e.layers){var D=h["source-layer"];y[D]||(y[D]={}),y[D][p.id]=p}else y[p.id]=p}}}for(c=0;c<t.length;c++)h=t[c],h.source===this.source&&h.ref&&(p=b[h.ref],p&&p.layers.push(h.id));var T=4096;if(e.layers)for(d in y)h=e.layers[d],h&&(h.extent&&(T=h.extent),a(h,y[d],s,o,n));else a(e,y);var z,w=x.length;for(c=x.length-1;c>=0;c--)p=x[c],p.needsPlacement&&(z?z.next=p:p.previousPlaced=!0,z=p),p.getDependencies&&p.getDependencies(this,r,l(p)),p.needsPlacement||p.getDependencies||u(v,p)},WorkerTile.prototype.redoPlacement=function(e,t,r){if("done"!==this.status)return this.redoPlacementAfterDone=!0,this.angle=e,{};for(var i=new BufferSet,s=[],o={},n=new CollisionTile(e,t),a=this.bucketsInOrder,l=a.length-1;l>=0;l--){var u=a[l];"symbol"===u.type&&(u.placeFeatures(n,i,r),o[u.id]=u.elementGroups)}for(var f in i)s.push(i[f].array);return{result:{elementGroups:o,buffers:i},transferables:s}};
+	},{"../data/buffer/buffer_set":2,"../data/create_bucket":13,"../data/feature_tree":15,"../symbol/collision_tile":68}],51:[function(require,module,exports){
+	"use strict";function AnimationLoop(){this.n=0,this.times=[]}module.exports=AnimationLoop,AnimationLoop.prototype.stopped=function(){return this.times=this.times.filter(function(t){return t.time>=(new Date).getTime()}),!this.times.length},AnimationLoop.prototype.set=function(t){return this.times.push({id:this.n,time:t+(new Date).getTime()}),this.n++},AnimationLoop.prototype.cancel=function(t){this.times=this.times.filter(function(i){return i.id!==t})};
+	},{}],52:[function(require,module,exports){
+	"use strict";function ImageSprite(t){this.base=t,this.retina=browser.devicePixelRatio>1;var i=this.retina?"@2x":"";ajax.getJSON(normalizeURL(t,i,".json"),function(t,i){return t?void this.fire("error",{error:t}):(this.data=i,void(this.img&&this.fire("load")))}.bind(this)),ajax.getImage(normalizeURL(t,i,".png"),function(t,i){if(t)return void this.fire("error",{error:t});for(var e=i.getData(),r=i.data=new Uint8Array(e.length),a=0;a<e.length;a+=4){var o=e[a+3]/255;r[a+0]=e[a+0]*o,r[a+1]=e[a+1]*o,r[a+2]=e[a+2]*o,r[a+3]=e[a+3]}this.img=i,this.data&&this.fire("load")}.bind(this))}function SpritePosition(){}var Evented=require("../util/evented"),ajax=require("../util/ajax"),browser=require("../util/browser"),normalizeURL=require("../util/mapbox").normalizeSpriteURL;module.exports=ImageSprite,ImageSprite.prototype=Object.create(Evented),ImageSprite.prototype.toJSON=function(){return this.base},ImageSprite.prototype.loaded=function(){return!(!this.data||!this.img)},ImageSprite.prototype.resize=function(){if(browser.devicePixelRatio>1!==this.retina){var t=new ImageSprite(this.base);t.on("load",function(){this.img=t.img,this.data=t.data,this.retina=t.retina}.bind(this))}},SpritePosition.prototype={x:0,y:0,width:0,height:0,pixelRatio:1,sdf:!1},ImageSprite.prototype.getSpritePosition=function(t){if(!this.loaded())return new SpritePosition;var i=this.data&&this.data[t];return i&&this.img?i:new SpritePosition};
+	},{"../util/ajax":94,"../util/browser":95,"../util/evented":100,"../util/mapbox":103}],53:[function(require,module,exports){
+	"use strict";var reference=require("./reference");module.exports={},reference.layout.forEach(function(e){var r=function(e){for(var r in e)this[r]=e[r]},o=reference[e];for(var t in o)void 0!==o[t]["default"]&&(r.prototype[t]=o[t]["default"]);module.exports[e.replace("layout_","")]=r});
+	},{"./reference":55}],54:[function(require,module,exports){
+	"use strict";var reference=require("./reference"),parseCSSColor=require("csscolorparser").parseCSSColor;module.exports={},reference.paint.forEach(function(e){var r=function(){},o=reference[e];for(var p in o){var t=o[p],a=t["default"];void 0!==a&&("color"===t.type&&(a=parseCSSColor(a)),r.prototype[p]=a)}r.prototype.hidden=!1,module.exports[e.replace("paint_","")]=r});
+	},{"./reference":55,"csscolorparser":107}],55:[function(require,module,exports){
+	"use strict";module.exports=require("mapbox-gl-style-spec/reference/latest");
+	},{"mapbox-gl-style-spec/reference/latest":131}],56:[function(require,module,exports){
+	"use strict";function Style(e,t){this.animationLoop=t||new AnimationLoop,this.dispatcher=new Dispatcher(Math.max(browser.hardwareConcurrency-1,1),this),this.glyphAtlas=new GlyphAtlas(1024,1024),this.spriteAtlas=new SpriteAtlas(512,512),this.spriteAtlas.resize(browser.devicePixelRatio),this.lineAtlas=new LineAtlas(256,512),this._layers={},this._order=[],this._groups=[],this.sources={},this.zoomHistory={},util.bindAll(["_forwardSourceEvent","_forwardTileEvent","_redoPlacement"],this);var r=function(e,t){if(e)return void this.fire("error",{error:e});var r=validate(t);if(r.length)for(var i=0;i<r.length;i++)this.fire("error",{error:new Error(r[i].message)});else{this._loaded=!0,this.stylesheet=t;var s=t.sources;for(var o in s)this.addSource(o,s[o]);t.sprite&&(this.sprite=new ImageSprite(t.sprite),this.sprite.on("load",this.fire.bind(this,"change"))),this.glyphSource=new GlyphSource(t.glyphs,this.glyphAtlas),this._resolve(),this.fire("load")}}.bind(this);"string"==typeof e?ajax.getJSON(normalizeURL(e),r):browser.frame(r.bind(this,null,e))}var Evented=require("../util/evented"),styleBatch=require("./style_batch"),StyleLayer=require("./style_layer"),ImageSprite=require("./image_sprite"),GlyphSource=require("../symbol/glyph_source"),GlyphAtlas=require("../symbol/glyph_atlas"),SpriteAtlas=require("../symbol/sprite_atlas"),LineAtlas=require("../render/line_atlas"),util=require("../util/util"),ajax=require("../util/ajax"),normalizeURL=require("../util/mapbox").normalizeStyleURL,browser=require("../util/browser"),Dispatcher=require("../util/dispatcher"),AnimationLoop=require("./animation_loop"),validate=require("mapbox-gl-style-spec/lib/validate/latest");module.exports=Style,Style.prototype=util.inherit(Evented,{_loaded:!1,loaded:function(){if(!this._loaded)return!1;for(var e in this.sources)if(!this.sources[e].loaded())return!1;return this.sprite&&!this.sprite.loaded()?!1:!0},_resolve:function(){var e,t;this._layers={},this._order=[];for(var r=0;r<this.stylesheet.layers.length;r++)t=new StyleLayer(this.stylesheet.layers[r]),this._layers[t.id]=t,this._order.push(t.id);for(e in this._layers)this._layers[e].resolveLayout();for(e in this._layers)this._layers[e].resolveReference(this._layers),this._layers[e].resolvePaint();this._groupLayers(),this._broadcastLayers()},_groupLayers:function(){var e;this._groups=[];for(var t=0;t<this._order.length;++t){var r=this._layers[this._order[t]];e&&r.source===e.source||(e=[],e.source=r.source,this._groups.push(e)),e.push(r)}},_broadcastLayers:function(){var e=[];for(var t in this._layers)e.push(this._layers[t].json());this.dispatcher.broadcast("set layers",e)},_cascade:function(e,t){if(this._loaded){t=t||{transition:!0};for(var r in this._layers)this._layers[r].cascade(e,t,this.stylesheet.transition||{},this.animationLoop);this.fire("change")}},_recalculate:function(e){for(var t in this.sources)this.sources[t].used=!1;this._updateZoomHistory(e),this.rasterFadeDuration=300;for(t in this._layers){var r=this._layers[t];r.recalculate(e,this.zoomHistory)&&r.source&&(this.sources[r.source].used=!0)}var i=300;Math.floor(this.z)!==Math.floor(e)&&this.animationLoop.set(i),this.z=e,this.fire("zoom")},_updateZoomHistory:function(e){var t=this.zoomHistory;void 0===t.lastIntegerZoom&&(t.lastIntegerZoom=Math.floor(e),t.lastIntegerZoomTime=0,t.lastZoom=e),Math.floor(t.lastZoom)<Math.floor(e)?(t.lastIntegerZoom=Math.floor(e),t.lastIntegerZoomTime=Date.now()):Math.floor(t.lastZoom)>Math.floor(e)&&(t.lastIntegerZoom=Math.floor(e+1),t.lastIntegerZoomTime=Date.now()),t.lastZoom=e},batch:function(e){styleBatch(this,e)},addSource:function(e,t){return this.batch(function(r){r.addSource(e,t)}),this},removeSource:function(e){return this.batch(function(t){t.removeSource(e)}),this},getSource:function(e){return this.sources[e]},addLayer:function(e,t){return this.batch(function(r){r.addLayer(e,t)}),this},removeLayer:function(e){return this.batch(function(t){t.removeLayer(e)}),this},getLayer:function(e){return this._layers[e]},getReferentLayer:function(e){var t=this.getLayer(e);return t.ref&&(t=this.getLayer(t.ref)),t},setFilter:function(e,t){return this.batch(function(r){r.setFilter(e,t)}),this},setLayerZoomRange:function(e,t,r){return this.batch(function(i){i.setLayerZoomRange(e,t,r)}),this},getFilter:function(e){return this.getReferentLayer(e).filter},getLayoutProperty:function(e,t){return this.getReferentLayer(e).getLayoutProperty(t)},getPaintProperty:function(e,t,r){return this.getLayer(e).getPaintProperty(t,r)},featuresAt:function(e,t,r){var i=[],s=null;t.layer&&(t.layerIds=Array.isArray(t.layer)?t.layer:[t.layer]),util.asyncEach(Object.keys(this.sources),function(r,o){var a=this.sources[r];a.featuresAt(e,t,function(e,t){t&&(i=i.concat(t)),e&&(s=e),o()})}.bind(this),function(){return s?r(s):void r(null,i.filter(function(e){return void 0!==this._layers[e.layer]}.bind(this)).map(function(e){return e.layer=this._layers[e.layer].json(),e}.bind(this)))}.bind(this))},featuresIn:function(e,t,r){var i=[],s=null;t.layer&&(t.layer={id:t.layer}),util.asyncEach(Object.keys(this.sources),function(r,o){var a=this.sources[r];a.featuresIn(e,t,function(e,t){t&&(i=i.concat(t)),e&&(s=e),o()})}.bind(this),function(){return s?r(s):void r(null,i.filter(function(e){return void 0!==this._layers[e.layer]}.bind(this)).map(function(e){return e.layer=this._layers[e.layer].json(),e}.bind(this)))}.bind(this))},_remove:function(){this.dispatcher.remove()},_reloadSource:function(e){this.sources[e].reload()},_updateSources:function(e){for(var t in this.sources)this.sources[t].update(e)},_redoPlacement:function(){for(var e in this.sources)this.sources[e].redoPlacement&&this.sources[e].redoPlacement()},_forwardSourceEvent:function(e){this.fire("source."+e.type,util.extend({source:e.target},e))},_forwardTileEvent:function(e){this.fire(e.type,util.extend({source:e.target},e))},"get sprite json":function(e,t){var r=this.sprite;r.loaded()?t(null,{sprite:r.data,retina:r.retina}):r.on("load",function(){t(null,{sprite:r.data,retina:r.retina})})},"get icons":function(e,t){var r=this.sprite,i=this.spriteAtlas;r.loaded()?(i.setSprite(r),i.addIcons(e.icons,t)):r.on("load",function(){i.setSprite(r),i.addIcons(e.icons,t)})},"get glyphs":function(e,t){this.glyphSource.getSimpleGlyphs(e.fontstack,e.codepoints,e.uid,t)}});
+	},{"../render/line_atlas":36,"../symbol/glyph_atlas":70,"../symbol/glyph_source":71,"../symbol/sprite_atlas":77,"../util/ajax":94,"../util/browser":95,"../util/dispatcher":97,"../util/evented":100,"../util/mapbox":103,"../util/util":106,"./animation_loop":51,"./image_sprite":52,"./style_batch":57,"./style_layer":60,"mapbox-gl-style-spec/lib/validate/latest":129}],57:[function(require,module,exports){
+	"use strict";function styleBatch(e,t){if(!e._loaded)throw new Error("Style is not done loading");var r=Object.create(styleBatch.prototype);r._style=e,r._groupLayers=!1,r._broadcastLayers=!1,r._reloadSources={},r._events=[],r._change=!1,t(r),r._groupLayers&&r._style._groupLayers(),r._broadcastLayers&&r._style._broadcastLayers(),Object.keys(r._reloadSources).forEach(function(e){r._style._reloadSource(e)}),r._events.forEach(function(e){r._style.fire.apply(r._style,e)}),r._change&&r._style.fire("change")}var Source=require("../source/source"),StyleLayer=require("./style_layer");styleBatch.prototype={addLayer:function(e,t){if(void 0!==this._style._layers[e.id])throw new Error("There is already a layer with this ID");return e instanceof StyleLayer||(e=new StyleLayer(e)),this._style._layers[e.id]=e,this._style._order.splice(t?this._style._order.indexOf(t):1/0,0,e.id),e.resolveLayout(),e.resolveReference(this._style._layers),e.resolvePaint(),this._groupLayers=!0,this._broadcastLayers=!0,e.source&&(this._reloadSources[e.source]=!0),this._events.push(["layer.add",{layer:e}]),this._change=!0,this},removeLayer:function(e){var t=this._style._layers[e];if(void 0===t)throw new Error("There is no layer with this ID");for(var r in this._style._layers)this._style._layers[r].ref===e&&this.removeLayer(r);return delete this._style._layers[e],this._style._order.splice(this._style._order.indexOf(e),1),this._groupLayers=!0,this._broadcastLayers=!0,this._events.push(["layer.remove",{layer:t}]),this._change=!0,this},setPaintProperty:function(e,t,r,s){return this._style.getLayer(e).setPaintProperty(t,r,s),this._change=!0,this},setLayoutProperty:function(e,t,r){return e=this._style.getReferentLayer(e),e.setLayoutProperty(t,r),this._broadcastLayers=!0,e.source&&(this._reloadSources[e.source]=!0),this._change=!0,this},setFilter:function(e,t){return e=this._style.getReferentLayer(e),e.filter=t,this._broadcastLayers=!0,e.source&&(this._reloadSources[e.source]=!0),this._change=!0,this},setLayerZoomRange:function(e,t,r){var s=this._style.getReferentLayer(e);return null!=t&&(s.minzoom=t),null!=r&&(s.maxzoom=r),this._broadcastLayers=!0,s.source&&(this._reloadSources[s.source]=!0),this._change=!0,this},addSource:function(e,t){if(!this._style._loaded)throw new Error("Style is not done loading");if(void 0!==this._style.sources[e])throw new Error("There is already a source with this ID");return t=Source.create(t),this._style.sources[e]=t,t.id=e,t.style=this._style,t.dispatcher=this._style.dispatcher,t.glyphAtlas=this._style.glyphAtlas,t.on("load",this._style._forwardSourceEvent).on("error",this._style._forwardSourceEvent).on("change",this._style._forwardSourceEvent).on("tile.add",this._style._forwardTileEvent).on("tile.load",this._style._forwardTileEvent).on("tile.error",this._style._forwardTileEvent).on("tile.remove",this._style._forwardTileEvent).on("tile.stats",this._style._forwardTileEvent),this._events.push(["source.add",{source:t}]),this._change=!0,this},removeSource:function(e){if(void 0===this._style.sources[e])throw new Error("There is no source with this ID");var t=this._style.sources[e];return delete this._style.sources[e],t.off("load",this._style._forwardSourceEvent).off("error",this._style._forwardSourceEvent).off("change",this._style._forwardSourceEvent).off("tile.add",this._style._forwardTileEvent).off("tile.load",this._style._forwardTileEvent).off("tile.error",this._style._forwardTileEvent).off("tile.remove",this._style._forwardTileEvent).off("tile.stats",this._style._forwardTileEvent),this._events.push(["source.remove",{source:t}]),this._change=!0,this}},module.exports=styleBatch;
+	},{"../source/source":43,"./style_layer":60}],58:[function(require,module,exports){
+	"use strict";function StyleDeclaration(t,r){this.type=t.type,this.transitionable=t.transition,null==r&&(r=t["default"]),this.json=JSON.stringify(r),"color"===this.type?this.value=parseColor(r):this.value=r,"interpolated"===t["function"]?this.calculate=MapboxGLFunction.interpolated(this.value):(this.calculate=MapboxGLFunction["piecewise-constant"](this.value),t.transition&&(this.calculate=transitioned(this.calculate)))}function transitioned(t){return function(r,o,e){var n,i,a,l=r%1,s=Math.min((Date.now()-o.lastIntegerZoomTime)/e,1),c=1,u=1;return r>o.lastIntegerZoom?(n=l+(1-l)*s,c*=2,i=t(r-1),a=t(r)):(n=1-(1-s)*l,a=t(r),i=t(r+1),c/=2),{from:i,fromScale:c,to:a,toScale:u,t:n}}}function parseColor(t){if(colorCache[t])return colorCache[t];if(Array.isArray(t))return t;if(t.stops)return util.extend({},t,{stops:t.stops.map(function(t){return[t[0],parseColor(t[1])]})});if("string"==typeof t){var r=colorDowngrade(parseCSSColor(t));return colorCache[t]=r,r}throw new Error("Invalid color "+t)}function colorDowngrade(t){return[t[0]/255,t[1]/255,t[2]/255,t[3]/1]}var parseCSSColor=require("csscolorparser").parseCSSColor,MapboxGLFunction=require("mapbox-gl-function"),util=require("../util/util");module.exports=StyleDeclaration;var colorCache={};
+	},{"../util/util":106,"csscolorparser":107,"mapbox-gl-function":128}],59:[function(require,module,exports){
+	"use strict";function makeConstructor(t){function e(t){this._values={},this._transitions={};for(var e in t)this[e]=t[e]}return Object.keys(t).forEach(function(n){var r=t[n];Object.defineProperty(e.prototype,n,{set:function(t){this._values[n]=new StyleDeclaration(r,t)},get:function(){return this._values[n].value}}),r.transition&&Object.defineProperty(e.prototype,n+"-transition",{set:function(t){this._transitions[n]=t},get:function(){return this._transitions[n]}})}),e.prototype.values=function(){return this._values},e.prototype.transition=function(t,e){var n=this._transitions[t]||{};return{duration:util.coalesce(n.duration,e.duration,300),delay:util.coalesce(n.delay,e.delay,0)}},e.prototype.json=function(){var t={};for(var e in this._values)t[e]=this._values[e].value;for(var n in this._transitions)t[n+"-transition"]=this._transitions[e];return t},e}var util=require("../util/util"),reference=require("./reference"),StyleDeclaration=require("./style_declaration"),lookup={paint:{},layout:{}};reference.layer.type.values.forEach(function(t){lookup.paint[t]=makeConstructor(reference["paint_"+t]),lookup.layout[t]=makeConstructor(reference["layout_"+t])}),module.exports=function(t,e,n){return new lookup[t][e](n)};
+	},{"../util/util":106,"./reference":55,"./style_declaration":58}],60:[function(require,module,exports){
+	"use strict";function StyleLayer(t){this._layer=t,this.id=t.id,this.ref=t.ref,this._resolved={},this._cascaded={},this.assign(t)}function premultiplyLayer(t,i){var e=i+"-color",a=i+"-halo-color",o=i+"-outline-color",r=t[e],s=t[a],n=t[o],l=t[i+"-opacity"],y=r&&l*r[3],u=s&&l*s[3],h=n&&l*n[3];void 0!==y&&1>y&&(t[e]=util.premultiply([r[0],r[1],r[2],y])),void 0!==u&&1>u&&(t[a]=util.premultiply([s[0],s[1],s[2],u])),void 0!==h&&1>h&&(t[o]=util.premultiply([n[0],n[1],n[2],h]))}var util=require("../util/util"),StyleTransition=require("./style_transition"),StyleDeclarationSet=require("./style_declaration_set"),LayoutProperties=require("./layout_properties"),PaintProperties=require("./paint_properties");module.exports=StyleLayer,StyleLayer.prototype={resolveLayout:function(){this.ref||(this.layout=new LayoutProperties[this.type](this._layer.layout),"line"===this.layout["symbol-placement"]&&(this.layout.hasOwnProperty("text-rotation-alignment")||(this.layout["text-rotation-alignment"]="map"),this.layout.hasOwnProperty("icon-rotation-alignment")||(this.layout["icon-rotation-alignment"]="map"),this.layout["symbol-avoid-edges"]=!0))},setLayoutProperty:function(t,i){null==i?delete this.layout[t]:this.layout[t]=i},getLayoutProperty:function(t){return this.layout[t]},resolveReference:function(t){this.ref&&this.assign(t[this.ref])},resolvePaint:function(){for(var t in this._layer){var i=t.match(/^paint(?:\.(.*))?$/);i&&(this._resolved[i[1]||""]=new StyleDeclarationSet("paint",this.type,this._layer[t]))}},setPaintProperty:function(t,i,e){var a=this._resolved[e||""];a||(a=this._resolved[e||""]=new StyleDeclarationSet("paint",this.type,{})),a[t]=i},getPaintProperty:function(t,i){var e=this._resolved[i||""];if(e)return e[t]},cascade:function(t,i,e,a){for(var o in this._resolved)if(""===o||t[o]){var r=this._resolved[o],s=r.values();for(var n in s){var l=s[n],y=i.transition?this._cascaded[n]:void 0;if(!y||y.declaration.json!==l.json){var u=r.transition(n,e),h=this._cascaded[n]=new StyleTransition(l,y,u);h.instant()||(h.loopID=a.set(h.endTime-(new Date).getTime())),y&&a.cancel(y.loopID)}}}if("symbol"===this.type){var c=new StyleDeclarationSet("layout",this.type,this.layout);this._cascaded["text-size"]=new StyleTransition(c.values()["text-size"],void 0,e),this._cascaded["icon-size"]=new StyleTransition(c.values()["icon-size"],void 0,e)}},recalculate:function(t,i){var e=this.type,a=this.paint=new PaintProperties[e];for(var o in this._cascaded)a[o]=this._cascaded[o].at(t,i);if(this.hidden=this.minzoom&&t<this.minzoom||this.maxzoom&&t>=this.maxzoom||"none"===this.layout.visibility,"symbol"===e?0!==a["text-opacity"]&&this.layout["text-field"]||0!==a["icon-opacity"]&&this.layout["icon-image"]?(premultiplyLayer(a,"text"),premultiplyLayer(a,"icon")):this.hidden=!0:0===a[e+"-opacity"]?this.hidden=!0:premultiplyLayer(a,e),this._cascaded["line-dasharray"]){var r=a["line-dasharray"],s=this._cascaded["line-width"]?this._cascaded["line-width"].at(Math.floor(t),1/0):a["line-width"];r.fromScale*=s,r.toScale*=s}return!this.hidden},assign:function(t){util.extend(this,util.pick(t,["type","source","source-layer","minzoom","maxzoom","filter","layout"]))},json:function(){return util.extend({},this._layer,util.pick(this,["type","source","source-layer","minzoom","maxzoom","filter","layout","paint"]))}};
+	},{"../util/util":106,"./layout_properties":53,"./paint_properties":54,"./style_declaration_set":59,"./style_transition":61}],61:[function(require,module,exports){
+	"use strict";function StyleTransition(t,i,e){this.declaration=t,this.startTime=this.endTime=(new Date).getTime();var n=t.type;"string"!==n&&"array"!==n||!t.transitionable?this.interp=interpolate[n]:this.interp=interpZoomTransitioned,this.oldTransition=i,this.duration=e.duration||0,this.delay=e.delay||0,this.instant()||(this.endTime=this.startTime+this.duration+this.delay,this.ease=util.easeCubicInOut),i&&i.endTime<=this.startTime&&delete i.oldTransition}function interpZoomTransitioned(t,i,e){return{from:t.to,fromScale:t.toScale,to:i.to,toScale:i.toScale,t:e}}var util=require("../util/util"),interpolate=require("../util/interpolate");module.exports=StyleTransition,StyleTransition.prototype.instant=function(){return!this.oldTransition||!this.interp||0===this.duration&&0===this.delay},StyleTransition.prototype.at=function(t,i,e){var n=this.declaration.calculate(t,i,this.duration);if(this.instant())return n;if(e=e||Date.now(),e<this.endTime){var r=this.oldTransition.at(t,i,this.startTime),a=this.ease((e-this.startTime-this.delay)/this.duration);n=this.interp(r,n,a)}return n};
+	},{"../util/interpolate":102,"../util/util":106}],62:[function(require,module,exports){
+	"use strict";function Anchor(t,e,o,n){this.x=t,this.y=e,this.angle=o,void 0!==n&&(this.segment=n)}var Point=require("point-geometry");module.exports=Anchor,Anchor.prototype=Object.create(Point.prototype),Anchor.prototype.clone=function(){return new Anchor(this.x,this.y,this.angle,this.segment)};
+	},{"point-geometry":137}],63:[function(require,module,exports){
+	"use strict";function BinPack(e,h){this.width=e,this.height=h,this.free=[{x:0,y:0,w:e,h:h}]}module.exports=BinPack,BinPack.prototype.release=function(e){for(var h=0;h<this.free.length;h++){var i=this.free[h];if(i.y===e.y&&i.h===e.h&&i.x+i.w===e.x)i.w+=e.w;else if(i.x===e.x&&i.w===e.w&&i.y+i.h===e.y)i.h+=e.h;else if(e.y===i.y&&e.h===i.h&&e.x+e.w===i.x)i.x=e.x,i.w+=e.w;else{if(e.x!==i.x||e.w!==i.w||e.y+e.h!==i.y)continue;i.y=e.y,i.h+=e.h}return this.free.splice(h,1),void this.release(i)}this.free.push(e)},BinPack.prototype.allocate=function(e,h){for(var i={x:1/0,y:1/0,w:1/0,h:1/0},t=-1,s=0;s<this.free.length;s++){var r=this.free[s];e<=r.w&&h<=r.h&&r.y<=i.y&&r.x<=i.x&&(i=r,t=s)}return 0>t?{x:-1,y:-1}:(this.free.splice(t,1),i.w<i.h?(i.w>e&&this.free.push({x:i.x+e,y:i.y,w:i.w-e,h:h}),i.h>h&&this.free.push({x:i.x,y:i.y+h,w:i.w,h:i.h-h})):(i.w>e&&this.free.push({x:i.x+e,y:i.y,w:i.w-e,h:i.h}),i.h>h&&this.free.push({x:i.x,y:i.y+h,w:e,h:i.h-h})),{x:i.x,y:i.y,w:e,h:h})};
+	},{}],64:[function(require,module,exports){
+	"use strict";function checkMaxAngle(e,t,a,r,n){if(void 0===t.segment)return!0;for(var i=t,s=t.segment+1,f=0;f>-a/2;){if(s--,0>s)return!1;f-=e[s].dist(i),i=e[s]}f+=e[s].dist(e[s+1]),s++;for(var l=[],o=0;a/2>f;){var u=e[s-1],c=e[s],g=e[s+1];if(!g)return!1;var h=u.angleTo(c)-c.angleTo(g);for(h=(h+3*Math.PI)%(2*Math.PI)-Math.PI,l.push({distance:f,angleDelta:h}),o+=h;f-l[0].distance>r;)o-=l.shift().angleDelta;if(Math.abs(o)>n)return!1;s++,f+=c.dist(g)}return!0}module.exports=checkMaxAngle;
+	},{}],65:[function(require,module,exports){
+	"use strict";function clipLine(x,y,n,e,t){for(var i=[],o=0;o<x.length;o++)for(var r,P=x[o],u=0;u<P.length-1;u++){var w=P[u],l=P[u+1];w.x<y&&l.x<y||(w.x<y?w=new Point(y,w.y+(l.y-w.y)*((y-w.x)/(l.x-w.x))):l.x<y&&(l=new Point(y,w.y+(l.y-w.y)*((y-w.x)/(l.x-w.x)))),w.y<n&&l.y<n||(w.y<n?w=new Point(w.x+(l.x-w.x)*((n-w.y)/(l.y-w.y)),n):l.y<n&&(l=new Point(w.x+(l.x-w.x)*((n-w.y)/(l.y-w.y)),n)),w.x>=e&&l.x>=e||(w.x>=e?w=new Point(e,w.y+(l.y-w.y)*((e-w.x)/(l.x-w.x))):l.x>=e&&(l=new Point(e,w.y+(l.y-w.y)*((e-w.x)/(l.x-w.x)))),w.y>=t&&l.y>=t||(w.y>=t?w=new Point(w.x+(l.x-w.x)*((t-w.y)/(l.y-w.y)),t):l.y>=t&&(l=new Point(w.x+(l.x-w.x)*((t-w.y)/(l.y-w.y)),t)),r&&w.equals(r[r.length-1])||(r=[w],i.push(r)),r.push(l)))))}return i}var Point=require("point-geometry");module.exports=clipLine;
+	},{"point-geometry":137}],66:[function(require,module,exports){
+	"use strict";function CollisionBox(i,t,s,h,o,l){this.anchorPoint=i,this.x1=t,this.y1=s,this.x2=h,this.y2=o,this.maxScale=l,this.placementScale=0,this[0]=this[1]=this[2]=this[3]=0}module.exports=CollisionBox;
+	},{}],67:[function(require,module,exports){
+	"use strict";function CollisionFeature(o,i,t,e,r,s){var n=t.top*e-r,l=t.bottom*e+r,a=t.left*e-r,u=t.right*e+r;if(this.boxes=[],s){var h=l-n,x=u-a;if(0>=h)return;h=Math.max(10*e,h),this._addLineCollisionBoxes(o,i,x,h)}else this.boxes.push(new CollisionBox(new Point(i.x,i.y),a,n,u,l,1/0))}var CollisionBox=require("./collision_box"),Point=require("point-geometry");module.exports=CollisionFeature,CollisionFeature.prototype._addLineCollisionBoxes=function(o,i,t,e){var r=e/2,s=Math.floor(t/r),n=-e/2,l=this.boxes,a=i,u=i.segment+1,h=n;do{if(u--,0>u)return l;h-=o[u].dist(a),a=o[u]}while(h>-t/2);for(var x=o[u].dist(o[u+1]),d=0;s>d;d++){for(var f=-t/2+d*r;f>h+x;){if(h+=x,u++,u+1>=o.length)return l;x=o[u].dist(o[u+1])}var C=f-h,b=o[u],m=o[u+1],p=m.sub(b)._unit()._mult(C)._add(b),v=Math.max(Math.abs(f-n)-r/2,0),_=t/2/v;l.push(new CollisionBox(p,-e/2,-e/2,e/2,e/2,_))}return l};
+	},{"./collision_box":66,"point-geometry":137}],68:[function(require,module,exports){
+	"use strict";function CollisionTile(t,a){this.tree=rbush(),this.angle=t;var e=Math.sin(t),i=Math.cos(t);this.rotationMatrix=[i,-e,e,i],this.yStretch=1/Math.cos(a/180*Math.PI),this.yStretch=Math.pow(this.yStretch,1.3)}var rbush=require("rbush");module.exports=CollisionTile,CollisionTile.prototype.minScale=.25,CollisionTile.prototype.maxScale=2,CollisionTile.prototype.placeCollisionFeature=function(t){for(var a=this.minScale,e=this.rotationMatrix,i=this.yStretch,o=0;o<t.boxes.length;o++){var l=t.boxes[o],r=l.anchorPoint.matMult(e),s=r.x,h=r.y;l[0]=s+l.x1,l[1]=h+l.y1*i,l[2]=s+l.x2,l[3]=h+l.y2*i;for(var n=this.tree.search(l),c=0;c<n.length;c++){var x=n[c],m=x.anchorPoint.matMult(e),y=(x.x1-l.x2)/(s-m.x),u=(x.x2-l.x1)/(s-m.x),S=(x.y1-l.y2)*i/(h-m.y),p=(x.y2-l.y1)*i/(h-m.y);(isNaN(y)||isNaN(u))&&(y=u=1),(isNaN(S)||isNaN(p))&&(S=p=1);var M=Math.min(Math.max(y,u),Math.max(S,p));if(M>x.maxScale&&(M=x.maxScale),M>l.maxScale&&(M=l.maxScale),M>a&&M>=x.placementScale&&(a=M),a>=this.maxScale)return a}}return a},CollisionTile.prototype.insertCollisionFeature=function(t,a){for(var e=t.boxes,i=0;i<e.length;i++)e[i].placementScale=a;a<this.maxScale&&this.tree.load(e)};
+	},{"rbush":139}],69:[function(require,module,exports){
+	"use strict";function getAnchors(e,r,t,a,n,o,l,h){var i=a?.6*o*l:0,c=Math.max(a?a.right-a.left:0,n?n.right-n.left:0);if(0===e[0].x||4096===e[0].x||0===e[0].y||4096===e[0].y)var u=!0;r/4>r-c*l&&(r=c*l+r/4);var s=2*o,g=u?r/2*h%r:(c/2+s)*l*h%r;return resample(e,g,r,i,t,c*l,u,!1)}function resample(e,r,t,a,n,o,l,h){for(var i=0,c=r-t,u=[],s=0;s<e.length-1;s++){for(var g=e[s],p=e[s+1],x=g.dist(p),f=p.angleTo(g);i+x>c+t;){c+=t;var v=(c-i)/x,m=interpolate(g.x,p.x,v),A=interpolate(g.y,p.y,v);if(m>=0&&4096>m&&A>=0&&4096>A){m=Math.round(m),A=Math.round(A);var y=new Anchor(m,A,f,s);(!a||checkMaxAngle(e,y,o,a,n))&&u.push(y)}}i+=x}return h||u.length||l||(u=resample(e,i/2,t,a,n,o,l,!0)),u}var interpolate=require("../util/interpolate"),Anchor=require("../symbol/anchor"),checkMaxAngle=require("./check_max_angle");module.exports=getAnchors;
+	},{"../symbol/anchor":62,"../util/interpolate":102,"./check_max_angle":64}],70:[function(require,module,exports){
+	"use strict";function GlyphAtlas(t,i){this.width=t,this.height=i,this.bin=new BinPack(t,i),this.index={},this.ids={},this.data=new Uint8Array(t*i)}var BinPack=require("./bin_pack");module.exports=GlyphAtlas,GlyphAtlas.prototype={get debug(){return"canvas"in this},set debug(t){t&&!this.canvas?(this.canvas=document.createElement("canvas"),this.canvas.width=this.width,this.canvas.height=this.height,document.body.appendChild(this.canvas),this.ctx=this.canvas.getContext("2d")):!t&&this.canvas&&(this.canvas.parentNode.removeChild(this.canvas),delete this.ctx,delete this.canvas)}},GlyphAtlas.prototype.getGlyphs=function(){var t,i,e,s={};for(var h in this.ids)t=h.split("#"),i=t[0],e=t[1],s[i]||(s[i]=[]),s[i].push(e);return s},GlyphAtlas.prototype.getRects=function(){var t,i,e,s={};for(var h in this.ids)t=h.split("#"),i=t[0],e=t[1],s[i]||(s[i]={}),s[i][e]=this.index[h];return s},GlyphAtlas.prototype.removeGlyphs=function(t){for(var i in this.ids){var e=this.ids[i],s=e.indexOf(t);if(s>=0&&e.splice(s,1),this.ids[i]=e,!e.length){for(var h=this.index[i],a=this.data,r=0;r<h.h;r++)for(var n=this.width*(h.y+r)+h.x,d=0;d<h.w;d++)a[n+d]=0;this.dirty=!0,this.bin.release(h),delete this.index[i],delete this.ids[i]}}this.updateTexture(this.gl)},GlyphAtlas.prototype.addGlyph=function(t,i,e,s){if(!e)return null;var h=i+"#"+e.id;if(this.index[h])return this.ids[h].indexOf(t)<0&&this.ids[h].push(t),this.index[h];if(!e.bitmap)return null;var a=e.width+2*s,r=e.height+2*s,n=1,d=a+2*n,l=r+2*n;d+=4-d%4,l+=4-l%4;var o=this.bin.allocate(d,l);if(o.x<0)return console.warn("glyph bitmap overflow"),{glyph:e,rect:null};this.index[h]=o,this.ids[h]=[t];for(var c=this.data,p=e.bitmap,u=0;r>u;u++)for(var x=this.width*(o.y+u+n)+o.x+n,E=a*u,T=0;a>T;T++)c[x+T]=p[E+T];return this.dirty=!0,o},GlyphAtlas.prototype.bind=function(t){this.gl=t,this.texture?t.bindTexture(t.TEXTURE_2D,this.texture):(this.texture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texture),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texImage2D(t.TEXTURE_2D,0,t.ALPHA,this.width,this.height,0,t.ALPHA,t.UNSIGNED_BYTE,null))},GlyphAtlas.prototype.updateTexture=function(t){if(this.bind(t),this.dirty){if(t.texSubImage2D(t.TEXTURE_2D,0,0,0,this.width,this.height,t.ALPHA,t.UNSIGNED_BYTE,this.data),this.ctx){for(var i=this.ctx.getImageData(0,0,this.width,this.height),e=0,s=0;e<this.data.length;e++,s+=4)i.data[s]=this.data[e],i.data[s+1]=this.data[e],i.data[s+2]=this.data[e],i.data[s+3]=255;this.ctx.putImageData(i,0,0),this.ctx.strokeStyle="red";for(var h=0;h<this.bin.free.length;h++){var a=this.bin.free[h];this.ctx.strokeRect(a.x,a.y,a.w,a.h)}}this.dirty=!1}};
+	},{"./bin_pack":63}],71:[function(require,module,exports){
+	"use strict";function GlyphSource(t,e){this.url=t&&normalizeURL(t),this.glyphAtlas=e,this.stacks=[],this.loading={}}function SimpleGlyph(t,e,r){var i=1;this.advance=t.advance,this.left=t.left-r-i,this.top=t.top+r+i,this.rect=e}function glyphUrl(t,e,r,i){return i=i||"abc",r.replace("{s}",i[t.length%i.length]).replace("{fontstack}",t).replace("{range}",e)}var normalizeURL=require("../util/mapbox").normalizeGlyphsURL,getArrayBuffer=require("../util/ajax").getArrayBuffer,Glyphs=require("../util/glyphs"),Protobuf=require("pbf");module.exports=GlyphSource,GlyphSource.prototype.getSimpleGlyphs=function(t,e,r,i){void 0===this.stacks[t]&&(this.stacks[t]={});for(var l,a={},s=this.stacks[t],h=this.glyphAtlas,o=3,n={},p=0,u=0;u<e.length;u++){var f=e[u];if(l=Math.floor(f/256),s[l]){var y=s[l].glyphs[f],c=h.addGlyph(r,t,y,o);y&&(a[f]=new SimpleGlyph(y,c,o))}else void 0===n[l]&&(n[l]=[],p++),n[l].push(f)}p||i(void 0,a);var g=function(e,l,s){if(!e)for(var u=this.stacks[t][l]=s.stacks[0],f=0;f<n[l].length;f++){var y=n[l][f],c=u.glyphs[y],g=h.addGlyph(r,t,c,o);c&&(a[y]=new SimpleGlyph(c,g,o))}p--,p||i(void 0,a)}.bind(this);for(var d in n)this.loadRange(t,d,g)},GlyphSource.prototype.loadRange=function(t,e,r){if(256*e>65535)return r("gyphs > 65535 not supported");void 0===this.loading[t]&&(this.loading[t]={});var i=this.loading[t];if(i[e])i[e].push(r);else{i[e]=[r];var l=256*e+"-"+(256*e+255),a=glyphUrl(t,l,this.url);getArrayBuffer(a,function(t,r){for(var l=!t&&new Glyphs(new Protobuf(new Uint8Array(r))),a=0;a<i[e].length;a++)i[e][a](t,e,l);delete i[e]})}};
+	},{"../util/ajax":94,"../util/glyphs":101,"../util/mapbox":103,"pbf":136}],72:[function(require,module,exports){
+	"use strict";module.exports=function(e,t,n){function r(r){l.push(e[r]),c.push(n[r]),v.push(t[r]),h++}function u(e,t,n){var r=f[e];return delete f[e],f[t]=r,c[r][0].pop(),c[r][0]=c[r][0].concat(n[0]),r}function i(e,t,n){var r=a[t];return delete a[t],a[e]=r,c[r][0].shift(),c[r][0]=n[0].concat(c[r][0]),r}function o(e,t,n){var r=n?t[0][t[0].length-1]:t[0][0];return e+":"+r.x+":"+r.y}var s,a={},f={},l=[],c=[],v=[],h=0;for(s=0;s<e.length;s++){var p=n[s],d=t[s];if(p)if(d){var g=o(d,p),x=o(d,p,!0);if(g in f&&x in a&&f[g]!==a[x]){var m=i(g,x,p),y=u(g,x,c[m]);delete a[g],delete f[x],f[o(d,c[y],!0)]=y,c[m]=null}else g in f?u(g,x,p):x in a?i(g,x,p):(r(s),a[g]=h-1,f[x]=h-1)}else r(s)}return{features:l,textFeatures:v,geometries:c}};
+	},{}],73:[function(require,module,exports){
+	"use strict";function SymbolQuad(t,a,e,n,i,o,r,h,l){this.anchorPoint=t,this.tl=a,this.tr=e,this.bl=n,this.br=i,this.tex=o,this.angle=r,this.minScale=h,this.maxScale=l}function getIconQuads(t,a,e,n,i,o){var r=a.image.rect,h=1,l=a.left-h,s=l+r.w,m=a.top-h,u=m+r.h,c=new Point(l,m),g=new Point(s,m),M=new Point(s,u),P=new Point(l,u),f=i["icon-rotate"]*Math.PI/180;if(o){var y=n[t.segment];f+=Math.atan2(t.y-y.y,t.x-y.x)}if(f){var S=Math.sin(f),v=Math.cos(f),x=[v,-S,S,v];c=c.matMult(x),g=g.matMult(x),P=P.matMult(x),M=M.matMult(x)}return[new SymbolQuad(new Point(t.x,t.y),c,g,P,M,a.image.rect,0,minScale,1/0)]}function getGlyphQuads(t,a,e,n,i,o){for(var r=i["text-rotate"]*Math.PI/180,h=i["text-keep-upright"],l=a.positionedGlyphs,s=[],m=0;m<l.length;m++){var u=l[m],c=u.glyph,g=c.rect;if(g){var M,P=(u.x+c.advance/2)*e,f=minScale;o?(M=[],f=getSegmentGlyphs(M,t,P,n,t.segment,!0),h&&(f=Math.min(f,getSegmentGlyphs(M,t,P,n,t.segment,!1)))):M=[{anchorPoint:new Point(t.x,t.y),offset:0,angle:0,maxScale:1/0,minScale:minScale}];for(var y=u.x+c.left,S=u.y-c.top,v=y+g.w,x=S+g.h,p=new Point(y,S),w=new Point(v,S),d=new Point(y,x),I=new Point(v,x),b=0;b<M.length;b++){var Q=M[b],G=p,k=w,q=d,_=I,j=Q.angle+r;if(j){var z=Math.sin(j),A=Math.cos(j),B=[A,-z,z,A];G=G.matMult(B),k=k.matMult(B),q=q.matMult(B),_=_.matMult(B)}var C=Math.max(Q.minScale,f),D=(t.angle+r+Q.offset+2*Math.PI)%(2*Math.PI);s.push(new SymbolQuad(Q.anchorPoint,G,k,q,_,g,D,C,Q.maxScale))}}}return s}function getSegmentGlyphs(t,a,e,n,i,o){var r=!o;0>e&&(o=!o),o&&i++;var h=new Point(a.x,a.y),l=n[i],s=1/0;e=Math.abs(e);for(var m=minScale;;){var u=h.dist(l),c=e/u,g=Math.atan2(l.y-h.y,l.x-h.x);if(o||(g+=Math.PI),r&&(g+=Math.PI),t.push({anchorPoint:h,offset:r?Math.PI:0,minScale:c,maxScale:s,angle:(g+2*Math.PI)%(2*Math.PI)}),m>=c)break;for(h=l;h.equals(l);)if(i+=o?1:-1,l=n[i],!l)return c;var M=l.sub(h)._unit();h=h.sub(M._mult(u)),s=c}return m}var Point=require("point-geometry");module.exports={getIconQuads:getIconQuads,getGlyphQuads:getGlyphQuads};var minScale=.5;
+	},{"point-geometry":137}],74:[function(require,module,exports){
+	"use strict";function resolveIcons(e,r){for(var o=[],s=0,n=e.length;n>s;s++){var t=resolveTokens(e[s].properties,r["icon-image"]);t&&o.indexOf(t)<0&&o.push(t)}return o}var resolveTokens=require("../util/token");module.exports=resolveIcons;
+	},{"../util/token":105}],75:[function(require,module,exports){
+	"use strict";function resolveText(e,r,t){for(var o=[],s=[],n=0,u=e.length;u>n;n++){var a=resolveTokens(e[n].properties,r["text-field"]);if(a){a=a.toString();var l=r["text-transform"];"uppercase"===l?a=a.toLocaleUpperCase():"lowercase"===l&&(a=a.toLocaleLowerCase());for(var i=0,v=a.length;v>i;i++)s.push(a.charCodeAt(i));o[n]=a}else o[n]=null}return s=uniq(s,t),{textFeatures:o,codepoints:s}}function uniq(e,r){var t,o=[];e.sort(sortNumbers);for(var s=0;s<e.length;s++)e[s]!==t&&(t=e[s],r[t]||o.push(e[s]));return o}function sortNumbers(e,r){return e-r}var resolveTokens=require("../util/token");module.exports=resolveText;
+	},{"../util/token":105}],76:[function(require,module,exports){
+	"use strict";function PositionedGlyph(t,i,n,e){this.codePoint=t,this.x=i,this.y=n,this.glyph=e}function Shaping(t,i,n,e,o,h){this.positionedGlyphs=t,this.text=i,this.top=n,this.bottom=e,this.left=o,this.right=h}function shapeText(t,i,n,e,o,h,a,s,r){for(var l=[],f=new Shaping(l,t,r[1],r[1],r[0],r[0]),c=-17,p=r[0],u=r[1]+c,d=0;d<t.length;d++){var g=t.charCodeAt(d),v=i[g];v&&(l.push(new PositionedGlyph(g,p,u,v)),p+=v.advance+s)}return l.length?(linewrap(f,i,e,n,o,h,a),f):!1}function linewrap(t,i,n,e,o,h,a){var s=null,r=0,l=0,f=0,c=0,p=t.positionedGlyphs;if(e)for(var u=0;u<p.length;u++){var d=p[u];if(d.x-=r,d.y+=n*f,d.x>e&&null!==s){var g=p[s+1].x;c=Math.max(g,c);for(var v=s+1;u>=v;v++)p[v].y+=n,p[v].x-=g;a&&justifyLine(p,i,l,s-1,a),l=s+1,s=null,r+=g,f++}breakable[d.codePoint]&&(s=u)}var x=p[p.length-1],y=x.x+i[x.codePoint].advance;c=Math.max(c,y);var P=(f+1)*n;justifyLine(p,i,l,p.length-1,a),align(p,a,o,h,c,n,f),t.top+=-h*P,t.bottom=t.top+P,t.left+=-o*c,t.right=t.left+c}function justifyLine(t,i,n,e,o){for(var h=i[t[e].codePoint].advance,a=(t[e].x+h)*o,s=n;e>=s;s++)t[s].x-=a}function align(t,i,n,e,o,h,a){for(var s=(i-n)*o,r=(-e*(a+1)+.5)*h,l=0;l<t.length;l++)t[l].x+=s,t[l].y+=r}function shapeIcon(t,i){if(!t||!t.rect)return null;var n=i["icon-offset"][0],e=i["icon-offset"][1],o=n-t.width/2,h=o+t.width,a=e-t.height/2,s=a+t.height;return new PositionedIcon(t,a,s,o,h)}function PositionedIcon(t,i,n,e,o){this.image=t,this.top=i,this.bottom=n,this.left=e,this.right=o}module.exports={shapeText:shapeText,shapeIcon:shapeIcon};var breakable={32:!0};
+	},{}],77:[function(require,module,exports){
+	"use strict";function SpriteAtlas(t,i){this.width=t,this.height=i,this.bin=new BinPack(t,i),this.images={},this.data=!1,this.texture=0,this.filter=0,this.pixelRatio=1,this.dirty=!0}function copyBitmap(t,i,e,h,a,s,r,o,n,l,p){var d,c,x=h*i+e,f=o*s+r;if(p)for(f-=s,c=-1;l>=c;c++,x=((c+l)%l+h)*i+e,f+=s)for(d=-1;n>=d;d++)a[f+d]=t[x+(d+n)%n];else for(c=0;l>c;c++,x+=i,f+=s)for(d=0;n>d;d++)a[f+d]=t[x+d]}function AtlasImage(t,i,e,h){this.rect=t,this.width=i,this.height=e,this.sdf=h}var BinPack=require("./bin_pack");module.exports=SpriteAtlas,SpriteAtlas.prototype={get debug(){return"canvas"in this},set debug(t){t&&!this.canvas?(this.canvas=document.createElement("canvas"),this.canvas.width=this.width*this.pixelRatio,this.canvas.height=this.height*this.pixelRatio,this.canvas.style.width=this.width+"px",this.canvas.style.width=this.width+"px",document.body.appendChild(this.canvas),this.ctx=this.canvas.getContext("2d")):!t&&this.canvas&&(this.canvas.parentNode.removeChild(this.canvas),delete this.ctx,delete this.canvas)}},SpriteAtlas.prototype.resize=function(t){if(this.pixelRatio===t)return!1;var i=this.pixelRatio;if(this.pixelRatio=t,this.canvas&&(this.canvas.width=this.width*this.pixelRatio,this.canvas.height=this.height*this.pixelRatio),this.data){var e=this.data;this.data=!1,this.allocate(),this.texture=!1;for(var h=this.width*i,a=this.height*i,s=this.width*t,r=this.height*t,o=this.data,n=e,l=0;r>l;l++)for(var p=Math.floor(l*a/r)*h,d=l*s,c=0;s>c;c++){var x=Math.floor(c*h/s);o[d+c]=n[p+x]}e=null,this.dirty=!0}return this.dirty},SpriteAtlas.prototype.allocateImage=function(t,i){var e=2,h=t+e+(4-(t+e)%4),a=i+e+(4-(i+e)%4),s=this.bin.allocate(h,a);return 0===s.w?s:(s.originalWidth=t,s.originalHeight=i,s)},SpriteAtlas.prototype.getImage=function(t,i){if(this.images[t])return this.images[t];if(!this.sprite)return null;var e=this.sprite.getSpritePosition(t);if(!e.width||!e.height)return null;var h=e.width/e.pixelRatio,a=e.height/e.pixelRatio,s=this.allocateImage(h,a);if(0===s.w)return s;var r=new AtlasImage(s,h,a,e.sdf);return this.images[t]=r,this.copy(s,e,i),r},SpriteAtlas.prototype.getPosition=function(t,i){var e=this.getImage(t,i),h=e&&e.rect;if(!h)return null;var a=i?e.width:h.w,s=i?e.height:h.h,r=1;return{size:[a,s],tl:[(h.x+r)/this.width,(h.y+r)/this.height],br:[(h.x+r+a)/this.width,(h.y+r+s)/this.height]}},SpriteAtlas.prototype.allocate=function(){if(!this.data){var t=Math.floor(this.width*this.pixelRatio),i=Math.floor(this.height*this.pixelRatio);this.data=new Uint32Array(t*i);for(var e=0;e<this.data.length;e++)this.data[e]=0}},SpriteAtlas.prototype.copy=function(t,i,e){if(this.sprite.img.data){var h=new Uint32Array(this.sprite.img.data.buffer);this.allocate();var a=this.data,s=1;copyBitmap(h,this.sprite.img.width,i.x,i.y,a,this.width*this.pixelRatio,(t.x+s)*this.pixelRatio,(t.y+s)*this.pixelRatio,i.width,i.height,e),this.dirty=!0}},SpriteAtlas.prototype.setSprite=function(t){this.sprite=t},SpriteAtlas.prototype.addIcons=function(t,i){for(var e=0;e<t.length;e++)this.getImage(t[e]);i(null,this.images)},SpriteAtlas.prototype.bind=function(t,i){var e=!1;this.texture?t.bindTexture(t.TEXTURE_2D,this.texture):(this.texture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texture),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),e=!0);var h=i?t.LINEAR:t.NEAREST;if(h!==this.filter&&(t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,h),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,h),this.filter=h),this.dirty&&(this.allocate(),e?t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width*this.pixelRatio,this.height*this.pixelRatio,0,t.RGBA,t.UNSIGNED_BYTE,new Uint8Array(this.data.buffer)):t.texSubImage2D(t.TEXTURE_2D,0,0,0,this.width*this.pixelRatio,this.height*this.pixelRatio,t.RGBA,t.UNSIGNED_BYTE,new Uint8Array(this.data.buffer)),this.dirty=!1,this.ctx)){var a=this.ctx.getImageData(0,0,this.width*this.pixelRatio,this.height*this.pixelRatio);a.data.set(new Uint8ClampedArray(this.data.buffer)),this.ctx.putImageData(a,0,0),this.ctx.strokeStyle="red";for(var s=0;s<this.bin.free.length;s++){var r=this.bin.free[s];this.ctx.strokeRect(r.x*this.pixelRatio,r.y*this.pixelRatio,r.w*this.pixelRatio,r.h*this.pixelRatio)}}};
+	},{"./bin_pack":63}],78:[function(require,module,exports){
+	"use strict";var util=require("../util/util"),interpolate=require("../util/interpolate"),browser=require("../util/browser"),LngLat=require("../geo/lng_lat"),LngLatBounds=require("../geo/lng_lat_bounds"),Point=require("point-geometry"),Camera=module.exports=function(){};util.extend(Camera.prototype,{getCenter:function(){return this.transform.center},setCenter:function(t){return this.jumpTo({center:t}),this},panBy:function(t,i){return this.panTo(this.transform.center,util.extend({offset:Point.convert(t).mult(-1)},i)),this},panTo:function(t,i){this.stop(),t=LngLat.convert(t),i=util.extend({duration:500,easing:util.ease,offset:[0,0]},i);var e=this.transform,n=Point.convert(i.offset).rotate(-e.angle),o=e.point,r=e.project(t).sub(n);return i.noMoveStart||this.fire("movestart"),this._ease(function(t){e.center=e.unproject(o.add(r.sub(o).mult(t))),this.fire("move")},function(){this.fire("moveend")},i),this},getZoom:function(){return this.transform.zoom},setZoom:function(t){return this.jumpTo({zoom:t}),this},zoomTo:function(t,i){this.stop(),i=util.extend({duration:500},i),i.easing=this._updateEasing(i.duration,t,i.easing);var e=this.transform,n=e.center,o=e.zoom;return i.around?n=LngLat.convert(i.around):i.offset&&(n=e.pointLocation(e.centerPoint.add(Point.convert(i.offset)))),i.animate===!1&&(i.duration=0),this.zooming||(this.zooming=!0,this.fire("movestart")),this._ease(function(i){e.setZoomAround(interpolate(o,t,i),n),this.fire("move").fire("zoom")},function(){this.ease=null,i.duration>=200&&(this.zooming=!1,this.fire("moveend"))},i),i.duration<200&&(clearTimeout(this._onZoomEnd),this._onZoomEnd=setTimeout(function(){this.zooming=!1,this.fire("moveend")}.bind(this),200)),this},zoomIn:function(t){return this.zoomTo(this.getZoom()+1,t),this},zoomOut:function(t){return this.zoomTo(this.getZoom()-1,t),this},getBearing:function(){return this.transform.bearing},setBearing:function(t){return this.jumpTo({bearing:t}),this},rotateTo:function(t,i){this.stop(),i=util.extend({duration:500,easing:util.ease},i);var e=this.transform,n=this.getBearing(),o=e.center;return i.around?o=LngLat.convert(i.around):i.offset&&(o=e.pointLocation(e.centerPoint.add(Point.convert(i.offset)))),t=this._normalizeBearing(t,n),this.rotating=!0,this.fire("movestart"),this._ease(function(i){e.setBearingAround(interpolate(n,t,i),o),this.fire("move").fire("rotate")},function(){this.rotating=!1,this.fire("moveend")},i),this},resetNorth:function(t){return this.rotateTo(0,util.extend({duration:1e3},t)),this},snapToNorth:function(t){return Math.abs(this.getBearing())<this.options.bearingSnap?this.resetNorth(t):this},getPitch:function(){return this.transform.pitch},setPitch:function(t){return this.jumpTo({pitch:t}),this},fitBounds:function(t,i){i=util.extend({padding:0,offset:[0,0],maxZoom:1/0},i),t=LngLatBounds.convert(t);var e=Point.convert(i.offset),n=this.transform,o=n.project(t.getNorthWest()),r=n.project(t.getSouthEast()),s=r.sub(o),a=(n.width-2*i.padding-2*Math.abs(e.x))/s.x,h=(n.height-2*i.padding-2*Math.abs(e.y))/s.y;return i.center=n.unproject(o.add(r).div(2)),i.zoom=Math.min(n.scaleZoom(n.scale*Math.min(a,h)),i.maxZoom),i.bearing=0,i.linear?this.easeTo(i):this.flyTo(i)},jumpTo:function(t){this.stop();var i=this.transform,e=!1,n=!1,o=!1;return"center"in t&&(i.center=LngLat.convert(t.center)),"zoom"in t&&i.zoom!==+t.zoom&&(e=!0,i.zoom=+t.zoom),"bearing"in t&&i.bearing!==+t.bearing&&(n=!0,i.bearing=+t.bearing),"pitch"in t&&i.pitch!==+t.pitch&&(o=!0,i.pitch=+t.pitch),this.fire("movestart").fire("move"),e&&this.fire("zoom"),n&&this.fire("rotate"),o&&this.fire("pitch"),this.fire("moveend")},easeTo:function(t){this.stop(),t=util.extend({offset:[0,0],duration:500,easing:util.ease},t);var i=this.transform,e=Point.convert(t.offset).rotate(-i.angle),n=i.point,o=this.getZoom(),r=this.getBearing(),s=this.getPitch(),a="zoom"in t?+t.zoom:o,h="bearing"in t?this._normalizeBearing(t.bearing,r):r,u="pitch"in t?+t.pitch:s,f=i.zoomScale(a-o),c="center"in t?i.project(LngLat.convert(t.center)).sub(e.div(f)):n,m=LngLat.convert(t.around);return a!==o&&(this.zooming=!0),r!==h&&(this.rotating=!0),this.zooming&&!m&&(m=i.pointLocation(i.centerPoint.add(c.sub(n).div(1-1/f)))),this.fire("movestart"),this._ease(function(t){this.zooming?i.setZoomAround(interpolate(o,a,t),m):i.center=i.unproject(n.add(c.sub(n).mult(t))),this.rotating&&(i.bearing=interpolate(r,h,t)),u!==s&&(i.pitch=interpolate(s,u,t)),this.fire("move"),this.zooming&&this.fire("zoom"),this.rotating&&this.fire("rotate")},function(){this.zooming=!1,this.rotating=!1,this.fire("moveend")},t),this},flyTo:function(t){function i(t){var i=(z*z-b*b+(t?-1:1)*M*M*_*_)/(2*(t?z:b)*M*_);return Math.log(Math.sqrt(i*i+1)-i)}function e(t){return(Math.exp(t)-Math.exp(-t))/2}function n(t){return(Math.exp(t)+Math.exp(-t))/2}function o(t){return e(t)/n(t)}this.stop(),t=util.extend({offset:[0,0],speed:1.2,curve:1.42,easing:util.ease},t);var r=this.transform,s=Point.convert(t.offset),a=this.getZoom(),h=this.getBearing(),u="center"in t?LngLat.convert(t.center):this.getCenter(),f="zoom"in t?+t.zoom:a,c="bearing"in t?this._normalizeBearing(t.bearing,h):h,m=r.zoomScale(f-a),g=r.point,d=r.project(u).sub(s.div(m)),p=r.worldSize,l=t.curve,v=t.speed,b=Math.max(r.width,r.height),z=b/m,_=d.sub(g).mag(),M=l*l,L=i(0),x=function(t){return n(L)/n(L+l*t)},T=function(t){return b*((n(L)*o(L+l*t)-e(L))/M)/_},B=(i(1)-L)/l;if(Math.abs(_)<1e-6){if(Math.abs(b-z)<1e-6)return this;var j=b>z?-1:1;B=Math.abs(Math.log(z/b))/l,T=function(){return 0},x=function(t){return Math.exp(j*l*t)}}return t.duration=1e3*B/v,this.zooming=!0,h!==c&&(this.rotating=!0),this.fire("movestart"),this._ease(function(t){var i=t*B,e=T(i);r.zoom=a+r.scaleZoom(1/x(i)),r.center=r.unproject(g.add(d.sub(g).mult(e)),p),c!==h&&(r.bearing=interpolate(h,c,t)),this.fire("move").fire("zoom"),c!==h&&this.fire("rotate")},function(){this.zooming=!1,this.rotating=!1,this.fire("moveend")},t),this},isEasing:function(){return!!this._abortFn},stop:function(){return this._abortFn&&(this._abortFn(),this._finishEase()),this},_ease:function(t,i,e){this._finishFn=i,this._abortFn=browser.timed(function(i){t.call(this,e.easing(i)),1===i&&this._finishEase()},e.animate===!1?0:e.duration,this)},_finishEase:function(){delete this._abortFn;var t=this._finishFn;delete this._finishFn,t.call(this)},_normalizeBearing:function(t,i){t=util.wrap(t,-180,180);var e=Math.abs(t-i);return Math.abs(t-360-i)<e&&(t-=360),Math.abs(t+360-i)<e&&(t+=360),t},_updateEasing:function(t,i,e){var n;if(this.ease){var o=this.ease,r=(Date.now()-o.start)/o.duration,s=o.easing(r+.01)-o.easing(r),a=.27/Math.sqrt(s*s+1e-4)*.01,h=Math.sqrt(.0729-a*a);n=util.bezier(a,h,.25,1)}else n=e?util.bezier.apply(util,e):util.ease;return this.ease={start:(new Date).getTime(),to:Math.pow(2,i),duration:t,easing:n},n}});
+	},{"../geo/lng_lat":20,"../geo/lng_lat_bounds":21,"../util/browser":95,"../util/interpolate":102,"../util/util":106,"point-geometry":137}],79:[function(require,module,exports){
+	"use strict";function Attribution(){}var Control=require("./control"),DOM=require("../../util/dom"),util=require("../../util/util");module.exports=Attribution,Attribution.prototype=util.inherit(Control,{options:{position:"bottom-right"},onAdd:function(t){var i="mapboxgl-ctrl-attrib",e=this._container=DOM.create("div",i,t.getContainer());return this._update(),t.on("source.load",this._update.bind(this)),t.on("source.change",this._update.bind(this)),t.on("source.remove",this._update.bind(this)),t.on("moveend",this._updateEditLink.bind(this)),e},_update:function(){var t=[];if(this._map.style)for(var i in this._map.style.sources){var e=this._map.style.sources[i];e.attribution&&t.indexOf(e.attribution)<0&&t.push(e.attribution)}this._container.innerHTML=t.join(" | "),this._editLink=this._container.getElementsByClassName("mapbox-improve-map")[0],this._updateEditLink()},_updateEditLink:function(){if(this._editLink){var t=this._map.getCenter();this._editLink.href="https://www.mapbox.com/map-feedback/#/"+t.lng+"/"+t.lat+"/"+Math.round(this._map.getZoom()+1)}}});
+	},{"../../util/dom":98,"../../util/util":106,"./control":80}],80:[function(require,module,exports){
+	"use strict";function Control(){}module.exports=Control,Control.prototype={addTo:function(o){this._map=o;var t=this._container=this.onAdd(o);if(this.options&&this.options.position){var i=this.options.position,n=o._controlCorners[i];t.className+=" mapboxgl-ctrl",-1!==i.indexOf("bottom")?n.insertBefore(t,n.firstChild):n.appendChild(t)}return this},remove:function(){return this._container.parentNode.removeChild(this._container),this.onRemove&&this.onRemove(this._map),this._map=null,this}};
+	},{}],81:[function(require,module,exports){
+	"use strict";function Navigation(t){util.setOptions(this,t)}var Control=require("./control"),DOM=require("../../util/dom"),util=require("../../util/util");module.exports=Navigation,Navigation.prototype=util.inherit(Control,{options:{position:"top-right"},onAdd:function(t){var o="mapboxgl-ctrl",s=this._container=DOM.create("div",o+"-group",t.getContainer());this._zoomInButton=this._createButton(o+"-icon "+o+"-zoom-in",t.zoomIn.bind(t)),this._zoomOutButton=this._createButton(o+"-icon "+o+"-zoom-out",t.zoomOut.bind(t)),this._compass=this._createButton(o+"-compass",t.resetNorth.bind(t));var e=this._compassCanvas=DOM.create("canvas",o+"-compass-canvas",this._compass);return e.style.cssText="width:30px; height:30px;",e.width=52,e.height=52,this._compass.addEventListener("mousedown",this._onCompassDown.bind(this)),this._onCompassMove=this._onCompassMove.bind(this),this._onCompassUp=this._onCompassUp.bind(this),this._compassCtx=e.getContext("2d"),t.on("rotate",this._drawNorth.bind(this)),this._drawNorth(),s},_onCompassDown:function(t){DOM.disableDrag(),document.addEventListener("mousemove",this._onCompassMove),document.addEventListener("mouseup",this._onCompassUp),this._prevX=t.screenX,t.stopPropagation()},_onCompassMove:function(t){var o=t.screenX,s=2>o?-5:o>window.screen.width-2?5:(o-this._prevX)/4;this._map.setBearing(this._map.getBearing()-s),this._prevX=t.screenX,this._moved=!0,t.preventDefault()},_onCompassUp:function(){document.removeEventListener("mousemove",this._onCompassMove),document.removeEventListener("mouseup",this._onCompassUp),DOM.enableDrag(),this._moved&&(this._moved=!1,DOM.suppressClick()),this._map.snapToNorth()},_createButton:function(t,o){var s=DOM.create("button",t,this._container);return s.addEventListener("click",function(){o()}),s},_drawNorth:function(){var t=20,o=8,s=26,e=this._map.transform.angle+Math.PI/2,i=this._compassCtx;this._compassCanvas.width=this._compassCanvas.width,i.translate(s,s),i.rotate(e),i.beginPath(),i.fillStyle="#000",i.lineTo(0,-o),i.lineTo(-t,0),i.lineTo(0,o),i.fill(),i.beginPath(),i.fillStyle="#bbb",i.moveTo(0,0),i.lineTo(0,o),i.lineTo(t,0),i.lineTo(0,-o),i.fill(),i.beginPath(),i.strokeStyle="#fff",i.lineWidth=4,i.moveTo(0,-o),i.lineTo(0,o),i.stroke()}});
+	},{"../../util/dom":98,"../../util/util":106,"./control":80}],82:[function(require,module,exports){
+	"use strict";function BoxZoom(o){this._map=o,this._el=o.getCanvasContainer(),this._container=o.getContainer(),util.bindHandlers(this)}var DOM=require("../../util/dom"),LngLatBounds=require("../../geo/lng_lat_bounds"),util=require("../../util/util");module.exports=BoxZoom,BoxZoom.prototype={enable:function(){this._el.addEventListener("mousedown",this._onMouseDown,!1)},disable:function(){this._el.removeEventListener("mousedown",this._onMouseDown)},_onMouseDown:function(o){(o.shiftKey||1===o.which&&1===o.button)&&(document.addEventListener("mousemove",this._onMouseMove,!1),document.addEventListener("keydown",this._onKeyDown,!1),document.addEventListener("mouseup",this._onMouseUp,!1),this._startPos=DOM.mousePos(this._el,o),this.active=!0)},_onMouseMove:function(o){var e=this._startPos,t=DOM.mousePos(this._el,o);this._box||(this._box=DOM.create("div","mapboxgl-boxzoom",this._container),this._container.classList.add("mapboxgl-crosshair"),DOM.disableDrag(),this._map.fire("boxzoomstart"));var s=Math.min(e.x,t.x),n=Math.max(e.x,t.x),i=Math.min(e.y,t.y),a=Math.max(e.y,t.y);DOM.setTransform(this._box,"translate("+s+"px,"+i+"px)"),this._box.style.width=n-s+"px",this._box.style.height=a-i+"px"},_onMouseUp:function(o){var e=this._startPos,t=DOM.mousePos(this._el,o),s=new LngLatBounds(this._map.unproject(e),this._map.unproject(t));this._finish(),this._map.fitBounds(s,{linear:!0}).fire("boxzoomend",{boxZoomBounds:s})},_onKeyDown:function(o){27===o.keyCode&&(this._finish(),this._map.fire("boxzoomcancel"))},_finish:function(){this._box&&(this.active=!1,document.removeEventListener("mousemove",this._onMouseMove,!1),document.removeEventListener("keydown",this._onKeyDown,!1),document.removeEventListener("mouseup",this._onMouseUp,!1),this._container.classList.remove("mapboxgl-crosshair"),this._box.parentNode.removeChild(this._box),this._box=null,DOM.enableDrag())}};
+	},{"../../geo/lng_lat_bounds":21,"../../util/dom":98,"../../util/util":106}],83:[function(require,module,exports){
+	"use strict";function DoubleClickZoom(o){this._map=o,this._onDblClick=this._onDblClick.bind(this)}module.exports=DoubleClickZoom,DoubleClickZoom.prototype={enable:function(){this._map.on("dblclick",this._onDblClick)},disable:function(){this._map.off("dblclick",this._onDblClick)},_onDblClick:function(o){this._map.zoomTo(Math.round(this._map.getZoom())+1,{around:o.lngLat})}};
+	},{}],84:[function(require,module,exports){
+	"use strict";function DragPan(e){this._map=e,this._el=e.getCanvasContainer(),util.bindHandlers(this)}var DOM=require("../../util/dom"),util=require("../../util/util");module.exports=DragPan;var inertiaLinearity=.25,inertiaEasing=util.bezier(0,0,inertiaLinearity,1),inertiaMaxSpeed=3e3,inertiaDeceleration=4e3;DragPan.prototype={enable:function(){this._el.addEventListener("mousedown",this._onDown,!1),this._el.addEventListener("touchstart",this._onDown,!1)},disable:function(){this._el.removeEventListener("mousedown",this._onDown),this._el.removeEventListener("touchstart",this._onDown)},_onDown:function(e){this._startPos=this._pos=DOM.mousePos(this._el,e),this._inertia=[[Date.now(),this._pos]],e.touches?1===e.touches.length&&(document.addEventListener("touchmove",this._onMove,!1),document.addEventListener("touchend",this._onTouchEnd,!1)):(document.addEventListener("mousemove",this._onMove,!1),document.addEventListener("mouseup",this._onMouseUp,!1))},_onMove:function(e){var t=this._map;if(!(t.boxZoom.active||t.dragRotate.active||e.touches&&e.touches.length>1)){this.active=!0;var n=DOM.mousePos(this._el,e),i=this._inertia,o=Date.now();for(i.push([o,n]);i.length>2&&o-i[0][0]>50;)i.shift();t.stop(),t.transform.setLocationAtPoint(t.transform.pointLocation(this._pos),n),t.fire("move"),this._pos=n,e.preventDefault()}},_onUp:function(){var e=this._inertia;if(e.length<2)return void this._map.fire("moveend");var t=e[e.length-1],n=e[0],i=t[1].sub(n[1]),o=(t[0]-n[0])/1e3,s=i.mult(inertiaLinearity/o),a=s.mag();a>inertiaMaxSpeed&&(a=inertiaMaxSpeed,s._unit()._mult(a));var r=a/(inertiaDeceleration*inertiaLinearity),u=s.mult(-r/2);this._map.panBy(u,{duration:1e3*r,easing:inertiaEasing,noMoveStart:!0}),this.active=!1},_onMouseUp:function(){this._onUp(),document.removeEventListener("mousemove",this._onMove,!1),document.removeEventListener("mouseup",this._onMouseUp,!1)},_onTouchEnd:function(){this._onUp(),document.removeEventListener("touchmove",this._onMove),document.removeEventListener("touchend",this._onTouchEnd)}};
+	},{"../../util/dom":98,"../../util/util":106}],85:[function(require,module,exports){
+	"use strict";function DragRotate(t){this._map=t,this._el=t.getCanvasContainer(),util.bindHandlers(this)}var DOM=require("../../util/dom"),Point=require("point-geometry"),util=require("../../util/util");module.exports=DragRotate,DragRotate.prototype={enable:function(){this._el.addEventListener("contextmenu",this._onContextMenu,!1)},disable:function(){this._el.removeEventListener("contextmenu",this._onContextMenu)},_onContextMenu:function(t){this._map.stop(),this._startPos=this._pos=DOM.mousePos(this._el,t),document.addEventListener("mousemove",this._onMouseMove,!1),document.addEventListener("mouseup",this._onMouseUp,!1),t.preventDefault()},_onMouseMove:function(t){var e=this._startPos,o=this._pos,n=DOM.mousePos(this._el,t),i=this._map,s=i.transform.centerPoint,r=e.sub(s),u=r.mag();this.active=!0,i.rotating||(i.fire("movestart"),i.rotating=!0),200>u&&(s=e.add(new Point(-200,0)._rotate(r.angle())));var a=o.sub(s).angleWith(n.sub(s))/Math.PI*180;i.transform.bearing=i.getBearing()-a,i.fire("move").fire("rotate"),clearTimeout(this._timeout),this._timeout=setTimeout(this._onTimeout,200),this._pos=n},_onTimeout:function(){var t=this._map;t.rotating=!1,t.snapToNorth(),t.rotating||(t._rerender(),t.fire("moveend"))},_onMouseUp:function(){this.active=!1,document.removeEventListener("mousemove",this._onMouseMove,!1),document.removeEventListener("mouseup",this._onMouseUp,!1)}};
+	},{"../../util/dom":98,"../../util/util":106,"point-geometry":137}],86:[function(require,module,exports){
+	"use strict";function Keyboard(e){this._map=e,this._el=e.getCanvasContainer(),this._onKeyDown=this._onKeyDown.bind(this)}module.exports=Keyboard;var panDelta=80,rotateDelta=2;Keyboard.prototype={enable:function(){this._el.addEventListener("keydown",this._onKeyDown,!1)},disable:function(){this._el.removeEventListener("keydown",this._onKeyDown)},_onKeyDown:function(e){if(!(e.altKey||e.ctrlKey||e.metaKey)){var a=this._map;switch(e.keyCode){case 61:case 107:case 171:case 187:a.zoomTo(Math.round(a.getZoom())+(e.shiftKey?2:1));break;case 189:case 109:case 173:a.zoomTo(Math.round(a.getZoom())-(e.shiftKey?2:1));break;case 37:e.shiftKey?a.setBearing(a.getBearing()-rotateDelta):a.panBy([-panDelta,0]);break;case 39:e.shiftKey?a.setBearing(a.getBearing()+rotateDelta):a.panBy([panDelta,0]);break;case 38:a.panBy([0,-panDelta]);break;case 40:a.panBy([0,panDelta])}}}};
+	},{}],87:[function(require,module,exports){
+	"use strict";function Pinch(t){this._map=t,this._el=t.getCanvasContainer(),util.bindHandlers(this)}var DOM=require("../../util/dom"),util=require("../../util/util");module.exports=Pinch,Pinch.prototype={enable:function(){this._el.addEventListener("touchstart",this._onStart,!1)},disable:function(){this._el.removeEventListener("touchstart",this._onStart)},_onStart:function(t){if(2===t.touches.length){var e=DOM.mousePos(this._el,t.touches[0]),s=DOM.mousePos(this._el,t.touches[1]);this._startVec=e.sub(s),this._startScale=this._map.transform.scale,this._startBearing=this._map.transform.bearing,document.addEventListener("touchmove",this._onMove,!1),document.addEventListener("touchend",this._onEnd,!1)}},_onMove:function(t){if(2===t.touches.length){var e=DOM.mousePos(this._el,t.touches[0]),s=DOM.mousePos(this._el,t.touches[1]),n=e.add(s).div(2),o=e.sub(s),i=o.mag()/this._startVec.mag(),a=180*o.angleWith(this._startVec)/Math.PI,r=this._map;r.easeTo({zoom:r.transform.scaleZoom(this._startScale*i),bearing:this._startBearing+a,duration:0,around:r.unproject(n)}),t.preventDefault()}},_onEnd:function(){this._map.snapToNorth(),document.removeEventListener("touchmove",this._onMove),document.removeEventListener("touchend",this._onEnd)}};
+	},{"../../util/dom":98,"../../util/util":106}],88:[function(require,module,exports){
+	"use strict";function ScrollZoom(e){this._map=e,this._el=e.getCanvasContainer(),util.bindHandlers(this)}var DOM=require("../../util/dom"),browser=require("../../util/browser"),util=require("../../util/util");module.exports=ScrollZoom;var ua="undefined"!=typeof navigator?navigator.userAgent.toLowerCase():"",firefox=-1!==ua.indexOf("firefox"),safari=-1!==ua.indexOf("safari")&&-1===ua.indexOf("chrom");ScrollZoom.prototype={enable:function(){this._el.addEventListener("wheel",this._onWheel,!1),this._el.addEventListener("mousewheel",this._onWheel,!1)},disable:function(){this._el.removeEventListener("wheel",this._onWheel),this._el.removeEventListener("mousewheel",this._onWheel)},_onWheel:function(e){var t;"wheel"===e.type?(t=e.deltaY,firefox&&e.deltaMode===window.WheelEvent.DOM_DELTA_PIXEL&&(t/=browser.devicePixelRatio),e.deltaMode===window.WheelEvent.DOM_DELTA_LINE&&(t*=40)):"mousewheel"===e.type&&(t=-e.wheelDeltaY,safari&&(t/=3));var i=(window.performance||Date).now(),o=i-(this._time||0);this._pos=DOM.mousePos(this._el,e),this._time=i,0!==t&&t%4.000244140625===0?(this._type="wheel",t=Math.floor(t/4)):0!==t&&Math.abs(t)<4?this._type="trackpad":o>400?(this._type=null,this._lastValue=t,this._timeout=setTimeout(this._onTimeout,40)):this._type||(this._type=Math.abs(o*t)<200?"trackpad":"wheel",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,t+=this._lastValue)),e.shiftKey&&t&&(t/=4),this._type&&this._zoom(-t),e.preventDefault()},_onTimeout:function(){this._type="wheel",this._zoom(-this._lastValue)},_zoom:function(e){var t=this._map,i=2/(1+Math.exp(-Math.abs(e/100)));0>e&&0!==i&&(i=1/i);var o=t.ease?t.ease.to:t.transform.scale,s=t.transform.scaleZoom(o*i);t.zoomTo(s,{duration:0,around:t.unproject(this._pos)})}};
+	},{"../../util/browser":95,"../../util/dom":98,"../../util/util":106}],89:[function(require,module,exports){
+	"use strict";function Hash(){util.bindAll(["_onHashChange","_updateHash"],this)}module.exports=Hash;var util=require("../util/util");Hash.prototype={addTo:function(t){return this._map=t,window.addEventListener("hashchange",this._onHashChange,!1),this._map.on("moveend",this._updateHash),this},remove:function(){return window.removeEventListener("hashchange",this._onHashChange,!1),this._map.off("moveend",this._updateHash),delete this._map,this},_onHashChange:function(){var t=location.hash.replace("#","").split("/");return t.length>=3?(this._map.jumpTo({center:[+t[2],+t[1]],zoom:+t[0],bearing:+(t[3]||0)}),!0):!1},_updateHash:function(){var t=this._map.getCenter(),e=this._map.getZoom(),a=this._map.getBearing(),h=Math.max(0,Math.ceil(Math.log(e)/Math.LN2)),n="#"+Math.round(100*e)/100+"/"+t.lat.toFixed(h)+"/"+t.lng.toFixed(h)+(a?"/"+Math.round(10*a)/10:"");window.history.replaceState("","",n)}};
+	},{"../util/util":106}],90:[function(require,module,exports){
+	"use strict";function Interaction(e){this._map=e,this._el=e.getCanvasContainer();for(var t in handlers)e[t]=new handlers[t](e);util.bindHandlers(this)}var handlers={scrollZoom:require("./handler/scroll_zoom"),boxZoom:require("./handler/box_zoom"),dragRotate:require("./handler/drag_rotate"),dragPan:require("./handler/drag_pan"),keyboard:require("./handler/keyboard"),doubleClickZoom:require("./handler/dblclick_zoom"),pinch:require("./handler/pinch")},DOM=require("../util/dom"),util=require("../util/util");module.exports=Interaction,Interaction.prototype={enable:function(){var e=this._map.options,t=this._el;for(var n in handlers)e[n]&&this._map[n].enable();t.addEventListener("mousedown",this._onMouseDown,!1),t.addEventListener("mouseup",this._onMouseUp,!1),t.addEventListener("touchstart",this._onTouchStart,!1),t.addEventListener("click",this._onClick,!1),t.addEventListener("mousemove",this._onMouseMove,!1),t.addEventListener("dblclick",this._onDblClick,!1),t.addEventListener("contextmenu",this._onContextMenu,!1)},disable:function(){var e=this._map.options,t=this._el;for(var n in handlers)e[n]&&this._map[n].disable();t.removeEventListener("mousedown",this._onMouseDown),t.removeEventListener("mouseup",this._onMouseUp),t.removeEventListener("touchstart",this._onTouchStart),t.removeEventListener("click",this._onClick),t.removeEventListener("mousemove",this._onMouseMove),t.removeEventListener("dblclick",this._onDblClick),t.removeEventListener("contextmenu",this._onContextMenu)},_onMouseDown:function(e){this._startPos=DOM.mousePos(this._el,e)},_onMouseUp:function(e){!this._contextMenuFired||this._map.dragRotate.active||this._map.dragPan.active||this._fireEvent("contextmenu",e),this._contextMenuFired=null},_onTouchStart:function(e){!e.touches||e.touches.length>1||(this._tapped?(clearTimeout(this._tapped),this._tapped=null,this._fireEvent("dblclick",e)):this._tapped=setTimeout(this._onTimeout,300))},_onTimeout:function(){this._tapped=null},_onMouseMove:function(e){var t=this._map,n=this._el;if(!t.dragPan.active&&!t.dragRotate.active){for(var o=e.toElement||e.target;o&&o!==n;)o=o.parentNode;o===n&&this._fireEvent("mousemove",e)}},_onClick:function(e){var t=DOM.mousePos(this._el,e);t.equals(this._startPos)&&this._fireEvent("click",e)},_onDblClick:function(e){this._fireEvent("dblclick",e),e.preventDefault()},_onContextMenu:function(){this._contextMenuFired=!0},_fireEvent:function(e,t){var n=DOM.mousePos(this._el,t);this._map.fire(e,{lngLat:this._map.unproject(n),point:n,originalEvent:t})}};
+	},{"../util/dom":98,"../util/util":106,"./handler/box_zoom":82,"./handler/dblclick_zoom":83,"./handler/drag_pan":84,"./handler/drag_rotate":85,"./handler/keyboard":86,"./handler/pinch":87,"./handler/scroll_zoom":88}],91:[function(require,module,exports){
+	"use strict";var Canvas=require("../util/canvas"),util=require("../util/util"),browser=require("../util/browser"),Evented=require("../util/evented"),DOM=require("../util/dom"),Style=require("../style/style"),AnimationLoop=require("../style/animation_loop"),Painter=require("../render/painter"),Transform=require("../geo/transform"),Hash=require("./hash"),Interaction=require("./interaction"),Camera=require("./camera"),LngLat=require("../geo/lng_lat"),LngLatBounds=require("../geo/lng_lat_bounds"),Point=require("point-geometry"),Attribution=require("./control/attribution"),Map=module.exports=function(t){if(t=this.options=util.inherit(this.options,t),this.animationLoop=new AnimationLoop,this.transform=new Transform(t.minZoom,t.maxZoom),t.maxBounds){var e=LngLatBounds.convert(t.maxBounds);this.transform.lngRange=[e.getWest(),e.getEast()],this.transform.latRange=[e.getSouth(),e.getNorth()]}util.bindAll(["_forwardStyleEvent","_forwardSourceEvent","_forwardLayerEvent","_forwardTileEvent","_onStyleLoad","_onStyleChange","_onSourceAdd","_onSourceRemove","_onSourceUpdate","_onWindowResize","onError","update","render"],this),this._setupContainer(),this._setupPainter(),this.on("move",this.update),this.on("zoom",this.update.bind(this,!0)),this.on("moveend",function(){this.animationLoop.set(300),this._rerender()}.bind(this)),"undefined"!=typeof window&&window.addEventListener("resize",this._onWindowResize,!1),this.interaction=new Interaction(this),t.interactive&&this.interaction.enable(),this._hash=t.hash&&(new Hash).addTo(this),this._hash&&this._hash._onHashChange()||this.jumpTo(t),this.sources={},this.stacks={},this._classes={},this.resize(),t.classes&&this.setClasses(t.classes),t.style&&this.setStyle(t.style),t.attributionControl&&this.addControl(new Attribution),this.on("style.error",this.onError),this.on("source.error",this.onError),this.on("tile.error",this.onError)};util.extend(Map.prototype,Evented),util.extend(Map.prototype,Camera.prototype),util.extend(Map.prototype,{options:{center:[0,0],zoom:0,bearing:0,pitch:0,minZoom:0,maxZoom:20,interactive:!0,scrollZoom:!0,boxZoom:!0,dragRotate:!0,dragPan:!0,keyboard:!0,doubleClickZoom:!0,pinch:!0,bearingSnap:7,hash:!1,attributionControl:!0,failIfMajorPerformanceCaveat:!1,preserveDrawingBuffer:!1},addControl:function(t){return t.addTo(this),this},addClass:function(t,e){this._classes[t]||(this._classes[t]=!0,this.style&&this.style._cascade(this._classes,e))},removeClass:function(t,e){this._classes[t]&&(delete this._classes[t],this.style&&this.style._cascade(this._classes,e))},setClasses:function(t,e){this._classes={};for(var i=0;i<t.length;i++)this._classes[t[i]]=!0;this.style&&this.style._cascade(this._classes,e)},hasClass:function(t){return!!this._classes[t]},getClasses:function(){return Object.keys(this._classes)},resize:function(){var t=0,e=0;return this._container&&(t=this._container.offsetWidth||400,e=this._container.offsetHeight||300),this._canvas.resize(t,e),this.transform.width=t,this.transform.height=e,this.transform._constrain(),this.painter.resize(t,e),this.fire("movestart").fire("move").fire("resize").fire("moveend")},getBounds:function(){return new LngLatBounds(this.transform.pointLocation(new Point(0,0)),this.transform.pointLocation(this.transform.size))},project:function(t){return this.transform.locationPoint(LngLat.convert(t))},unproject:function(t){return this.transform.pointLocation(Point.convert(t))},featuresAt:function(t,e,i){var r=this.unproject(t).wrap(),s=this.transform.locationCoordinate(r);return this.style.featuresAt(s,e,i),this},featuresIn:function(t,e,i){return"undefined"==typeof i&&(i=e,e=t,t=[Point.convert([0,0]),Point.convert([this.transform.width,this.transform.height])]),t=t.map(Point.convert.bind(Point)),t=[new Point(Math.min(t[0].x,t[1].x),Math.min(t[0].y,t[1].y)),new Point(Math.max(t[0].x,t[1].x),Math.max(t[0].y,t[1].y))].map(this.transform.pointCoordinate.bind(this.transform)),this.style.featuresIn(t,e,i),this},batch:function(t){this.style.batch(t),this.style._cascade(this._classes),this.update(!0)},setStyle:function(t){return this.style&&(this.style.off("load",this._onStyleLoad).off("error",this._forwardStyleEvent).off("change",this._onStyleChange).off("source.add",this._onSourceAdd).off("source.remove",this._onSourceRemove).off("source.load",this._onSourceUpdate).off("source.error",this._forwardSourceEvent).off("source.change",this._onSourceUpdate).off("layer.add",this._forwardLayerEvent).off("layer.remove",this._forwardLayerEvent).off("tile.add",this._forwardTileEvent).off("tile.remove",this._forwardTileEvent).off("tile.load",this.update).off("tile.error",this._forwardTileEvent).off("tile.stats",this._forwardTileEvent)._remove(),this.off("rotate",this.style._redoPlacement),this.off("pitch",this.style._redoPlacement)),t?(t instanceof Style?this.style=t:this.style=new Style(t,this.animationLoop),this.style.on("load",this._onStyleLoad).on("error",this._forwardStyleEvent).on("change",this._onStyleChange).on("source.add",this._onSourceAdd).on("source.remove",this._onSourceRemove).on("source.load",this._onSourceUpdate).on("source.error",this._forwardSourceEvent).on("source.change",this._onSourceUpdate).on("layer.add",this._forwardLayerEvent).on("layer.remove",this._forwardLayerEvent).on("tile.add",this._forwardTileEvent).on("tile.remove",this._forwardTileEvent).on("tile.load",this.update).on("tile.error",this._forwardTileEvent).on("tile.stats",this._forwardTileEvent),this.on("rotate",this.style._redoPlacement),this.on("pitch",this.style._redoPlacement),this):(this.style=null,this)},addSource:function(t,e){return this.style.addSource(t,e),this},removeSource:function(t){return this.style.removeSource(t),this},getSource:function(t){return this.style.getSource(t)},addLayer:function(t,e){return this.style.addLayer(t,e),this.style._cascade(this._classes),this},removeLayer:function(t){return this.style.removeLayer(t),this.style._cascade(this._classes),this},setFilter:function(t,e){return this.style.setFilter(t,e),this},setLayerZoomRange:function(t,e,i){return this.style.setLayerZoomRange(t,e,i),this},getFilter:function(t){return this.style.getFilter(t)},setPaintProperty:function(t,e,i,r){return this.batch(function(s){s.setPaintProperty(t,e,i,r)}),this},getPaintProperty:function(t,e,i){return this.style.getPaintProperty(t,e,i)},setLayoutProperty:function(t,e,i){return this.batch(function(r){r.setLayoutProperty(t,e,i)}),this},getLayoutProperty:function(t,e){return this.style.getLayoutProperty(t,e)},getContainer:function(){return this._container},getCanvasContainer:function(){return this._canvasContainer},getCanvas:function(){return this._canvas.getElement()},_setupContainer:function(){var t=this.options.container,e=this._container="string"==typeof t?document.getElementById(t):t;e.classList.add("mapboxgl-map");var i=this._canvasContainer=DOM.create("div","mapboxgl-canvas-container",e);this.options.interactive&&i.classList.add("mapboxgl-interactive"),this._canvas=new Canvas(this,i);var r=DOM.create("div","mapboxgl-control-container",e),s=this._controlCorners={};["top-left","top-right","bottom-left","bottom-right"].forEach(function(t){s[t]=DOM.create("div","mapboxgl-ctrl-"+t,r)})},_setupPainter:function(){var t=this._canvas.getWebGLContext({failIfMajorPerformanceCaveat:this.options.failIfMajorPerformanceCaveat,preserveDrawingBuffer:this.options.preserveDrawingBuffer});return t?void(this.painter=new Painter(t,this.transform)):void console.error("Failed to initialize WebGL")},_contextLost:function(t){t.preventDefault(),this._frameId&&browser.cancelFrame(this._frameId)},_contextRestored:function(){this._setupPainter(),this.resize(),this.update()},loaded:function(){return this._styleDirty||this._sourcesDirty?!1:this.style&&!this.style.loaded()?!1:!0},update:function(t){return this.style?(this._styleDirty=this._styleDirty||t,this._sourcesDirty=!0,this._rerender(),this):this},render:function(){return this.style&&this._styleDirty&&(this._styleDirty=!1,this.style._recalculate(this.transform.zoom)),this.style&&this._sourcesDirty&&!this._sourcesDirtyTimeout&&(this._sourcesDirty=!1,this._sourcesDirtyTimeout=setTimeout(function(){this._sourcesDirtyTimeout=null}.bind(this),50),this.style._updateSources(this.transform)),this.painter.render(this.style,{debug:this.debug,vertices:this.vertices,rotating:this.rotating,zooming:this.zooming}),this.fire("render"),this.loaded()&&!this._loaded&&(this._loaded=!0,this.fire("load")),this._frameId=null,this.animationLoop.stopped()||(this._styleDirty=!0),(this._sourcesDirty||this._repaint||!this.animationLoop.stopped())&&this._rerender(),this},remove:function(){return this._hash&&this._hash.remove(),browser.cancelFrame(this._frameId),clearTimeout(this._sourcesDirtyTimeout),this.setStyle(null),"undefined"!=typeof window&&window.removeEventListener("resize",this._onWindowResize,!1),this},onError:function(t){console.error(t.error)},_rerender:function(){this.style&&!this._frameId&&(this._frameId=browser.frame(this.render))},_forwardStyleEvent:function(t){this.fire("style."+t.type,util.extend({style:t.target},t))},_forwardSourceEvent:function(t){this.fire(t.type,util.extend({style:t.target},t))},_forwardLayerEvent:function(t){this.fire(t.type,util.extend({style:t.target},t))},_forwardTileEvent:function(t){this.fire(t.type,util.extend({style:t.target},t))},_onStyleLoad:function(t){var e=new Transform,i=this.transform;i.center.lng===e.center.lng&&i.center.lat===e.center.lat&&i.zoom===e.zoom&&i.bearing===e.bearing&&i.pitch===e.pitch&&this.jumpTo(this.style.stylesheet),this.style._cascade(this._classes,{transition:!1}),this._forwardStyleEvent(t)},_onStyleChange:function(t){this.update(!0),this._forwardStyleEvent(t)},_onSourceAdd:function(t){var e=t.source;e.onAdd&&e.onAdd(this),this._forwardSourceEvent(t)},_onSourceRemove:function(t){var e=t.source;e.onRemove&&e.onRemove(this),this._forwardSourceEvent(t)},_onSourceUpdate:function(t){this.update(),this._forwardSourceEvent(t)},_onWindowResize:function(){this.stop().resize().update()}}),util.extendAll(Map.prototype,{_debug:!1,get debug(){return this._debug},set debug(t){this._debug=t,this.update()},_collisionDebug:!1,get collisionDebug(){return this._collisionDebug},set collisionDebug(t){this._collisionDebug=t,this.style._redoPlacement()},_repaint:!1,get repaint(){return this._repaint},set repaint(t){this._repaint=t,this.update()},_vertices:!1,get vertices(){return this._vertices},set vertices(t){this._vertices=t,this.update()}});
+	},{"../geo/lng_lat":20,"../geo/lng_lat_bounds":21,"../geo/transform":22,"../render/painter":37,"../style/animation_loop":51,"../style/style":56,"../util/browser":95,"../util/canvas":96,"../util/dom":98,"../util/evented":100,"../util/util":106,"./camera":78,"./control/attribution":79,"./hash":89,"./interaction":90,"point-geometry":137}],92:[function(require,module,exports){
+	"use strict";function Popup(t){util.setOptions(this,t),util.bindAll(["_updatePosition","_onClickClose"],this)}module.exports=Popup;var util=require("../util/util"),Evented=require("../util/evented"),DOM=require("../util/dom"),LngLat=require("../geo/lng_lat");Popup.prototype=util.inherit(Evented,{options:{closeButton:!0,closeOnClick:!0},addTo:function(t){return this._map=t,this._map.on("move",this._updatePosition),this.options.closeOnClick&&this._map.on("click",this._onClickClose),this._update(),this},remove:function(){return this._container&&this._container.parentNode.removeChild(this._container),this._map&&(this._map.off("move",this._updatePosition),this._map.off("click",this._onClickClose),delete this._map),this},getLngLat:function(){return this._lngLat},setLngLat:function(t){return this._lngLat=LngLat.convert(t),this._update(),this},setText:function(t){return this._content=document.createTextNode(t),this._updateContent(),this},setHTML:function(t){this._content=document.createDocumentFragment();var i,e=document.createElement("body");for(e.innerHTML=t;;){if(i=e.firstChild,!i)break;this._content.appendChild(i)}return this._updateContent(),this},_update:function(){this._map&&(this._container||(this._container=DOM.create("div","mapboxgl-popup",this._map.getContainer()),this._tip=DOM.create("div","mapboxgl-popup-tip",this._container),this._wrapper=DOM.create("div","mapboxgl-popup-content",this._container),this.options.closeButton&&(this._closeButton=DOM.create("button","mapboxgl-popup-close-button",this._wrapper),this._closeButton.innerHTML="&#215;",this._closeButton.addEventListener("click",this._onClickClose))),this._updateContent(),this._updatePosition())},_updateContent:function(){if(this._content&&this._container){for(var t=this._wrapper;t.hasChildNodes();)t.removeChild(t.firstChild);this.options.closeButton&&t.appendChild(this._closeButton),t.appendChild(this._content)}},_updatePosition:function(){if(this._lngLat&&this._container){var t=this._map.project(this._lngLat).round(),i=this.options.anchor;if(!i){var e=this._container.offsetWidth,o=this._container.offsetHeight;i=t.y<o?["top"]:t.y>this._map.transform.height-o?["bottom"]:[],t.x<e/2?i.push("left"):t.x>this._map.transform.width-e/2&&i.push("right"),i=0===i.length?"bottom":i.join("-"),this.options.anchor=i}var n={top:"translate(-50%,0)","top-left":"translate(0,0)","top-right":"translate(-100%,0)",bottom:"translate(-50%,-100%)","bottom-left":"translate(0,-100%)","bottom-right":"translate(-100%,-100%)",left:"translate(0,-50%)",right:"translate(-100%,-50%)"},s=this._container.classList;for(var a in n)s.remove("mapboxgl-popup-anchor-"+a);s.add("mapboxgl-popup-anchor-"+i),DOM.setTransform(this._container,n[i]+" translate("+t.x+"px,"+t.y+"px)")}},_onClickClose:function(){this.remove()}});
+	},{"../geo/lng_lat":20,"../util/dom":98,"../util/evented":100,"../util/util":106}],93:[function(require,module,exports){
+	"use strict";function Actor(t,e){this.target=t,this.parent=e,this.callbacks={},this.callbackID=0,this.receive=this.receive.bind(this),this.target.addEventListener("message",this.receive,!1)}module.exports=Actor,Actor.prototype.receive=function(t){var e,s=t.data;if("<response>"===s.type)e=this.callbacks[s.id],delete this.callbacks[s.id],e(s.error||null,s.data);else if("undefined"!=typeof s.id){var i=s.id;this.parent[s.type](s.data,function(t,e,s){this.postMessage({type:"<response>",id:String(i),error:t?String(t):null,data:e},s)}.bind(this))}else this.parent[s.type](s.data)},Actor.prototype.send=function(t,e,s,i){var a=null;s&&(this.callbacks[a=this.callbackID++]=s),this.postMessage({type:t,id:String(a),data:e},i)},Actor.prototype.postMessage=function(t,e){try{this.target.postMessage(t,e)}catch(s){this.target.postMessage(t)}};
+	},{}],94:[function(require,module,exports){
+	"use strict";function sameOrigin(e){var t=document.createElement("a");return t.href=e,t.protocol===document.location.protocol&&t.host===document.location.host}exports.getJSON=function(e,t){var n=new XMLHttpRequest;return n.open("GET",e,!0),n.setRequestHeader("Accept","application/json"),n.onerror=function(e){t(e)},n.onload=function(){if(n.status>=200&&n.status<300&&n.response){var e;try{e=JSON.parse(n.response)}catch(r){return t(r)}t(null,e)}else t(new Error(n.statusText))},n.send(),n},exports.getArrayBuffer=function(e,t){var n=new XMLHttpRequest;return n.open("GET",e,!0),n.responseType="arraybuffer",n.onerror=function(e){t(e)},n.onload=function(){n.status>=200&&n.status<300&&n.response?t(null,n.response):t(new Error(n.statusText))},n.send(),n},exports.getImage=function(e,t){return exports.getArrayBuffer(e,function(e,n){e&&t(e);var r=new Image;r.onload=function(){t(null,r),(window.URL||window.webkitURL).revokeObjectURL(r.src)};var o=new Blob([new Uint8Array(n)],{type:"image/png"});return r.src=(window.URL||window.webkitURL).createObjectURL(o),r.getData=function(){var e=document.createElement("canvas"),t=e.getContext("2d");return e.width=r.width,e.height=r.height,t.drawImage(r,0,0),t.getImageData(0,0,r.width,r.height).data},r})},exports.getVideo=function(e,t){var n=document.createElement("video");n.onloadstart=function(){t(null,n)};for(var r=0;r<e.length;r++){var o=document.createElement("source");sameOrigin(e[r])||(n.crossOrigin="Anonymous"),o.src=e[r],n.appendChild(o)}return n.getData=function(){return n},n};
+	},{}],95:[function(require,module,exports){
+	"use strict";var Canvas=require("./canvas"),frame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame;exports.frame=function(e){return frame(e)};var cancel=window.cancelAnimationFrame||window.mozCancelAnimationFrame||window.webkitCancelAnimationFrame||window.msCancelAnimationFrame;exports.cancelFrame=function(e){cancel(e)},exports.timed=function(e,r,t){function n(a){o||(window.performance||(a=Date.now()),a>=i+r?e.call(t,1):(e.call(t,(a-i)/r),exports.frame(n)))}if(!r)return e.call(t,1),null;var o=!1,i=window.performance?window.performance.now():Date.now();return exports.frame(n),function(){o=!0}},exports.supported=function(e){for(var r=([function(){return"undefined"!=typeof window},function(){return"undefined"!=typeof document},function(){return!!(Array.prototype&&Array.prototype.every&&Array.prototype.filter&&Array.prototype.forEach&&Array.prototype.indexOf&&Array.prototype.lastIndexOf&&Array.prototype.map&&Array.prototype.some&&Array.prototype.reduce&&Array.prototype.reduceRight&&Array.isArray)},function(){return!(!Function.prototype||!Function.prototype.bind||!(Object.keys&&Object.create&&Object.getPrototypeOf&&Object.getOwnPropertyNames&&Object.isSealed&&Object.isFrozen&&Object.isExtensible&&Object.getOwnPropertyDescriptor&&Object.defineProperty&&Object.defineProperties&&Object.seal&&Object.freeze&&Object.preventExtensions))},function(){return"JSON"in window&&"parse"in JSON&&"stringify"in JSON},function(){return(new Canvas).supportsWebGLContext(e&&e.failIfMajorPerformanceCaveat||!1)},function(){return"Worker"in window}]),t=0;t<r.length;t++)if(!r[t]())return!1;return!0},exports.hardwareConcurrency=navigator.hardwareConcurrency||8,Object.defineProperty(exports,"devicePixelRatio",{get:function(){return window.devicePixelRatio}});
+	},{"./canvas":96}],96:[function(require,module,exports){
+	"use strict";function Canvas(t,e){this.canvas=document.createElement("canvas"),t&&e&&(this.canvas.style.position="absolute",this.canvas.classList.add("mapboxgl-canvas"),this.canvas.addEventListener("webglcontextlost",t._contextLost.bind(t),!1),this.canvas.addEventListener("webglcontextrestored",t._contextRestored.bind(t),!1),this.canvas.setAttribute("tabindex",0),e.appendChild(this.canvas))}var util=require("../util");module.exports=Canvas,Canvas.prototype.resize=function(t,e){var a=window.devicePixelRatio||1;this.canvas.width=a*t,this.canvas.height=a*e,this.canvas.style.width=t+"px",this.canvas.style.height=e+"px"};var requiredContextAttributes={antialias:!1,alpha:!0,stencil:!0,depth:!1};Canvas.prototype.getWebGLContext=function(t){return t=util.extend({},t,requiredContextAttributes),this.canvas.getContext("webgl",t)||this.canvas.getContext("experimental-webgl",t)},Canvas.prototype.supportsWebGLContext=function(t){var e=util.extend({failIfMajorPerformanceCaveat:t},requiredContextAttributes);return"probablySupportsContext"in this.canvas?this.canvas.probablySupportsContext("webgl",e)||this.canvas.probablySupportsContext("experimental-webgl",e):"supportsContext"in this.canvas?this.canvas.supportsContext("webgl",e)||this.canvas.supportsContext("experimental-webgl",e):!!window.WebGLRenderingContext&&!!this.getWebGLContext(t)},Canvas.prototype.getElement=function(){return this.canvas};
+	},{"../util":106}],97:[function(require,module,exports){
+	"use strict";function Dispatcher(r,t){this.actors=[],this.currentActor=0;for(var e=0;r>e;e++){var o=new WebWorkify(require("../../source/worker")),s=new Actor(o,t);s.name="Worker "+e,this.actors.push(s)}}var Actor=require("../actor"),WebWorkify=require("webworkify");module.exports=Dispatcher,Dispatcher.prototype={broadcast:function(r,t){for(var e=0;e<this.actors.length;e++)this.actors[e].send(r,t)},send:function(r,t,e,o,s){return("number"!=typeof o||isNaN(o))&&(o=this.currentActor=(this.currentActor+1)%this.actors.length),this.actors[o].send(r,t,e,s),o},remove:function(){for(var r=0;r<this.actors.length;r++)this.actors[r].target.terminate();this.actors=[]}};
+	},{"../../source/worker":49,"../actor":93,"webworkify":149}],98:[function(require,module,exports){
+	"use strict";function testProp(e){for(var t=0;t<e.length;t++)if(e[t]in docStyle)return e[t]}function suppressClick(e){e.preventDefault(),e.stopPropagation(),window.removeEventListener("click",suppressClick,!0)}var Point=require("point-geometry");exports.create=function(e,t,r){var o=document.createElement(e);return t&&(o.className=t),r&&r.appendChild(o),o};var docStyle=document.documentElement.style,selectProp=testProp(["userSelect","MozUserSelect","WebkitUserSelect","msUserSelect"]),userSelect;exports.disableDrag=function(){selectProp&&(userSelect=docStyle[selectProp],docStyle[selectProp]="none")},exports.enableDrag=function(){selectProp&&(docStyle[selectProp]=userSelect)};var transformProp=testProp(["transform","WebkitTransform"]);exports.setTransform=function(e,t){e.style[transformProp]=t},exports.suppressClick=function(){window.addEventListener("click",suppressClick,!0),window.setTimeout(function(){window.removeEventListener("click",suppressClick,!0)},0)},exports.mousePos=function(e,t){var r=e.getBoundingClientRect();return t=t.touches?t.touches[0]:t,new Point(t.clientX-r.left-e.clientLeft,t.clientY-r.top-e.clientTop)};
+	},{"point-geometry":137}],99:[function(require,module,exports){
+	"use strict";module.exports={API_URL:"https://api.mapbox.com",REQUIRE_ACCESS_TOKEN:!0};
+	},{}],100:[function(require,module,exports){
+	"use strict";var util=require("./util"),Evented={on:function(t,e){return this._events=this._events||{},this._events[t]=this._events[t]||[],this._events[t].push(e),this},off:function(t,e){if(!t)return delete this._events,this;if(!this.listens(t))return this;if(e){var s=this._events[t].indexOf(e);s>=0&&this._events[t].splice(s,1),this._events[t].length||delete this._events[t]}else delete this._events[t];return this},once:function(t,e){var s=function(i){this.off(t,s),e.call(this,i)}.bind(this);return this.on(t,s),this},fire:function(t,e){if(!this.listens(t))return this;e=util.extend({},e),util.extend(e,{type:t,target:this});for(var s=this._events[t].slice(),i=0;i<s.length;i++)s[i].call(this,e);return this},listens:function(t){return!(!this._events||!this._events[t])}};module.exports=Evented;
+	},{"./util":106}],101:[function(require,module,exports){
+	"use strict";function Glyphs(a,e){this.stacks=a.readFields(readFontstacks,[],e)}function readFontstacks(a,e,r){if(1===a){var t=r.readMessage(readFontstack,{glyphs:{}});e.push(t)}}function readFontstack(a,e,r){if(1===a)e.name=r.readString();else if(2===a)e.range=r.readString();else if(3===a){var t=r.readMessage(readGlyph,{});e.glyphs[t.id]=t}}function readGlyph(a,e,r){1===a?e.id=r.readVarint():2===a?e.bitmap=r.readBytes():3===a?e.width=r.readVarint():4===a?e.height=r.readVarint():5===a?e.left=r.readSVarint():6===a?e.top=r.readSVarint():7===a&&(e.advance=r.readVarint())}module.exports=Glyphs;
+	},{}],102:[function(require,module,exports){
+	"use strict";function interpolate(t,e,n){return t*(1-n)+e*n}module.exports=interpolate,interpolate.number=interpolate,interpolate.vec2=function(t,e,n){return[interpolate(t[0],e[0],n),interpolate(t[1],e[1],n)]},interpolate.color=function(t,e,n){return[interpolate(t[0],e[0],n),interpolate(t[1],e[1],n),interpolate(t[2],e[2],n),interpolate(t[3],e[3],n)]},interpolate.array=function(t,e,n){return t.map(function(t,r){return interpolate(t,e[r],n)})};
+	},{}],103:[function(require,module,exports){
+	"use strict";function normalizeURL(e,r,o){if(o=o||config.ACCESS_TOKEN,!o&&config.REQUIRE_ACCESS_TOKEN)throw new Error("An API access token is required to use Mapbox GL. See https://www.mapbox.com/developers/api/#access-tokens");if(e=e.replace(/^mapbox:\/\//,config.API_URL+r),e+=-1!==e.indexOf("?")?"&access_token=":"?access_token=",config.REQUIRE_ACCESS_TOKEN){if("s"===o[0])throw new Error("Use a public access token (pk.*) with Mapbox GL JS, not a secret access token (sk.*). See https://www.mapbox.com/developers/api/#access-tokens");e+=o}return e}var config=require("./config"),browser=require("./browser");module.exports.normalizeStyleURL=function(e,r){if(!e.match(/^mapbox:\/\/styles\//))return e;var o=e.split("/"),t=o[3],n=o[4],s=o[5]?"/draft":"";return normalizeURL("mapbox://"+t+"/"+n+s,"/styles/v1/",r)},module.exports.normalizeSourceURL=function(e,r){return e.match(/^mapbox:\/\//)?normalizeURL(e+".json","/v4/",r)+"&secure":e},module.exports.normalizeGlyphsURL=function(e,r){if(!e.match(/^mapbox:\/\//))return e;var o=e.split("/")[3];return normalizeURL("mapbox://"+o+"/{fontstack}/{range}.pbf","/fonts/v1/",r)},module.exports.normalizeSpriteURL=function(e,r,o,t){if(!e.match(/^mapbox:\/\/sprites\//))return e+r+o;var n=e.split("/"),s=n[3],a=n[4],i=n[5]?"/draft":"";return normalizeURL("mapbox://"+s+"/"+a+i+"/sprite"+r+o,"/styles/v1/",t)},module.exports.normalizeTileURL=function(e,r){return r&&r.match(/^mapbox:\/\//)?e.replace(/\.((?:png|jpg)\d*)(?=$|\?)/,browser.devicePixelRatio>=2?"@2x.$1":".$1"):e};
+	},{"./browser":95,"./config":99}],104:[function(require,module,exports){
+	"use strict";function MRUCache(t,e){this.max=t,this.onRemove=e,this.reset()}module.exports=MRUCache,MRUCache.prototype.reset=function(){for(var t in this.list)this.onRemove(this.list[t]);return this.list={},this.order=[],this},MRUCache.prototype.add=function(t,e){if(this.list[t]=e,this.order.push(t),this.order.length>this.max){var i=this.get(this.order[0]);i&&this.onRemove(i)}return this},MRUCache.prototype.has=function(t){return t in this.list},MRUCache.prototype.keys=function(){return this.order},MRUCache.prototype.get=function(t){if(!this.has(t))return null;var e=this.list[t];return delete this.list[t],this.order.splice(this.order.indexOf(t),1),e};
+	},{}],105:[function(require,module,exports){
+	"use strict";function resolveTokens(e,n){return n.replace(/{([^{}()\[\]<>$=:;.,^]+)}/g,function(n,r){return r in e?e[r]:""})}module.exports=resolveTokens;
+	},{}],106:[function(require,module,exports){
+	"use strict";var UnitBezier=require("unitbezier"),Coordinate=require("../geo/coordinate");exports.easeCubicInOut=function(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,r=t*n;return 4*(.5>n?r:3*(n-t)+r-.75)},exports.bezier=function(n,t,r,e){var o=new UnitBezier(n,t,r,e);return function(n){return o.solve(n)}},exports.ease=exports.bezier(.25,.1,.25,1),exports.premultiply=function(n){return n[0]*=n[3],n[1]*=n[3],n[2]*=n[3],n},exports.clamp=function(n,t,r){return Math.min(r,Math.max(t,n))},exports.wrap=function(n,t,r){var e=r-t,o=((n-t)%e+e)%e+t;return o===t?r:o},exports.coalesce=function(){for(var n=0;n<arguments.length;n++){var t=arguments[n];if(null!==t&&void 0!==t)return t}},exports.asyncEach=function(n,t,r){function e(){0===--o&&r()}var o=n.length;if(0===o)return r();for(var i=0;i<n.length;i++)t(n[i],e)},exports.asyncAll=function(n,t,r){var e=n.length,o=new Array(n.length),i=null;n.forEach(function(n,u){t(n,function(n,t){n&&(i=n),o[u]=t,0===--e&&r(i,o)})})},exports.keysDifference=function(n,t){var r=[];for(var e in n)e in t||r.push(e);return r},exports.extend=function(n){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var e in r)n[e]=r[e]}return n},exports.extendAll=function(n,t){for(var r in t)Object.defineProperty(n,r,Object.getOwnPropertyDescriptor(t,r));return n},exports.inherit=function(n,t){var r="function"==typeof n?n.prototype:n,e=Object.create(r);return exports.extendAll(e,t),e},exports.pick=function(n,t){for(var r={},e=0;e<t.length;e++){var o=t[e];o in n&&(r[o]=n[o])}return r};var id=1;exports.uniqueId=function(){return id++},exports.throttle=function(n,t,r){var e,o,i,u;return u=function(){e=!1,o&&(i.apply(r,o),o=!1)},i=function(){e?o=arguments:(n.apply(r,arguments),setTimeout(u,t),e=!0)}},exports.debounce=function(n,t){var r,e;return function(){e=arguments,clearTimeout(r),r=setTimeout(function(){n.apply(null,e)},t)}},exports.bindAll=function(n,t){n.forEach(function(n){t[n]=t[n].bind(t)})},exports.bindHandlers=function(n){for(var t in n)"function"==typeof n[t]&&0===t.indexOf("_on")&&(n[t]=n[t].bind(n))},exports.setOptions=function(n,t){n.hasOwnProperty("options")||(n.options=n.options?Object.create(n.options):{});for(var r in t)n.options[r]=t[r];return n.options},exports.getCoordinatesCenter=function(n){for(var t=1/0,r=1/0,e=-(1/0),o=-(1/0),i=0;i<n.length;i++)t=Math.min(t,n[i].column),r=Math.min(r,n[i].row),e=Math.max(e,n[i].column),o=Math.max(o,n[i].row);var u=e-t,a=o-r,c=Math.max(u,a);return new Coordinate((t+e)/2,(r+o)/2,0).zoomTo(Math.floor(-Math.log(c)/Math.LN2))};
+	},{"../geo/coordinate":19,"unitbezier":141}],107:[function(require,module,exports){
+	function clamp_css_byte(e){return e=Math.round(e),0>e?0:e>255?255:e}function clamp_css_float(e){return 0>e?0:e>1?1:e}function parse_css_int(e){return clamp_css_byte("%"===e[e.length-1]?parseFloat(e)/100*255:parseInt(e))}function parse_css_float(e){return clamp_css_float("%"===e[e.length-1]?parseFloat(e)/100:parseFloat(e))}function css_hue_to_rgb(e,r,l){return 0>l?l+=1:l>1&&(l-=1),1>6*l?e+(r-e)*l*6:1>2*l?r:2>3*l?e+(r-e)*(2/3-l)*6:e}function parseCSSColor(e){var r=e.replace(/ /g,"").toLowerCase();if(r in kCSSColorTable)return kCSSColorTable[r].slice();if("#"===r[0]){if(4===r.length){var l=parseInt(r.substr(1),16);return l>=0&&4095>=l?[(3840&l)>>4|(3840&l)>>8,240&l|(240&l)>>4,15&l|(15&l)<<4,1]:null}if(7===r.length){var l=parseInt(r.substr(1),16);return l>=0&&16777215>=l?[(16711680&l)>>16,(65280&l)>>8,255&l,1]:null}return null}var a=r.indexOf("("),t=r.indexOf(")");if(-1!==a&&t+1===r.length){var n=r.substr(0,a),s=r.substr(a+1,t-(a+1)).split(","),o=1;switch(n){case"rgba":if(4!==s.length)return null;o=parse_css_float(s.pop());case"rgb":return 3!==s.length?null:[parse_css_int(s[0]),parse_css_int(s[1]),parse_css_int(s[2]),o];case"hsla":if(4!==s.length)return null;o=parse_css_float(s.pop());case"hsl":if(3!==s.length)return null;var i=(parseFloat(s[0])%360+360)%360/360,u=parse_css_float(s[1]),g=parse_css_float(s[2]),d=.5>=g?g*(u+1):g+u-g*u,c=2*g-d;return[clamp_css_byte(255*css_hue_to_rgb(c,d,i+1/3)),clamp_css_byte(255*css_hue_to_rgb(c,d,i)),clamp_css_byte(255*css_hue_to_rgb(c,d,i-1/3)),o];default:return null}}return null}var kCSSColorTable={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{exports.parseCSSColor=parseCSSColor}catch(e){}
+	},{}],108:[function(require,module,exports){
+	"use strict";function infix(t){return function(n,r,i){return"$type"===r?"t"+t+VectorTileFeatureTypes.indexOf(i):"p["+JSON.stringify(r)+"]"+t+JSON.stringify(i)}}function strictInfix(t){var n=infix(t);return function(t,r,i){return"$type"===r?n(t,r,i):"typeof(p["+JSON.stringify(r)+"]) === typeof("+JSON.stringify(i)+") && "+n(t,r,i)}}function compile(t){return operators[t[0]].apply(t,t)}function truth(){return!0}var VectorTileFeatureTypes=["Unknown","Point","LineString","Polygon"],operators={"==":infix("==="),"!=":infix("!=="),">":strictInfix(">"),"<":strictInfix("<"),"<=":strictInfix("<="),">=":strictInfix(">="),"in":function(t,n){return"(function(){"+Array.prototype.slice.call(arguments,2).map(function(r){return"if ("+operators["=="](t,n,r)+") return true;"}).join("")+"return false;})()"},"!in":function(){return"!("+operators["in"].apply(this,arguments)+")"},any:function(){return Array.prototype.slice.call(arguments,1).map(function(t){return"("+compile(t)+")"}).join("||")||"false"},all:function(){return Array.prototype.slice.call(arguments,1).map(function(t){return"("+compile(t)+")"}).join("&&")||"true"},none:function(){return"!("+operators.any.apply(this,arguments)+")"}};module.exports=function(t){if(!t)return truth;var n="var p = f.properties || f.tags || {}, t = f.type; return "+compile(t)+";";return new Function("f",n)};
+	},{}],109:[function(require,module,exports){
+	"use strict";function clip(e,n,t,r,l,u,i,s){if(t/=n,r/=n,i>=t&&r>=s)return e;if(i>r||t>s)return null;for(var p=[],h=0;h<e.length;h++){var c,a,o=e[h],f=o.geometry,g=o.type;if(c=o.min[l],a=o.max[l],c>=t&&r>=a)p.push(o);else if(!(c>r||t>a)){var m=1===g?clipPoints(f,t,r,l):clipGeometry(f,t,r,l,u,3===g);m.length&&p.push({geometry:m,type:g,tags:e[h].tags||null,min:o.min,max:o.max})}}return p.length?p:null}function clipPoints(e,n,t,r){for(var l=[],u=0;u<e.length;u++){var i=e[u],s=i[r];s>=n&&t>=s&&l.push(i)}return l}function clipGeometry(e,n,t,r,l,u){for(var i=[],s=0;s<e.length;s++){var p,h,c,a=0,o=0,f=null,g=e[s],m=g.area,v=g.dist,w=g.length,y=[];for(h=0;w-1>h;h++)p=f||g[h],f=g[h+1],a=o||p[r],o=f[r],n>a?o>t?(y.push(l(p,f,n),l(p,f,t)),u||(y=newSlice(i,y,m,v))):o>=n&&y.push(l(p,f,n)):a>t?n>o?(y.push(l(p,f,t),l(p,f,n)),u||(y=newSlice(i,y,m,v))):t>=o&&y.push(l(p,f,t)):(y.push(p),n>o?(y.push(l(p,f,n)),u||(y=newSlice(i,y,m,v))):o>t&&(y.push(l(p,f,t)),u||(y=newSlice(i,y,m,v))));p=g[w-1],a=p[r],a>=n&&t>=a&&y.push(p),c=y[y.length-1],u&&c&&(y[0][0]!==c[0]||y[0][1]!==c[1])&&y.push(y[0]),newSlice(i,y,m,v)}return i}function newSlice(e,n,t,r){return n.length&&(n.area=t,n.dist=r,e.push(n)),[]}module.exports=clip;
+	},{}],110:[function(require,module,exports){
+	"use strict";function convert(e,t){var r=[];if("FeatureCollection"===e.type)for(var o=0;o<e.features.length;o++)convertFeature(r,e.features[o],t);else"Feature"===e.type?convertFeature(r,e,t):convertFeature(r,{geometry:e},t);return r}function convertFeature(e,t,r){var o,n,a,i=t.geometry,c=i.type,l=i.coordinates,u=t.properties;if("Point"===c)e.push(create(u,1,[projectPoint(l)]));else if("MultiPoint"===c)e.push(create(u,1,project(l)));else if("LineString"===c)e.push(create(u,2,[project(l,r)]));else if("MultiLineString"===c||"Polygon"===c){for(a=[],o=0;o<l.length;o++)a.push(project(l[o],r));e.push(create(u,"Polygon"===c?3:2,a))}else if("MultiPolygon"===c){for(a=[],o=0;o<l.length;o++)for(n=0;n<l[o].length;n++)a.push(project(l[o][n],r));e.push(create(u,3,a))}else{if("GeometryCollection"!==c)throw new Error("Input data is not a valid GeoJSON object.");for(o=0;o<i.geometries.length;o++)convertFeature(e,{geometry:i.geometries[o],properties:u},r)}}function create(e,t,r){var o={geometry:r,type:t,tags:e||null,min:[2,1],max:[-1,0]};return calcBBox(o),o}function project(e,t){for(var r=[],o=0;o<e.length;o++)r.push(projectPoint(e[o]));return t&&(simplify(r,t),calcSize(r)),r}function projectPoint(e){var t=Math.sin(e[1]*Math.PI/180),r=e[0]/360+.5,o=.5-.25*Math.log((1+t)/(1-t))/Math.PI;return o=-1>o?-1:o>1?1:o,[r,o,0]}function calcSize(e){for(var t,r,o=0,n=0,a=0;a<e.length-1;a++)t=r||e[a],r=e[a+1],o+=t[0]*r[1]-r[0]*t[1],n+=Math.abs(r[0]-t[0])+Math.abs(r[1]-t[1]);e.area=Math.abs(o/2),e.dist=n}function calcBBox(e){var t=e.geometry,r=e.min,o=e.max;if(1===e.type)calcRingBBox(r,o,t);else for(var n=0;n<t.length;n++)calcRingBBox(r,o,t[n]);return e}function calcRingBBox(e,t,r){for(var o,n=0;n<r.length;n++)o=r[n],e[0]=Math.min(o[0],e[0]),t[0]=Math.max(o[0],t[0]),e[1]=Math.min(o[1],e[1]),t[1]=Math.max(o[1],t[1])}module.exports=convert;var simplify=require("./simplify");
+	},{"./simplify":112}],111:[function(require,module,exports){
+	"use strict";function geojsonvt(e,t){return new GeoJSONVT(e,t)}function GeoJSONVT(e,t){t=this.options=extend(Object.create(this.options),t);var i=t.debug;i&&console.time("preprocess data");var o=1<<t.maxZoom,n=convert(e,t.tolerance/(o*t.extent));this.tiles={},this.tileCoords=[],i&&(console.timeEnd("preprocess data"),console.log("index: maxZoom: %d, maxPoints: %d",t.indexMaxZoom,t.indexMaxPoints),console.time("generate tiles"),this.stats={},this.total=0),n=wrap(n,t.buffer/t.extent,intersectX),n.length&&this.splitTile(n,0,0,0),i&&(n.length&&console.log("features: %d, points: %d",this.tiles[0].numFeatures,this.tiles[0].numPoints),console.timeEnd("generate tiles"),console.log("tiles generated:",this.total,JSON.stringify(this.stats)))}function toID(e,t,i){return 32*((1<<e)*i+t)+e}function intersectX(e,t,i){return[i,(i-e[0])*(t[1]-e[1])/(t[0]-e[0])+e[1],1]}function intersectY(e,t,i){return[(i-e[1])*(t[0]-e[0])/(t[1]-e[1])+e[0],i,1]}function extend(e,t){for(var i in t)e[i]=t[i];return e}function isClippedSquare(e,t,i){var o=e.source;if(1!==o.length)return!1;var n=o[0];if(3!==n.type||n.geometry.length>1)return!1;var r=n.geometry[0].length;if(5!==r)return!1;for(var s=0;r>s;s++){var l=transform.point(n.geometry[0][s],t,e.z2,e.x,e.y);if(l[0]!==-i&&l[0]!==t+i||l[1]!==-i&&l[1]!==t+i)return!1}return!0}module.exports=geojsonvt;var convert=require("./convert"),transform=require("./transform"),clip=require("./clip"),wrap=require("./wrap"),createTile=require("./tile");GeoJSONVT.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,solidChildren:!1,tolerance:3,extent:4096,buffer:64,debug:0},GeoJSONVT.prototype.splitTile=function(e,t,i,o,n,r,s){for(var l=[e,t,i,o],a=this.options,u=a.debug,c=null;l.length;){o=l.pop(),i=l.pop(),t=l.pop(),e=l.pop();var p=1<<t,d=toID(t,i,o),m=this.tiles[d],f=t===a.maxZoom?0:a.tolerance/(p*a.extent);if(!m&&(u>1&&console.time("creation"),m=this.tiles[d]=createTile(e,p,i,o,f,t===a.maxZoom),this.tileCoords.push({z:t,x:i,y:o}),u)){u>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",t,i,o,m.numFeatures,m.numPoints,m.numSimplified),console.timeEnd("creation"));var h="z"+t;this.stats[h]=(this.stats[h]||0)+1,this.total++}if(m.source=e,n){if(t===a.maxZoom||t===n)continue;var x=1<<n-t;if(i!==Math.floor(r/x)||o!==Math.floor(s/x))continue}else if(t===a.indexMaxZoom||m.numPoints<=a.indexMaxPoints)continue;if(a.solidChildren||!isClippedSquare(m,a.extent,a.buffer)){m.source=null,u>1&&console.time("clipping");var g,v,M,T,b,y,S=.5*a.buffer/a.extent,Z=.5-S,q=.5+S,w=1+S;g=v=M=T=null,b=clip(e,p,i-S,i+q,0,intersectX,m.min[0],m.max[0]),y=clip(e,p,i+Z,i+w,0,intersectX,m.min[0],m.max[0]),b&&(g=clip(b,p,o-S,o+q,1,intersectY,m.min[1],m.max[1]),v=clip(b,p,o+Z,o+w,1,intersectY,m.min[1],m.max[1])),y&&(M=clip(y,p,o-S,o+q,1,intersectY,m.min[1],m.max[1]),T=clip(y,p,o+Z,o+w,1,intersectY,m.min[1],m.max[1])),u>1&&console.timeEnd("clipping"),g&&l.push(g,t+1,2*i,2*o),v&&l.push(v,t+1,2*i,2*o+1),M&&l.push(M,t+1,2*i+1,2*o),T&&l.push(T,t+1,2*i+1,2*o+1)}else n&&(c=t)}return c},GeoJSONVT.prototype.getTile=function(e,t,i){var o=this.options,n=o.extent,r=o.debug,s=1<<e;t=(t%s+s)%s;var l=toID(e,t,i);if(this.tiles[l])return transform.tile(this.tiles[l],n);r>1&&console.log("drilling down to z%d-%d-%d",e,t,i);for(var a,u=e,c=t,p=i;!a&&u>0;)u--,c=Math.floor(c/2),p=Math.floor(p/2),a=this.tiles[toID(u,c,p)];if(!a||!a.source)return null;if(r>1&&console.log("found parent tile z%d-%d-%d",u,c,p),isClippedSquare(a,n,o.buffer))return transform.tile(a,n);r>1&&console.time("drilling down");var d=this.splitTile(a.source,u,c,p,e,t,i);if(r>1&&console.timeEnd("drilling down"),null!==d){var m=1<<e-d;l=toID(d,Math.floor(t/m),Math.floor(i/m))}return this.tiles[l]?transform.tile(this.tiles[l],n):null};
+	},{"./clip":109,"./convert":110,"./tile":113,"./transform":114,"./wrap":115}],112:[function(require,module,exports){
+	"use strict";function simplify(t,i){var e,p,r,s,o=i*i,f=t.length,u=0,n=f-1,g=[];for(t[u][2]=1,t[n][2]=1;n;){for(p=0,e=u+1;n>e;e++)r=getSqSegDist(t[e],t[u],t[n]),r>p&&(s=e,p=r);p>o?(t[s][2]=p,g.push(u),g.push(s),u=s):(n=g.pop(),u=g.pop())}}function getSqSegDist(t,i,e){var p=i[0],r=i[1],s=e[0],o=e[1],f=t[0],u=t[1],n=s-p,g=o-r;if(0!==n||0!==g){var l=((f-p)*n+(u-r)*g)/(n*n+g*g);l>1?(p=s,r=o):l>0&&(p+=n*l,r+=g*l)}return n=f-p,g=u-r,n*n+g*g}module.exports=simplify;
+	},{}],113:[function(require,module,exports){
+	"use strict";function createTile(e,n,t,m,i,u){for(var r={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:t,y:m,z2:n,transformed:!1,min:[2,1],max:[-1,0]},a=0;a<e.length;a++){r.numFeatures++,addFeature(r,e[a],i,u);var s=e[a].min,l=e[a].max;s[0]<r.min[0]&&(r.min[0]=s[0]),s[1]<r.min[1]&&(r.min[1]=s[1]),l[0]>r.max[0]&&(r.max[0]=l[0]),l[1]>r.max[1]&&(r.max[1]=l[1])}return r}function addFeature(e,n,t,m){var i,u,r,a,s=n.geometry,l=n.type,o=[],f=t*t;if(1===l)for(i=0;i<s.length;i++)o.push(s[i]),e.numPoints++,e.numSimplified++;else for(i=0;i<s.length;i++)if(r=s[i],m||!(2===l&&r.dist<t||3===l&&r.area<f)){var d=[];for(u=0;u<r.length;u++)a=r[u],(m||a[2]>f)&&(d.push(a),e.numSimplified++),e.numPoints++;o.push(d)}else e.numPoints+=r.length;o.length&&e.features.push({geometry:o,type:l,tags:n.tags||null})}module.exports=createTile;
+	},{}],114:[function(require,module,exports){
+	"use strict";function transformTile(r,t){if(r.transformed)return r;var n,e,o,f=r.z2,a=r.x,s=r.y;for(n=0;n<r.features.length;n++){var i=r.features[n],u=i.geometry,m=i.type;if(1===m)for(e=0;e<u.length;e++)u[e]=transformPoint(u[e],t,f,a,s);else for(e=0;e<u.length;e++){var l=u[e];for(o=0;o<l.length;o++)l[o]=transformPoint(l[o],t,f,a,s)}}return r.transformed=!0,r}function transformPoint(r,t,n,e,o){var f=Math.round(t*(r[0]*n-e)),a=Math.round(t*(r[1]*n-o));return[f,a]}exports.tile=transformTile,exports.point=transformPoint;
+	},{}],115:[function(require,module,exports){
+	"use strict";function wrap(r,t,e){var o=r,a=clip(r,1,-1-t,t,0,e,-1,2),s=clip(r,1,1-t,2+t,0,e,-1,2);return(a||s)&&(o=clip(r,1,-t,1+t,0,e,-1,2),a&&(o=shiftFeatureCoords(a,1).concat(o)),s&&(o=o.concat(shiftFeatureCoords(s,-1)))),o}function shiftFeatureCoords(r,t){for(var e=[],o=0;o<r.length;o++){var a,s=r[o],i=s.type;if(1===i)a=shiftCoords(s.geometry,t);else{a=[];for(var n=0;n<s.geometry.length;n++)a.push(shiftCoords(s.geometry[n],t))}e.push({geometry:a,type:i,tags:s.tags,min:[s.min[0]+t,s.min[1]],max:[s.max[0]+t,s.max[1]]})}return e}function shiftCoords(r,t){var e=[];e.area=r.area,e.dist=r.dist;for(var o=0;o<r.length;o++)e.push([r[o][0]+t,r[o][1],r[o][2]]);return e}var clip=require("./clip");module.exports=wrap;
+	},{"./clip":109}],116:[function(require,module,exports){
+	exports.glMatrix=require("./gl-matrix/common.js"),exports.mat2=require("./gl-matrix/mat2.js"),exports.mat2d=require("./gl-matrix/mat2d.js"),exports.mat3=require("./gl-matrix/mat3.js"),exports.mat4=require("./gl-matrix/mat4.js"),exports.quat=require("./gl-matrix/quat.js"),exports.vec2=require("./gl-matrix/vec2.js"),exports.vec3=require("./gl-matrix/vec3.js"),exports.vec4=require("./gl-matrix/vec4.js");
+	},{"./gl-matrix/common.js":117,"./gl-matrix/mat2.js":118,"./gl-matrix/mat2d.js":119,"./gl-matrix/mat3.js":120,"./gl-matrix/mat4.js":121,"./gl-matrix/quat.js":122,"./gl-matrix/vec2.js":123,"./gl-matrix/vec3.js":124,"./gl-matrix/vec4.js":125}],117:[function(require,module,exports){
+	var glMatrix={};glMatrix.EPSILON=1e-6,glMatrix.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,glMatrix.RANDOM=Math.random,glMatrix.setMatrixArrayType=function(r){GLMAT_ARRAY_TYPE=r};var degree=Math.PI/180;glMatrix.toRadian=function(r){return r*degree},module.exports=glMatrix;
+	},{}],118:[function(require,module,exports){
+	var glMatrix=require("./common.js"),mat2={};mat2.create=function(){var t=new glMatrix.ARRAY_TYPE(4);return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},mat2.clone=function(t){var n=new glMatrix.ARRAY_TYPE(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n},mat2.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t},mat2.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},mat2.transpose=function(t,n){if(t===n){var r=n[1];t[1]=n[2],t[2]=r}else t[0]=n[0],t[1]=n[2],t[2]=n[1],t[3]=n[3];return t},mat2.invert=function(t,n){var r=n[0],a=n[1],u=n[2],o=n[3],e=r*o-u*a;return e?(e=1/e,t[0]=o*e,t[1]=-a*e,t[2]=-u*e,t[3]=r*e,t):null},mat2.adjoint=function(t,n){var r=n[0];return t[0]=n[3],t[1]=-n[1],t[2]=-n[2],t[3]=r,t},mat2.determinant=function(t){return t[0]*t[3]-t[2]*t[1]},mat2.multiply=function(t,n,r){var a=n[0],u=n[1],o=n[2],e=n[3],i=r[0],m=r[1],c=r[2],f=r[3];return t[0]=a*i+o*m,t[1]=u*i+e*m,t[2]=a*c+o*f,t[3]=u*c+e*f,t},mat2.mul=mat2.multiply,mat2.rotate=function(t,n,r){var a=n[0],u=n[1],o=n[2],e=n[3],i=Math.sin(r),m=Math.cos(r);return t[0]=a*m+o*i,t[1]=u*m+e*i,t[2]=a*-i+o*m,t[3]=u*-i+e*m,t},mat2.scale=function(t,n,r){var a=n[0],u=n[1],o=n[2],e=n[3],i=r[0],m=r[1];return t[0]=a*i,t[1]=u*i,t[2]=o*m,t[3]=e*m,t},mat2.fromRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=-r,t[3]=a,t},mat2.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t},mat2.str=function(t){return"mat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},mat2.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2))},mat2.LDU=function(t,n,r,a){return t[2]=a[2]/a[0],r[0]=a[0],r[1]=a[1],r[3]=a[3]-t[2]*r[1],[t,n,r]},module.exports=mat2;
+	},{"./common.js":117}],119:[function(require,module,exports){
+	var glMatrix=require("./common.js"),mat2d={};mat2d.create=function(){var t=new glMatrix.ARRAY_TYPE(6);return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},mat2d.clone=function(t){var n=new glMatrix.ARRAY_TYPE(6);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n},mat2d.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t},mat2d.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},mat2d.invert=function(t,n){var r=n[0],a=n[1],o=n[2],u=n[3],e=n[4],i=n[5],m=r*u-a*o;return m?(m=1/m,t[0]=u*m,t[1]=-a*m,t[2]=-o*m,t[3]=r*m,t[4]=(o*i-u*e)*m,t[5]=(a*e-r*i)*m,t):null},mat2d.determinant=function(t){return t[0]*t[3]-t[1]*t[2]},mat2d.multiply=function(t,n,r){var a=n[0],o=n[1],u=n[2],e=n[3],i=n[4],m=n[5],c=r[0],d=r[1],f=r[2],l=r[3],M=r[4],h=r[5];return t[0]=a*c+u*d,t[1]=o*c+e*d,t[2]=a*f+u*l,t[3]=o*f+e*l,t[4]=a*M+u*h+i,t[5]=o*M+e*h+m,t},mat2d.mul=mat2d.multiply,mat2d.rotate=function(t,n,r){var a=n[0],o=n[1],u=n[2],e=n[3],i=n[4],m=n[5],c=Math.sin(r),d=Math.cos(r);return t[0]=a*d+u*c,t[1]=o*d+e*c,t[2]=a*-c+u*d,t[3]=o*-c+e*d,t[4]=i,t[5]=m,t},mat2d.scale=function(t,n,r){var a=n[0],o=n[1],u=n[2],e=n[3],i=n[4],m=n[5],c=r[0],d=r[1];return t[0]=a*c,t[1]=o*c,t[2]=u*d,t[3]=e*d,t[4]=i,t[5]=m,t},mat2d.translate=function(t,n,r){var a=n[0],o=n[1],u=n[2],e=n[3],i=n[4],m=n[5],c=r[0],d=r[1];return t[0]=a,t[1]=o,t[2]=u,t[3]=e,t[4]=a*c+u*d+i,t[5]=o*c+e*d+m,t},mat2d.fromRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=-r,t[3]=a,t[4]=0,t[5]=0,t},mat2d.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t[4]=0,t[5]=0,t},mat2d.fromTranslation=function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=n[0],t[5]=n[1],t},mat2d.str=function(t){return"mat2d("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+")"},mat2d.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+1)},module.exports=mat2d;
+	},{"./common.js":117}],120:[function(require,module,exports){
+	var glMatrix=require("./common.js"),mat3={};mat3.create=function(){var t=new glMatrix.ARRAY_TYPE(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},mat3.fromMat4=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[4],t[4]=n[5],t[5]=n[6],t[6]=n[8],t[7]=n[9],t[8]=n[10],t},mat3.clone=function(t){var n=new glMatrix.ARRAY_TYPE(9);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n},mat3.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},mat3.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},mat3.transpose=function(t,n){if(t===n){var r=n[1],a=n[2],o=n[5];t[1]=n[3],t[2]=n[6],t[3]=r,t[5]=n[7],t[6]=a,t[7]=o}else t[0]=n[0],t[1]=n[3],t[2]=n[6],t[3]=n[1],t[4]=n[4],t[5]=n[7],t[6]=n[2],t[7]=n[5],t[8]=n[8];return t},mat3.invert=function(t,n){var r=n[0],a=n[1],o=n[2],u=n[3],m=n[4],e=n[5],i=n[6],c=n[7],f=n[8],l=f*m-e*c,M=-f*u+e*i,v=c*u-m*i,h=r*l+a*M+o*v;return h?(h=1/h,t[0]=l*h,t[1]=(-f*a+o*c)*h,t[2]=(e*a-o*m)*h,t[3]=M*h,t[4]=(f*r-o*i)*h,t[5]=(-e*r+o*u)*h,t[6]=v*h,t[7]=(-c*r+a*i)*h,t[8]=(m*r-a*u)*h,t):null},mat3.adjoint=function(t,n){var r=n[0],a=n[1],o=n[2],u=n[3],m=n[4],e=n[5],i=n[6],c=n[7],f=n[8];return t[0]=m*f-e*c,t[1]=o*c-a*f,t[2]=a*e-o*m,t[3]=e*i-u*f,t[4]=r*f-o*i,t[5]=o*u-r*e,t[6]=u*c-m*i,t[7]=a*i-r*c,t[8]=r*m-a*u,t},mat3.determinant=function(t){var n=t[0],r=t[1],a=t[2],o=t[3],u=t[4],m=t[5],e=t[6],i=t[7],c=t[8];return n*(c*u-m*i)+r*(-c*o+m*e)+a*(i*o-u*e)},mat3.multiply=function(t,n,r){var a=n[0],o=n[1],u=n[2],m=n[3],e=n[4],i=n[5],c=n[6],f=n[7],l=n[8],M=r[0],v=r[1],h=r[2],p=r[3],s=r[4],w=r[5],d=r[6],R=r[7],g=r[8];return t[0]=M*a+v*m+h*c,t[1]=M*o+v*e+h*f,t[2]=M*u+v*i+h*l,t[3]=p*a+s*m+w*c,t[4]=p*o+s*e+w*f,t[5]=p*u+s*i+w*l,t[6]=d*a+R*m+g*c,t[7]=d*o+R*e+g*f,t[8]=d*u+R*i+g*l,t},mat3.mul=mat3.multiply,mat3.translate=function(t,n,r){var a=n[0],o=n[1],u=n[2],m=n[3],e=n[4],i=n[5],c=n[6],f=n[7],l=n[8],M=r[0],v=r[1];return t[0]=a,t[1]=o,t[2]=u,t[3]=m,t[4]=e,t[5]=i,t[6]=M*a+v*m+c,t[7]=M*o+v*e+f,t[8]=M*u+v*i+l,t},mat3.rotate=function(t,n,r){var a=n[0],o=n[1],u=n[2],m=n[3],e=n[4],i=n[5],c=n[6],f=n[7],l=n[8],M=Math.sin(r),v=Math.cos(r);return t[0]=v*a+M*m,t[1]=v*o+M*e,t[2]=v*u+M*i,t[3]=v*m-M*a,t[4]=v*e-M*o,t[5]=v*i-M*u,t[6]=c,t[7]=f,t[8]=l,t},mat3.scale=function(t,n,r){var a=r[0],o=r[1];return t[0]=a*n[0],t[1]=a*n[1],t[2]=a*n[2],t[3]=o*n[3],t[4]=o*n[4],t[5]=o*n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},mat3.fromTranslation=function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=n[0],t[7]=n[1],t[8]=1,t},mat3.fromRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=0,t[3]=-r,t[4]=a,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},mat3.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=0,t[4]=n[1],t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},mat3.fromMat2d=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=0,t[3]=n[2],t[4]=n[3],t[5]=0,t[6]=n[4],t[7]=n[5],t[8]=1,t},mat3.fromQuat=function(t,n){var r=n[0],a=n[1],o=n[2],u=n[3],m=r+r,e=a+a,i=o+o,c=r*m,f=a*m,l=a*e,M=o*m,v=o*e,h=o*i,p=u*m,s=u*e,w=u*i;return t[0]=1-l-h,t[3]=f-w,t[6]=M+s,t[1]=f+w,t[4]=1-c-h,t[7]=v-p,t[2]=M-s,t[5]=v+p,t[8]=1-c-l,t},mat3.normalFromMat4=function(t,n){var r=n[0],a=n[1],o=n[2],u=n[3],m=n[4],e=n[5],i=n[6],c=n[7],f=n[8],l=n[9],M=n[10],v=n[11],h=n[12],p=n[13],s=n[14],w=n[15],d=r*e-a*m,R=r*i-o*m,g=r*c-u*m,x=a*i-o*e,y=a*c-u*e,A=o*c-u*i,Y=f*p-l*h,T=f*s-M*h,j=f*w-v*h,q=l*s-M*p,E=l*w-v*p,P=M*w-v*s,_=d*P-R*E+g*q+x*j-y*T+A*Y;return _?(_=1/_,t[0]=(e*P-i*E+c*q)*_,t[1]=(i*j-m*P-c*T)*_,t[2]=(m*E-e*j+c*Y)*_,t[3]=(o*E-a*P-u*q)*_,t[4]=(r*P-o*j+u*T)*_,t[5]=(a*j-r*E-u*Y)*_,t[6]=(p*A-s*y+w*x)*_,t[7]=(s*g-h*A-w*R)*_,t[8]=(h*y-p*g+w*d)*_,t):null},mat3.str=function(t){return"mat3("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+")"},mat3.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+Math.pow(t[6],2)+Math.pow(t[7],2)+Math.pow(t[8],2))},module.exports=mat3;
+	},{"./common.js":117}],121:[function(require,module,exports){
+	var glMatrix=require("./common.js"),mat4={};mat4.create=function(){var t=new glMatrix.ARRAY_TYPE(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4.clone=function(t){var a=new glMatrix.ARRAY_TYPE(16);return a[0]=t[0],a[1]=t[1],a[2]=t[2],a[3]=t[3],a[4]=t[4],a[5]=t[5],a[6]=t[6],a[7]=t[7],a[8]=t[8],a[9]=t[9],a[10]=t[10],a[11]=t[11],a[12]=t[12],a[13]=t[13],a[14]=t[14],a[15]=t[15],a},mat4.copy=function(t,a){return t[0]=a[0],t[1]=a[1],t[2]=a[2],t[3]=a[3],t[4]=a[4],t[5]=a[5],t[6]=a[6],t[7]=a[7],t[8]=a[8],t[9]=a[9],t[10]=a[10],t[11]=a[11],t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15],t},mat4.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4.transpose=function(t,a){if(t===a){var r=a[1],n=a[2],o=a[3],e=a[6],i=a[7],u=a[11];t[1]=a[4],t[2]=a[8],t[3]=a[12],t[4]=r,t[6]=a[9],t[7]=a[13],t[8]=n,t[9]=e,t[11]=a[14],t[12]=o,t[13]=i,t[14]=u}else t[0]=a[0],t[1]=a[4],t[2]=a[8],t[3]=a[12],t[4]=a[1],t[5]=a[5],t[6]=a[9],t[7]=a[13],t[8]=a[2],t[9]=a[6],t[10]=a[10],t[11]=a[14],t[12]=a[3],t[13]=a[7],t[14]=a[11],t[15]=a[15];return t},mat4.invert=function(t,a){var r=a[0],n=a[1],o=a[2],e=a[3],i=a[4],u=a[5],M=a[6],m=a[7],h=a[8],c=a[9],f=a[10],s=a[11],l=a[12],v=a[13],p=a[14],w=a[15],g=r*u-n*i,P=r*M-o*i,R=r*m-e*i,x=n*M-o*u,I=n*m-e*u,S=o*m-e*M,d=h*v-c*l,q=h*p-f*l,E=h*w-s*l,O=c*p-f*v,b=c*w-s*v,T=f*w-s*p,Y=g*T-P*b+R*O+x*E-I*q+S*d;return Y?(Y=1/Y,t[0]=(u*T-M*b+m*O)*Y,t[1]=(o*b-n*T-e*O)*Y,t[2]=(v*S-p*I+w*x)*Y,t[3]=(f*I-c*S-s*x)*Y,t[4]=(M*E-i*T-m*q)*Y,t[5]=(r*T-o*E+e*q)*Y,t[6]=(p*R-l*S-w*P)*Y,t[7]=(h*S-f*R+s*P)*Y,t[8]=(i*b-u*E+m*d)*Y,t[9]=(n*E-r*b-e*d)*Y,t[10]=(l*I-v*R+w*g)*Y,t[11]=(c*R-h*I-s*g)*Y,t[12]=(u*q-i*O-M*d)*Y,t[13]=(r*O-n*q+o*d)*Y,t[14]=(v*P-l*x-p*g)*Y,t[15]=(h*x-c*P+f*g)*Y,t):null},mat4.adjoint=function(t,a){var r=a[0],n=a[1],o=a[2],e=a[3],i=a[4],u=a[5],M=a[6],m=a[7],h=a[8],c=a[9],f=a[10],s=a[11],l=a[12],v=a[13],p=a[14],w=a[15];return t[0]=u*(f*w-s*p)-c*(M*w-m*p)+v*(M*s-m*f),t[1]=-(n*(f*w-s*p)-c*(o*w-e*p)+v*(o*s-e*f)),t[2]=n*(M*w-m*p)-u*(o*w-e*p)+v*(o*m-e*M),t[3]=-(n*(M*s-m*f)-u*(o*s-e*f)+c*(o*m-e*M)),t[4]=-(i*(f*w-s*p)-h*(M*w-m*p)+l*(M*s-m*f)),t[5]=r*(f*w-s*p)-h*(o*w-e*p)+l*(o*s-e*f),t[6]=-(r*(M*w-m*p)-i*(o*w-e*p)+l*(o*m-e*M)),t[7]=r*(M*s-m*f)-i*(o*s-e*f)+h*(o*m-e*M),t[8]=i*(c*w-s*v)-h*(u*w-m*v)+l*(u*s-m*c),t[9]=-(r*(c*w-s*v)-h*(n*w-e*v)+l*(n*s-e*c)),t[10]=r*(u*w-m*v)-i*(n*w-e*v)+l*(n*m-e*u),t[11]=-(r*(u*s-m*c)-i*(n*s-e*c)+h*(n*m-e*u)),t[12]=-(i*(c*p-f*v)-h*(u*p-M*v)+l*(u*f-M*c)),t[13]=r*(c*p-f*v)-h*(n*p-o*v)+l*(n*f-o*c),t[14]=-(r*(u*p-M*v)-i*(n*p-o*v)+l*(n*M-o*u)),t[15]=r*(u*f-M*c)-i*(n*f-o*c)+h*(n*M-o*u),t},mat4.determinant=function(t){var a=t[0],r=t[1],n=t[2],o=t[3],e=t[4],i=t[5],u=t[6],M=t[7],m=t[8],h=t[9],c=t[10],f=t[11],s=t[12],l=t[13],v=t[14],p=t[15],w=a*i-r*e,g=a*u-n*e,P=a*M-o*e,R=r*u-n*i,x=r*M-o*i,I=n*M-o*u,S=m*l-h*s,d=m*v-c*s,q=m*p-f*s,E=h*v-c*l,O=h*p-f*l,b=c*p-f*v;return w*b-g*O+P*E+R*q-x*d+I*S},mat4.multiply=function(t,a,r){var n=a[0],o=a[1],e=a[2],i=a[3],u=a[4],M=a[5],m=a[6],h=a[7],c=a[8],f=a[9],s=a[10],l=a[11],v=a[12],p=a[13],w=a[14],g=a[15],P=r[0],R=r[1],x=r[2],I=r[3];return t[0]=P*n+R*u+x*c+I*v,t[1]=P*o+R*M+x*f+I*p,t[2]=P*e+R*m+x*s+I*w,t[3]=P*i+R*h+x*l+I*g,P=r[4],R=r[5],x=r[6],I=r[7],t[4]=P*n+R*u+x*c+I*v,t[5]=P*o+R*M+x*f+I*p,t[6]=P*e+R*m+x*s+I*w,t[7]=P*i+R*h+x*l+I*g,P=r[8],R=r[9],x=r[10],I=r[11],t[8]=P*n+R*u+x*c+I*v,t[9]=P*o+R*M+x*f+I*p,t[10]=P*e+R*m+x*s+I*w,t[11]=P*i+R*h+x*l+I*g,P=r[12],R=r[13],x=r[14],I=r[15],t[12]=P*n+R*u+x*c+I*v,t[13]=P*o+R*M+x*f+I*p,t[14]=P*e+R*m+x*s+I*w,t[15]=P*i+R*h+x*l+I*g,t},mat4.mul=mat4.multiply,mat4.translate=function(t,a,r){var n,o,e,i,u,M,m,h,c,f,s,l,v=r[0],p=r[1],w=r[2];return a===t?(t[12]=a[0]*v+a[4]*p+a[8]*w+a[12],t[13]=a[1]*v+a[5]*p+a[9]*w+a[13],t[14]=a[2]*v+a[6]*p+a[10]*w+a[14],t[15]=a[3]*v+a[7]*p+a[11]*w+a[15]):(n=a[0],o=a[1],e=a[2],i=a[3],u=a[4],M=a[5],m=a[6],h=a[7],c=a[8],f=a[9],s=a[10],l=a[11],t[0]=n,t[1]=o,t[2]=e,t[3]=i,t[4]=u,t[5]=M,t[6]=m,t[7]=h,t[8]=c,t[9]=f,t[10]=s,t[11]=l,t[12]=n*v+u*p+c*w+a[12],t[13]=o*v+M*p+f*w+a[13],t[14]=e*v+m*p+s*w+a[14],t[15]=i*v+h*p+l*w+a[15]),t},mat4.scale=function(t,a,r){var n=r[0],o=r[1],e=r[2];return t[0]=a[0]*n,t[1]=a[1]*n,t[2]=a[2]*n,t[3]=a[3]*n,t[4]=a[4]*o,t[5]=a[5]*o,t[6]=a[6]*o,t[7]=a[7]*o,t[8]=a[8]*e,t[9]=a[9]*e,t[10]=a[10]*e,t[11]=a[11]*e,t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15],t},mat4.rotate=function(t,a,r,n){var o,e,i,u,M,m,h,c,f,s,l,v,p,w,g,P,R,x,I,S,d,q,E,O,b=n[0],T=n[1],Y=n[2],y=Math.sqrt(b*b+T*T+Y*Y);return Math.abs(y)<glMatrix.EPSILON?null:(y=1/y,b*=y,T*=y,Y*=y,o=Math.sin(r),e=Math.cos(r),i=1-e,u=a[0],M=a[1],m=a[2],h=a[3],c=a[4],f=a[5],s=a[6],l=a[7],v=a[8],p=a[9],w=a[10],g=a[11],P=b*b*i+e,R=T*b*i+Y*o,x=Y*b*i-T*o,I=b*T*i-Y*o,S=T*T*i+e,d=Y*T*i+b*o,q=b*Y*i+T*o,E=T*Y*i-b*o,O=Y*Y*i+e,t[0]=u*P+c*R+v*x,t[1]=M*P+f*R+p*x,t[2]=m*P+s*R+w*x,t[3]=h*P+l*R+g*x,t[4]=u*I+c*S+v*d,t[5]=M*I+f*S+p*d,t[6]=m*I+s*S+w*d,t[7]=h*I+l*S+g*d,t[8]=u*q+c*E+v*O,t[9]=M*q+f*E+p*O,t[10]=m*q+s*E+w*O,t[11]=h*q+l*E+g*O,a!==t&&(t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]),t)},mat4.rotateX=function(t,a,r){var n=Math.sin(r),o=Math.cos(r),e=a[4],i=a[5],u=a[6],M=a[7],m=a[8],h=a[9],c=a[10],f=a[11];return a!==t&&(t[0]=a[0],t[1]=a[1],t[2]=a[2],t[3]=a[3],t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]),t[4]=e*o+m*n,t[5]=i*o+h*n,t[6]=u*o+c*n,t[7]=M*o+f*n,t[8]=m*o-e*n,t[9]=h*o-i*n,t[10]=c*o-u*n,t[11]=f*o-M*n,t},mat4.rotateY=function(t,a,r){var n=Math.sin(r),o=Math.cos(r),e=a[0],i=a[1],u=a[2],M=a[3],m=a[8],h=a[9],c=a[10],f=a[11];return a!==t&&(t[4]=a[4],t[5]=a[5],t[6]=a[6],t[7]=a[7],t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]),t[0]=e*o-m*n,t[1]=i*o-h*n,t[2]=u*o-c*n,t[3]=M*o-f*n,t[8]=e*n+m*o,t[9]=i*n+h*o,t[10]=u*n+c*o,t[11]=M*n+f*o,t},mat4.rotateZ=function(t,a,r){var n=Math.sin(r),o=Math.cos(r),e=a[0],i=a[1],u=a[2],M=a[3],m=a[4],h=a[5],c=a[6],f=a[7];return a!==t&&(t[8]=a[8],t[9]=a[9],t[10]=a[10],t[11]=a[11],t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]),t[0]=e*o+m*n,t[1]=i*o+h*n,t[2]=u*o+c*n,t[3]=M*o+f*n,t[4]=m*o-e*n,t[5]=h*o-i*n,t[6]=c*o-u*n,t[7]=f*o-M*n,t},mat4.fromTranslation=function(t,a){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=a[0],t[13]=a[1],t[14]=a[2],t[15]=1,t},mat4.fromScaling=function(t,a){return t[0]=a[0],t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=a[1],t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=a[2],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4.fromRotation=function(t,a,r){var n,o,e,i=r[0],u=r[1],M=r[2],m=Math.sqrt(i*i+u*u+M*M);return Math.abs(m)<glMatrix.EPSILON?null:(m=1/m,i*=m,u*=m,M*=m,n=Math.sin(a),o=Math.cos(a),e=1-o,t[0]=i*i*e+o,t[1]=u*i*e+M*n,t[2]=M*i*e-u*n,t[3]=0,t[4]=i*u*e-M*n,t[5]=u*u*e+o,t[6]=M*u*e+i*n,t[7]=0,t[8]=i*M*e+u*n,t[9]=u*M*e-i*n,t[10]=M*M*e+o,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t)},mat4.fromXRotation=function(t,a){var r=Math.sin(a),n=Math.cos(a);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=n,t[6]=r,t[7]=0,t[8]=0,t[9]=-r,t[10]=n,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4.fromYRotation=function(t,a){var r=Math.sin(a),n=Math.cos(a);return t[0]=n,t[1]=0,t[2]=-r,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=r,t[9]=0,t[10]=n,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4.fromZRotation=function(t,a){var r=Math.sin(a),n=Math.cos(a);return t[0]=n,t[1]=r,t[2]=0,t[3]=0,t[4]=-r,t[5]=n,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4.fromRotationTranslation=function(t,a,r){var n=a[0],o=a[1],e=a[2],i=a[3],u=n+n,M=o+o,m=e+e,h=n*u,c=n*M,f=n*m,s=o*M,l=o*m,v=e*m,p=i*u,w=i*M,g=i*m;return t[0]=1-(s+v),t[1]=c+g,t[2]=f-w,t[3]=0,t[4]=c-g,t[5]=1-(h+v),t[6]=l+p,t[7]=0,t[8]=f+w,t[9]=l-p,t[10]=1-(h+s),t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t},mat4.fromRotationTranslationScale=function(t,a,r,n){var o=a[0],e=a[1],i=a[2],u=a[3],M=o+o,m=e+e,h=i+i,c=o*M,f=o*m,s=o*h,l=e*m,v=e*h,p=i*h,w=u*M,g=u*m,P=u*h,R=n[0],x=n[1],I=n[2];return t[0]=(1-(l+p))*R,t[1]=(f+P)*R,t[2]=(s-g)*R,t[3]=0,t[4]=(f-P)*x,t[5]=(1-(c+p))*x,t[6]=(v+w)*x,t[7]=0,t[8]=(s+g)*I,t[9]=(v-w)*I,t[10]=(1-(c+l))*I,t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t},mat4.fromRotationTranslationScaleOrigin=function(t,a,r,n,o){var e=a[0],i=a[1],u=a[2],M=a[3],m=e+e,h=i+i,c=u+u,f=e*m,s=e*h,l=e*c,v=i*h,p=i*c,w=u*c,g=M*m,P=M*h,R=M*c,x=n[0],I=n[1],S=n[2],d=o[0],q=o[1],E=o[2];return t[0]=(1-(v+w))*x,t[1]=(s+R)*x,t[2]=(l-P)*x,t[3]=0,t[4]=(s-R)*I,t[5]=(1-(f+w))*I,t[6]=(p+g)*I,t[7]=0,t[8]=(l+P)*S,t[9]=(p-g)*S,t[10]=(1-(f+v))*S,t[11]=0,t[12]=r[0]+d-(t[0]*d+t[4]*q+t[8]*E),t[13]=r[1]+q-(t[1]*d+t[5]*q+t[9]*E),t[14]=r[2]+E-(t[2]*d+t[6]*q+t[10]*E),t[15]=1,t},mat4.fromQuat=function(t,a){var r=a[0],n=a[1],o=a[2],e=a[3],i=r+r,u=n+n,M=o+o,m=r*i,h=n*i,c=n*u,f=o*i,s=o*u,l=o*M,v=e*i,p=e*u,w=e*M;return t[0]=1-c-l,t[1]=h+w,t[2]=f-p,t[3]=0,t[4]=h-w,t[5]=1-m-l,t[6]=s+v,t[7]=0,t[8]=f+p,t[9]=s-v,t[10]=1-m-c,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4.frustum=function(t,a,r,n,o,e,i){var u=1/(r-a),M=1/(o-n),m=1/(e-i);return t[0]=2*e*u,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*e*M,t[6]=0,t[7]=0,t[8]=(r+a)*u,t[9]=(o+n)*M,t[10]=(i+e)*m,t[11]=-1,t[12]=0,t[13]=0,t[14]=i*e*2*m,t[15]=0,t},mat4.perspective=function(t,a,r,n,o){var e=1/Math.tan(a/2),i=1/(n-o);return t[0]=e/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=(o+n)*i,t[11]=-1,t[12]=0,t[13]=0,t[14]=2*o*n*i,t[15]=0,t},mat4.perspectiveFromFieldOfView=function(t,a,r,n){var o=Math.tan(a.upDegrees*Math.PI/180),e=Math.tan(a.downDegrees*Math.PI/180),i=Math.tan(a.leftDegrees*Math.PI/180),u=Math.tan(a.rightDegrees*Math.PI/180),M=2/(i+u),m=2/(o+e);return t[0]=M,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=m,t[6]=0,t[7]=0,t[8]=-((i-u)*M*.5),t[9]=(o-e)*m*.5,t[10]=n/(r-n),t[11]=-1,t[12]=0,t[13]=0,t[14]=n*r/(r-n),t[15]=0,t},mat4.ortho=function(t,a,r,n,o,e,i){var u=1/(a-r),M=1/(n-o),m=1/(e-i);return t[0]=-2*u,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*M,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*m,t[11]=0,t[12]=(a+r)*u,t[13]=(o+n)*M,t[14]=(i+e)*m,t[15]=1,t},mat4.lookAt=function(t,a,r,n){var o,e,i,u,M,m,h,c,f,s,l=a[0],v=a[1],p=a[2],w=n[0],g=n[1],P=n[2],R=r[0],x=r[1],I=r[2];return Math.abs(l-R)<glMatrix.EPSILON&&Math.abs(v-x)<glMatrix.EPSILON&&Math.abs(p-I)<glMatrix.EPSILON?mat4.identity(t):(h=l-R,c=v-x,f=p-I,s=1/Math.sqrt(h*h+c*c+f*f),h*=s,c*=s,f*=s,o=g*f-P*c,e=P*h-w*f,i=w*c-g*h,s=Math.sqrt(o*o+e*e+i*i),s?(s=1/s,o*=s,e*=s,i*=s):(o=0,e=0,i=0),u=c*i-f*e,M=f*o-h*i,m=h*e-c*o,s=Math.sqrt(u*u+M*M+m*m),s?(s=1/s,u*=s,M*=s,m*=s):(u=0,M=0,m=0),t[0]=o,t[1]=u,t[2]=h,t[3]=0,t[4]=e,t[5]=M,t[6]=c,t[7]=0,t[8]=i,t[9]=m,t[10]=f,t[11]=0,t[12]=-(o*l+e*v+i*p),t[13]=-(u*l+M*v+m*p),t[14]=-(h*l+c*v+f*p),t[15]=1,t)},mat4.str=function(t){return"mat4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+", "+t[9]+", "+t[10]+", "+t[11]+", "+t[12]+", "+t[13]+", "+t[14]+", "+t[15]+")"},mat4.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+Math.pow(t[6],2)+Math.pow(t[7],2)+Math.pow(t[8],2)+Math.pow(t[9],2)+Math.pow(t[10],2)+Math.pow(t[11],2)+Math.pow(t[12],2)+Math.pow(t[13],2)+Math.pow(t[14],2)+Math.pow(t[15],2))},module.exports=mat4;
+	},{"./common.js":117}],122:[function(require,module,exports){
+	var glMatrix=require("./common.js"),mat3=require("./mat3.js"),vec3=require("./vec3.js"),vec4=require("./vec4.js"),quat={};quat.create=function(){var t=new glMatrix.ARRAY_TYPE(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},quat.rotationTo=function(){var t=vec3.create(),a=vec3.fromValues(1,0,0),e=vec3.fromValues(0,1,0);return function(r,u,n){var c=vec3.dot(u,n);return-.999999>c?(vec3.cross(t,a,u),vec3.length(t)<1e-6&&vec3.cross(t,e,u),vec3.normalize(t,t),quat.setAxisAngle(r,t,Math.PI),r):c>.999999?(r[0]=0,r[1]=0,r[2]=0,r[3]=1,r):(vec3.cross(t,u,n),r[0]=t[0],r[1]=t[1],r[2]=t[2],r[3]=1+c,quat.normalize(r,r))}}(),quat.setAxes=function(){var t=mat3.create();return function(a,e,r,u){return t[0]=r[0],t[3]=r[1],t[6]=r[2],t[1]=u[0],t[4]=u[1],t[7]=u[2],t[2]=-e[0],t[5]=-e[1],t[8]=-e[2],quat.normalize(a,quat.fromMat3(a,t))}}(),quat.clone=vec4.clone,quat.fromValues=vec4.fromValues,quat.copy=vec4.copy,quat.set=vec4.set,quat.identity=function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},quat.setAxisAngle=function(t,a,e){e=.5*e;var r=Math.sin(e);return t[0]=r*a[0],t[1]=r*a[1],t[2]=r*a[2],t[3]=Math.cos(e),t},quat.add=vec4.add,quat.multiply=function(t,a,e){var r=a[0],u=a[1],n=a[2],c=a[3],q=e[0],o=e[1],s=e[2],i=e[3];return t[0]=r*i+c*q+u*s-n*o,t[1]=u*i+c*o+n*q-r*s,t[2]=n*i+c*s+r*o-u*q,t[3]=c*i-r*q-u*o-n*s,t},quat.mul=quat.multiply,quat.scale=vec4.scale,quat.rotateX=function(t,a,e){e*=.5;var r=a[0],u=a[1],n=a[2],c=a[3],q=Math.sin(e),o=Math.cos(e);return t[0]=r*o+c*q,t[1]=u*o+n*q,t[2]=n*o-u*q,t[3]=c*o-r*q,t},quat.rotateY=function(t,a,e){e*=.5;var r=a[0],u=a[1],n=a[2],c=a[3],q=Math.sin(e),o=Math.cos(e);return t[0]=r*o-n*q,t[1]=u*o+c*q,t[2]=n*o+r*q,t[3]=c*o-u*q,t},quat.rotateZ=function(t,a,e){e*=.5;var r=a[0],u=a[1],n=a[2],c=a[3],q=Math.sin(e),o=Math.cos(e);return t[0]=r*o+u*q,t[1]=u*o-r*q,t[2]=n*o+c*q,t[3]=c*o-n*q,t},quat.calculateW=function(t,a){var e=a[0],r=a[1],u=a[2];return t[0]=e,t[1]=r,t[2]=u,t[3]=Math.sqrt(Math.abs(1-e*e-r*r-u*u)),t},quat.dot=vec4.dot,quat.lerp=vec4.lerp,quat.slerp=function(t,a,e,r){var u,n,c,q,o,s=a[0],i=a[1],v=a[2],l=a[3],f=e[0],h=e[1],M=e[2],m=e[3];return n=s*f+i*h+v*M+l*m,0>n&&(n=-n,f=-f,h=-h,M=-M,m=-m),1-n>1e-6?(u=Math.acos(n),c=Math.sin(u),q=Math.sin((1-r)*u)/c,o=Math.sin(r*u)/c):(q=1-r,o=r),t[0]=q*s+o*f,t[1]=q*i+o*h,t[2]=q*v+o*M,t[3]=q*l+o*m,t},quat.sqlerp=function(){var t=quat.create(),a=quat.create();return function(e,r,u,n,c,q){return quat.slerp(t,r,c,q),quat.slerp(a,u,n,q),quat.slerp(e,t,a,2*q*(1-q)),e}}(),quat.invert=function(t,a){var e=a[0],r=a[1],u=a[2],n=a[3],c=e*e+r*r+u*u+n*n,q=c?1/c:0;return t[0]=-e*q,t[1]=-r*q,t[2]=-u*q,t[3]=n*q,t},quat.conjugate=function(t,a){return t[0]=-a[0],t[1]=-a[1],t[2]=-a[2],t[3]=a[3],t},quat.length=vec4.length,quat.len=quat.length,quat.squaredLength=vec4.squaredLength,quat.sqrLen=quat.squaredLength,quat.normalize=vec4.normalize,quat.fromMat3=function(t,a){var e,r=a[0]+a[4]+a[8];if(r>0)e=Math.sqrt(r+1),t[3]=.5*e,e=.5/e,t[0]=(a[5]-a[7])*e,t[1]=(a[6]-a[2])*e,t[2]=(a[1]-a[3])*e;else{var u=0;a[4]>a[0]&&(u=1),a[8]>a[3*u+u]&&(u=2);var n=(u+1)%3,c=(u+2)%3;e=Math.sqrt(a[3*u+u]-a[3*n+n]-a[3*c+c]+1),t[u]=.5*e,e=.5/e,t[3]=(a[3*n+c]-a[3*c+n])*e,t[n]=(a[3*n+u]+a[3*u+n])*e,t[c]=(a[3*c+u]+a[3*u+c])*e}return t},quat.str=function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},module.exports=quat;
+	},{"./common.js":117,"./mat3.js":120,"./vec3.js":124,"./vec4.js":125}],123:[function(require,module,exports){
+	var glMatrix=require("./common.js"),vec2={};vec2.create=function(){var n=new glMatrix.ARRAY_TYPE(2);return n[0]=0,n[1]=0,n},vec2.clone=function(n){var e=new glMatrix.ARRAY_TYPE(2);return e[0]=n[0],e[1]=n[1],e},vec2.fromValues=function(n,e){var r=new glMatrix.ARRAY_TYPE(2);return r[0]=n,r[1]=e,r},vec2.copy=function(n,e){return n[0]=e[0],n[1]=e[1],n},vec2.set=function(n,e,r){return n[0]=e,n[1]=r,n},vec2.add=function(n,e,r){return n[0]=e[0]+r[0],n[1]=e[1]+r[1],n},vec2.subtract=function(n,e,r){return n[0]=e[0]-r[0],n[1]=e[1]-r[1],n},vec2.sub=vec2.subtract,vec2.multiply=function(n,e,r){return n[0]=e[0]*r[0],n[1]=e[1]*r[1],n},vec2.mul=vec2.multiply,vec2.divide=function(n,e,r){return n[0]=e[0]/r[0],n[1]=e[1]/r[1],n},vec2.div=vec2.divide,vec2.min=function(n,e,r){return n[0]=Math.min(e[0],r[0]),n[1]=Math.min(e[1],r[1]),n},vec2.max=function(n,e,r){return n[0]=Math.max(e[0],r[0]),n[1]=Math.max(e[1],r[1]),n},vec2.scale=function(n,e,r){return n[0]=e[0]*r,n[1]=e[1]*r,n},vec2.scaleAndAdd=function(n,e,r,t){return n[0]=e[0]+r[0]*t,n[1]=e[1]+r[1]*t,n},vec2.distance=function(n,e){var r=e[0]-n[0],t=e[1]-n[1];return Math.sqrt(r*r+t*t)},vec2.dist=vec2.distance,vec2.squaredDistance=function(n,e){var r=e[0]-n[0],t=e[1]-n[1];return r*r+t*t},vec2.sqrDist=vec2.squaredDistance,vec2.length=function(n){var e=n[0],r=n[1];return Math.sqrt(e*e+r*r)},vec2.len=vec2.length,vec2.squaredLength=function(n){var e=n[0],r=n[1];return e*e+r*r},vec2.sqrLen=vec2.squaredLength,vec2.negate=function(n,e){return n[0]=-e[0],n[1]=-e[1],n},vec2.inverse=function(n,e){return n[0]=1/e[0],n[1]=1/e[1],n},vec2.normalize=function(n,e){var r=e[0],t=e[1],c=r*r+t*t;return c>0&&(c=1/Math.sqrt(c),n[0]=e[0]*c,n[1]=e[1]*c),n},vec2.dot=function(n,e){return n[0]*e[0]+n[1]*e[1]},vec2.cross=function(n,e,r){var t=e[0]*r[1]-e[1]*r[0];return n[0]=n[1]=0,n[2]=t,n},vec2.lerp=function(n,e,r,t){var c=e[0],u=e[1];return n[0]=c+t*(r[0]-c),n[1]=u+t*(r[1]-u),n},vec2.random=function(n,e){e=e||1;var r=2*glMatrix.RANDOM()*Math.PI;return n[0]=Math.cos(r)*e,n[1]=Math.sin(r)*e,n},vec2.transformMat2=function(n,e,r){var t=e[0],c=e[1];return n[0]=r[0]*t+r[2]*c,n[1]=r[1]*t+r[3]*c,n},vec2.transformMat2d=function(n,e,r){var t=e[0],c=e[1];return n[0]=r[0]*t+r[2]*c+r[4],n[1]=r[1]*t+r[3]*c+r[5],n},vec2.transformMat3=function(n,e,r){var t=e[0],c=e[1];return n[0]=r[0]*t+r[3]*c+r[6],n[1]=r[1]*t+r[4]*c+r[7],n},vec2.transformMat4=function(n,e,r){var t=e[0],c=e[1];return n[0]=r[0]*t+r[4]*c+r[12],n[1]=r[1]*t+r[5]*c+r[13],n},vec2.forEach=function(){var n=vec2.create();return function(e,r,t,c,u,v){var a,i;for(r||(r=2),t||(t=0),i=c?Math.min(c*r+t,e.length):e.length,a=t;i>a;a+=r)n[0]=e[a],n[1]=e[a+1],u(n,n,v),e[a]=n[0],e[a+1]=n[1];return e}}(),vec2.str=function(n){return"vec2("+n[0]+", "+n[1]+")"},module.exports=vec2;
+	},{"./common.js":117}],124:[function(require,module,exports){
+	var glMatrix=require("./common.js"),vec3={};vec3.create=function(){var n=new glMatrix.ARRAY_TYPE(3);return n[0]=0,n[1]=0,n[2]=0,n},vec3.clone=function(n){var t=new glMatrix.ARRAY_TYPE(3);return t[0]=n[0],t[1]=n[1],t[2]=n[2],t},vec3.fromValues=function(n,t,e){var r=new glMatrix.ARRAY_TYPE(3);return r[0]=n,r[1]=t,r[2]=e,r},vec3.copy=function(n,t){return n[0]=t[0],n[1]=t[1],n[2]=t[2],n},vec3.set=function(n,t,e,r){return n[0]=t,n[1]=e,n[2]=r,n},vec3.add=function(n,t,e){return n[0]=t[0]+e[0],n[1]=t[1]+e[1],n[2]=t[2]+e[2],n},vec3.subtract=function(n,t,e){return n[0]=t[0]-e[0],n[1]=t[1]-e[1],n[2]=t[2]-e[2],n},vec3.sub=vec3.subtract,vec3.multiply=function(n,t,e){return n[0]=t[0]*e[0],n[1]=t[1]*e[1],n[2]=t[2]*e[2],n},vec3.mul=vec3.multiply,vec3.divide=function(n,t,e){return n[0]=t[0]/e[0],n[1]=t[1]/e[1],n[2]=t[2]/e[2],n},vec3.div=vec3.divide,vec3.min=function(n,t,e){return n[0]=Math.min(t[0],e[0]),n[1]=Math.min(t[1],e[1]),n[2]=Math.min(t[2],e[2]),n},vec3.max=function(n,t,e){return n[0]=Math.max(t[0],e[0]),n[1]=Math.max(t[1],e[1]),n[2]=Math.max(t[2],e[2]),n},vec3.scale=function(n,t,e){return n[0]=t[0]*e,n[1]=t[1]*e,n[2]=t[2]*e,n},vec3.scaleAndAdd=function(n,t,e,r){return n[0]=t[0]+e[0]*r,n[1]=t[1]+e[1]*r,n[2]=t[2]+e[2]*r,n},vec3.distance=function(n,t){var e=t[0]-n[0],r=t[1]-n[1],c=t[2]-n[2];return Math.sqrt(e*e+r*r+c*c)},vec3.dist=vec3.distance,vec3.squaredDistance=function(n,t){var e=t[0]-n[0],r=t[1]-n[1],c=t[2]-n[2];return e*e+r*r+c*c},vec3.sqrDist=vec3.squaredDistance,vec3.length=function(n){var t=n[0],e=n[1],r=n[2];return Math.sqrt(t*t+e*e+r*r)},vec3.len=vec3.length,vec3.squaredLength=function(n){var t=n[0],e=n[1],r=n[2];return t*t+e*e+r*r},vec3.sqrLen=vec3.squaredLength,vec3.negate=function(n,t){return n[0]=-t[0],n[1]=-t[1],n[2]=-t[2],n},vec3.inverse=function(n,t){return n[0]=1/t[0],n[1]=1/t[1],n[2]=1/t[2],n},vec3.normalize=function(n,t){var e=t[0],r=t[1],c=t[2],a=e*e+r*r+c*c;return a>0&&(a=1/Math.sqrt(a),n[0]=t[0]*a,n[1]=t[1]*a,n[2]=t[2]*a),n},vec3.dot=function(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]},vec3.cross=function(n,t,e){var r=t[0],c=t[1],a=t[2],u=e[0],v=e[1],i=e[2];return n[0]=c*i-a*v,n[1]=a*u-r*i,n[2]=r*v-c*u,n},vec3.lerp=function(n,t,e,r){var c=t[0],a=t[1],u=t[2];return n[0]=c+r*(e[0]-c),n[1]=a+r*(e[1]-a),n[2]=u+r*(e[2]-u),n},vec3.hermite=function(n,t,e,r,c,a){var u=a*a,v=u*(2*a-3)+1,i=u*(a-2)+a,o=u*(a-1),s=u*(3-2*a);return n[0]=t[0]*v+e[0]*i+r[0]*o+c[0]*s,n[1]=t[1]*v+e[1]*i+r[1]*o+c[1]*s,n[2]=t[2]*v+e[2]*i+r[2]*o+c[2]*s,n},vec3.bezier=function(n,t,e,r,c,a){var u=1-a,v=u*u,i=a*a,o=v*u,s=3*a*v,f=3*i*u,M=i*a;return n[0]=t[0]*o+e[0]*s+r[0]*f+c[0]*M,n[1]=t[1]*o+e[1]*s+r[1]*f+c[1]*M,n[2]=t[2]*o+e[2]*s+r[2]*f+c[2]*M,n},vec3.random=function(n,t){t=t||1;var e=2*glMatrix.RANDOM()*Math.PI,r=2*glMatrix.RANDOM()-1,c=Math.sqrt(1-r*r)*t;return n[0]=Math.cos(e)*c,n[1]=Math.sin(e)*c,n[2]=r*t,n},vec3.transformMat4=function(n,t,e){var r=t[0],c=t[1],a=t[2],u=e[3]*r+e[7]*c+e[11]*a+e[15];return u=u||1,n[0]=(e[0]*r+e[4]*c+e[8]*a+e[12])/u,n[1]=(e[1]*r+e[5]*c+e[9]*a+e[13])/u,n[2]=(e[2]*r+e[6]*c+e[10]*a+e[14])/u,n},vec3.transformMat3=function(n,t,e){var r=t[0],c=t[1],a=t[2];return n[0]=r*e[0]+c*e[3]+a*e[6],n[1]=r*e[1]+c*e[4]+a*e[7],n[2]=r*e[2]+c*e[5]+a*e[8],n},vec3.transformQuat=function(n,t,e){var r=t[0],c=t[1],a=t[2],u=e[0],v=e[1],i=e[2],o=e[3],s=o*r+v*a-i*c,f=o*c+i*r-u*a,M=o*a+u*c-v*r,h=-u*r-v*c-i*a;return n[0]=s*o+h*-u+f*-i-M*-v,n[1]=f*o+h*-v+M*-u-s*-i,n[2]=M*o+h*-i+s*-v-f*-u,n},vec3.rotateX=function(n,t,e,r){var c=[],a=[];return c[0]=t[0]-e[0],c[1]=t[1]-e[1],c[2]=t[2]-e[2],a[0]=c[0],a[1]=c[1]*Math.cos(r)-c[2]*Math.sin(r),a[2]=c[1]*Math.sin(r)+c[2]*Math.cos(r),n[0]=a[0]+e[0],n[1]=a[1]+e[1],n[2]=a[2]+e[2],n},vec3.rotateY=function(n,t,e,r){var c=[],a=[];return c[0]=t[0]-e[0],c[1]=t[1]-e[1],c[2]=t[2]-e[2],a[0]=c[2]*Math.sin(r)+c[0]*Math.cos(r),a[1]=c[1],a[2]=c[2]*Math.cos(r)-c[0]*Math.sin(r),n[0]=a[0]+e[0],n[1]=a[1]+e[1],n[2]=a[2]+e[2],n},vec3.rotateZ=function(n,t,e,r){var c=[],a=[];return c[0]=t[0]-e[0],c[1]=t[1]-e[1],c[2]=t[2]-e[2],a[0]=c[0]*Math.cos(r)-c[1]*Math.sin(r),a[1]=c[0]*Math.sin(r)+c[1]*Math.cos(r),a[2]=c[2],n[0]=a[0]+e[0],n[1]=a[1]+e[1],n[2]=a[2]+e[2],n},vec3.forEach=function(){var n=vec3.create();return function(t,e,r,c,a,u){var v,i;for(e||(e=3),r||(r=0),i=c?Math.min(c*e+r,t.length):t.length,v=r;i>v;v+=e)n[0]=t[v],n[1]=t[v+1],n[2]=t[v+2],a(n,n,u),t[v]=n[0],t[v+1]=n[1],t[v+2]=n[2];return t}}(),vec3.angle=function(n,t){var e=vec3.fromValues(n[0],n[1],n[2]),r=vec3.fromValues(t[0],t[1],t[2]);vec3.normalize(e,e),vec3.normalize(r,r);var c=vec3.dot(e,r);return c>1?0:Math.acos(c)},vec3.str=function(n){return"vec3("+n[0]+", "+n[1]+", "+n[2]+")"},module.exports=vec3;
+	},{"./common.js":117}],125:[function(require,module,exports){
+	var glMatrix=require("./common.js"),vec4={};vec4.create=function(){var e=new glMatrix.ARRAY_TYPE(4);return e[0]=0,e[1]=0,e[2]=0,e[3]=0,e},vec4.clone=function(e){var n=new glMatrix.ARRAY_TYPE(4);return n[0]=e[0],n[1]=e[1],n[2]=e[2],n[3]=e[3],n},vec4.fromValues=function(e,n,t,r){var c=new glMatrix.ARRAY_TYPE(4);return c[0]=e,c[1]=n,c[2]=t,c[3]=r,c},vec4.copy=function(e,n){return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e},vec4.set=function(e,n,t,r,c){return e[0]=n,e[1]=t,e[2]=r,e[3]=c,e},vec4.add=function(e,n,t){return e[0]=n[0]+t[0],e[1]=n[1]+t[1],e[2]=n[2]+t[2],e[3]=n[3]+t[3],e},vec4.subtract=function(e,n,t){return e[0]=n[0]-t[0],e[1]=n[1]-t[1],e[2]=n[2]-t[2],e[3]=n[3]-t[3],e},vec4.sub=vec4.subtract,vec4.multiply=function(e,n,t){return e[0]=n[0]*t[0],e[1]=n[1]*t[1],e[2]=n[2]*t[2],e[3]=n[3]*t[3],e},vec4.mul=vec4.multiply,vec4.divide=function(e,n,t){return e[0]=n[0]/t[0],e[1]=n[1]/t[1],e[2]=n[2]/t[2],e[3]=n[3]/t[3],e},vec4.div=vec4.divide,vec4.min=function(e,n,t){return e[0]=Math.min(n[0],t[0]),e[1]=Math.min(n[1],t[1]),e[2]=Math.min(n[2],t[2]),e[3]=Math.min(n[3],t[3]),e},vec4.max=function(e,n,t){return e[0]=Math.max(n[0],t[0]),e[1]=Math.max(n[1],t[1]),e[2]=Math.max(n[2],t[2]),e[3]=Math.max(n[3],t[3]),e},vec4.scale=function(e,n,t){return e[0]=n[0]*t,e[1]=n[1]*t,e[2]=n[2]*t,e[3]=n[3]*t,e},vec4.scaleAndAdd=function(e,n,t,r){return e[0]=n[0]+t[0]*r,e[1]=n[1]+t[1]*r,e[2]=n[2]+t[2]*r,e[3]=n[3]+t[3]*r,e},vec4.distance=function(e,n){var t=n[0]-e[0],r=n[1]-e[1],c=n[2]-e[2],u=n[3]-e[3];return Math.sqrt(t*t+r*r+c*c+u*u)},vec4.dist=vec4.distance,vec4.squaredDistance=function(e,n){var t=n[0]-e[0],r=n[1]-e[1],c=n[2]-e[2],u=n[3]-e[3];return t*t+r*r+c*c+u*u},vec4.sqrDist=vec4.squaredDistance,vec4.length=function(e){var n=e[0],t=e[1],r=e[2],c=e[3];return Math.sqrt(n*n+t*t+r*r+c*c)},vec4.len=vec4.length,vec4.squaredLength=function(e){var n=e[0],t=e[1],r=e[2],c=e[3];return n*n+t*t+r*r+c*c},vec4.sqrLen=vec4.squaredLength,vec4.negate=function(e,n){return e[0]=-n[0],e[1]=-n[1],e[2]=-n[2],e[3]=-n[3],e},vec4.inverse=function(e,n){return e[0]=1/n[0],e[1]=1/n[1],e[2]=1/n[2],e[3]=1/n[3],e},vec4.normalize=function(e,n){var t=n[0],r=n[1],c=n[2],u=n[3],a=t*t+r*r+c*c+u*u;return a>0&&(a=1/Math.sqrt(a),e[0]=t*a,e[1]=r*a,e[2]=c*a,e[3]=u*a),e},vec4.dot=function(e,n){return e[0]*n[0]+e[1]*n[1]+e[2]*n[2]+e[3]*n[3]},vec4.lerp=function(e,n,t,r){var c=n[0],u=n[1],a=n[2],v=n[3];return e[0]=c+r*(t[0]-c),e[1]=u+r*(t[1]-u),e[2]=a+r*(t[2]-a),e[3]=v+r*(t[3]-v),e},vec4.random=function(e,n){return n=n||1,e[0]=glMatrix.RANDOM(),e[1]=glMatrix.RANDOM(),e[2]=glMatrix.RANDOM(),e[3]=glMatrix.RANDOM(),vec4.normalize(e,e),vec4.scale(e,e,n),e},vec4.transformMat4=function(e,n,t){var r=n[0],c=n[1],u=n[2],a=n[3];return e[0]=t[0]*r+t[4]*c+t[8]*u+t[12]*a,e[1]=t[1]*r+t[5]*c+t[9]*u+t[13]*a,e[2]=t[2]*r+t[6]*c+t[10]*u+t[14]*a,e[3]=t[3]*r+t[7]*c+t[11]*u+t[15]*a,e},vec4.transformQuat=function(e,n,t){var r=n[0],c=n[1],u=n[2],a=t[0],v=t[1],i=t[2],o=t[3],f=o*r+v*u-i*c,s=o*c+i*r-a*u,l=o*u+a*c-v*r,M=-a*r-v*c-i*u;return e[0]=f*o+M*-a+s*-i-l*-v,e[1]=s*o+M*-v+l*-a-f*-i,e[2]=l*o+M*-i+f*-v-s*-a,e[3]=n[3],e},vec4.forEach=function(){var e=vec4.create();return function(n,t,r,c,u,a){var v,i;for(t||(t=4),r||(r=0),i=c?Math.min(c*t+r,n.length):n.length,v=r;i>v;v+=t)e[0]=n[v],e[1]=n[v+1],e[2]=n[v+2],e[3]=n[v+3],u(e,e,a),n[v]=e[0],n[v+1]=e[1],n[v+2]=e[2],n[v+3]=e[3];return n}}(),vec4.str=function(e){return"vec4("+e[0]+", "+e[1]+", "+e[2]+", "+e[3]+")"},module.exports=vec4;
+	},{"./common.js":117}],126:[function(require,module,exports){
+	exports.read=function(a,o,t,r,h){var M,p,w=8*h-r-1,f=(1<<w)-1,e=f>>1,i=-7,N=t?h-1:0,n=t?-1:1,s=a[o+N];for(N+=n,M=s&(1<<-i)-1,s>>=-i,i+=w;i>0;M=256*M+a[o+N],N+=n,i-=8);for(p=M&(1<<-i)-1,M>>=-i,i+=r;i>0;p=256*p+a[o+N],N+=n,i-=8);if(0===M)M=1-e;else{if(M===f)return p?NaN:(s?-1:1)*(1/0);p+=Math.pow(2,r),M-=e}return(s?-1:1)*p*Math.pow(2,M-r)},exports.write=function(a,o,t,r,h,M){var p,w,f,e=8*M-h-1,i=(1<<e)-1,N=i>>1,n=23===h?Math.pow(2,-24)-Math.pow(2,-77):0,s=r?0:M-1,u=r?1:-1,l=0>o||0===o&&0>1/o?1:0;for(o=Math.abs(o),isNaN(o)||o===1/0?(w=isNaN(o)?1:0,p=i):(p=Math.floor(Math.log(o)/Math.LN2),o*(f=Math.pow(2,-p))<1&&(p--,f*=2),o+=p+N>=1?n/f:n*Math.pow(2,1-N),o*f>=2&&(p++,f/=2),p+N>=i?(w=0,p=i):p+N>=1?(w=(o*f-1)*Math.pow(2,h),p+=N):(w=o*Math.pow(2,N-1)*Math.pow(2,h),p=0));h>=8;a[t+s]=255&w,s+=u,w/=256,h-=8);for(p=p<<h|w,e+=h;e>0;a[t+s]=255&p,s+=u,p/=256,e-=8);a[t+s-u]|=128*l};
+	},{}],127:[function(require,module,exports){
+	"function"==typeof Object.create?module.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:module.exports=function(t,e){t.super_=e;var o=function(){};o.prototype=e.prototype,t.prototype=new o,t.prototype.constructor=t};
+	},{}],128:[function(require,module,exports){
+	"use strict";function constant(r){return function(){return r}}function interpolateNumber(r,t,n){return r*(1-n)+t*n}function interpolateArray(r,t,n){for(var e=[],o=0;o<r.length;o++)e[o]=interpolateNumber(r[o],t[o],n);return e}exports.interpolated=function(r){if(!r.stops)return constant(r);var t=r.stops,n=r.base||1,e=Array.isArray(t[0][1])?interpolateArray:interpolateNumber;return function(r){for(var o,a,i=0;i<t.length;i++){var u=t[i];if(u[0]<=r&&(o=u),u[0]>r){a=u;break}}if(o&&a){var s=a[0]-o[0],f=r-o[0],p=1===n?f/s:(Math.pow(n,f)-1)/(Math.pow(n,s)-1);return e(o[1],a[1],p)}return o?o[1]:a?a[1]:void 0}},exports["piecewise-constant"]=function(r){if(!r.stops)return constant(r);var t=r.stops;return function(r){for(var n=0;n<t.length;n++)if(t[n][0]>r)return t[0===n?0:n-1][1];return t[t.length-1][1]}};
+	},{}],129:[function(require,module,exports){
+	"use strict";var reference=require("../../reference/latest.min.js"),validate=require("./parsed");module.exports=function(e){return validate(e,reference)};
+	},{"../../reference/latest.min.js":132,"./parsed":130}],130:[function(require,module,exports){
+	"use strict";function typeof_(e){return e instanceof Number?"number":e instanceof String?"string":e instanceof Boolean?"boolean":Array.isArray(e)?"array":null===e?"null":typeof e}function unbundle(e){return e instanceof Number||e instanceof String||e instanceof Boolean?e.valueOf():e}var parseCSSColor=require("csscolorparser").parseCSSColor,format=require("util").format;module.exports=function(e,t){function r(e,t){var r={message:(e?e+": ":"")+format.apply(format,Array.prototype.slice.call(arguments,2))};null!==t&&void 0!==t&&t.__line__&&(r.line=t.__line__),s.push(r)}function n(e,o,i){var s=typeof_(o);if("string"===s&&"@"===o[0]){if(t.$version>7)return r(e,o,"constants have been deprecated as of v8");if(!(o in a))return r(e,o,'constant "%s" not found',o);o=a[o],s=typeof_(o)}if(i["function"]&&"object"===s)return n["function"](e,o,i);if(i.type){var u=n[i.type];if(u)return u(e,o,i);i=t[i.type]}n.object(e,o,i)}function o(e){return function(t,n,o){var a=typeof_(n);a!==e&&r(t,n,"%s expected, %s found",e,a),"minimum"in o&&n<o.minimum&&r(t,n,"%s is less than the minimum value %s",n,o.minimum),"maximum"in o&&n>o.maximum&&r(t,n,"%s is greater than the maximum value %s",n,o.maximum)}}var a=e.constants||{},i={},s=[];return n.constants=function(e,n){if(t.$version>7){if(n)return r(e,n,"constants have been deprecated as of v8")}else{var o=typeof_(n);if("object"!==o)return r(e,n,"object expected, %s found",o);for(var a in n)"@"!==a[0]&&r(e+"."+a,n[a],'constants must start with "@"')}},n.source=function(e,o){if(!o.type)return void r(e,o,'"type" is required');var a=unbundle(o.type);switch(a){case"vector":case"raster":if(n.object(e,o,t.source_tile),"url"in o)for(var i in o)["type","url","tileSize"].indexOf(i)<0&&r(e+"."+i,o[i],'a source with a "url" property may not include a "%s" property',i);break;case"geojson":n.object(e,o,t.source_geojson);break;case"video":n.object(e,o,t.source_video);break;case"image":n.object(e,o,t.source_image);break;default:n["enum"](e+".type",o.type,{values:["vector","raster","geojson","video","image"]})}},n.layer=function(o,a){a.type||a.ref||r(o,a,'either "type" or "ref" is required');var s=unbundle(a.type),u=unbundle(a.ref);if(a.id&&(i[a.id]?r(o,a.id,'duplicate layer id "%s", previously used at line %d',a.id,i[a.id]):i[a.id]=a.id.__line__),"ref"in a){["type","source","source-layer","filter","layout"].forEach(function(e){e in a&&r(o,a[e],'"%s" is prohibited for ref layers',e)});var c;e.layers.forEach(function(e){e.id==u&&(c=e)}),c?c.ref?r(o,a.ref,"ref cannot reference another ref layer"):s=c.type:r(o,a.ref,'ref layer "%s" not found',u)}else if("background"!==s)if(a.source){var f=e.sources[a.source];f?"vector"==f.type&&"raster"==s?r(o,a.source,'layer "%s" requires a raster source',a.id):"raster"==f.type&&"raster"!=s?r(o,a.source,'layer "%s" requires a vector source',a.id):"vector"!=f.type||a["source-layer"]||r(o,a,'layer "%s" must specify a "source-layer"',a.id):r(o,a.source,'source "%s" not found',a.source)}else r(o,a,'missing required property "source"');n.object(o,a,t.layer,{filter:n.filter,layout:function(e,r){var o=t["layout_"+s];return s&&o&&n(e,r,o)},paint:function(e,r){var o=t["paint_"+s];return s&&o&&n(e,r,o)}})},n.object=function(e,o,a,i){i=i||{};var s=typeof_(o);if("object"!==s)return r(e,o,"object expected, %s found",s);for(var u in o){var c=u.split(".")[0],f=a[c]||a["*"],l=c.match(/^(.*)-transition$/);f?(i[c]||n)((e?e+".":e)+u,o[u],f):l&&a[l[1]]&&a[l[1]].transition?n((e?e+".":e)+u,o[u],t.transition):""!==e&&1!==e.split(".").length&&r(e,o[u],'unknown property "%s"',u)}for(var p in a)a[p].required&&void 0===a[p]["default"]&&void 0===o[p]&&r(e,o,'missing required property "%s"',p)},n.array=function(t,o,a,i){if("array"!==typeof_(o))return r(t,o,"array expected, %s found",typeof_(o));if(a.length&&o.length!==a.length)return r(t,o,"array length %d expected, length %d found",a.length,o.length);if(a["min-length"]&&o.length<a["min-length"])return r(t,o,"array length at least %d expected, length %d found",a["min-length"],o.length);var s={type:a.value};e.version<7&&(s["function"]=a["function"]),"object"===typeof_(a.value)&&(s=a.value);for(var u=0;u<o.length;u++)(i||n)(t+"["+u+"]",o[u],s)},n.filter=function(e,o){var a;if("array"!==typeof_(o))return r(e,o,"array expected, %s found",typeof_(o));if(o.length<1)return r(e,o,"filter array must have at least 1 element");switch(n["enum"](e+"[0]",o[0],t.filter_operator),unbundle(o[0])){case"<":case"<=":case">":case">=":o.length>=2&&"$type"==o[1]&&r(e,o,'"$type" cannot be use with operator "%s"',o[0]);case"==":case"!=":3!=o.length&&r(e,o,'filter array for operator "%s" must have 3 elements',o[0]);case"in":case"!in":o.length>=2&&(a=typeof_(o[1]),"string"!==a?r(e+"[1]",o[1],"string expected, %s found",a):"@"===o[1][0]&&r(e+"[1]",o[1],"filter key cannot be a constant"));for(var i=2;i<o.length;i++)a=typeof_(o[i]),"$type"==o[1]?n["enum"](e+"["+i+"]",o[i],t.geometry_type):"string"===a&&"@"===o[i][0]?r(e+"["+i+"]",o[i],"filter value cannot be a constant"):"string"!==a&&"number"!==a&&"boolean"!==a&&r(e+"["+i+"]",o[i],"string, number, or boolean expected, %s found",a);break;case"any":case"all":case"none":for(i=1;i<o.length;i++)n.filter(e+"["+i+"]",o[i])}},n["function"]=function(e,o,a){n.object(e,o,t["function"],{stops:function(e,t,o){var i=-(1/0);n.array(e,t,o,function(e,t){return"array"!==typeof_(t)?r(e,t,"array expected, %s found",typeof_(t)):2!==t.length?r(e,t,"array length %d expected, length %d found",2,t.length):(n(e+"[0]",t[0],{type:"number"}),n(e+"[1]",t[1],a),void("number"===typeof_(t[0])&&("piecewise-constant"===a["function"]&&t[0]%1!==0&&r(e+"[0]",t[0],"zoom level for piecewise-constant functions must be an integer"),t[0]<=i&&r(e+"[0]",t[0],"array stops must appear in ascending order and have no duplicates"),i=t[0])))}),"array"===typeof_(t)&&0===t.length&&r(e,t,"array must have at least one stop")}})},n["enum"]=function(e,t,n){-1===n.values.indexOf(unbundle(t))&&r(e,t,"expected one of [%s], %s found",n.values.join(", "),t)},n.color=function(e,t){var n=typeof_(t);return"string"!==n?r(e,t,"color expected, %s found",n):null===parseCSSColor(t)?r(e,t,'color expected, "%s" found',t):void 0},n.number=o("number"),n.string=o("string"),n["boolean"]=o("boolean"),n["*"]=function(){},n("",e,t.$root),t.$version>7&&e.constants&&n.constants("constants",e.constants),s.sort(function(e,t){return e.line-t.line}),s};
+	},{"csscolorparser":107,"util":143}],131:[function(require,module,exports){
+	module.exports=require("./v8.json");
+	},{"./v8.json":133}],132:[function(require,module,exports){
+	module.exports=require("./v8.min.json");
+	},{"./v8.min.json":134}],133:[function(require,module,exports){
+	module.exports={"$version":8,"$root":{"version":{"required":true,"type":"enum","values":[8],"doc":"Stylesheet version number. Must be 8.","example":8},"name":{"type":"string","doc":"A human-readable name for the style.","example":"Bright"},"metadata":{"type":"*","doc":"Arbitrary properties useful to track with the stylesheet, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'."},"center":{"type":"array","value":"number","doc":"Default map center in longitude and latitude.  The style center will be used only if the map has not been positioned by other means (e.g. map options or user interaction).","example":[-73.9749,40.7736]},"zoom":{"type":"number","doc":"Default zoom level.  The style zoom will be used only if the map has not been positioned by other means (e.g. map options or user interaction).","example":12.5},"bearing":{"type":"number","default":0,"period":360,"units":"degrees","doc":"Default bearing, in degrees.  The style bearing will be used only if the map has not been positioned by other means (e.g. map options or user interaction).","example":29},"pitch":{"type":"number","default":0,"units":"degrees","doc":"Default pitch, in degrees. Zero is perpendicular to the surface.  The style pitch will be used only if the map has not been positioned by other means (e.g. map options or user interaction).","example":50},"sources":{"required":true,"type":"sources","doc":"Data source specifications.","example":{"mapbox-streets":{"type":"vector","url":"mapbox://mapbox.mapbox-streets-v6"}}},"sprite":{"type":"string","doc":"A base URL for retrieving the sprite image and metadata. The extensions `.png`, `.json` and scale factor `@2x.png` will be automatically appended.","example":"mapbox://sprites/mapbox/bright-v8"},"glyphs":{"type":"string","doc":"A URL template for loading signed-distance-field glyph sets in PBF format. Valid tokens are {fontstack} and {range}.","example":"mapbox://fonts/mapbox/{fontstack}/{range}.pbf"},"transition":{"type":"transition","doc":"A global transition definition to use as a default across properties.","example":{"duration":300,"delay":0}},"layers":{"required":true,"type":"array","value":"layer","doc":"Layers will be drawn in the order of this array.","example":[{"id":"water","source":"mapbox-streets","source-layer":"water","type":"fill","paint":{"fill-color":"#00ffff"}}]}},"sources":{"*":{"type":"source","doc":"Specification of a data source. For vector and raster sources, either TileJSON or a URL to a TileJSON must be provided. For GeoJSON and video sources, a URL must be provided."}},"source":["source_tile","source_geojson","source_video","source_image"],"source_tile":{"type":{"required":true,"type":"enum","values":["vector","raster"],"doc":"The data type of the tile source."},"url":{"type":"string","doc":"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<mapid>`."},"tiles":{"type":"array","value":"string","doc":"An array of one or more tile source URLs, as in the TileJSON spec."},"minzoom":{"type":"number","default":0,"doc":"Minimum zoom level for which tiles are available, as in the TileJSON spec."},"maxzoom":{"type":"number","default":22,"doc":"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels."},"tileSize":{"type":"number","default":512,"units":"pixels","doc":"The minimum visual size to display tiles for this layer. Only configurable for raster layers."},"*":{"type":"*","doc":"Other keys to configure the data source."}},"source_geojson":{"type":{"required":true,"type":"enum","values":["geojson"],"doc":"The data type of the GeoJSON source."},"data":{"type":"*","doc":"A URL to a GeoJSON file, or inline GeoJSON."},"maxzoom":{"type":"number","default":14,"doc":"Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom levels)."},"buffer":{"type":"number","default":64,"doc":"Tile buffer size on each side (higher means fewer rendering artifacts near tile edges but slower performance)."},"tolerance":{"type":"number","default":3,"doc":"Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance)."},"cluster":{"type":"boolean","default":false,"doc":"If the data is a collection of point features, setting this to true clusters the points by radius into groups."},"clusterRadius":{"type":"number","default":400,"doc":"Radius of each cluster when clustering points, relative to 4096 tile."},"clusterMaxZoom":{"type":"number","doc":"Max zoom to cluster points on. Defaults to one zoom less than maxzoom (so that last zoom features are not clustered)."}},"source_video":{"type":{"required":true,"type":"enum","values":["video"],"doc":"The data type of the video source."},"urls":{"required":true,"type":"array","value":"string","doc":"URLs to video content in order of preferred format."},"coordinates":{"required":true,"doc":"Corners of video specified in longitude, latitude pairs.","type":"array","length":4,"value":{"type":"array","length":2,"value":"number","doc":"A single longitude, latitude pair."}}},"source_image":{"type":{"required":true,"type":"enum","values":["image"],"doc":"The data type of the image source."},"url":{"required":true,"type":"string","doc":"URL that points to an image"},"coordinates":{"required":true,"doc":"Corners of image specified in longitude, latitude pairs.","type":"array","length":4,"value":{"type":"array","length":2,"value":"number","doc":"A single longitude, latitude pair."}}},"layer":{"id":{"type":"string","doc":"Unique layer name.","required":true},"type":{"type":"enum","values":["fill","line","symbol","circle","raster","background"],"doc":"Rendering type of this layer."},"metadata":{"type":"*","doc":"Arbitrary properties useful to track with the layer, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'."},"ref":{"type":"string","doc":"References another layer to copy `type`, `source`, `source-layer`, `minzoom`, `maxzoom`, `filter`, and `layout` properties from. This allows the layers to share processing and be more efficient."},"source":{"type":"string","doc":"Name of a source description to be used for this layer."},"source-layer":{"type":"string","doc":"Layer to use from a vector tile source. Required if the source supports multiple layers."},"minzoom":{"type":"number","minimum":0,"maximum":22,"doc":"The minimum zoom level on which the layer gets parsed and appears on."},"maxzoom":{"type":"number","minimum":0,"maximum":22,"doc":"The maximum zoom level on which the layer gets parsed and appears on."},"interactive":{"type":"boolean","doc":"Enable querying of feature data from this layer for interactivity.","default":false},"filter":{"type":"filter","doc":"A expression specifying conditions on source features. Only features that match the filter are displayed."},"layout":{"type":"layout","doc":"Layout properties for the layer."},"paint":{"type":"paint","doc":"Default paint properties for this layer."},"paint.*":{"type":"paint","doc":"Class-specific paint properties for this layer. The class name is the part after the first dot."}},"layout":["layout_fill","layout_line","layout_circle","layout_symbol","layout_raster","layout_background"],"layout_background":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"layout_fill":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"layout_circle":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"layout_line":{"line-cap":{"type":"enum","function":"piecewise-constant","values":["butt","round","square"],"default":"butt","doc":"The display of line endings."},"line-join":{"type":"enum","function":"piecewise-constant","values":["bevel","round","miter"],"default":"miter","doc":"The display of lines when joining."},"line-miter-limit":{"type":"number","default":2,"function":"interpolated","doc":"Used to automatically convert miter joins to bevel joins for sharp angles.","requires":[{"line-join":"miter"}]},"line-round-limit":{"type":"number","default":1.05,"function":"interpolated","doc":"Used to automatically convert round joins to miter joins for shallow angles.","requires":[{"line-join":"round"}]},"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"layout_symbol":{"symbol-placement":{"type":"enum","function":"piecewise-constant","values":["point","line"],"default":"point","doc":"Label placement relative to its geometry. `line` can only be used on LineStrings and Polygons."},"symbol-spacing":{"type":"number","default":250,"minimum":1,"function":"interpolated","units":"pixels","doc":"Distance between two symbol anchors.","requires":[{"symbol-placement":"line"}]},"symbol-avoid-edges":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer."},"icon-allow-overlap":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, the icon will be visible even if it collides with other previously drawn symbols.","requires":["icon-image"]},"icon-ignore-placement":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, other symbols can be visible even if they collide with the icon.","requires":["icon-image"]},"icon-optional":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not.","requires":["icon-image","text-field"]},"icon-rotation-alignment":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"viewport","doc":"Orientation of icon when map is rotated.","requires":["icon-image"]},"icon-size":{"type":"number","default":1,"minimum":0,"function":"interpolated","doc":"Scale factor for icon. 1 is original size, 3 triples the size.","requires":["icon-image"]},"icon-image":{"type":"string","function":"piecewise-constant","doc":"A string with {tokens} replaced, referencing the data property to pull from.","tokens":true},"icon-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","units":"degrees","doc":"Rotates the icon clockwise.","requires":["icon-image"]},"icon-padding":{"type":"number","default":2,"minimum":0,"function":"interpolated","units":"pixels","doc":"Size of the additional area around the icon bounding box used for detecting symbol collisions.","requires":["icon-image"]},"icon-keep-upright":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, the icon may be flipped to prevent it from being rendered upside-down.","requires":["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":"line"}]},"icon-offset":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","doc":"Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up.","requires":["icon-image"]},"text-rotation-alignment":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"viewport","doc":"Orientation of text when map is rotated.","requires":["text-field"]},"text-field":{"type":"string","function":"piecewise-constant","default":"","tokens":true,"doc":"Value to use for a text label. Feature properties are specified using tokens like {field_name}."},"text-font":{"type":"array","value":"string","function":"piecewise-constant","default":["Open Sans Regular","Arial Unicode MS Regular"],"doc":"Font stack to use for displaying text.","requires":["text-field"]},"text-size":{"type":"number","default":16,"minimum":0,"units":"pixels","function":"interpolated","doc":"Font size.","requires":["text-field"]},"text-max-width":{"type":"number","default":10,"minimum":0,"units":"em","function":"interpolated","doc":"The maximum line width for text wrapping.","requires":["text-field"]},"text-line-height":{"type":"number","default":1.2,"units":"em","function":"interpolated","doc":"Text leading value for multi-line text.","requires":["text-field"]},"text-letter-spacing":{"type":"number","default":0,"units":"em","function":"interpolated","doc":"Text tracking amount.","requires":["text-field"]},"text-justify":{"type":"enum","function":"piecewise-constant","values":["left","center","right"],"default":"center","doc":"Text justification options.","requires":["text-field"]},"text-anchor":{"type":"enum","function":"piecewise-constant","values":["center","left","right","top","bottom","top-left","top-right","bottom-left","bottom-right"],"default":"center","doc":"Part of the text placed closest to the anchor.","requires":["text-field"]},"text-max-angle":{"type":"number","default":45,"units":"degrees","function":"interpolated","doc":"Maximum angle change between adjacent characters.","requires":["text-field",{"symbol-placement":"line"}]},"text-rotate":{"type":"number","default":0,"period":360,"units":"degrees","function":"interpolated","doc":"Rotates the text clockwise.","requires":["text-field"]},"text-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","function":"interpolated","doc":"Size of the additional area around the text bounding box used for detecting symbol collisions.","requires":["text-field"]},"text-keep-upright":{"type":"boolean","function":"piecewise-constant","default":true,"doc":"If true, the text may be flipped vertically to prevent it from being rendered upside-down.","requires":["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":"line"}]},"text-transform":{"type":"enum","function":"piecewise-constant","values":["none","uppercase","lowercase"],"default":"none","doc":"Specifies how to capitalize text, similar to the CSS `text-transform` property.","requires":["text-field"]},"text-offset":{"type":"array","doc":"Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up.","value":"number","units":"ems","function":"interpolated","length":2,"default":[0,0],"requires":["text-field"]},"text-allow-overlap":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, the text will be visible even if it collides with other previously drawn symbols.","requires":["text-field"]},"text-ignore-placement":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, other symbols can be visible even if they collide with the text.","requires":["text-field"]},"text-optional":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not.","requires":["text-field","icon-image"]},"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"layout_raster":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"filter":{"type":"array","value":"*","doc":"A filter selects specific features from a layer."},"filter_operator":{"type":"enum","values":["==","!=",">",">=","<","<=","in","!in","all","any","none"],"doc":"The filter operator."},"geometry_type":{"type":"enum","values":["Point","LineString","Polygon"],"doc":"The geometry type for the filter to select."},"color_operation":{"type":"enum","values":["lighten","saturate","spin","fade","mix"],"doc":"A color operation to apply."},"function":{"stops":{"type":"array","required":true,"doc":"An array of stops.","value":"function_stop"},"base":{"type":"number","default":1,"minimum":0,"doc":"The exponential base of the interpolation curve. It controls the rate at which the result increases. Higher values make the result increase more towards the high end of the range. With `1` the stops are interpolated linearly."}},"function_stop":{"type":"array","minimum":0,"maximum":22,"value":["number","color"],"length":2,"doc":"Zoom level and value pair."},"paint":["paint_fill","paint_line","paint_circle","paint_symbol","paint_raster","paint_background"],"paint_fill":{"fill-antialias":{"type":"boolean","function":"piecewise-constant","default":true,"doc":"Whether or not the fill should be antialiased."},"fill-opacity":{"type":"number","function":"interpolated","default":1,"minimum":0,"maximum":1,"doc":"The opacity given to the fill color.","transition":true},"fill-color":{"type":"color","default":"#000000","doc":"The color of the fill.","function":"interpolated","transition":true,"requires":[{"!":"fill-pattern"}]},"fill-outline-color":{"type":"color","doc":"The outline color of the fill. Matches the value of `fill-color` if unspecified.","function":"interpolated","transition":true,"requires":[{"!":"fill-pattern"},{"fill-antialias":true}]},"fill-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","doc":"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively."},"fill-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"doc":"Control whether the translation is relative to the map (north) or viewport (screen)","default":"map","requires":["fill-translate"]},"fill-pattern":{"type":"string","function":"piecewise-constant","transition":true,"doc":"Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512)."}},"paint_line":{"line-opacity":{"type":"number","doc":"The opacity at which the line will be drawn.","function":"interpolated","default":1,"minimum":0,"maximum":1,"transition":true},"line-color":{"type":"color","doc":"The color with which the line will be drawn.","default":"#000000","function":"interpolated","transition":true,"requires":[{"!":"line-pattern"}]},"line-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","doc":"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively."},"line-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"doc":"Control whether the translation is relative to the map (north) or viewport (screen)","default":"map","requires":["line-translate"]},"line-width":{"type":"number","default":1,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Stroke thickness."},"line-gap-width":{"type":"number","default":0,"minimum":0,"doc":"Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap.","function":"interpolated","transition":true,"units":"pixels"},"line-offset":{"type":"number","default":0,"doc":"The line's offset perpendicular to its direction. Values may be positive or negative, where positive indicates \"rightwards\" (if you were moving in the direction of the line) and negative indicates \"leftwards.\"","function":"interpolated","transition":true,"units":"pixels"},"line-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Blur applied to the line, in pixels."},"line-dasharray":{"type":"array","value":"number","function":"piecewise-constant","doc":"Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width.","minimum":0,"transition":true,"units":"line widths","requires":[{"!":"line-pattern"}]},"line-pattern":{"type":"string","function":"piecewise-constant","transition":true,"doc":"Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512)."}},"paint_circle":{"circle-radius":{"type":"number","default":5,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Circle radius."},"circle-color":{"type":"color","default":"#000000","doc":"The color of the circle.","function":"interpolated","transition":true},"circle-blur":{"type":"number","default":0,"doc":"Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity.","function":"interpolated","transition":true},"circle-opacity":{"type":"number","doc":"The opacity at which the circle will be drawn.","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true},"circle-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","doc":"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively."},"circle-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"doc":"Control whether the translation is relative to the map (north) or viewport (screen)","default":"map","requires":["circle-translate"]}},"paint_symbol":{"icon-opacity":{"doc":"The opacity at which the icon will be drawn.","type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true,"requires":["icon-image"]},"icon-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"doc":"The color of the icon. This can only be used with sdf icons.","requires":["icon-image"]},"icon-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","transition":true,"doc":"The color of the icon's halo. Icon halos can only be used with sdf icons.","requires":["icon-image"]},"icon-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Distance of halo to the icon outline.","requires":["icon-image"]},"icon-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Fade out the halo towards the outside.","requires":["icon-image"]},"icon-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","doc":"Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.","requires":["icon-image"]},"icon-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"doc":"Control whether the translation is relative to the map (north) or viewport (screen).","default":"map","requires":["icon-image","icon-translate"]},"text-opacity":{"type":"number","doc":"The opacity at which the text will be drawn.","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true,"requires":["text-field"]},"text-color":{"type":"color","doc":"The color with which the text will be drawn.","default":"#000000","function":"interpolated","transition":true,"requires":["text-field"]},"text-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","transition":true,"doc":"The color of the text's halo, which helps it stand out from backgrounds.","requires":["text-field"]},"text-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Distance of halo to the font outline. Max text halo width is 1/4 of the font-size.","requires":["text-field"]},"text-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"The halo's fadeout distance towards the outside.","requires":["text-field"]},"text-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","doc":"Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.","requires":["text-field"]},"text-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"doc":"Control whether the translation is relative to the map (north) or viewport (screen).","default":"map","requires":["text-field","text-translate"]}},"paint_raster":{"raster-opacity":{"type":"number","doc":"The opacity at which the image will be drawn.","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true},"raster-hue-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","transition":true,"units":"degrees","doc":"Rotates hues around the color wheel."},"raster-brightness-min":{"type":"number","function":"interpolated","doc":"Increase or reduce the brightness of the image. The value is the minimum brightness.","default":0,"minimum":0,"maximum":1,"transition":true},"raster-brightness-max":{"type":"number","function":"interpolated","doc":"Increase or reduce the brightness of the image. The value is the maximum brightness.","default":1,"minimum":0,"maximum":1,"transition":true},"raster-saturation":{"type":"number","doc":"Increase or reduce the saturation of the image.","default":0,"minimum":-1,"maximum":1,"function":"interpolated","transition":true},"raster-contrast":{"type":"number","doc":"Increase or reduce the contrast of the image.","default":0,"minimum":-1,"maximum":1,"function":"interpolated","transition":true},"raster-fade-duration":{"type":"number","default":300,"minimum":0,"function":"interpolated","transition":true,"units":"milliseconds","doc":"Fade duration when a new tile is added."}},"paint_background":{"background-color":{"type":"color","default":"#000000","doc":"The color with which the background will be drawn.","function":"interpolated","transition":true,"requires":[{"!":"background-pattern"}]},"background-pattern":{"type":"string","function":"piecewise-constant","transition":true,"doc":"Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512)."},"background-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"doc":"The opacity at which the background will be drawn.","function":"interpolated","transition":true}},"transition":{"duration":{"type":"number","default":300,"minimum":0,"units":"milliseconds","doc":"Time allotted for transitions to complete."},"delay":{"type":"number","default":0,"minimum":0,"units":"milliseconds","doc":"Length of time before a transition begins."}}}
+	},{}],134:[function(require,module,exports){
+	module.exports={"$version":8,"$root":{"version":{"required":true,"type":"enum","values":[8]},"name":{"type":"string"},"metadata":{"type":"*"},"center":{"type":"array","value":"number"},"zoom":{"type":"number"},"bearing":{"type":"number","default":0,"period":360,"units":"degrees"},"pitch":{"type":"number","default":0,"units":"degrees"},"sources":{"required":true,"type":"sources"},"sprite":{"type":"string"},"glyphs":{"type":"string"},"transition":{"type":"transition"},"layers":{"required":true,"type":"array","value":"layer"}},"sources":{"*":{"type":"source"}},"source":["source_tile","source_geojson","source_video","source_image"],"source_tile":{"type":{"required":true,"type":"enum","values":["vector","raster"]},"url":{"type":"string"},"tiles":{"type":"array","value":"string"},"minzoom":{"type":"number","default":0},"maxzoom":{"type":"number","default":22},"tileSize":{"type":"number","default":512,"units":"pixels"},"*":{"type":"*"}},"source_geojson":{"type":{"required":true,"type":"enum","values":["geojson"]},"data":{"type":"*"},"maxzoom":{"type":"number","default":14},"buffer":{"type":"number","default":64},"tolerance":{"type":"number","default":3},"cluster":{"type":"boolean","default":false},"clusterRadius":{"type":"number","default":400},"clusterMaxZoom":{"type":"number"}},"source_video":{"type":{"required":true,"type":"enum","values":["video"]},"urls":{"required":true,"type":"array","value":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"source_image":{"type":{"required":true,"type":"enum","values":["image"]},"url":{"required":true,"type":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"layer":{"id":{"type":"string","required":true},"type":{"type":"enum","values":["fill","line","symbol","circle","raster","background"]},"metadata":{"type":"*"},"ref":{"type":"string"},"source":{"type":"string"},"source-layer":{"type":"string"},"minzoom":{"type":"number","minimum":0,"maximum":22},"maxzoom":{"type":"number","minimum":0,"maximum":22},"interactive":{"type":"boolean","default":false},"filter":{"type":"filter"},"layout":{"type":"layout"},"paint":{"type":"paint"},"paint.*":{"type":"paint"}},"layout":["layout_fill","layout_line","layout_circle","layout_symbol","layout_raster","layout_background"],"layout_background":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"layout_fill":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"layout_circle":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"layout_line":{"line-cap":{"type":"enum","function":"piecewise-constant","values":["butt","round","square"],"default":"butt"},"line-join":{"type":"enum","function":"piecewise-constant","values":["bevel","round","miter"],"default":"miter"},"line-miter-limit":{"type":"number","default":2,"function":"interpolated","requires":[{"line-join":"miter"}]},"line-round-limit":{"type":"number","default":1.05,"function":"interpolated","requires":[{"line-join":"round"}]},"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"layout_symbol":{"symbol-placement":{"type":"enum","function":"piecewise-constant","values":["point","line"],"default":"point"},"symbol-spacing":{"type":"number","default":250,"minimum":1,"function":"interpolated","units":"pixels","requires":[{"symbol-placement":"line"}]},"symbol-avoid-edges":{"type":"boolean","function":"piecewise-constant","default":false},"icon-allow-overlap":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["icon-image"]},"icon-ignore-placement":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["icon-image"]},"icon-optional":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["icon-image","text-field"]},"icon-rotation-alignment":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"viewport","requires":["icon-image"]},"icon-size":{"type":"number","default":1,"minimum":0,"function":"interpolated","requires":["icon-image"]},"icon-image":{"type":"string","function":"piecewise-constant","tokens":true},"icon-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","units":"degrees","requires":["icon-image"]},"icon-padding":{"type":"number","default":2,"minimum":0,"function":"interpolated","units":"pixels","requires":["icon-image"]},"icon-keep-upright":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":"line"}]},"icon-offset":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","requires":["icon-image"]},"text-rotation-alignment":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"viewport","requires":["text-field"]},"text-field":{"type":"string","function":"piecewise-constant","default":"","tokens":true},"text-font":{"type":"array","value":"string","function":"piecewise-constant","default":["Open Sans Regular","Arial Unicode MS Regular"],"requires":["text-field"]},"text-size":{"type":"number","default":16,"minimum":0,"units":"pixels","function":"interpolated","requires":["text-field"]},"text-max-width":{"type":"number","default":10,"minimum":0,"units":"em","function":"interpolated","requires":["text-field"]},"text-line-height":{"type":"number","default":1.2,"units":"em","function":"interpolated","requires":["text-field"]},"text-letter-spacing":{"type":"number","default":0,"units":"em","function":"interpolated","requires":["text-field"]},"text-justify":{"type":"enum","function":"piecewise-constant","values":["left","center","right"],"default":"center","requires":["text-field"]},"text-anchor":{"type":"enum","function":"piecewise-constant","values":["center","left","right","top","bottom","top-left","top-right","bottom-left","bottom-right"],"default":"center","requires":["text-field"]},"text-max-angle":{"type":"number","default":45,"units":"degrees","function":"interpolated","requires":["text-field",{"symbol-placement":"line"}]},"text-rotate":{"type":"number","default":0,"period":360,"units":"degrees","function":"interpolated","requires":["text-field"]},"text-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","function":"interpolated","requires":["text-field"]},"text-keep-upright":{"type":"boolean","function":"piecewise-constant","default":true,"requires":["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":"line"}]},"text-transform":{"type":"enum","function":"piecewise-constant","values":["none","uppercase","lowercase"],"default":"none","requires":["text-field"]},"text-offset":{"type":"array","value":"number","units":"ems","function":"interpolated","length":2,"default":[0,0],"requires":["text-field"]},"text-allow-overlap":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["text-field"]},"text-ignore-placement":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["text-field"]},"text-optional":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["text-field","icon-image"]},"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"layout_raster":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"filter":{"type":"array","value":"*"},"filter_operator":{"type":"enum","values":["==","!=",">",">=","<","<=","in","!in","all","any","none"]},"geometry_type":{"type":"enum","values":["Point","LineString","Polygon"]},"color_operation":{"type":"enum","values":["lighten","saturate","spin","fade","mix"]},"function":{"stops":{"type":"array","required":true,"value":"function_stop"},"base":{"type":"number","default":1,"minimum":0}},"function_stop":{"type":"array","minimum":0,"maximum":22,"value":["number","color"],"length":2},"paint":["paint_fill","paint_line","paint_circle","paint_symbol","paint_raster","paint_background"],"paint_fill":{"fill-antialias":{"type":"boolean","function":"piecewise-constant","default":true},"fill-opacity":{"type":"number","function":"interpolated","default":1,"minimum":0,"maximum":1,"transition":true},"fill-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"requires":[{"!":"fill-pattern"}]},"fill-outline-color":{"type":"color","function":"interpolated","transition":true,"requires":[{"!":"fill-pattern"},{"fill-antialias":true}]},"fill-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels"},"fill-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"map","requires":["fill-translate"]},"fill-pattern":{"type":"string","function":"piecewise-constant","transition":true}},"paint_line":{"line-opacity":{"type":"number","function":"interpolated","default":1,"minimum":0,"maximum":1,"transition":true},"line-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"requires":[{"!":"line-pattern"}]},"line-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels"},"line-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"map","requires":["line-translate"]},"line-width":{"type":"number","default":1,"minimum":0,"function":"interpolated","transition":true,"units":"pixels"},"line-gap-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels"},"line-offset":{"type":"number","default":0,"function":"interpolated","transition":true,"units":"pixels"},"line-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels"},"line-dasharray":{"type":"array","value":"number","function":"piecewise-constant","minimum":0,"transition":true,"units":"line widths","requires":[{"!":"line-pattern"}]},"line-pattern":{"type":"string","function":"piecewise-constant","transition":true}},"paint_circle":{"circle-radius":{"type":"number","default":5,"minimum":0,"function":"interpolated","transition":true,"units":"pixels"},"circle-color":{"type":"color","default":"#000000","function":"interpolated","transition":true},"circle-blur":{"type":"number","default":0,"function":"interpolated","transition":true},"circle-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true},"circle-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels"},"circle-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"map","requires":["circle-translate"]}},"paint_symbol":{"icon-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true,"requires":["icon-image"]},"icon-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"requires":["icon-image"]},"icon-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","transition":true,"requires":["icon-image"]},"icon-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","requires":["icon-image"]},"icon-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"map","requires":["icon-image","icon-translate"]},"text-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true,"requires":["text-field"]},"text-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"requires":["text-field"]},"text-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","transition":true,"requires":["text-field"]},"text-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","requires":["text-field"]},"text-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","requires":["text-field"]},"text-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","requires":["text-field"]},"text-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"map","requires":["text-field","text-translate"]}},"paint_raster":{"raster-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true},"raster-hue-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","transition":true,"units":"degrees"},"raster-brightness-min":{"type":"number","function":"interpolated","default":0,"minimum":0,"maximum":1,"transition":true},"raster-brightness-max":{"type":"number","function":"interpolated","default":1,"minimum":0,"maximum":1,"transition":true},"raster-saturation":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","transition":true},"raster-contrast":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","transition":true},"raster-fade-duration":{"type":"number","default":300,"minimum":0,"function":"interpolated","transition":true,"units":"milliseconds"}},"paint_background":{"background-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"requires":[{"!":"background-pattern"}]},"background-pattern":{"type":"string","function":"piecewise-constant","transition":true},"background-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true}},"transition":{"duration":{"type":"number","default":300,"minimum":0,"units":"milliseconds"},"delay":{"type":"number","default":0,"minimum":0,"units":"milliseconds"}}}
+	},{}],135:[function(require,module,exports){
+	"use strict";function Buffer(t){var e;t&&t.length&&(e=t,t=e.length);var r=new Uint8Array(t||0);return e&&r.set(e),r.readUInt32LE=BufferMethods.readUInt32LE,r.writeUInt32LE=BufferMethods.writeUInt32LE,r.readInt32LE=BufferMethods.readInt32LE,r.writeInt32LE=BufferMethods.writeInt32LE,r.readFloatLE=BufferMethods.readFloatLE,r.writeFloatLE=BufferMethods.writeFloatLE,r.readDoubleLE=BufferMethods.readDoubleLE,r.writeDoubleLE=BufferMethods.writeDoubleLE,r.toString=BufferMethods.toString,r.write=BufferMethods.write,r.slice=BufferMethods.slice,r.copy=BufferMethods.copy,r._isBuffer=!0,r}function encodeString(t){for(var e,r,n=t.length,i=[],o=0;n>o;o++){if(e=t.charCodeAt(o),e>55295&&57344>e){if(!r){e>56319||o+1===n?i.push(239,191,189):r=e;continue}if(56320>e){i.push(239,191,189),r=e;continue}e=r-55296<<10|e-56320|65536,r=null}else r&&(i.push(239,191,189),r=null);128>e?i.push(e):2048>e?i.push(e>>6|192,63&e|128):65536>e?i.push(e>>12|224,e>>6&63|128,63&e|128):i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}return i}module.exports=Buffer;var ieee754=require("ieee754"),BufferMethods,lastStr,lastStrEncoded;BufferMethods={readUInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},writeUInt32LE:function(t,e){this[e]=t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24},readInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+(this[t+3]<<24)},readFloatLE:function(t){return ieee754.read(this,t,!0,23,4)},readDoubleLE:function(t){return ieee754.read(this,t,!0,52,8)},writeFloatLE:function(t,e){return ieee754.write(this,t,e,!0,23,4)},writeDoubleLE:function(t,e){return ieee754.write(this,t,e,!0,52,8)},toString:function(t,e,r){var n="",i="";e=e||0,r=Math.min(this.length,r||this.length);for(var o=e;r>o;o++){var u=this[o];127>=u?(n+=decodeURIComponent(i)+String.fromCharCode(u),i=""):i+="%"+u.toString(16)}return n+=decodeURIComponent(i)},write:function(t,e){for(var r=t===lastStr?lastStrEncoded:encodeString(t),n=0;n<r.length;n++)this[e+n]=r[n]},slice:function(t,e){return this.subarray(t,e)},copy:function(t,e){e=e||0;for(var r=0;r<this.length;r++)t[e+r]=this[r]}},BufferMethods.writeInt32LE=BufferMethods.writeUInt32LE,Buffer.byteLength=function(t){return lastStr=t,lastStrEncoded=encodeString(t),lastStrEncoded.length},Buffer.isBuffer=function(t){return!(!t||!t._isBuffer)};
+	},{"ieee754":126}],136:[function(require,module,exports){
+	(function (global){
+	"use strict";function Pbf(t){this.buf=Buffer.isBuffer(t)?t:new Buffer(t||0),this.pos=0,this.length=this.buf.length}function writePackedVarint(t,i){for(var e=0;e<t.length;e++)i.writeVarint(t[e])}function writePackedSVarint(t,i){for(var e=0;e<t.length;e++)i.writeSVarint(t[e])}function writePackedFloat(t,i){for(var e=0;e<t.length;e++)i.writeFloat(t[e])}function writePackedDouble(t,i){for(var e=0;e<t.length;e++)i.writeDouble(t[e])}function writePackedBoolean(t,i){for(var e=0;e<t.length;e++)i.writeBoolean(t[e])}function writePackedFixed32(t,i){for(var e=0;e<t.length;e++)i.writeFixed32(t[e])}function writePackedSFixed32(t,i){for(var e=0;e<t.length;e++)i.writeSFixed32(t[e])}function writePackedFixed64(t,i){for(var e=0;e<t.length;e++)i.writeFixed64(t[e])}function writePackedSFixed64(t,i){for(var e=0;e<t.length;e++)i.writeSFixed64(t[e])}module.exports=Pbf;var Buffer=global.Buffer||require("./buffer");Pbf.Varint=0,Pbf.Fixed64=1,Pbf.Bytes=2,Pbf.Fixed32=5;var SHIFT_LEFT_32=4294967296,SHIFT_RIGHT_32=1/SHIFT_LEFT_32,POW_2_63=Math.pow(2,63);Pbf.prototype={destroy:function(){this.buf=null},readFields:function(t,i,e){for(e=e||this.length;this.pos<e;){var r=this.readVarint(),s=r>>3,n=this.pos;t(s,i,this),this.pos===n&&this.skip(r)}return i},readMessage:function(t,i){return this.readFields(t,i,this.readVarint()+this.pos)},readFixed32:function(){var t=this.buf.readUInt32LE(this.pos);return this.pos+=4,t},readSFixed32:function(){var t=this.buf.readInt32LE(this.pos);return this.pos+=4,t},readFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+this.buf.readUInt32LE(this.pos+4)*SHIFT_LEFT_32;return this.pos+=8,t},readSFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+this.buf.readInt32LE(this.pos+4)*SHIFT_LEFT_32;return this.pos+=8,t},readFloat:function(){var t=this.buf.readFloatLE(this.pos);return this.pos+=4,t},readDouble:function(){var t=this.buf.readDoubleLE(this.pos);return this.pos+=8,t},readVarint:function(){var t,i,e,r,s,n,o=this.buf;if(e=o[this.pos++],128>e)return e;if(e=127&e,r=o[this.pos++],128>r)return e|r<<7;if(r=(127&r)<<7,s=o[this.pos++],128>s)return e|r|s<<14;if(s=(127&s)<<14,n=o[this.pos++],128>n)return e|r|s|n<<21;if(t=e|r|s|(127&n)<<21,i=o[this.pos++],t+=268435456*(127&i),128>i)return t;if(i=o[this.pos++],t+=34359738368*(127&i),128>i)return t;if(i=o[this.pos++],t+=4398046511104*(127&i),128>i)return t;if(i=o[this.pos++],t+=562949953421312*(127&i),128>i)return t;if(i=o[this.pos++],t+=72057594037927940*(127&i),128>i)return t;if(i=o[this.pos++],t+=0x8000000000000000*(127&i),128>i)return t;throw new Error("Expected varint not more than 10 bytes")},readVarint64:function(){var t=this.pos,i=this.readVarint();if(POW_2_63>i)return i;for(var e=this.pos-2;255===this.buf[e];)e--;t>e&&(e=t),i=0;for(var r=0;e-t+1>r;r++){var s=127&~this.buf[t+r];i+=4>r?s<<7*r:s*Math.pow(2,7*r)}return-i-1},readSVarint:function(){var t=this.readVarint();return t%2===1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,i=this.buf.toString("utf8",this.pos,t);return this.pos=t,i},readBytes:function(){var t=this.readVarint()+this.pos,i=this.buf.slice(this.pos,t);return this.pos=t,i},readPackedVarint:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readVarint());return i},readPackedSVarint:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readSVarint());return i},readPackedBoolean:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readBoolean());return i},readPackedFloat:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readFloat());return i},readPackedDouble:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readDouble());return i},readPackedFixed32:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readFixed32());return i},readPackedSFixed32:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readSFixed32());return i},readPackedFixed64:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readFixed64());return i},readPackedSFixed64:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readSFixed64());return i},skip:function(t){var i=7&t;if(i===Pbf.Varint)for(;this.buf[this.pos++]>127;);else if(i===Pbf.Bytes)this.pos=this.readVarint()+this.pos;else if(i===Pbf.Fixed32)this.pos+=4;else{if(i!==Pbf.Fixed64)throw new Error("Unimplemented type: "+i);this.pos+=8}},writeTag:function(t,i){this.writeVarint(t<<3|i)},realloc:function(t){for(var i=this.length||16;i<this.pos+t;)i*=2;if(i!==this.length){var e=new Buffer(i);this.buf.copy(e),this.buf=e,this.length=i}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.slice(0,this.length)},writeFixed32:function(t){this.realloc(4),this.buf.writeUInt32LE(t,this.pos),this.pos+=4},writeSFixed32:function(t){this.realloc(4),this.buf.writeInt32LE(t,this.pos),this.pos+=4},writeFixed64:function(t){this.realloc(8),this.buf.writeInt32LE(-1&t,this.pos),this.buf.writeUInt32LE(Math.floor(t*SHIFT_RIGHT_32),this.pos+4),this.pos+=8},writeSFixed64:function(t){this.realloc(8),this.buf.writeInt32LE(-1&t,this.pos),this.buf.writeInt32LE(Math.floor(t*SHIFT_RIGHT_32),this.pos+4),this.pos+=8},writeVarint:function(t){if(t=+t,127>=t)this.realloc(1),this.buf[this.pos++]=t;else if(16383>=t)this.realloc(2),this.buf[this.pos++]=t>>>0&127|128,this.buf[this.pos++]=t>>>7&127;else if(2097151>=t)this.realloc(3),this.buf[this.pos++]=t>>>0&127|128,this.buf[this.pos++]=t>>>7&127|128,this.buf[this.pos++]=t>>>14&127;else if(268435455>=t)this.realloc(4),this.buf[this.pos++]=t>>>0&127|128,this.buf[this.pos++]=t>>>7&127|128,this.buf[this.pos++]=t>>>14&127|128,this.buf[this.pos++]=t>>>21&127;else{for(var i=this.pos;t>=128;)this.realloc(1),this.buf[this.pos++]=255&t|128,t/=128;if(this.realloc(1),this.buf[this.pos++]=0|t,this.pos-i>10)throw new Error("Given varint doesn't fit into 10 bytes")}},writeSVarint:function(t){this.writeVarint(0>t?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t);var i=Buffer.byteLength(t);this.writeVarint(i),this.realloc(i),this.buf.write(t,this.pos),this.pos+=i},writeFloat:function(t){this.realloc(4),this.buf.writeFloatLE(t,this.pos),this.pos+=4},writeDouble:function(t){this.realloc(8),this.buf.writeDoubleLE(t,this.pos),this.pos+=8},writeBytes:function(t){var i=t.length;this.writeVarint(i),this.realloc(i);for(var e=0;i>e;e++)this.buf[this.pos++]=t[e]},writeRawMessage:function(t,i){this.pos++;var e=this.pos;t(i,this);var r=this.pos-e,s=127>=r?1:16383>=r?2:2097151>=r?3:268435455>=r?4:Math.ceil(Math.log(r)/(7*Math.LN2));if(s>1){this.realloc(s-1);for(var n=this.pos-1;n>=e;n--)this.buf[n+s-1]=this.buf[n]}this.pos=e-1,this.writeVarint(r),this.pos+=r},writeMessage:function(t,i,e){this.writeTag(t,Pbf.Bytes),this.writeRawMessage(i,e)},writePackedVarint:function(t,i){this.writeMessage(t,writePackedVarint,i)},writePackedSVarint:function(t,i){this.writeMessage(t,writePackedSVarint,i)},writePackedBoolean:function(t,i){this.writeMessage(t,writePackedBoolean,i)},writePackedFloat:function(t,i){this.writeMessage(t,writePackedFloat,i)},writePackedDouble:function(t,i){this.writeMessage(t,writePackedDouble,i)},writePackedFixed32:function(t,i){this.writeMessage(t,writePackedFixed32,i)},writePackedSFixed32:function(t,i){this.writeMessage(t,writePackedSFixed32,i)},writePackedFixed64:function(t,i){this.writeMessage(t,writePackedFixed64,i)},writePackedSFixed64:function(t,i){this.writeMessage(t,writePackedSFixed64,i)},writeBytesField:function(t,i){this.writeTag(t,Pbf.Bytes),this.writeBytes(i)},writeFixed32Field:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeFixed32(i)},writeSFixed32Field:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeSFixed32(i)},writeFixed64Field:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeFixed64(i)},writeSFixed64Field:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeSFixed64(i)},writeVarintField:function(t,i){this.writeTag(t,Pbf.Varint),this.writeVarint(i)},writeSVarintField:function(t,i){this.writeTag(t,Pbf.Varint),this.writeSVarint(i)},writeStringField:function(t,i){this.writeTag(t,Pbf.Bytes),this.writeString(i)},writeFloatField:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeFloat(i)},writeDoubleField:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeDouble(i)},writeBooleanField:function(t,i){this.writeVarintField(t,Boolean(i))}};
+	}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+
+	},{"./buffer":135}],137:[function(require,module,exports){
+	"use strict";function Point(t,n){this.x=t,this.y=n}module.exports=Point,Point.prototype={clone:function(){return new Point(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var n=t.x-this.x,i=t.y-this.y;return n*n+i*i},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,n){return Math.atan2(this.x*n-this.y*t,this.x*t+this.y*n)},_matMult:function(t){var n=t[0]*this.x+t[1]*this.y,i=t[2]*this.x+t[3]*this.y;return this.x=n,this.y=i,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var n=Math.cos(t),i=Math.sin(t),s=n*this.x-i*this.y,r=i*this.x+n*this.y;return this.x=s,this.y=r,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},Point.convert=function(t){return t instanceof Point?t:Array.isArray(t)?new Point(t[0],t[1]):t};
+	},{}],138:[function(require,module,exports){
+	function cleanUpNextTick(){draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue()}function drainQueue(){if(!draining){var e=setTimeout(cleanUpNextTick);draining=!0;for(var n=queue.length;n;){for(currentQueue=queue,queue=[];++queueIndex<n;)currentQueue&&currentQueue[queueIndex].run();queueIndex=-1,n=queue.length}currentQueue=null,draining=!1,clearTimeout(e)}}function Item(e,n){this.fun=e,this.array=n}function noop(){}var process=module.exports={},queue=[],draining=!1,currentQueue,queueIndex=-1;process.nextTick=function(e){var n=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)n[r-1]=arguments[r];queue.push(new Item(e,n)),1!==queue.length||draining||setTimeout(drainQueue,0)},Item.prototype.run=function(){this.fun.apply(null,this.array)},process.title="browser",process.browser=!0,process.env={},process.argv=[],process.version="",process.versions={},process.on=noop,process.addListener=noop,process.once=noop,process.off=noop,process.removeListener=noop,process.removeAllListeners=noop,process.emit=noop,process.binding=function(e){throw new Error("process.binding is not supported")},process.cwd=function(){return"/"},process.chdir=function(e){throw new Error("process.chdir is not supported")},process.umask=function(){return 0};
+	},{}],139:[function(require,module,exports){
+	!function(){"use strict";function t(i,n){return this instanceof t?(this._maxEntries=Math.max(4,i||9),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),n&&this._initFormat(n),void this.clear()):new t(i,n)}function i(t,i){t.bbox=n(t,0,t.children.length,i)}function n(t,i,n,r){for(var o,a=e(),s=i;n>s;s++)o=t.children[s],h(a,t.leaf?r(o):o.bbox);return a}function e(){return[1/0,1/0,-(1/0),-(1/0)]}function h(t,i){return t[0]=Math.min(t[0],i[0]),t[1]=Math.min(t[1],i[1]),t[2]=Math.max(t[2],i[2]),t[3]=Math.max(t[3],i[3]),t}function r(t,i){return t.bbox[0]-i.bbox[0]}function o(t,i){return t.bbox[1]-i.bbox[1]}function a(t){return(t[2]-t[0])*(t[3]-t[1])}function s(t){return t[2]-t[0]+(t[3]-t[1])}function l(t,i){return(Math.max(i[2],t[2])-Math.min(i[0],t[0]))*(Math.max(i[3],t[3])-Math.min(i[1],t[1]))}function u(t,i){var n=Math.max(t[0],i[0]),e=Math.max(t[1],i[1]),h=Math.min(t[2],i[2]),r=Math.min(t[3],i[3]);return Math.max(0,h-n)*Math.max(0,r-e)}function f(t,i){return t[0]<=i[0]&&t[1]<=i[1]&&i[2]<=t[2]&&i[3]<=t[3]}function c(t,i){return i[0]<=t[2]&&i[1]<=t[3]&&i[2]>=t[0]&&i[3]>=t[1]}function d(t,i,n,e,h){for(var r,o=[i,n];o.length;)n=o.pop(),i=o.pop(),e>=n-i||(r=i+Math.ceil((n-i)/e/2)*e,x(t,i,n,r,h),o.push(i,r,r,n))}function x(t,i,n,e,h){for(var r,o,a,s,l,u,f,c,d;n>i;){for(n-i>600&&(r=n-i+1,o=e-i+1,a=Math.log(r),s=.5*Math.exp(2*a/3),l=.5*Math.sqrt(a*s*(r-s)/r)*(0>o-r/2?-1:1),u=Math.max(i,Math.floor(e-o*s/r+l)),f=Math.min(n,Math.floor(e+(r-o)*s/r+l)),x(t,u,f,e,h)),c=t[e],o=i,d=n,p(t,i,e),h(t[n],c)>0&&p(t,i,n);d>o;){for(p(t,o,d),o++,d--;h(t[o],c)<0;)o++;for(;h(t[d],c)>0;)d--}0===h(t[i],c)?p(t,i,d):(d++,p(t,d,n)),e>=d&&(i=d+1),d>=e&&(n=d-1)}}function p(t,i,n){var e=t[i];t[i]=t[n],t[n]=e}t.prototype={all:function(){return this._all(this.data,[])},search:function(t){var i=this.data,n=[],e=this.toBBox;if(!c(t,i.bbox))return n;for(var h,r,o,a,s=[];i;){for(h=0,r=i.children.length;r>h;h++)o=i.children[h],a=i.leaf?e(o):o.bbox,c(t,a)&&(i.leaf?n.push(o):f(t,a)?this._all(o,n):s.push(o));i=s.pop()}return n},collides:function(t){var i=this.data,n=this.toBBox;if(!c(t,i.bbox))return!1;for(var e,h,r,o,a=[];i;){for(e=0,h=i.children.length;h>e;e++)if(r=i.children[e],o=i.leaf?n(r):r.bbox,c(t,o)){if(i.leaf||f(t,o))return!0;a.push(r)}i=a.pop()}return!1},load:function(t){if(!t||!t.length)return this;if(t.length<this._minEntries){for(var i=0,n=t.length;n>i;i++)this.insert(t[i]);return this}var e=this._build(t.slice(),0,t.length-1,0);if(this.data.children.length)if(this.data.height===e.height)this._splitRoot(this.data,e);else{if(this.data.height<e.height){var h=this.data;this.data=e,e=h}this._insert(e,this.data.height-e.height-1,!0)}else this.data=e;return this},insert:function(t){return t&&this._insert(t,this.data.height-1),this},clear:function(){return this.data={children:[],height:1,bbox:e(),leaf:!0},this},remove:function(t){if(!t)return this;for(var i,n,e,h,r=this.data,o=this.toBBox(t),a=[],s=[];r||a.length;){if(r||(r=a.pop(),n=a[a.length-1],i=s.pop(),h=!0),r.leaf&&(e=r.children.indexOf(t),-1!==e))return r.children.splice(e,1),a.push(r),this._condense(a),this;h||r.leaf||!f(r.bbox,o)?n?(i++,r=n.children[i],h=!1):r=null:(a.push(r),s.push(i),i=0,n=r,r=r.children[0])}return this},toBBox:function(t){return t},compareMinX:function(t,i){return t[0]-i[0]},compareMinY:function(t,i){return t[1]-i[1]},toJSON:function(){return this.data},fromJSON:function(t){return this.data=t,this},_all:function(t,i){for(var n=[];t;)t.leaf?i.push.apply(i,t.children):n.push.apply(n,t.children),t=n.pop();return i},_build:function(t,n,e,h){var r,o=e-n+1,a=this._maxEntries;if(a>=o)return r={children:t.slice(n,e+1),height:1,bbox:null,leaf:!0},i(r,this.toBBox),r;h||(h=Math.ceil(Math.log(o)/Math.log(a)),a=Math.ceil(o/Math.pow(a,h-1))),r={children:[],height:h,bbox:null,leaf:!1};var s,l,u,f,c=Math.ceil(o/a),x=c*Math.ceil(Math.sqrt(a));for(d(t,n,e,x,this.compareMinX),s=n;e>=s;s+=x)for(u=Math.min(s+x-1,e),d(t,s,u,c,this.compareMinY),l=s;u>=l;l+=c)f=Math.min(l+c-1,u),r.children.push(this._build(t,l,f,h-1));return i(r,this.toBBox),r},_chooseSubtree:function(t,i,n,e){for(var h,r,o,s,u,f,c,d;;){if(e.push(i),i.leaf||e.length-1===n)break;for(c=d=1/0,h=0,r=i.children.length;r>h;h++)o=i.children[h],u=a(o.bbox),f=l(t,o.bbox)-u,d>f?(d=f,c=c>u?u:c,s=o):f===d&&c>u&&(c=u,s=o);i=s}return i},_insert:function(t,i,n){var e=this.toBBox,r=n?t.bbox:e(t),o=[],a=this._chooseSubtree(r,this.data,i,o);for(a.children.push(t),h(a.bbox,r);i>=0&&o[i].children.length>this._maxEntries;)this._split(o,i),i--;this._adjustParentBBoxes(r,o,i)},_split:function(t,n){var e=t[n],h=e.children.length,r=this._minEntries;this._chooseSplitAxis(e,r,h);var o=this._chooseSplitIndex(e,r,h),a={children:e.children.splice(o,e.children.length-o),height:e.height,bbox:null,leaf:!1};e.leaf&&(a.leaf=!0),i(e,this.toBBox),i(a,this.toBBox),n?t[n-1].children.push(a):this._splitRoot(e,a)},_splitRoot:function(t,n){this.data={children:[t,n],height:t.height+1,bbox:null,leaf:!1},i(this.data,this.toBBox)},_chooseSplitIndex:function(t,i,e){var h,r,o,s,l,f,c,d;for(f=c=1/0,h=i;e-i>=h;h++)r=n(t,0,h,this.toBBox),o=n(t,h,e,this.toBBox),s=u(r,o),l=a(r)+a(o),f>s?(f=s,d=h,c=c>l?l:c):s===f&&c>l&&(c=l,d=h);return d},_chooseSplitAxis:function(t,i,n){var e=t.leaf?this.compareMinX:r,h=t.leaf?this.compareMinY:o,a=this._allDistMargin(t,i,n,e),s=this._allDistMargin(t,i,n,h);s>a&&t.children.sort(e)},_allDistMargin:function(t,i,e,r){t.children.sort(r);var o,a,l=this.toBBox,u=n(t,0,i,l),f=n(t,e-i,e,l),c=s(u)+s(f);for(o=i;e-i>o;o++)a=t.children[o],h(u,t.leaf?l(a):a.bbox),c+=s(u);for(o=e-i-1;o>=i;o--)a=t.children[o],h(f,t.leaf?l(a):a.bbox),c+=s(f);return c},_adjustParentBBoxes:function(t,i,n){for(var e=n;e>=0;e--)h(i[e].bbox,t)},_condense:function(t){for(var n,e=t.length-1;e>=0;e--)0===t[e].children.length?e>0?(n=t[e-1].children,n.splice(n.indexOf(t[e]),1)):this.clear():i(t[e],this.toBBox)},_initFormat:function(t){var i=["return a"," - b",";"];this.compareMinX=new Function("a","b",i.join(t[0])),this.compareMinY=new Function("a","b",i.join(t[1])),this.toBBox=new Function("a","return [a"+t.join(", a")+"];")}},"function"==typeof define&&define.amd?define("rbush",function(){return t}):"undefined"!=typeof module?module.exports=t:"undefined"!=typeof self?self.rbush=t:window.rbush=t}();
+	},{}],140:[function(require,module,exports){
+	void function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():e.resolveUrl=r()}(this,function(){function e(){var e=arguments.length;if(0===e)throw new Error("resolveUrl requires at least one argument; got none.");var r=document.createElement("base");if(r.href=arguments[0],1===e)return r.href;var t=document.getElementsByTagName("head")[0];t.insertBefore(r,t.firstChild);for(var n,o=document.createElement("a"),f=1;e>f;f++)o.href=arguments[f],n=o.href,r.href=n;return t.removeChild(r),n}return e});
+	},{}],141:[function(require,module,exports){
+	function UnitBezier(t,i,e,r){this.cx=3*t,this.bx=3*(e-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*i,this.by=3*(r-i)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=r,this.p2x=e,this.p2y=r}module.exports=UnitBezier,UnitBezier.prototype.sampleCurveX=function(t){return((this.ax*t+this.bx)*t+this.cx)*t},UnitBezier.prototype.sampleCurveY=function(t){return((this.ay*t+this.by)*t+this.cy)*t},UnitBezier.prototype.sampleCurveDerivativeX=function(t){return(3*this.ax*t+2*this.bx)*t+this.cx},UnitBezier.prototype.solveCurveX=function(t,i){"undefined"==typeof i&&(i=1e-6);var e,r,s,h,n;for(s=t,n=0;8>n;n++){if(h=this.sampleCurveX(s)-t,Math.abs(h)<i)return s;var u=this.sampleCurveDerivativeX(s);if(Math.abs(u)<1e-6)break;s-=h/u}if(e=0,r=1,s=t,e>s)return e;if(s>r)return r;for(;r>e;){if(h=this.sampleCurveX(s),Math.abs(h-t)<i)return s;t>h?e=s:r=s,s=.5*(r-e)+e}return s},UnitBezier.prototype.solve=function(t,i){return this.sampleCurveY(this.solveCurveX(t,i))};
+	},{}],142:[function(require,module,exports){
+	module.exports=function(o){return o&&"object"==typeof o&&"function"==typeof o.copy&&"function"==typeof o.fill&&"function"==typeof o.readUInt8};
+	},{}],143:[function(require,module,exports){
+	(function (process,global){
+	function inspect(e,r){var t={seen:[],stylize:stylizeNoColor};return arguments.length>=3&&(t.depth=arguments[2]),arguments.length>=4&&(t.colors=arguments[3]),isBoolean(r)?t.showHidden=r:r&&exports._extend(t,r),isUndefined(t.showHidden)&&(t.showHidden=!1),isUndefined(t.depth)&&(t.depth=2),isUndefined(t.colors)&&(t.colors=!1),isUndefined(t.customInspect)&&(t.customInspect=!0),t.colors&&(t.stylize=stylizeWithColor),formatValue(t,e,t.depth)}function stylizeWithColor(e,r){var t=inspect.styles[r];return t?"["+inspect.colors[t][0]+"m"+e+"["+inspect.colors[t][1]+"m":e}function stylizeNoColor(e,r){return e}function arrayToHash(e){var r={};return e.forEach(function(e,t){r[e]=!0}),r}function formatValue(e,r,t){if(e.customInspect&&r&&isFunction(r.inspect)&&r.inspect!==exports.inspect&&(!r.constructor||r.constructor.prototype!==r)){var n=r.inspect(t,e);return isString(n)||(n=formatValue(e,n,t)),n}var i=formatPrimitive(e,r);if(i)return i;var o=Object.keys(r),s=arrayToHash(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(r)),isError(r)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return formatError(r);if(0===o.length){if(isFunction(r)){var u=r.name?": "+r.name:"";return e.stylize("[Function"+u+"]","special")}if(isRegExp(r))return e.stylize(RegExp.prototype.toString.call(r),"regexp");if(isDate(r))return e.stylize(Date.prototype.toString.call(r),"date");if(isError(r))return formatError(r)}var a="",c=!1,l=["{","}"];if(isArray(r)&&(c=!0,l=["[","]"]),isFunction(r)){var p=r.name?": "+r.name:"";a=" [Function"+p+"]"}if(isRegExp(r)&&(a=" "+RegExp.prototype.toString.call(r)),isDate(r)&&(a=" "+Date.prototype.toUTCString.call(r)),isError(r)&&(a=" "+formatError(r)),0===o.length&&(!c||0==r.length))return l[0]+a+l[1];if(0>t)return isRegExp(r)?e.stylize(RegExp.prototype.toString.call(r),"regexp"):e.stylize("[Object]","special");e.seen.push(r);var f;return f=c?formatArray(e,r,t,s,o):o.map(function(n){return formatProperty(e,r,t,s,n,c)}),e.seen.pop(),reduceToSingleString(f,a,l)}function formatPrimitive(e,r){if(isUndefined(r))return e.stylize("undefined","undefined");if(isString(r)){var t="'"+JSON.stringify(r).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(t,"string")}return isNumber(r)?e.stylize(""+r,"number"):isBoolean(r)?e.stylize(""+r,"boolean"):isNull(r)?e.stylize("null","null"):void 0}function formatError(e){return"["+Error.prototype.toString.call(e)+"]"}function formatArray(e,r,t,n,i){for(var o=[],s=0,u=r.length;u>s;++s)hasOwnProperty(r,String(s))?o.push(formatProperty(e,r,t,n,String(s),!0)):o.push("");return i.forEach(function(i){i.match(/^\d+$/)||o.push(formatProperty(e,r,t,n,i,!0))}),o}function formatProperty(e,r,t,n,i,o){var s,u,a;if(a=Object.getOwnPropertyDescriptor(r,i)||{value:r[i]},a.get?u=a.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):a.set&&(u=e.stylize("[Setter]","special")),hasOwnProperty(n,i)||(s="["+i+"]"),u||(e.seen.indexOf(a.value)<0?(u=isNull(t)?formatValue(e,a.value,null):formatValue(e,a.value,t-1),u.indexOf("\n")>-1&&(u=o?u.split("\n").map(function(e){return"  "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return"   "+e}).join("\n"))):u=e.stylize("[Circular]","special")),isUndefined(s)){if(o&&i.match(/^\d+$/))return u;s=JSON.stringify(""+i),s.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+u}function reduceToSingleString(e,r,t){var n=0,i=e.reduce(function(e,r){return n++,r.indexOf("\n")>=0&&n++,e+r.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?t[0]+(""===r?"":r+"\n ")+" "+e.join(",\n  ")+" "+t[1]:t[0]+r+" "+e.join(", ")+" "+t[1]}function isArray(e){return Array.isArray(e)}function isBoolean(e){return"boolean"==typeof e}function isNull(e){return null===e}function isNullOrUndefined(e){return null==e}function isNumber(e){return"number"==typeof e}function isString(e){return"string"==typeof e}function isSymbol(e){return"symbol"==typeof e}function isUndefined(e){return void 0===e}function isRegExp(e){return isObject(e)&&"[object RegExp]"===objectToString(e)}function isObject(e){return"object"==typeof e&&null!==e}function isDate(e){return isObject(e)&&"[object Date]"===objectToString(e)}function isError(e){return isObject(e)&&("[object Error]"===objectToString(e)||e instanceof Error)}function isFunction(e){return"function"==typeof e}function isPrimitive(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function objectToString(e){return Object.prototype.toString.call(e)}function pad(e){return 10>e?"0"+e.toString(10):e.toString(10)}function timestamp(){var e=new Date,r=[pad(e.getHours()),pad(e.getMinutes()),pad(e.getSeconds())].join(":");return[e.getDate(),months[e.getMonth()],r].join(" ")}function hasOwnProperty(e,r){return Object.prototype.hasOwnProperty.call(e,r)}var formatRegExp=/%[sdj%]/g;exports.format=function(e){if(!isString(e)){for(var r=[],t=0;t<arguments.length;t++)r.push(inspect(arguments[t]));return r.join(" ")}for(var t=1,n=arguments,i=n.length,o=String(e).replace(formatRegExp,function(e){if("%%"===e)return"%";if(t>=i)return e;switch(e){case"%s":return String(n[t++]);case"%d":return Number(n[t++]);case"%j":try{return JSON.stringify(n[t++])}catch(r){return"[Circular]"}default:return e}}),s=n[t];i>t;s=n[++t])o+=isNull(s)||!isObject(s)?" "+s:" "+inspect(s);return o},exports.deprecate=function(e,r){function t(){if(!n){if(process.throwDeprecation)throw new Error(r);process.traceDeprecation?console.trace(r):console.error(r),n=!0}return e.apply(this,arguments)}if(isUndefined(global.process))return function(){return exports.deprecate(e,r).apply(this,arguments)};if(process.noDeprecation===!0)return e;var n=!1;return t};var debugs={},debugEnviron;exports.debuglog=function(e){if(isUndefined(debugEnviron)&&(debugEnviron=process.env.NODE_DEBUG||""),e=e.toUpperCase(),!debugs[e])if(new RegExp("\\b"+e+"\\b","i").test(debugEnviron)){var r=process.pid;debugs[e]=function(){var t=exports.format.apply(exports,arguments);console.error("%s %d: %s",e,r,t)}}else debugs[e]=function(){};return debugs[e]},exports.inspect=inspect,inspect.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},inspect.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},exports.isArray=isArray,exports.isBoolean=isBoolean,exports.isNull=isNull,exports.isNullOrUndefined=isNullOrUndefined,exports.isNumber=isNumber,exports.isString=isString,exports.isSymbol=isSymbol,exports.isUndefined=isUndefined,exports.isRegExp=isRegExp,exports.isObject=isObject,exports.isDate=isDate,exports.isError=isError,exports.isFunction=isFunction,exports.isPrimitive=isPrimitive,exports.isBuffer=require("./support/isBuffer");var months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];exports.log=function(){console.log("%s - %s",timestamp(),exports.format.apply(exports,arguments))},exports.inherits=require("inherits"),exports._extend=function(e,r){if(!r||!isObject(r))return e;for(var t=Object.keys(r),n=t.length;n--;)e[t[n]]=r[t[n]];return e};
+	}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+
+	},{"./support/isBuffer":142,"_process":138,"inherits":127}],144:[function(require,module,exports){
+	module.exports.VectorTile=require("./lib/vectortile.js"),module.exports.VectorTileFeature=require("./lib/vectortilefeature.js"),module.exports.VectorTileLayer=require("./lib/vectortilelayer.js");
+	},{"./lib/vectortile.js":145,"./lib/vectortilefeature.js":147,"./lib/vectortilelayer.js":148}],145:[function(require,module,exports){
+	"use strict";function VectorTile(e,r){this.layers=e.readFields(readTile,{},r)}function readTile(e,r,i){if(3===e){var t=new VectorTileLayer(i,i.readVarint()+i.pos);t.length&&(r[t.name]=t)}}var VectorTileLayer=require("./vectortilelayer");module.exports=VectorTile;
+	},{"./vectortilelayer":148}],146:[function(require,module,exports){
+	"use strict";function VectorTileClipper(i){this.feature=i,this.finalRatio=4096/i.extent*Math.pow(2,i.dz);var t=64;t/=this.finalRatio;var s=i.extent>>i.dz;t>s&&(t=s),this.dz=i.dz,this.margin=t,this.xmin=s*i.xPos-t,this.ymin=s*i.yPos-t,this.xmax=this.xmin+s+2*t,this.ymax=this.ymin+s+2*t,this.lines=[],this._prevIsIn=!1,this.type=i.type}var Point=require("point-geometry");module.exports=VectorTileClipper,VectorTileClipper.prototype.loadGeometry=function(){var i=this.feature._pbf;i.pos=this.feature._geometry;for(var t=i.readVarint()+i.pos,s=1,h=0,n=0,e=0;i.pos<t;){if(!h){var x=i.readVarint();s=7&x,h=x>>3}if(h--,1===s||2===s)n+=i.readSVarint(),e+=i.readSVarint(),1===s?this.moveTo(n,e):this.lineTo(n,e);else{if(7!==s)throw new Error("unknown command "+s);this.closePolygon()}}return this.result()},VectorTileClipper.prototype.moveTo=function(i,t){this._push_line(),this._prevIsIn=this._isIn(i,t),this._moveTo(i,t,this._prevIsIn),this._prevPt=new Point(i,t),this._firstPt=new Point(i,t)},VectorTileClipper.prototype.lineTo=function(i,t){var s,h,n,e,x,y,l,o,m,r,a,p,_=this._isIn(i,t);if(_)this._prevIsIn?this._lineTo(i,t,!0):(s=this._prevPt,h=new Point(i,t),n=this._intersect(h,s),this._lineTo(n.x,n.y,!0),this._lineTo(h.x,h.y,!0));else if(this._prevIsIn)h=this._prevPt,s=new Point(i,t),n=this._intersect(h,s),this._lineTo(n.x,n.y,!0),this._lineTo(s.x,s.y,!1);else if(e=this._prevPt,x=new Point(i,t),e.x<=this.xmin&&x.x<=this.xmin||e.x>=this.xmax&&x.x>=this.xmax||e.y<=this.ymin&&x.y<=this.ymin||e.y>=this.ymax&&x.y>=this.ymax)this._lineTo(x.x,x.y,!1);else{if(o=[],(e.x<this.xmin&&x.x>this.xmin||e.x>this.xmin&&x.x<this.xmin)&&(y=(this.xmin-e.x)/(x.x-e.x),p=e.y+y*(x.y-e.y),p<=this.ymin?r=!1:p>=this.ymax?r=!0:(l={},l.ratio=y,l.x=this.xmin,l.y=p,o.push(l))),(e.x<this.xmax&&x.x>this.xmax||e.x>this.xmax&&x.x<this.xmax)&&(y=(this.xmax-e.x)/(x.x-e.x),p=e.y+y*(x.y-e.y),p<=this.ymin?r=!1:p>=this.ymax?r=!0:(l={},l.ratio=y,l.x=this.xmax,l.y=p,o.push(l))),(e.y<this.ymin&&x.y>this.ymin||e.y>this.ymin&&x.y<this.ymin)&&(y=(this.ymin-e.y)/(x.y-e.y),a=e.x+y*(x.x-e.x),a<=this.xmin?m=!1:a>=this.xmax?m=!0:(l={},l.ratio=y,l.x=a,l.y=this.ymin,o.push(l))),(e.y<this.ymax&&x.y>this.ymax||e.y>this.ymax&&x.y<this.ymax)&&(y=(this.ymax-e.y)/(x.y-e.y),a=e.x+y*(x.x-e.x),a<=this.xmin?m=!1:a>=this.xmax?m=!0:(l={},l.ratio=y,l.x=a,l.y=this.ymax,o.push(l))),0===o.length)m?r?this._lineTo(this.xmax,this.ymax,!0):this._lineTo(this.xmax,this.ymin,!0):r?this._lineTo(this.xmin,this.ymax,!0):this._lineTo(this.xmin,this.ymin,!0);else if(o.length>1&&o[0].ratio>o[1].ratio)this._lineTo(o[1].x,o[1].y,!0),this._lineTo(o[0].x,o[0].y,!0);else for(var u=0;u<o.length;u++)this._lineTo(o[u].x,o[u].y,!0);this._lineTo(x.x,x.y,!1)}this._prevIsIn=_,this._prevPt=new Point(i,t)},VectorTileClipper.prototype.closePolygon=function(){var i,t;this.line.length>0&&(i=this._firstPt,t=this._prevPt,(i.x!==t.x||i.y!==t.y)&&this.lineTo(i.x,i.y))},VectorTileClipper.prototype.result=function(){return this._push_line(),0===this.lines.length?null:this.lines},VectorTileClipper.prototype._isIn=function(i,t){return i>=this.xmin&&i<=this.xmax&&t>=this.ymin&&t<=this.ymax},VectorTileClipper.prototype._intersect=function(i,t){var s,h,n,e;return t.x>=this.xmin&&t.x<=this.xmax?(h=t.y<=this.ymin?this.ymin:this.ymax,s=i.x+(h-i.y)/(t.y-i.y)*(t.x-i.x)):t.y>=this.ymin&&t.y<=this.ymax?(s=t.x<=this.xmin?this.xmin:this.xmax,h=i.y+(s-i.x)/(t.x-i.x)*(t.y-i.y)):(h=t.y<=this.ymin?this.ymin:this.ymax,s=t.x<=this.xmin?this.xmin:this.xmax,n=(s-i.x)/(t.x-i.x),e=(h-i.y)/(t.y-i.y),e>n?h=i.y+n*(t.y-i.y):s=i.x+e*(t.x-i.x)),new Point(s,h)},VectorTileClipper.prototype._push_line=function(){this.line&&(1===this.type?this.line.length>0&&this.lines.push(this.line):2===this.type?this.line.length>1&&this.lines.push(this.line):3===this.type&&this.line.length>3&&this.lines.push(this.line)),this.line=[]},VectorTileClipper.prototype._moveTo=function(i,t,s){3!==this.type?s&&(i=(i-(this.xmin+this.margin))*this.finalRatio,t=(t-(this.ymin+this.margin))*this.finalRatio,this.line.push(new Point(i,t))):(s||(i<this.xmin&&(i=this.xmin),i>this.xmax&&(i=this.xmax),t<this.ymin&&(t=this.ymin),t>this.ymax&&(t=this.ymax)),i=(i-(this.xmin+this.margin))*this.finalRatio,t=(t-(this.ymin+this.margin))*this.finalRatio,this.line.push(new Point(i,t)),this._is_h=!1,this._is_v=!1)},VectorTileClipper.prototype._lineTo=function(i,t,s){var h,n;if(3!==this.type)if(s){if(i=(i-(this.xmin+this.margin))*this.finalRatio,t=(t-(this.ymin+this.margin))*this.finalRatio,this.line.length>0&&(h=this.line[this.line.length-1],h.x===i&&h.y===t))return;this.line.push(new Point(i,t))}else this.line&&this.line.length>0&&this._push_line();else if(s||(i<this.xmin&&(i=this.xmin),i>this.xmax&&(i=this.xmax),t<this.ymin&&(t=this.ymin),t>this.ymax&&(t=this.ymax)),i=(i-(this.xmin+this.margin))*this.finalRatio,t=(t-(this.ymin+this.margin))*this.finalRatio,this.line&&this.line.length>0){h=this.line[this.line.length-1];var e=h.x===i,x=h.y===t;if(e&&x)return;this._is_h&&e?(h.x=i,h.y=t,n=this.line[this.line.length-2],this._is_h=n.x===i,this._is_v=n.y===t):this._is_v&&x?(h.x=i,h.y=t,n=this.line[this.line.length-2],this._is_h=n.x===i,this._is_v=n.y===t):(this.line.push(new Point(i,t)),this._is_h=e,this._is_v=x)}else this.line.push(new Point(i,t))};
+	},{"point-geometry":137}],147:[function(require,module,exports){
+	"use strict";function VectorTileFeature(e,t,r,i,o){this.properties={},this.extent=r,this.type=0,this._pbf=e,this._geometry=-1,this._keys=i,this._values=o,e.readFields(readFeature,this,t)}function readFeature(e,t,r){1==e?t._id=r.readVarint():2==e?readTag(r,t):3==e?t.type=r.readVarint():4==e&&(t._geometry=r.pos)}function readTag(e,t){for(var r=e.readVarint()+e.pos;e.pos<r;){var i=t._keys[e.readVarint()],o=t._values[e.readVarint()];t.properties[i]=o}}var Point=require("point-geometry"),VectorTileClipper=require("./vectortileclipper");module.exports=VectorTileFeature,VectorTileFeature.types=["Unknown","Point","LineString","Polygon"],VectorTileFeature.prototype.loadGeometry=function(){var e;if(this.dz){var t=new VectorTileClipper(this);e=t.loadGeometry()}else{for(var r=0,i=this.extent;i>4096;)r+=1,i>>=1;var o=this._pbf;o.pos=this._geometry;var a,n=o.readVarint()+o.pos,s=1,p=0,h=0,u=0;for(e=[];o.pos<n;){if(!p){var l=o.readVarint();s=7&l,p=l>>3}if(p--,1===s||2===s)h+=o.readSVarint(),u+=o.readSVarint(),1===s&&(a&&e.push(a),a=[]),a.push(new Point(h>>r,u>>r));else{if(7!==s)throw new Error("unknown command "+s);a&&a.push(a[0].clone())}}a&&e.push(a)}return e},VectorTileFeature.prototype.bbox=function(){var e=this._pbf;e.pos=this._geometry;for(var t=e.readVarint()+e.pos,r=1,i=0,o=0,a=0,n=1/0,s=-(1/0),p=1/0,h=-(1/0);e.pos<t;){if(!i){var u=e.readVarint();r=7&u,i=u>>3}if(i--,1===r||2===r)o+=e.readSVarint(),a+=e.readSVarint(),n>o&&(n=o),o>s&&(s=o),p>a&&(p=a),a>h&&(h=a);else if(7!==r)throw new Error("unknown command "+r)}return[n,p,s,h]},VectorTileFeature.prototype.toGeoJSON=function(e,t,r){for(var i=this.extent*Math.pow(2,r),o=this.extent*e,a=this.extent*t,n=this.loadGeometry(),s=VectorTileFeature.types[this.type],p=0;p<n.length;p++)for(var h=n[p],u=0;u<h.length;u++){var l=h[u],d=180-360*(l.y+a)/i;h[u]=[360*(l.x+o)/i-180,360/Math.PI*Math.atan(Math.exp(d*Math.PI/180))-90]}return"Point"===s&&1===n.length?n=n[0][0]:"Point"===s?(n=n[0],s="MultiPoint"):"LineString"===s&&1===n.length?n=n[0]:"LineString"===s&&(s="MultiLineString"),{type:"Feature",geometry:{type:s,coordinates:n},properties:this.properties}};
+	},{"./vectortileclipper":146,"point-geometry":137}],148:[function(require,module,exports){
+	"use strict";function VectorTileLayer(e,t){this.version=1,this.name=null,this.extent=4096,this.length=0,this._pbf=e,this._keys=[],this._values=[],this._features=[],e.readFields(readLayer,this,t),this.length=this._features.length}function readLayer(e,t,r){15===e?t.version=r.readVarint():1===e?t.name=r.readString():5===e?t.extent=r.readVarint():2===e?t._features.push(r.pos):3===e?t._keys.push(r.readString()):4===e&&t._values.push(readValueMessage(r))}function readValueMessage(e){for(var t=null,r=e.readVarint()+e.pos;e.pos<r;){var a=e.readVarint()>>3;t=1===a?e.readString():2===a?e.readFloat():3===a?e.readDouble():4===a?e.readVarint64():5===a?e.readVarint():6===a?e.readSVarint():7===a?e.readBoolean():null}return t}var VectorTileFeature=require("./vectortilefeature.js");module.exports=VectorTileLayer,VectorTileLayer.prototype.feature=function(e){if(0>e||e>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[e];var t=this._pbf.readVarint()+this._pbf.pos;return new VectorTileFeature(this._pbf,t,this.extent,this._keys,this._values)};
+	},{"./vectortilefeature.js":147}],149:[function(require,module,exports){
+	var bundleFn=arguments[3],sources=arguments[4],cache=arguments[5],stringify=JSON.stringify;module.exports=function(r){for(var e,t=Object.keys(cache),n=0,o=t.length;o>n;n++){var a=t[n],i=cache[a].exports;if(i===r||i["default"]===r){e=a;break}}if(!e){e=Math.floor(Math.pow(16,8)*Math.random()).toString(16);for(var s={},n=0,o=t.length;o>n;n++){var a=t[n];s[a]=a}sources[e]=[Function(["require","module","exports"],"("+r+")(self)"),s]}var u=Math.floor(Math.pow(16,8)*Math.random()).toString(16),f={};f[e]=e,sources[u]=[Function(["require"],"var f = require("+stringify(e)+");(f.default ? f.default : f)(self);"),f];var c="("+bundleFn+")({"+Object.keys(sources).map(function(r){return stringify(r)+":["+sources[r][0]+","+stringify(sources[r][1])+"]"}).join(",")+"},{},["+stringify(u)+"])",l=window.URL||window.webkitURL||window.mozURL||window.msURL;return new Worker(l.createObjectURL(new Blob([c],{type:"text/javascript"})))};
+	},{}]},{},[24])(24)
+	});
+
+	L.MapboxGL = L.Layer.extend({
+	    options: {
+	      updateInterval: 32
+	    },
+
+	    initialize: function (options) {
+	        L.setOptions(this, options);
+
+	        if (options.accessToken) {
+	            mapboxgl.accessToken = options.accessToken;
+	        } else {
+	            throw new Error('You should provide a Mapbox GL access token as a token option.');
+	        }
+
+	         /**
+	         * Create a version of `fn` that only fires once every `time` millseconds.
+	         *
+	         * @param {Function} fn the function to be throttled
+	         * @param {number} time millseconds required between function calls
+	         * @param {*} context the value of `this` with which the function is called
+	         * @returns {Function} debounced function
+	         * @private
+	         */
+	        var throttle = function (fn, time, context) {
+	            var lock, args, wrapperFn, later;
+
+	            later = function () {
+	                // reset lock and call if queued
+	                lock = false;
+	                if (args) {
+	                    wrapperFn.apply(context, args);
+	                    args = false;
+	                }
+	            };
+
+	            wrapperFn = function () {
+	                if (lock) {
+	                    // called too soon, queue to call later
+	                    args = arguments;
+
+	                } else {
+	                    // call and lock until later
+	                    fn.apply(context, arguments);
+	                    setTimeout(later, time);
+	                    lock = true;
+	                }
+	            };
+
+	            return wrapperFn;
+	        };
+
+	        // setup throttling the update event when panning
+	        this._throttledUpdate = throttle(L.Util.bind(this._update, this), this.options.updateInterval);
+	    },
+
+	    onAdd: function (map) {
+	        if (!this._glContainer) {
+	            this._initContainer();
+	        }
+
+	        map._panes.tilePane.appendChild(this._glContainer);
+
+	        this._initGL();
+
+	        this._offset = this._map.containerPointToLayerPoint([0, 0]);
+
+	        // work around https://github.com/mapbox/mapbox-gl-leaflet/issues/47
+	        if (map.options.zoomAnimation) {
+	            L.DomEvent.on(map._proxy, L.DomUtil.TRANSITION_END, this._transitionEnd, this);
+	        }
+	    },
+
+	    onRemove: function (map) {
+	        if (this._map.options.zoomAnimation) {
+	            L.DomEvent.off(this._map._proxy, L.DomUtil.TRANSITION_END, this._transitionEnd, this);
+	        }
+
+	        map.getPanes().tilePane.removeChild(this._glContainer);
+	        this._glMap.remove();
+	        this._glMap = null;
+	    },
+
+	    getEvents: function () {
+	        return {
+	            move: this._throttledUpdate, // sensibly throttle updating while panning
+	            zoomanim: this._animateZoom, // applys the zoom animation to the <canvas>
+	            zoom: this._pinchZoom, // animate every zoom event for smoother pinch-zooming
+	            zoomstart: this._zoomStart, // flag starting a zoom to disable panning
+	            zoomend: this._zoomEnd
+	        };
+	    },
+
+	    _initContainer: function () {
+	        var container = this._glContainer = L.DomUtil.create('div', 'leaflet-gl-layer');
+
+	        var size = this._map.getSize();
+	        container.style.width  = size.x + 'px';
+	        container.style.height = size.y + 'px';
+	    },
+
+	    _initGL: function () {
+	        var center = this._map.getCenter();
+
+	        var options = L.extend({}, this.options, {
+	            container: this._glContainer,
+	            interactive: false,
+	            center: [center.lng, center.lat],
+	            zoom: this._map.getZoom() - 1,
+	            attributionControl: false
+	        });
+
+	        this._glMap = new mapboxgl.Map(options);
+
+	        // allow GL base map to pan beyond min/max latitudes
+	        this._glMap.transform.latRange = null;
+
+	        // treat child <canvas> element like L.ImageOverlay
+	        L.DomUtil.addClass(this._glMap._canvas.canvas, 'leaflet-image-layer');
+	        L.DomUtil.addClass(this._glMap._canvas.canvas, 'leaflet-zoom-animated');
+	    },
+
+	    _update: function (e) {
+	        // update the offset so we can correct for it later when we zoom
+	        this._offset = this._map.containerPointToLayerPoint([0, 0]);
+
+	        if (this._zooming) {
+	          return;
+	        }
+
+	        var size = this._map.getSize(),
+	            container = this._glContainer,
+	            gl = this._glMap,
+	            topLeft = this._map.containerPointToLayerPoint([0, 0]);
+
+	        L.DomUtil.setPosition(container, topLeft);
+
+	        var center = this._map.getCenter();
+
+	        // gl.setView([center.lat, center.lng], this._map.getZoom() - 1, 0);
+	        // calling setView directly causes sync issues because it uses requestAnimFrame
+
+	        var tr = gl.transform;
+	        tr.center = mapboxgl.LngLat.convert([center.lng, center.lat]);
+	        tr.zoom = this._map.getZoom() - 1;
+
+	        if (gl.transform.width !== size.x || gl.transform.height !== size.y) {
+	            container.style.width  = size.x + 'px';
+	            container.style.height = size.y + 'px';
+	            gl._resize();
+	        } else {
+	          gl.update();
+	        }
+	    },
+
+	    // update the map constantly during a pinch zoom
+	    _pinchZoom: function (e) {
+	      this._glMap.jumpTo({
+	        zoom: this._map.getZoom() - 1,
+	        center: this._map.getCenter()
+	      });
+	    },
+
+	    // borrowed from L.ImageOverlay https://github.com/Leaflet/Leaflet/blob/master/src/layer/ImageOverlay.js#L139-L144
+	    _animateZoom: function (e) {
+	      var scale = this._map.getZoomScale(e.zoom),
+	          offset = this._map._latLngToNewLayerPoint(this._map.getBounds().getNorthWest(), e.zoom, e.center);
+
+	      L.DomUtil.setTransform(this._glMap._canvas.canvas, offset.subtract(this._offset), scale);
+	    },
+
+	    _zoomStart: function (e) {
+	      this._zooming = true;
+	    },
+
+	    _zoomEnd: function () {
+	      var scale = this._map.getZoomScale(this._map.getZoom()),
+	          offset = this._map._latLngToNewLayerPoint(this._map.getBounds().getNorthWest(), this._map.getZoom(), this._map.getCenter());
+
+	      L.DomUtil.setTransform(this._glMap._canvas.canvas, offset.subtract(this._offset), scale);
+	    },
+
+	    _transitionEnd: function (e) {
+	      L.Util.requestAnimFrame(function () {
+	          var zoom = this._map.getZoom(),
+	          center = this._map.getCenter(),
+	          offset = this._map.latLngToContainerPoint(this._map.getBounds().getNorthWest());
+
+	          // reset the scale and offset
+	          L.DomUtil.setTransform(this._glMap._canvas.canvas, offset, 1);
+
+	          // enable panning once the gl map is ready again
+	          this._glMap.once('moveend', L.Util.bind(function () {
+	              this._zooming = false;
+	              this._zoomEnd();
+	          }, this));
+
+	          // update the map position
+	          this._glMap.jumpTo({
+	              center: center,
+	              zoom: zoom - 1
+	          });
+	      }, this)
+	    }
+	});
+
+	L.mapboxGL = function (options) {
+	    return new L.MapboxGL(options);
+	};
+
+	function fetchMetadata (url, context) {
+	  esriLeaflet.request(url, {}, function (error, style) {
+	    if (!error) {
+	      esriLeaflet.request(style.sources.esri.url, {}, function (error, tileMetadata) {
+	        if (!error) {
+	          formatStyle(style, tileMetadata, url);
+	          context._mapboxGL = L$1.mapboxGL({
+	            accessToken: 'ezree',
+	            style: style
+	          });
+
+	          context._ready = true;
+	          context.fire('ready', {}, true);
+	        }
+	      }, context);
+	    } else {
+	      throw new Error('Unable to fetch vector tile style metadata');
+	    }
+	  }, context);
+	}
+
+	function formatStyle (style, metadata, styleUrl) {
+	  // if a relative path is referenced, the default style can be found in a standard location
+	  if (style.sources.esri.url && style.sources.esri.url.indexOf('http') === -1) {
+	    style.sources.esri.url = styleUrl.replace('/resources/styles/root.json', '');
+	  }
+
+	  // right now ArcGIS Pro published vector services have a slightly different signature
+	  if (metadata.tiles && metadata.tiles[0].charAt(0) !== '/') {
+	    metadata.tiles[0] = '/' + metadata.tiles[0];
+	  }
+
+	  if (metadata.tileMap && metadata.tileMap.charAt(0) !== '/') {
+	    metadata.tileMap = '/' + metadata.tileMap;
+	  }
+
+	  style.sources.esri = {
+	    type: 'vector',
+	    scheme: 'xyz',
+	    tilejson: metadata.tilejson || '2.0.0',
+	    format: (metadata.tileInfo && metadata.tileInfo.format) || 'pbf',
+	    index: metadata.tileMap ? style.sources.esri.url + metadata.tileMap : null,
+	    tiles: [
+	      style.sources.esri.url + metadata.tiles[0]
+	    ],
+	    description: metadata.description,
+	    name: metadata.name
+	  };
+
+	  if (style.glyphs.indexOf('http') === -1) {
+	    // set paths to sprite and glyphs
+	    style.glyphs = styleUrl.replace('styles/root.json', style.glyphs.replace('../', ''));
+	    style.sprite = styleUrl.replace('styles/root.json', style.sprite.replace('../', ''));
+	  }
+	}
+
+	var Basemap = L$1.Layer.extend({
+	  statics: {
+	    URLPREFIX: 'https://www.arcgis.com/sharing/rest/content/items/',
+	    URLSUFFIX: '/resources/styles/root.json',
+	    STYLES: {
+	      'DarkGray': '57436c01bc754dbb87dfb636b6484022',
+	      'Gray': '1e47168d181248e491541ffd5a91c0de',
+	      'Hybrid': 'af6063d6906c4eb589dfe03819610660',
+	      'Navigation': 'e19e9330bf08490ca8353d76b5e2e658',
+	      'Streets': 'a60a37a27cc140ddad15f919cd5a69f2',
+	      'StreetsNight': '92c551c9f07b4147846aae273e822714',
+	      'StreetsRelief': '78c0a9ab4fbf4198a8b951848aab19d8',
+	      'Topographic': '86d5ed4b6dc741de9dad5f0fbe09ae95',
+	      'Spring': '763884983d3544c0a418a97992881fce',
+	      'Newspaper': '4f4843d99c34436f82920932317893ae',
+	      'MidCentury': '267f44f08a844c7abee2b62b00600540',
+	      'ModernAntique': '996d9e7a3aac4514bb692ce7a990f1c1',
+	      'BlackAndWhite': '3161443179244702a5e0449010013b54'
+	    }
+	  },
+
+	  initialize: function (options) {
+	    // L.Layer expects a JSON object literal to be passed in constructor
+	    options = {
+	      key: options
+	    };
+
+	    if (typeof options.key === 'string' && Basemap.STYLES[options.key]) {
+	      var url = Basemap.URLPREFIX + Basemap.STYLES[options.key] + Basemap.URLSUFFIX;
+	      fetchMetadata(url, this);
+	    } else {
+	      throw new Error('L.esri.Vector.Basemap: Invalid parameter. Use one of "DarkGray", "Gray", "Hybrid", "Navigation", "Streets", "StreetsNight", "StreetsRelief", "Topographic"');
+	    }
+	  },
+
+	  onAdd: function (map) {
+	    this._map = map;
+
+	    esriLeaflet.Util.setEsriAttribution(map);
+
+	    if (map.attributionControl) {
+	      // 95% sure this is the right static attribution url
+	      esriLeaflet.Util._getAttributionData('https://static.arcgis.com/attribution/World_Street_Map', map);
+	      map.attributionControl.addAttribution('<span class="esri-dynamic-attribution">USGS, NOAA</span>');
+	    }
+
+	    if (this._ready) {
+	      this._asyncAdd();
+	    } else {
+	      this.once('ready', function () {
+	        this._asyncAdd();
+	      }, this);
+	    }
+	  },
+
+	  onRemove: function (map) {
+	    map.off('moveend', esriLeaflet.Util._updateMapAttribution);
+	    map.removeLayer(this._mapboxGL);
+
+	    if (map.attributionControl) {
+	      var vectorAttribution = document.getElementsByClassName('esri-dynamic-attribution')[0].outerHTML;
+	      // this doesn't work, not sure why.
+	      map.attributionControl.removeAttribution(vectorAttribution);
+	    }
+	  },
+
+	  _asyncAdd: function () {
+	    var map = this._map;
+
+	    // set the background color of the map to the background color of the tiles
+	    map.getContainer().style.background = this._mapboxGL.options.style.layers[0].paint['background-color'];
+
+	    map.on('moveend', esriLeaflet.Util._updateMapAttribution);
+	    this._mapboxGL.addTo(map, this);
+	  }
+	});
+
+	function basemap (key) {
+	  return new Basemap(key);
+	}
+
+	var Layer = L$1.Layer.extend({
+	  statics: {
+	    URLPREFIX: 'https://www.arcgis.com/sharing/rest/content/items/'
+	  },
+
+	  initialize: function (options) {
+	    // L.Layer expects a JSON object literal to be passed in constructor
+	    options = {
+	      id: options
+	    };
+
+	    if (typeof options.id === 'string') {
+	      var itemMetadataUrl = Layer.URLPREFIX + options.id;
+	      var tileUrl;
+	      var styleUrl;
+
+	      esriLeaflet.request(itemMetadataUrl, {}, function (error, metadata) {
+	        if (!error) {
+	          tileUrl = metadata.url;
+
+	          // custom tileset published using ArcGIS Pro
+	          if (tileUrl.indexOf('basemaps.arcgis.com') === -1) {
+	            this._customTileset = true;
+	            // if copyright info was published, display it.
+	            if (metadata.accessInformation) {
+	              this._copyrightText = metadata.accessInformation;
+	            }
+	            esriLeaflet.request(tileUrl, {}, function (error, tileMetadata) {
+	              if (!error) {
+	                // right now ArcGIS Pro published vector services have a slightly different signature
+	                if (tileMetadata.defaultStyles.charAt(0) !== '/') {
+	                  tileMetadata.defaultStyles = '/' + tileMetadata.defaultStyles;
+	                }
+
+	                styleUrl = tileUrl + tileMetadata.defaultStyles + '/root.json';
+	                esriLeaflet.request(styleUrl, {}, function (error, style) {
+	                  if (!error) {
+	                    formatStyle(style, tileMetadata, styleUrl);
+
+	                    this._mapboxGL = L$1.mapboxGL({
+	                      accessToken: 'ezree',
+	                      style: style
+	                    });
+
+	                    this._ready = true;
+	                    this.fire('ready', {}, true);
+	                  }
+	                }, this);
+	              }
+	            }, this);
+	          } else {
+	            // custom symbology applied to hosted basemap tiles
+	            fetchMetadata(itemMetadataUrl + '/resources/styles/root.json', this);
+	          }
+	        }
+	      }, this);
+	    } else {
+	      throw new Error('L.esri.Vector.Layer: Invalid parameter. Use the id of an ArcGIS Online vector tile item');
+	    }
+	  },
+
+	  onAdd: function (map) {
+	    this._map = map;
+	    esriLeaflet.Util.setEsriAttribution(map);
+
+	    if (this._ready) {
+	      this._asyncAdd();
+	    } else {
+	      this.once('ready', function () {
+	        this._asyncAdd();
+	      }, this);
+	    }
+	  },
+
+	  onRemove: function (map) {
+	    map.off('moveend', esriLeaflet.Util._updateMapAttribution);
+	    map.removeLayer(this._mapboxGL);
+
+	    if (map.attributionControl) {
+	      var vectorAttribution = document.getElementsByClassName('esri-dynamic-attribution')[0].outerHTML;
+	      // this doesn't work, not sure why.
+	      map.attributionControl.removeAttribution(vectorAttribution);
+	    }
+	  },
+
+	  _asyncAdd: function () {
+	    var map = this._map;
+	    if (map.attributionControl) {
+	      if (this._customTileset) {
+	        if (this._copyrightText) {
+	          // pull static copyright text for services published with Pro
+	          map.attributionControl.addAttribution('<span class="esri-dynamic-attribution">' + this._copyrightText + '</span>');
+	        }
+	      } else {
+	        // provide dynamic attribution for Esri basemaps
+	        esriLeaflet.Util._getAttributionData('https://static.arcgis.com/attribution/World_Street_Map', map);
+	        map.attributionControl.addAttribution('<span class="esri-dynamic-attribution">USGS, NOAA</span>');
+	        map.on('moveend', esriLeaflet.Util._updateMapAttribution);
+	      }
+	    }
+
+	    // set the background color of the map to the background color of the tiles
+	    map.getContainer().style.background = this._mapboxGL.options.style.layers[0].paint['background-color'];
+	    this._mapboxGL.addTo(map, this);
+	  }
+	});
+
+	function layer (id) {
+	  return new Layer(id);
+	}
+
+	exports.VERSION = version;
+	exports.Basemap = Basemap;
+	exports.basemap = basemap;
+	exports.Layer = Layer;
+	exports.layer = layer;
+
+}));
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LXZlY3Rvci1kZWJ1Zy5qcyIsInNvdXJjZXMiOlsiLi4vcGFja2FnZS5qc29uIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21hcGJveC1nbC9kaXN0L21hcGJveC1nbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9tYXBib3gtZ2wtbGVhZmxldC9sZWFmbGV0LW1hcGJveC1nbC5qcyIsIi4uL3NyYy9VdGlsLmpzIiwiLi4vc3JjL0Jhc2VtYXAuanMiLCIuLi9zcmMvTGF5ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsie1xuICBcIm5hbWVcIjogXCJlc3JpLWxlYWZsZXQtdmVjdG9yXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJFc3JpIHZlY3RvciBiYXNlbWFwIHBsdWdpbiBmb3IgTGVhZmxldC5cIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMS4wLjZcIixcbiAgXCJhdXRob3JcIjogXCJKb2huIEdyYXZvaXMgPGpncmF2b2lzQGVzcmkuY29tPiAoaHR0cDovL2pvaG5ncmF2b2lzLmNvbSlcIixcbiAgXCJjb250cmlidXRvcnNcIjogW1xuICAgIFwiUGF0cmljayBBcmx0IDxwYXJsdEBlc3JpLmNvbT4gKGh0dHA6Ly9wYXRyaWNrYXJsdC5jb20pXCJcbiAgXSxcbiAgXCJidWdzXCI6IHtcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9Fc3JpL2VzcmktbGVhZmxldC12ZWN0b3IvaXNzdWVzXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiZXNyaS1sZWFmbGV0XCI6IFwiXjIuMC4zXCIsXG4gICAgXCJsZWFmbGV0XCI6IFwiXjEuMC4wXCIsXG4gICAgXCJtYXBib3gtZ2xcIjogXCJnaXQraHR0cHM6Ly9naXRodWIuY29tL0VzcmkvbWFwYm94LWdsLWpzLmdpdCNpbmRleGVkLXZlY3Rvci1zb3VyY2VzXCIsXG4gICAgXCJtYXBib3gtZ2wtbGVhZmxldFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vamdyYXZvaXMvbWFwYm94LWdsLWxlYWZsZXQjaW5kZXhlZC12ZWN0b3Itc291cmNlc1wiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImdoLXJlbGVhc2VcIjogXCJeMi4wLjBcIixcbiAgICBcImh0dHAtc2VydmVyXCI6IFwiXjAuOC41XCIsXG4gICAgXCJta2RpcnBcIjogXCJeMC41LjFcIixcbiAgICBcIm5vZGVtb25cIjogXCJeMS45LjJcIixcbiAgICBcInJvbGx1cFwiOiBcIl4wLjI1LjRcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tanNvblwiOiBcIl4yLjAuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1ub2RlLXJlc29sdmVcIjogXCJeMS40LjBcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tdWdsaWZ5XCI6IFwiXjAuMy4xXCIsXG4gICAgXCJzZW1pc3RhbmRhcmRcIjogXCJeNy4wLjVcIixcbiAgICBcInNuYXp6eVwiOiBcIl4yLjAuMVwiLFxuICAgIFwid2F0Y2hcIjogXCJeMC4xNy4xXCJcbiAgfSxcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9Fc3JpL2VzcmktbGVhZmxldC12ZWN0b3IjcmVhZG1lXCIsXG4gIFwianNuZXh0Om1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXRWZWN0b3IuanNcIixcbiAgXCJqc3BtXCI6IHtcbiAgICBcInJlZ2lzdHJ5XCI6IFwibnBtXCIsXG4gICAgXCJmb3JtYXRcIjogXCJlczZcIixcbiAgICBcIm1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXRWZWN0b3IuanNcIlxuICB9LFxuICBcImxpY2Vuc2VcIjogXCJBcGFjaGUtMi4wXCIsXG4gIFwibWFpblwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LXZlY3Rvci1kZWJ1Zy5qc1wiLFxuICBcImJyb3dzZXJcIjogXCJkaXN0L2VzcmktbGVhZmxldC12ZWN0b3ItZGVidWcuanNcIixcbiAgXCJyZWFkbWVGaWxlbmFtZVwiOiBcIlJFQURNRS5tZFwiLFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9Fc3JpL2VzcmktbGVhZmxldC12ZWN0b3IuZ2l0XCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInByZWJ1aWxkXCI6IFwibWtkaXJwIGRpc3RcIixcbiAgICBcImJ1aWxkXCI6IFwicm9sbHVwIC1jIHByb2ZpbGVzL2RlYnVnLmpzICYgcm9sbHVwIC1jIHByb2ZpbGVzL3Byb2R1Y3Rpb24uanNcIixcbiAgICBcImxpbnRcIjogXCJzZW1pc3RhbmRhcmQgfCBzbmF6enlcIixcbiAgICBcInByZXB1Ymxpc2hcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJwcmV0ZXN0XCI6IFwibnBtIHJ1biBidWlsZFwiLFxuICAgIFwic3RhcnRcIjogXCJ3YXRjaCAnbnBtIHJ1biBidWlsZCcgc3JjICYgaHR0cC1zZXJ2ZXIgLXAgODc2NSAtYy0xIC1vXCIsXG4gICAgXCJ0ZXN0XCI6IFwibnBtIHJ1biBsaW50XCIsXG4gICAgXCJyZWxlYXNlXCI6IFwiLi9zY3JpcHRzL3JlbGVhc2Uuc2hcIlxuICB9XG59XG4iLCIoZnVuY3Rpb24oZil7aWYodHlwZW9mIGV4cG9ydHM9PT1cIm9iamVjdFwiJiZ0eXBlb2YgbW9kdWxlIT09XCJ1bmRlZmluZWRcIil7bW9kdWxlLmV4cG9ydHM9ZigpfWVsc2UgaWYodHlwZW9mIGRlZmluZT09PVwiZnVuY3Rpb25cIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKFtdLGYpfWVsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCIpe2c9Z2xvYmFsfWVsc2UgaWYodHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiKXtnPXNlbGZ9ZWxzZXtnPXRoaXN9Zy5tYXBib3hnbCA9IGYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIChmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pKHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEJ1ZmZlcih0KXt0Pyh0aGlzLmFycmF5PXQuYXJyYXksdGhpcy5wb3M9dC5wb3MpOih0aGlzLmFycmF5PW5ldyBBcnJheUJ1ZmZlcih0aGlzLmRlZmF1bHRMZW5ndGgpLHRoaXMubGVuZ3RoPXRoaXMuZGVmYXVsdExlbmd0aCx0aGlzLnNldHVwVmlld3MoKSl9bW9kdWxlLmV4cG9ydHM9QnVmZmVyLEJ1ZmZlci5wcm90b3R5cGU9e3BvczowLGl0ZW1TaXplOjQsZGVmYXVsdExlbmd0aDo4MTkyLGFycmF5VHlwZTpcIkFSUkFZX0JVRkZFUlwiLGdldCBpbmRleCgpe3JldHVybiB0aGlzLnBvcy90aGlzLml0ZW1TaXplfSxzZXR1cFZpZXdzOmZ1bmN0aW9uKCl7dGhpcy51Ynl0ZXM9bmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheSksdGhpcy5ieXRlcz1uZXcgSW50OEFycmF5KHRoaXMuYXJyYXkpLHRoaXMudXNob3J0cz1uZXcgVWludDE2QXJyYXkodGhpcy5hcnJheSksdGhpcy5zaG9ydHM9bmV3IEludDE2QXJyYXkodGhpcy5hcnJheSl9LGJpbmQ6ZnVuY3Rpb24odCl7dmFyIGU9dFt0aGlzLmFycmF5VHlwZV07dGhpcy5idWZmZXI/dC5iaW5kQnVmZmVyKGUsdGhpcy5idWZmZXIpOih0aGlzLmJ1ZmZlcj10LmNyZWF0ZUJ1ZmZlcigpLHQuYmluZEJ1ZmZlcihlLHRoaXMuYnVmZmVyKSx0LmJ1ZmZlckRhdGEoZSx0aGlzLmFycmF5LnNsaWNlKDAsdGhpcy5wb3MpLHQuU1RBVElDX0RSQVcpLHRoaXMuYXJyYXk9bnVsbCl9LGRlc3Ryb3k6ZnVuY3Rpb24odCl7dGhpcy5idWZmZXImJnQuZGVsZXRlQnVmZmVyKHRoaXMuYnVmZmVyKX0scmVzaXplOmZ1bmN0aW9uKCl7aWYodGhpcy5sZW5ndGg8dGhpcy5wb3MrdGhpcy5pdGVtU2l6ZSl7Zm9yKDt0aGlzLmxlbmd0aDx0aGlzLnBvcyt0aGlzLml0ZW1TaXplOyl0aGlzLmxlbmd0aD0yKk1hdGgucm91bmQoMS41KnRoaXMubGVuZ3RoLzIpO3RoaXMuYXJyYXk9bmV3IEFycmF5QnVmZmVyKHRoaXMubGVuZ3RoKTt2YXIgdD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5KTt0LnNldCh0aGlzLnVieXRlcyksdGhpcy5zZXR1cFZpZXdzKCl9fX07XG59LHt9XSwyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBMaW5lVmVydGV4QnVmZmVyPXJlcXVpcmUoXCIuL2xpbmVfdmVydGV4X2J1ZmZlclwiKSxMaW5lRWxlbWVudEJ1ZmZlcj1yZXF1aXJlKFwiLi9saW5lX2VsZW1lbnRfYnVmZmVyXCIpLEZpbGxWZXJ0ZXhCdWZmZXI9cmVxdWlyZShcIi4vZmlsbF92ZXJ0ZXhfYnVmZmVyXCIpLEZpbGxFbGVtZW50QnVmZmVyPXJlcXVpcmUoXCIuL3RyaWFuZ2xlX2VsZW1lbnRfYnVmZmVyXCIpLE91dGxpbmVFbGVtZW50QnVmZmVyPXJlcXVpcmUoXCIuL291dGxpbmVfZWxlbWVudF9idWZmZXJcIiksR2x5cGhWZXJ0ZXhCdWZmZXI9cmVxdWlyZShcIi4vZ2x5cGhfdmVydGV4X2J1ZmZlclwiKSxHbHlwaEVsZW1lbnRCdWZmZXI9cmVxdWlyZShcIi4vdHJpYW5nbGVfZWxlbWVudF9idWZmZXJcIiksSWNvblZlcnRleEJ1ZmZlcj1yZXF1aXJlKFwiLi9pY29uX3ZlcnRleF9idWZmZXJcIiksSWNvbkVsZW1lbnRCdWZmZXI9cmVxdWlyZShcIi4vdHJpYW5nbGVfZWxlbWVudF9idWZmZXJcIiksQ29sbGlzaW9uQm94VmVydGV4QnVmZmVyPXJlcXVpcmUoXCIuL2NvbGxpc2lvbl9ib3hfdmVydGV4X2J1ZmZlclwiKSxDaXJjbGVWZXJ0ZXhCdWZmZXI9cmVxdWlyZShcIi4vY2lyY2xlX3ZlcnRleF9idWZmZXJcIiksQ2lyY2xlRWxlbWVudEJ1ZmZlcj1yZXF1aXJlKFwiLi90cmlhbmdsZV9lbGVtZW50X2J1ZmZlclwiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZT1lfHx7fSx7Z2x5cGhWZXJ0ZXg6bmV3IEdseXBoVmVydGV4QnVmZmVyKGUuZ2x5cGhWZXJ0ZXgpLGdseXBoRWxlbWVudDpuZXcgR2x5cGhFbGVtZW50QnVmZmVyKGUuZ2x5cGhFbGVtZW50KSxpY29uVmVydGV4Om5ldyBJY29uVmVydGV4QnVmZmVyKGUuaWNvblZlcnRleCksaWNvbkVsZW1lbnQ6bmV3IEljb25FbGVtZW50QnVmZmVyKGUuaWNvbkVsZW1lbnQpLGNpcmNsZVZlcnRleDpuZXcgQ2lyY2xlVmVydGV4QnVmZmVyKGUuY2lyY2xlVmVydGV4KSxjaXJjbGVFbGVtZW50Om5ldyBDaXJjbGVFbGVtZW50QnVmZmVyKGUuY2lyY2xlRWxlbWVudCksZmlsbFZlcnRleDpuZXcgRmlsbFZlcnRleEJ1ZmZlcihlLmZpbGxWZXJ0ZXgpLGZpbGxFbGVtZW50Om5ldyBGaWxsRWxlbWVudEJ1ZmZlcihlLmZpbGxFbGVtZW50KSxvdXRsaW5lRWxlbWVudDpuZXcgT3V0bGluZUVsZW1lbnRCdWZmZXIoZS5vdXRsaW5lRWxlbWVudCksbGluZVZlcnRleDpuZXcgTGluZVZlcnRleEJ1ZmZlcihlLmxpbmVWZXJ0ZXgpLGxpbmVFbGVtZW50Om5ldyBMaW5lRWxlbWVudEJ1ZmZlcihlLmxpbmVFbGVtZW50KSxjb2xsaXNpb25Cb3hWZXJ0ZXg6bmV3IENvbGxpc2lvbkJveFZlcnRleEJ1ZmZlcihlLmNvbGxpc2lvbkJveFZlcnRleCl9fTtcbn0se1wiLi9jaXJjbGVfdmVydGV4X2J1ZmZlclwiOjMsXCIuL2NvbGxpc2lvbl9ib3hfdmVydGV4X2J1ZmZlclwiOjQsXCIuL2ZpbGxfdmVydGV4X2J1ZmZlclwiOjUsXCIuL2dseXBoX3ZlcnRleF9idWZmZXJcIjo2LFwiLi9pY29uX3ZlcnRleF9idWZmZXJcIjo3LFwiLi9saW5lX2VsZW1lbnRfYnVmZmVyXCI6OCxcIi4vbGluZV92ZXJ0ZXhfYnVmZmVyXCI6OSxcIi4vb3V0bGluZV9lbGVtZW50X2J1ZmZlclwiOjEwLFwiLi90cmlhbmdsZV9lbGVtZW50X2J1ZmZlclwiOjExfV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBDaXJjbGVWZXJ0ZXhCdWZmZXIoZSl7QnVmZmVyLmNhbGwodGhpcyxlKX12YXIgdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpLEJ1ZmZlcj1yZXF1aXJlKFwiLi9idWZmZXJcIik7bW9kdWxlLmV4cG9ydHM9Q2lyY2xlVmVydGV4QnVmZmVyLENpcmNsZVZlcnRleEJ1ZmZlci5wcm90b3R5cGU9dXRpbC5pbmhlcml0KEJ1ZmZlcix7ZGVmYXVsdExlbmd0aDozMjc2OCxpdGVtU2l6ZTo0LGFkZDpmdW5jdGlvbihlLHQsaSxyKXt2YXIgZj10aGlzLnBvcyxzPWYvMjt0aGlzLnJlc2l6ZSgpLHRoaXMuc2hvcnRzW3MrMF09MiplKyhpKzEpLzIsdGhpcy5zaG9ydHNbcysxXT0yKnQrKHIrMSkvMix0aGlzLnBvcys9dGhpcy5pdGVtU2l6ZX0sYmluZDpmdW5jdGlvbihlLHQsaSl7QnVmZmVyLnByb3RvdHlwZS5iaW5kLmNhbGwodGhpcyxlKSxlLnZlcnRleEF0dHJpYlBvaW50ZXIodC5hX3BvcywyLGUuU0hPUlQsITEsdGhpcy5pdGVtU2l6ZSxpKzApfX0pO1xufSx7XCIuLi8uLi91dGlsL3V0aWxcIjoxMDYsXCIuL2J1ZmZlclwiOjF9XSw0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIENvbGxpc2lvbkJveFZlcnRleEJ1ZmZlcih0KXtCdWZmZXIuY2FsbCh0aGlzLHQpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi8uLi91dGlsL3V0aWxcIiksQnVmZmVyPXJlcXVpcmUoXCIuL2J1ZmZlclwiKTttb2R1bGUuZXhwb3J0cz1Db2xsaXNpb25Cb3hWZXJ0ZXhCdWZmZXIsQ29sbGlzaW9uQm94VmVydGV4QnVmZmVyLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQnVmZmVyLHtpdGVtU2l6ZToxMixkZWZhdWx0TGVuZ3RoOjMyNzY4LGFkZDpmdW5jdGlvbih0LGksZSxyKXt2YXIgcz10aGlzLnBvcyxvPXMvMix1PXRoaXMuaW5kZXg7cmV0dXJuIHRoaXMucmVzaXplKCksdGhpcy5zaG9ydHNbbyswXT10LngsdGhpcy5zaG9ydHNbbysxXT10LnksdGhpcy5zaG9ydHNbbysyXT1NYXRoLnJvdW5kKGkueCksdGhpcy5zaG9ydHNbbyszXT1NYXRoLnJvdW5kKGkueSksdGhpcy51Ynl0ZXNbcys4XT1NYXRoLmZsb29yKDEwKmUpLHRoaXMudWJ5dGVzW3MrOV09TWF0aC5mbG9vcigxMCpyKSx0aGlzLnBvcys9dGhpcy5pdGVtU2l6ZSx1fX0pO1xufSx7XCIuLi8uLi91dGlsL3V0aWxcIjoxMDYsXCIuL2J1ZmZlclwiOjF9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEZpbGxWZXJ0ZXhCdWZmZXIoZSl7QnVmZmVyLmNhbGwodGhpcyxlKX12YXIgdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpLEJ1ZmZlcj1yZXF1aXJlKFwiLi9idWZmZXJcIik7bW9kdWxlLmV4cG9ydHM9RmlsbFZlcnRleEJ1ZmZlcixGaWxsVmVydGV4QnVmZmVyLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQnVmZmVyLHtpdGVtU2l6ZTo0LGFkZDpmdW5jdGlvbihlLGkpe3ZhciB0PXRoaXMucG9zLzI7dGhpcy5yZXNpemUoKSx0aGlzLnNob3J0c1t0KzBdPWUsdGhpcy5zaG9ydHNbdCsxXT1pLHRoaXMucG9zKz10aGlzLml0ZW1TaXplfX0pO1xufSx7XCIuLi8uLi91dGlsL3V0aWxcIjoxMDYsXCIuL2J1ZmZlclwiOjF9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEdseXBoVmVydGV4QnVmZmVyKHQpe0J1ZmZlci5jYWxsKHRoaXMsdCl9dmFyIHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKSxCdWZmZXI9cmVxdWlyZShcIi4vYnVmZmVyXCIpO21vZHVsZS5leHBvcnRzPUdseXBoVmVydGV4QnVmZmVyLEdseXBoVmVydGV4QnVmZmVyLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQnVmZmVyLHtkZWZhdWx0TGVuZ3RoOjMyNzY4LGl0ZW1TaXplOjE2LGFkZDpmdW5jdGlvbih0LGUscixpLHMsaCxvLGYsdSl7dmFyIGE9dGhpcy5wb3MsbD1hLzI7dGhpcy5yZXNpemUoKSx0aGlzLnNob3J0c1tsKzBdPXQsdGhpcy5zaG9ydHNbbCsxXT1lLHRoaXMuc2hvcnRzW2wrMl09TWF0aC5yb3VuZCg2NCpyKSx0aGlzLnNob3J0c1tsKzNdPU1hdGgucm91bmQoNjQqaSksdGhpcy51Ynl0ZXNbYSs4XT1NYXRoLmZsb29yKHMvNCksdGhpcy51Ynl0ZXNbYSs5XT1NYXRoLmZsb29yKGgvNCksdGhpcy51Ynl0ZXNbYSsxMF09TWF0aC5mbG9vcigxMCp1KSx0aGlzLnVieXRlc1thKzEyXT1NYXRoLmZsb29yKDEwKm8pLHRoaXMudWJ5dGVzW2ErMTNdPU1hdGguZmxvb3IoMTAqTWF0aC5taW4oZiwyNSkpLHRoaXMucG9zKz10aGlzLml0ZW1TaXplfSxiaW5kOmZ1bmN0aW9uKHQsZSxyKXtCdWZmZXIucHJvdG90eXBlLmJpbmQuY2FsbCh0aGlzLHQpO3ZhciBpPXRoaXMuaXRlbVNpemU7dC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuYV9wb3MsMix0LlNIT1JULCExLGksciswKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoZS5hX29mZnNldCwyLHQuU0hPUlQsITEsaSxyKzQpLHQudmVydGV4QXR0cmliUG9pbnRlcihlLmFfZGF0YTEsNCx0LlVOU0lHTkVEX0JZVEUsITEsaSxyKzgpLHQudmVydGV4QXR0cmliUG9pbnRlcihlLmFfZGF0YTIsMix0LlVOU0lHTkVEX0JZVEUsITEsaSxyKzEyKX19KTtcbn0se1wiLi4vLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9idWZmZXJcIjoxfV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBJY29uVmVydGV4QnVmZmVyKHQpe0J1ZmZlci5jYWxsKHRoaXMsdCl9dmFyIHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKSxCdWZmZXI9cmVxdWlyZShcIi4vYnVmZmVyXCIpO21vZHVsZS5leHBvcnRzPUljb25WZXJ0ZXhCdWZmZXIsSWNvblZlcnRleEJ1ZmZlci5wcm90b3R5cGU9dXRpbC5pbmhlcml0KEJ1ZmZlcix7ZGVmYXVsdExlbmd0aDozMjc2OCxpdGVtU2l6ZToxNixhZGQ6ZnVuY3Rpb24odCxlLGkscixzLG8saCx1LGYpe3ZhciBhPXRoaXMucG9zLG49YS8yO3RoaXMucmVzaXplKCksdGhpcy5zaG9ydHNbbiswXT10LHRoaXMuc2hvcnRzW24rMV09ZSx0aGlzLnNob3J0c1tuKzJdPU1hdGgucm91bmQoNjQqaSksdGhpcy5zaG9ydHNbbiszXT1NYXRoLnJvdW5kKDY0KnIpLHRoaXMudWJ5dGVzW2ErOF09cy80LHRoaXMudWJ5dGVzW2ErOV09by80LHRoaXMudWJ5dGVzW2ErMTBdPU1hdGguZmxvb3IoMTAqKGZ8fDApKSx0aGlzLnVieXRlc1thKzEyXT1NYXRoLmZsb29yKDEwKihofHwwKSksdGhpcy51Ynl0ZXNbYSsxM109TWF0aC5mbG9vcigxMCpNYXRoLm1pbih1fHwyNSwyNSkpLHRoaXMucG9zKz10aGlzLml0ZW1TaXplfSxiaW5kOmZ1bmN0aW9uKHQsZSxpKXtCdWZmZXIucHJvdG90eXBlLmJpbmQuY2FsbCh0aGlzLHQpO3ZhciByPXRoaXMuaXRlbVNpemU7dC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuYV9wb3MsMix0LlNIT1JULCExLHIsaSswKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoZS5hX29mZnNldCwyLHQuU0hPUlQsITEscixpKzQpLHQudmVydGV4QXR0cmliUG9pbnRlcihlLmFfZGF0YTEsNCx0LlVOU0lHTkVEX0JZVEUsITEscixpKzgpLHQudmVydGV4QXR0cmliUG9pbnRlcihlLmFfZGF0YTIsMix0LlVOU0lHTkVEX0JZVEUsITEscixpKzEyKX19KTtcbn0se1wiLi4vLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9idWZmZXJcIjoxfV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBMaW5lRWxlbWVudEJ1ZmZlcihlKXtCdWZmZXIuY2FsbCh0aGlzLGUpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi8uLi91dGlsL3V0aWxcIiksQnVmZmVyPXJlcXVpcmUoXCIuL2J1ZmZlclwiKTttb2R1bGUuZXhwb3J0cz1MaW5lRWxlbWVudEJ1ZmZlcixMaW5lRWxlbWVudEJ1ZmZlci5wcm90b3R5cGU9dXRpbC5pbmhlcml0KEJ1ZmZlcix7aXRlbVNpemU6NixhcnJheVR5cGU6XCJFTEVNRU5UX0FSUkFZX0JVRkZFUlwiLGFkZDpmdW5jdGlvbihlLHQsaSl7dmFyIHI9dGhpcy5wb3MvMjt0aGlzLnJlc2l6ZSgpLHRoaXMudXNob3J0c1tyKzBdPWUsdGhpcy51c2hvcnRzW3IrMV09dCx0aGlzLnVzaG9ydHNbcisyXT1pLHRoaXMucG9zKz10aGlzLml0ZW1TaXplfX0pO1xufSx7XCIuLi8uLi91dGlsL3V0aWxcIjoxMDYsXCIuL2J1ZmZlclwiOjF9XSw5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIExpbmVWZXJ0ZXhCdWZmZXIoZSl7QnVmZmVyLmNhbGwodGhpcyxlKX12YXIgdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpLEJ1ZmZlcj1yZXF1aXJlKFwiLi9idWZmZXJcIik7bW9kdWxlLmV4cG9ydHM9TGluZVZlcnRleEJ1ZmZlcixMaW5lVmVydGV4QnVmZmVyLmV4dHJ1ZGVTY2FsZT02MyxMaW5lVmVydGV4QnVmZmVyLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQnVmZmVyLHtpdGVtU2l6ZTo4LGRlZmF1bHRMZW5ndGg6MzI3NjgsYWRkOmZ1bmN0aW9uKGUsdCxyLGkscyl7dmFyIHU9dGhpcy5wb3MsZj11LzIsaD10aGlzLmluZGV4LG89TGluZVZlcnRleEJ1ZmZlci5leHRydWRlU2NhbGU7cmV0dXJuIHRoaXMucmVzaXplKCksdGhpcy5zaG9ydHNbZiswXT0yKk1hdGguZmxvb3IoZS54KXxyLHRoaXMuc2hvcnRzW2YrMV09MipNYXRoLmZsb29yKGUueSl8aSx0aGlzLmJ5dGVzW3UrNF09TWF0aC5yb3VuZChvKnQueCksdGhpcy5ieXRlc1t1KzVdPU1hdGgucm91bmQobyp0LnkpLHRoaXMuYnl0ZXNbdSs2XT0oc3x8MCkvMTI4LHRoaXMuYnl0ZXNbdSs3XT0oc3x8MCklMTI4LHRoaXMucG9zKz10aGlzLml0ZW1TaXplLGh9fSk7XG59LHtcIi4uLy4uL3V0aWwvdXRpbFwiOjEwNixcIi4vYnVmZmVyXCI6MX1dLDEwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIE91dGxpbmVFbGVtZW50QnVmZmVyKGUpe0J1ZmZlci5jYWxsKHRoaXMsZSl9dmFyIHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKSxCdWZmZXI9cmVxdWlyZShcIi4vYnVmZmVyXCIpO21vZHVsZS5leHBvcnRzPU91dGxpbmVFbGVtZW50QnVmZmVyLE91dGxpbmVFbGVtZW50QnVmZmVyLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQnVmZmVyLHtpdGVtU2l6ZTo0LGFycmF5VHlwZTpcIkVMRU1FTlRfQVJSQVlfQlVGRkVSXCIsYWRkOmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5wb3MvMjt0aGlzLnJlc2l6ZSgpLHRoaXMudXNob3J0c1tpKzBdPWUsdGhpcy51c2hvcnRzW2krMV09dCx0aGlzLnBvcys9dGhpcy5pdGVtU2l6ZX19KTtcbn0se1wiLi4vLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9idWZmZXJcIjoxfV0sMTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gVHJpYW5nbGVFbGVtZW50QnVmZmVyKGUpe0J1ZmZlci5jYWxsKHRoaXMsZSl9dmFyIHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKSxCdWZmZXI9cmVxdWlyZShcIi4vYnVmZmVyXCIpO21vZHVsZS5leHBvcnRzPVRyaWFuZ2xlRWxlbWVudEJ1ZmZlcixUcmlhbmdsZUVsZW1lbnRCdWZmZXIucHJvdG90eXBlPXV0aWwuaW5oZXJpdChCdWZmZXIse2l0ZW1TaXplOjYsYXJyYXlUeXBlOlwiRUxFTUVOVF9BUlJBWV9CVUZGRVJcIixhZGQ6ZnVuY3Rpb24oZSx0LGkpe3ZhciByPXRoaXMucG9zLzI7dGhpcy5yZXNpemUoKSx0aGlzLnVzaG9ydHNbciswXT1lLHRoaXMudXNob3J0c1tyKzFdPXQsdGhpcy51c2hvcnRzW3IrMl09aSx0aGlzLnBvcys9dGhpcy5pdGVtU2l6ZX19KTtcbn0se1wiLi4vLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9idWZmZXJcIjoxfV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQ2lyY2xlQnVja2V0KGUpe3RoaXMuYnVmZmVycz1lLHRoaXMuZWxlbWVudEdyb3Vwcz1uZXcgRWxlbWVudEdyb3VwcyhlLmNpcmNsZVZlcnRleCxlLmNpcmNsZUVsZW1lbnQpfXZhciBFbGVtZW50R3JvdXBzPXJlcXVpcmUoXCIuL2VsZW1lbnRfZ3JvdXBzXCIpO21vZHVsZS5leHBvcnRzPUNpcmNsZUJ1Y2tldCxDaXJjbGVCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmVzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTQwOTYscj0wO3I8dGhpcy5mZWF0dXJlcy5sZW5ndGg7cisrKWZvcih2YXIgdD10aGlzLmZlYXR1cmVzW3JdLmxvYWRHZW9tZXRyeSgpWzBdLHM9MDtzPHQubGVuZ3RoO3MrKyl7dGhpcy5lbGVtZW50R3JvdXBzLm1ha2VSb29tRm9yKDYpO3ZhciB1PXRbc10ueCxpPXRbc10ueTtpZighKDA+dXx8dT49ZXx8MD5pfHxpPj1lKSl7dmFyIGw9dGhpcy5idWZmZXJzLmNpcmNsZVZlcnRleC5pbmRleC10aGlzLmVsZW1lbnRHcm91cHMuY3VycmVudC52ZXJ0ZXhTdGFydEluZGV4O3RoaXMuYnVmZmVycy5jaXJjbGVWZXJ0ZXguYWRkKHUsaSwtMSwtMSksdGhpcy5idWZmZXJzLmNpcmNsZVZlcnRleC5hZGQodSxpLDEsLTEpLHRoaXMuYnVmZmVycy5jaXJjbGVWZXJ0ZXguYWRkKHUsaSwxLDEpLHRoaXMuYnVmZmVycy5jaXJjbGVWZXJ0ZXguYWRkKHUsaSwtMSwxKSx0aGlzLmVsZW1lbnRHcm91cHMuZWxlbWVudEJ1ZmZlci5hZGQobCxsKzEsbCsyKSx0aGlzLmVsZW1lbnRHcm91cHMuZWxlbWVudEJ1ZmZlci5hZGQobCxsKzMsbCsyKSx0aGlzLmVsZW1lbnRHcm91cHMuY3VycmVudC52ZXJ0ZXhMZW5ndGgrPTQsdGhpcy5lbGVtZW50R3JvdXBzLmN1cnJlbnQuZWxlbWVudExlbmd0aCs9Mn19fTtcbn0se1wiLi9lbGVtZW50X2dyb3Vwc1wiOjE0fV0sMTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gY3JlYXRlQnVja2V0KGUsdCxpLHIsbCl7dmFyIGM9bmV3IFN0eWxlRGVjbGFyYXRpb25TZXQoXCJsYXlvdXRcIixlLnR5cGUsZS5sYXlvdXQse30pLnZhbHVlcygpLGE9e2xhc3RJbnRlZ2VyWm9vbToxLzAsbGFzdEludGVnZXJab29tVGltZTowLGxhc3Rab29tOjB9LHU9e307Zm9yKHZhciBvIGluIGMpdVtvXT1jW29dLmNhbGN1bGF0ZShpLGEpO1wic3ltYm9sXCI9PT1lLnR5cGUmJihjW1widGV4dC1zaXplXCJdJiYodVtcInRleHQtbWF4LXNpemVcIl09Y1tcInRleHQtc2l6ZVwiXS5jYWxjdWxhdGUoMTgsYSksdVtcInRleHQtc2l6ZVwiXT1jW1widGV4dC1zaXplXCJdLmNhbGN1bGF0ZShpKzEsYSkpLGNbXCJpY29uLXNpemVcIl0mJih1W1wiaWNvbi1tYXgtc2l6ZVwiXT1jW1wiaWNvbi1zaXplXCJdLmNhbGN1bGF0ZSgxOCxhKSx1W1wiaWNvbi1zaXplXCJdPWNbXCJpY29uLXNpemVcIl0uY2FsY3VsYXRlKGkrMSxhKSkpO3ZhciBzPVwibGluZVwiPT09ZS50eXBlP0xpbmVCdWNrZXQ6XCJmaWxsXCI9PT1lLnR5cGU/RmlsbEJ1Y2tldDpcInN5bWJvbFwiPT09ZS50eXBlP1N5bWJvbEJ1Y2tldDpcImNpcmNsZVwiPT09ZS50eXBlP0NpcmNsZUJ1Y2tldDpudWxsLG49bmV3IHModCxuZXcgTGF5b3V0UHJvcGVydGllc1tlLnR5cGVdKHUpLHIsaSxsKTtyZXR1cm4gbi5pZD1lLmlkLG4udHlwZT1lLnR5cGUsbltcInNvdXJjZS1sYXllclwiXT1lW1wic291cmNlLWxheWVyXCJdLG4uaW50ZXJhY3RpdmU9ZS5pbnRlcmFjdGl2ZSxuLm1pblpvb209ZS5taW56b29tLG4ubWF4Wm9vbT1lLm1heHpvb20sbi5maWx0ZXI9ZmVhdHVyZUZpbHRlcihlLmZpbHRlciksbi5mZWF0dXJlcz1bXSxufW1vZHVsZS5leHBvcnRzPWNyZWF0ZUJ1Y2tldDt2YXIgTGluZUJ1Y2tldD1yZXF1aXJlKFwiLi9saW5lX2J1Y2tldFwiKSxGaWxsQnVja2V0PXJlcXVpcmUoXCIuL2ZpbGxfYnVja2V0XCIpLFN5bWJvbEJ1Y2tldD1yZXF1aXJlKFwiLi9zeW1ib2xfYnVja2V0XCIpLENpcmNsZUJ1Y2tldD1yZXF1aXJlKFwiLi9jaXJjbGVfYnVja2V0XCIpLExheW91dFByb3BlcnRpZXM9cmVxdWlyZShcIi4uL3N0eWxlL2xheW91dF9wcm9wZXJ0aWVzXCIpLGZlYXR1cmVGaWx0ZXI9cmVxdWlyZShcImZlYXR1cmUtZmlsdGVyXCIpLFN0eWxlRGVjbGFyYXRpb25TZXQ9cmVxdWlyZShcIi4uL3N0eWxlL3N0eWxlX2RlY2xhcmF0aW9uX3NldFwiKTtcbn0se1wiLi4vc3R5bGUvbGF5b3V0X3Byb3BlcnRpZXNcIjo1MyxcIi4uL3N0eWxlL3N0eWxlX2RlY2xhcmF0aW9uX3NldFwiOjU5LFwiLi9jaXJjbGVfYnVja2V0XCI6MTIsXCIuL2ZpbGxfYnVja2V0XCI6MTYsXCIuL2xpbmVfYnVja2V0XCI6MTcsXCIuL3N5bWJvbF9idWNrZXRcIjoxOCxcImZlYXR1cmUtZmlsdGVyXCI6MTA4fV0sMTQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gRWxlbWVudEdyb3VwcyhlLHQsbil7dGhpcy52ZXJ0ZXhCdWZmZXI9ZSx0aGlzLmVsZW1lbnRCdWZmZXI9dCx0aGlzLnNlY29uZEVsZW1lbnRCdWZmZXI9bix0aGlzLmdyb3Vwcz1bXX1mdW5jdGlvbiBFbGVtZW50R3JvdXAoZSx0LG4pe3RoaXMudmVydGV4U3RhcnRJbmRleD1lLHRoaXMuZWxlbWVudFN0YXJ0SW5kZXg9dCx0aGlzLnNlY29uZEVsZW1lbnRTdGFydEluZGV4PW4sdGhpcy5lbGVtZW50TGVuZ3RoPTAsdGhpcy52ZXJ0ZXhMZW5ndGg9MCx0aGlzLnNlY29uZEVsZW1lbnRMZW5ndGg9MH1tb2R1bGUuZXhwb3J0cz1FbGVtZW50R3JvdXBzLEVsZW1lbnRHcm91cHMucHJvdG90eXBlLm1ha2VSb29tRm9yPWZ1bmN0aW9uKGUpeyghdGhpcy5jdXJyZW50fHx0aGlzLmN1cnJlbnQudmVydGV4TGVuZ3RoK2U+NjU1MzUpJiYodGhpcy5jdXJyZW50PW5ldyBFbGVtZW50R3JvdXAodGhpcy52ZXJ0ZXhCdWZmZXIuaW5kZXgsdGhpcy5lbGVtZW50QnVmZmVyJiZ0aGlzLmVsZW1lbnRCdWZmZXIuaW5kZXgsdGhpcy5zZWNvbmRFbGVtZW50QnVmZmVyJiZ0aGlzLnNlY29uZEVsZW1lbnRCdWZmZXIuaW5kZXgpLHRoaXMuZ3JvdXBzLnB1c2godGhpcy5jdXJyZW50KSl9O1xufSx7fV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gRmVhdHVyZVRyZWUodCxlKXt0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQuei1NYXRoLmxvZyhlKS9NYXRoLkxOMix0aGlzLnJ0cmVlPXJidXNoKDkpLHRoaXMudG9CZUluc2VydGVkPVtdfWZ1bmN0aW9uIGdlb21ldHJ5SW50ZXJzZWN0c0JveCh0LGUsbil7cmV0dXJuXCJQb2ludFwiPT09ZT9wb2ludEludGVyc2VjdHNCb3godCxuKTpcIkxpbmVTdHJpbmdcIj09PWU/bGluZUludGVyc2VjdHNCb3godCxuKTpcIlBvbHlnb25cIj09PWU/cG9seUludGVyc2VjdHNCb3godCxuKXx8bGluZUludGVyc2VjdHNCb3godCxuKTohMX1mdW5jdGlvbiBwb2x5SW50ZXJzZWN0c0JveCh0LGUpe3JldHVybiBwb2x5Q29udGFpbnNQb2ludCh0LG5ldyBQb2ludChlWzBdLGVbMV0pKXx8cG9seUNvbnRhaW5zUG9pbnQodCxuZXcgUG9pbnQoZVswXSxlWzNdKSl8fHBvbHlDb250YWluc1BvaW50KHQsbmV3IFBvaW50KGVbMl0sZVsxXSkpfHxwb2x5Q29udGFpbnNQb2ludCh0LG5ldyBQb2ludChlWzJdLGVbM10pKT8hMDpsaW5lSW50ZXJzZWN0c0JveCh0LGUpfWZ1bmN0aW9uIGxpbmVJbnRlcnNlY3RzQm94KHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZm9yKHZhciByPXRbbl0sbz0wLGk9ci5sZW5ndGgtMTtvPHIubGVuZ3RoO2k9bysrKXt2YXIgcz1yW29dLGE9cltpXSx1PW5ldyBQb2ludChzLnkscy54KSxsPW5ldyBQb2ludChhLnksYS54KTtpZihzZWdtZW50Q3Jvc3Nlc0hvcml6b250YWwocyxhLGVbMF0sZVsyXSxlWzFdKXx8c2VnbWVudENyb3NzZXNIb3Jpem9udGFsKHMsYSxlWzBdLGVbMl0sZVszXSl8fHNlZ21lbnRDcm9zc2VzSG9yaXpvbnRhbCh1LGwsZVsxXSxlWzNdLGVbMF0pfHxzZWdtZW50Q3Jvc3Nlc0hvcml6b250YWwodSxsLGVbMV0sZVszXSxlWzJdKSlyZXR1cm4hMH1yZXR1cm4gcG9pbnRJbnRlcnNlY3RzQm94KHQsZSl9ZnVuY3Rpb24gc2VnbWVudENyb3NzZXNIb3Jpem9udGFsKHQsZSxuLHIsbyl7aWYoZS55PT09dC55KXJldHVybiBlLnk9PT1vJiZNYXRoLm1pbih0LngsZS54KTw9ciYmTWF0aC5tYXgodC54LGUueCk+PW47dmFyIGk9KG8tdC55KS8oZS55LXQueSkscz10LngraSooZS54LXQueCk7cmV0dXJuIHM+PW4mJnI+PXMmJjE+PWkmJmk+PTB9ZnVuY3Rpb24gcG9pbnRJbnRlcnNlY3RzQm94KHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZm9yKHZhciByPXRbbl0sbz0wO288ci5sZW5ndGg7bysrKWlmKHJbb10ueD49ZVswXSYmcltvXS55Pj1lWzFdJiZyW29dLng8PWVbMl0mJnJbb10ueTw9ZVszXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBnZW9tZXRyeUNvbnRhaW5zUG9pbnQodCxlLG4scil7cmV0dXJuXCJQb2ludFwiPT09ZT9wb2ludENvbnRhaW5zUG9pbnQodCxuLHIpOlwiTGluZVN0cmluZ1wiPT09ZT9saW5lQ29udGFpbnNQb2ludCh0LG4scik6XCJQb2x5Z29uXCI9PT1lP3BvbHlDb250YWluc1BvaW50KHQsbil8fGxpbmVDb250YWluc1BvaW50KHQsbixyKTohMX1mdW5jdGlvbiBkaXN0VG9TZWdtZW50U3F1YXJlZCh0LGUsbil7dmFyIHI9ZS5kaXN0U3FyKG4pO2lmKDA9PT1yKXJldHVybiB0LmRpc3RTcXIoZSk7dmFyIG89KCh0LngtZS54KSoobi54LWUueCkrKHQueS1lLnkpKihuLnktZS55KSkvcjtyZXR1cm4gMD5vP3QuZGlzdFNxcihlKTpvPjE/dC5kaXN0U3FyKG4pOnQuZGlzdFNxcihuLnN1YihlKS5fbXVsdChvKS5fYWRkKGUpKX1mdW5jdGlvbiBsaW5lQ29udGFpbnNQb2ludCh0LGUsbil7Zm9yKHZhciByPW4qbixvPTA7bzx0Lmxlbmd0aDtvKyspZm9yKHZhciBpPXRbb10scz0xO3M8aS5sZW5ndGg7cysrKXt2YXIgYT1pW3MtMV0sdT1pW3NdO2lmKGRpc3RUb1NlZ21lbnRTcXVhcmVkKGUsYSx1KTxyKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIHBvbHlDb250YWluc1BvaW50KHQsZSl7Zm9yKHZhciBuLHIsbyxpPSExLHM9MDtzPHQubGVuZ3RoO3MrKyl7bj10W3NdO2Zvcih2YXIgYT0wLHU9bi5sZW5ndGgtMTthPG4ubGVuZ3RoO3U9YSsrKXI9blthXSxvPW5bdV0sci55PmUueSE9by55PmUueSYmZS54PChvLngtci54KSooZS55LXIueSkvKG8ueS1yLnkpK3IueCYmKGk9IWkpfXJldHVybiBpfWZ1bmN0aW9uIHBvaW50Q29udGFpbnNQb2ludCh0LGUsbil7Zm9yKHZhciByPW4qbixvPTA7bzx0Lmxlbmd0aDtvKyspZm9yKHZhciBpPXRbb10scz0wO3M8aS5sZW5ndGg7cysrKWlmKGlbc10uZGlzdFNxcihlKTw9cilyZXR1cm4hMDtyZXR1cm4hMX12YXIgcmJ1c2g9cmVxdWlyZShcInJidXNoXCIpLFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKSx2dD1yZXF1aXJlKFwidmVjdG9yLXRpbGVcIiksdXRpbD1yZXF1aXJlKFwiLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPUZlYXR1cmVUcmVlLEZlYXR1cmVUcmVlLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCxlLG4pe3QubGF5ZXJzPWUsdC5mZWF0dXJlPW4sdGhpcy50b0JlSW5zZXJ0ZWQucHVzaCh0KX0sRmVhdHVyZVRyZWUucHJvdG90eXBlLl9sb2FkPWZ1bmN0aW9uKCl7dGhpcy5ydHJlZS5sb2FkKHRoaXMudG9CZUluc2VydGVkKSx0aGlzLnRvQmVJbnNlcnRlZD1bXX0sRmVhdHVyZVRyZWUucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQsZSl7dGhpcy50b0JlSW5zZXJ0ZWQubGVuZ3RoJiZ0aGlzLl9sb2FkKCk7dmFyIG4scixvPXQucGFyYW1zfHx7fSxpPXQueCxzPXQueSxhPVtdO1widW5kZWZpbmVkXCIhPXR5cGVvZiBpJiZcInVuZGVmaW5lZFwiIT10eXBlb2Ygcz8obj0oby5yYWRpdXN8fDApKih0LnRpbGVFeHRlbnR8fDQwOTYpL3Quc2NhbGUscj1baS1uLHMtbixpK24scytuXSk6cj1bdC5taW5YLHQubWluWSx0Lm1heFgsdC5tYXhZXTtmb3IodmFyIHU9dGhpcy5ydHJlZS5zZWFyY2gociksbD0wO2w8dS5sZW5ndGg7bCsrKXt2YXIgeT11W2xdLmZlYXR1cmUseD11W2xdLmxheWVycyxmPXZ0LlZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW3kudHlwZV07aWYoKCFvLiR0eXBlfHxmPT09by4kdHlwZSkmJighbnx8Z2VvbWV0cnlDb250YWluc1BvaW50KHkubG9hZEdlb21ldHJ5KCksZixuZXcgUG9pbnQoaSxzKSxuKSkmJmdlb21ldHJ5SW50ZXJzZWN0c0JveCh5LmxvYWRHZW9tZXRyeSgpLGYscikpe3ZhciBoPXkudG9HZW9KU09OKHRoaXMueCx0aGlzLnksdGhpcy56KTtvLmluY2x1ZGVHZW9tZXRyeXx8KGguZ2VvbWV0cnk9bnVsbCk7Zm9yKHZhciBkPTA7ZDx4Lmxlbmd0aDtkKyspe3ZhciBnPXhbZF07by5sYXllcklkcyYmby5sYXllcklkcy5pbmRleE9mKGcpPDB8fGEucHVzaCh1dGlsLmV4dGVuZCh7bGF5ZXI6Z30saCkpfX19ZShudWxsLGEpfTtcbn0se1wiLi4vdXRpbC91dGlsXCI6MTA2LFwicG9pbnQtZ2VvbWV0cnlcIjoxMzcsXCJyYnVzaFwiOjEzOSxcInZlY3Rvci10aWxlXCI6MTQ0fV0sMTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gRmlsbEJ1Y2tldChlKXt0aGlzLmJ1ZmZlcnM9ZSx0aGlzLmVsZW1lbnRHcm91cHM9bmV3IEVsZW1lbnRHcm91cHMoZS5maWxsVmVydGV4LGUuZmlsbEVsZW1lbnQsZS5vdXRsaW5lRWxlbWVudCl9dmFyIEVsZW1lbnRHcm91cHM9cmVxdWlyZShcIi4vZWxlbWVudF9ncm91cHNcIik7bW9kdWxlLmV4cG9ydHM9RmlsbEJ1Y2tldCxGaWxsQnVja2V0LnByb3RvdHlwZS5hZGRGZWF0dXJlcz1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmZlYXR1cmVzLHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIGw9ZVt0XSxyPWwubG9hZEdlb21ldHJ5KCk7ciYmdGhpcy5hZGRGZWF0dXJlKHIpfX0sRmlsbEJ1Y2tldC5wcm90b3R5cGUuYWRkRmVhdHVyZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl0aGlzLmFkZEZpbGwoZVt0XSl9LEZpbGxCdWNrZXQucHJvdG90eXBlLmFkZEZpbGw9ZnVuY3Rpb24oZSl7aWYoIShlLmxlbmd0aDwzKSl7dmFyIHQ9ZS5sZW5ndGg7dGhpcy5lbGVtZW50R3JvdXBzLm1ha2VSb29tRm9yKHQrMSk7Zm9yKHZhciBsLHIsbixpPXRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50LG89dGhpcy5idWZmZXJzLmZpbGxWZXJ0ZXgsdT10aGlzLmJ1ZmZlcnMuZmlsbEVsZW1lbnQscz10aGlzLmJ1ZmZlcnMub3V0bGluZUVsZW1lbnQsZD1vLmluZGV4LWkudmVydGV4U3RhcnRJbmRleCxhPTA7YTxlLmxlbmd0aDthKyspcj1vLmluZGV4LWkudmVydGV4U3RhcnRJbmRleCxuPWVbYV0sby5hZGQobi54LG4ueSksaS52ZXJ0ZXhMZW5ndGgrKyxhPj0yJiYobi54IT09ZVswXS54fHxuLnkhPT1lWzBdLnkpJiYodS5hZGQoZCxsLHIpLGkuZWxlbWVudExlbmd0aCsrKSxhPj0xJiYocy5hZGQobCxyKSxpLnNlY29uZEVsZW1lbnRMZW5ndGgrKyksbD1yfX07XG59LHtcIi4vZWxlbWVudF9ncm91cHNcIjoxNH1dLDE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIExpbmVCdWNrZXQoZSx0KXt0aGlzLmJ1ZmZlcnM9ZSx0aGlzLmVsZW1lbnRHcm91cHM9bmV3IEVsZW1lbnRHcm91cHMoZS5saW5lVmVydGV4LGUubGluZUVsZW1lbnQpLHRoaXMubGF5b3V0UHJvcGVydGllcz10fXZhciBFbGVtZW50R3JvdXBzPXJlcXVpcmUoXCIuL2VsZW1lbnRfZ3JvdXBzXCIpO21vZHVsZS5leHBvcnRzPUxpbmVCdWNrZXQsTGluZUJ1Y2tldC5wcm90b3R5cGUuYWRkRmVhdHVyZXM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5mZWF0dXJlcyx0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciByPWVbdF0saT1yLmxvYWRHZW9tZXRyeSgpO2kmJnRoaXMuYWRkRmVhdHVyZShpKX19LExpbmVCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMubGF5b3V0UHJvcGVydGllcyxyPTA7cjxlLmxlbmd0aDtyKyspdGhpcy5hZGRMaW5lKGVbcl0sdFtcImxpbmUtam9pblwiXSx0W1wibGluZS1jYXBcIl0sdFtcImxpbmUtbWl0ZXItbGltaXRcIl0sdFtcImxpbmUtcm91bmQtbGltaXRcIl0pfSxMaW5lQnVja2V0LnByb3RvdHlwZS5hZGRMaW5lPWZ1bmN0aW9uKGUsdCxyLGkscyl7Zm9yKHZhciBuPWUubGVuZ3RoO24+MiYmZVtuLTFdLmVxdWFscyhlW24tMl0pOyluLS07aWYoIShlLmxlbmd0aDwyKSl7XCJiZXZlbFwiPT09dCYmKGk9MS4wNSk7dmFyIHU9ZVswXSxoPWVbbi0xXSxkPXUuZXF1YWxzKGgpO2lmKHRoaXMuZWxlbWVudEdyb3Vwcy5tYWtlUm9vbUZvcigxMCpuKSwyIT09bnx8IWQpe3ZhciBhLGwsbyxmLG0scCx4LHY9cixjPWQ/XCJidXR0XCI6cixWPTEsYj0wLF89ITA7dGhpcy5lMT10aGlzLmUyPXRoaXMuZTM9LTEsZCYmKGE9ZVtuLTJdLG09dS5zdWIoYSkuX3VuaXQoKS5fcGVycCgpKTtmb3IodmFyIHk9MDtuPnk7eSsrKWlmKG89ZCYmeT09PW4tMT9lWzFdOmVbeSsxXSwhb3x8IWVbeV0uZXF1YWxzKG8pKXttJiYoZj1tKSxhJiYobD1hKSxhPWVbeV0sbCYmKGIrPWEuZGlzdChsKSksbT1vP28uc3ViKGEpLl91bml0KCkuX3BlcnAoKTpmLGY9Znx8bTt2YXIgTD1mLmFkZChtKS5fdW5pdCgpLEM9TC54Km0ueCtMLnkqbS55LGc9MS9DLGs9bCYmbyxHPWs/dDpvP3Y6YztpZihrJiZcInJvdW5kXCI9PT1HJiYocz5nP0c9XCJtaXRlclwiOjI+PWcmJihHPVwiZmFrZXJvdW5kXCIpKSxcIm1pdGVyXCI9PT1HJiZnPmkmJihHPVwiYmV2ZWxcIiksXCJiZXZlbFwiPT09RyYmKGc+MiYmKEc9XCJmbGlwYmV2ZWxcIiksaT5nJiYoRz1cIm1pdGVyXCIpKSxcIm1pdGVyXCI9PT1HKUwuX211bHQoZyksdGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLEwsMCwwLCExKTtlbHNlIGlmKFwiZmxpcGJldmVsXCI9PT1HKXtpZihnPjEwMClMPW0uY2xvbmUoKTtlbHNle3ZhciBCPWYueCptLnktZi55Km0ueD4wPy0xOjEscT1nKmYuYWRkKG0pLm1hZygpL2Yuc3ViKG0pLm1hZygpO0wuX3BlcnAoKS5fbXVsdChxKkIpfXRoaXMuYWRkQ3VycmVudFZlcnRleChhLFYsYixMLDAsMCwhMSksVj0tVn1lbHNlIGlmKFwiYmV2ZWxcIj09PUd8fFwiZmFrZXJvdW5kXCI9PT1HKXt2YXIgUD1WKihmLngqbS55LWYueSptLngpPjAsUz0tTWF0aC5zcXJ0KGcqZy0xKTtpZihQPyh4PTAscD1TKToocD0wLHg9UyksX3x8dGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLGYscCx4LCExKSxcImZha2Vyb3VuZFwiPT09Ryl7Zm9yKHZhciBFLEY9TWF0aC5mbG9vcig4KiguNS0oQy0uNSkpKSxJPTA7Rj5JO0krKylFPW0ubXVsdCgoSSsxKS8oRisxKSkuX2FkZChmKS5fdW5pdCgpLHRoaXMuYWRkUGllU2xpY2VWZXJ0ZXgoYSxWLGIsRSxQKTt0aGlzLmFkZFBpZVNsaWNlVmVydGV4KGEsVixiLEwsUCk7Zm9yKHZhciBNPUYtMTtNPj0wO00tLSlFPWYubXVsdCgoTSsxKS8oRisxKSkuX2FkZChtKS5fdW5pdCgpLHRoaXMuYWRkUGllU2xpY2VWZXJ0ZXgoYSxWLGIsRSxQKX1vJiZ0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoYSxWLGIsbSwtcCwteCwhMSl9ZWxzZVwiYnV0dFwiPT09Rz8oX3x8dGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLGYsMCwwLCExKSxvJiZ0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoYSxWLGIsbSwwLDAsITEpKTpcInNxdWFyZVwiPT09Rz8oX3x8KHRoaXMuYWRkQ3VycmVudFZlcnRleChhLFYsYixmLDEsMSwhMSksdGhpcy5lMT10aGlzLmUyPS0xLFY9MSksbyYmdGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLG0sLTEsLTEsITEpKTpcInJvdW5kXCI9PT1HJiYoX3x8KHRoaXMuYWRkQ3VycmVudFZlcnRleChhLFYsYixmLDAsMCwhMSksdGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLGYsMSwxLCEwKSx0aGlzLmUxPXRoaXMuZTI9LTEsVj0xKSxvJiYodGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLG0sLTEsLTEsITApLHRoaXMuYWRkQ3VycmVudFZlcnRleChhLFYsYixtLDAsMCwhMSkpKTtfPSExfX19fSxMaW5lQnVja2V0LnByb3RvdHlwZS5hZGRDdXJyZW50VmVydGV4PWZ1bmN0aW9uKGUsdCxyLGkscyxuLHUpe3ZhciBoLGQ9dT8xOjAsYT10aGlzLmJ1ZmZlcnMubGluZVZlcnRleCxsPXRoaXMuYnVmZmVycy5saW5lRWxlbWVudCxvPXRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50LGY9dGhpcy5lbGVtZW50R3JvdXBzLmN1cnJlbnQudmVydGV4U3RhcnRJbmRleDtoPWkubXVsdCh0KSxzJiZoLl9zdWIoaS5wZXJwKCkuX211bHQocykpLHRoaXMuZTM9YS5hZGQoZSxoLGQsMCxyKS1mLHRoaXMuZTE+PTAmJnRoaXMuZTI+PTAmJihsLmFkZCh0aGlzLmUxLHRoaXMuZTIsdGhpcy5lMyksby5lbGVtZW50TGVuZ3RoKyspLHRoaXMuZTE9dGhpcy5lMix0aGlzLmUyPXRoaXMuZTMsaD1pLm11bHQoLXQpLG4mJmguX3N1YihpLnBlcnAoKS5fbXVsdChuKSksdGhpcy5lMz1hLmFkZChlLGgsZCwxLHIpLWYsdGhpcy5lMT49MCYmdGhpcy5lMj49MCYmKGwuYWRkKHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzKSxvLmVsZW1lbnRMZW5ndGgrKyksdGhpcy5lMT10aGlzLmUyLHRoaXMuZTI9dGhpcy5lMyxvLnZlcnRleExlbmd0aCs9Mn0sTGluZUJ1Y2tldC5wcm90b3R5cGUuYWRkUGllU2xpY2VWZXJ0ZXg9ZnVuY3Rpb24oZSx0LHIsaSxzKXt2YXIgbj10aGlzLmJ1ZmZlcnMubGluZVZlcnRleCx1PXRoaXMuYnVmZmVycy5saW5lRWxlbWVudCxoPXRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50LGQ9dGhpcy5lbGVtZW50R3JvdXBzLmN1cnJlbnQudmVydGV4U3RhcnRJbmRleCxhPXM7aT1pLm11bHQodCoocz8tMToxKSksdGhpcy5lMz1uLmFkZChlLGksMCxhLHIpLWQsaC52ZXJ0ZXhMZW5ndGgrPTEsdGhpcy5lMT49MCYmdGhpcy5lMj49MCYmKHUuYWRkKHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzKSxoLmVsZW1lbnRMZW5ndGgrKykscz90aGlzLmUyPXRoaXMuZTM6dGhpcy5lMT10aGlzLmUzfTtcbn0se1wiLi9lbGVtZW50X2dyb3Vwc1wiOjE0fV0sMTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3ltYm9sQnVja2V0KGUsdCxvLGkscyl7dGhpcy5idWZmZXJzPWUsdGhpcy5sYXlvdXRQcm9wZXJ0aWVzPXQsdGhpcy5vdmVyc2NhbGluZz1vLHRoaXMuem9vbT1pLHRoaXMuY29sbGlzaW9uRGVidWc9czt2YXIgbj01MTIqbyxhPTQwOTY7dGhpcy50aWxlUGl4ZWxSYXRpbz1hL24sdGhpcy5jb21wYXJlVGV4dD17fSx0aGlzLnN5bWJvbEluc3RhbmNlcz1bXX1mdW5jdGlvbiBTeW1ib2xJbnN0YW5jZShlLHQsbyxpLHMsbixhLGwscixjLGgsdSl7dGhpcy54PWUueCx0aGlzLnk9ZS55LHRoaXMuaGFzVGV4dD0hIW8sdGhpcy5oYXNJY29uPSEhaSx0aGlzLmhhc1RleHQmJih0aGlzLmdseXBoUXVhZHM9bj9nZXRHbHlwaFF1YWRzKGUsbyxhLHQscyxyKTpbXSx0aGlzLnRleHRDb2xsaXNpb25GZWF0dXJlPW5ldyBDb2xsaXNpb25GZWF0dXJlKHQsZSxvLGEsbCxyKSksdGhpcy5oYXNJY29uJiYodGhpcy5pY29uUXVhZHM9bj9nZXRJY29uUXVhZHMoZSxpLGMsdCxzLHUpOltdLHRoaXMuaWNvbkNvbGxpc2lvbkZlYXR1cmU9bmV3IENvbGxpc2lvbkZlYXR1cmUodCxlLGksYyxoLHUpKX12YXIgRWxlbWVudEdyb3Vwcz1yZXF1aXJlKFwiLi9lbGVtZW50X2dyb3Vwc1wiKSxBbmNob3I9cmVxdWlyZShcIi4uL3N5bWJvbC9hbmNob3JcIiksZ2V0QW5jaG9ycz1yZXF1aXJlKFwiLi4vc3ltYm9sL2dldF9hbmNob3JzXCIpLHJlc29sdmVUb2tlbnM9cmVxdWlyZShcIi4uL3V0aWwvdG9rZW5cIiksUXVhZHM9cmVxdWlyZShcIi4uL3N5bWJvbC9xdWFkc1wiKSxTaGFwaW5nPXJlcXVpcmUoXCIuLi9zeW1ib2wvc2hhcGluZ1wiKSxyZXNvbHZlVGV4dD1yZXF1aXJlKFwiLi4vc3ltYm9sL3Jlc29sdmVfdGV4dFwiKSxyZXNvbHZlSWNvbnM9cmVxdWlyZShcIi4uL3N5bWJvbC9yZXNvbHZlX2ljb25zXCIpLG1lcmdlTGluZXM9cmVxdWlyZShcIi4uL3N5bWJvbC9tZXJnZWxpbmVzXCIpLHNoYXBlVGV4dD1TaGFwaW5nLnNoYXBlVGV4dCxzaGFwZUljb249U2hhcGluZy5zaGFwZUljb24sZ2V0R2x5cGhRdWFkcz1RdWFkcy5nZXRHbHlwaFF1YWRzLGdldEljb25RdWFkcz1RdWFkcy5nZXRJY29uUXVhZHMsY2xpcExpbmU9cmVxdWlyZShcIi4uL3N5bWJvbC9jbGlwX2xpbmVcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpLENvbGxpc2lvbkZlYXR1cmU9cmVxdWlyZShcIi4uL3N5bWJvbC9jb2xsaXNpb25fZmVhdHVyZVwiKTttb2R1bGUuZXhwb3J0cz1TeW1ib2xCdWNrZXQsU3ltYm9sQnVja2V0LnByb3RvdHlwZS5uZWVkc1BsYWNlbWVudD0hMCxTeW1ib2xCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmVzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubGF5b3V0UHJvcGVydGllcyxvPXRoaXMuZmVhdHVyZXMsaT10aGlzLnRleHRGZWF0dXJlcyxzPS41LG49LjU7c3dpdGNoKHRbXCJ0ZXh0LWFuY2hvclwiXSl7Y2FzZVwicmlnaHRcIjpjYXNlXCJ0b3AtcmlnaHRcIjpjYXNlXCJib3R0b20tcmlnaHRcIjpzPTE7YnJlYWs7Y2FzZVwibGVmdFwiOmNhc2VcInRvcC1sZWZ0XCI6Y2FzZVwiYm90dG9tLWxlZnRcIjpzPTB9c3dpdGNoKHRbXCJ0ZXh0LWFuY2hvclwiXSl7Y2FzZVwiYm90dG9tXCI6Y2FzZVwiYm90dG9tLXJpZ2h0XCI6Y2FzZVwiYm90dG9tLWxlZnRcIjpuPTE7YnJlYWs7Y2FzZVwidG9wXCI6Y2FzZVwidG9wLXJpZ2h0XCI6Y2FzZVwidG9wLWxlZnRcIjpuPTB9Zm9yKHZhciBhPVwicmlnaHRcIj09PXRbXCJ0ZXh0LWp1c3RpZnlcIl0/MTpcImxlZnRcIj09PXRbXCJ0ZXh0LWp1c3RpZnlcIl0/MDouNSxsPTI0LHI9dFtcInRleHQtbGluZS1oZWlnaHRcIl0qbCxjPVwibGluZVwiIT09dFtcInN5bWJvbC1wbGFjZW1lbnRcIl0/dFtcInRleHQtbWF4LXdpZHRoXCJdKmw6MCxoPXRbXCJ0ZXh0LWxldHRlci1zcGFjaW5nXCJdKmwsdT1bdFtcInRleHQtb2Zmc2V0XCJdWzBdKmwsdFtcInRleHQtb2Zmc2V0XCJdWzFdKmxdLG09dFtcInRleHQtZm9udFwiXS5qb2luKFwiLFwiKSxwPVtdLHg9MDt4PG8ubGVuZ3RoO3grKylwLnB1c2gob1t4XS5sb2FkR2VvbWV0cnkoKSk7aWYoXCJsaW5lXCI9PT10W1wic3ltYm9sLXBsYWNlbWVudFwiXSl7dmFyIHk9bWVyZ2VMaW5lcyhvLGkscCk7cD15Lmdlb21ldHJpZXMsbz15LmZlYXR1cmVzLGk9eS50ZXh0RmVhdHVyZXN9Zm9yKHZhciBkLGcsZj0wO2Y8by5sZW5ndGg7ZisrKWlmKHBbZl0pe2lmKGQ9aVtmXT9zaGFwZVRleHQoaVtmXSx0aGlzLnN0YWNrc1ttXSxjLHIscyxuLGEsaCx1KTpudWxsLHRbXCJpY29uLWltYWdlXCJdKXt2YXIgYj1yZXNvbHZlVG9rZW5zKG9bZl0ucHJvcGVydGllcyx0W1wiaWNvbi1pbWFnZVwiXSksdj10aGlzLmljb25zW2JdO2c9c2hhcGVJY29uKHYsdCksdiYmKHZvaWQgMD09PXRoaXMuc2RmSWNvbnM/dGhpcy5zZGZJY29ucz12LnNkZjp0aGlzLnNkZkljb25zIT09di5zZGYmJmNvbnNvbGUud2FybihcIlN0eWxlIHNoZWV0IHdhcm5pbmc6IENhbm5vdCBtaXggU0RGIGFuZCBub24tU0RGIGljb25zIGluIG9uZSBidWNrZXRcIikpfWVsc2UgZz1udWxsOyhkfHxnKSYmdGhpcy5hZGRGZWF0dXJlKHBbZl0sZCxnKX10aGlzLnBsYWNlRmVhdHVyZXMoZSx0aGlzLmJ1ZmZlcnMsdGhpcy5jb2xsaXNpb25EZWJ1Zyl9LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuYWRkRmVhdHVyZT1mdW5jdGlvbihlLHQsbyl7dmFyIGk9dGhpcy5sYXlvdXRQcm9wZXJ0aWVzLHM9MjQsbj1pW1widGV4dC1zaXplXCJdL3MsYT10aGlzLnRpbGVQaXhlbFJhdGlvKm4sbD10aGlzLnRpbGVQaXhlbFJhdGlvKmlbXCJ0ZXh0LW1heC1zaXplXCJdL3Mscj10aGlzLnRpbGVQaXhlbFJhdGlvKmlbXCJpY29uLXNpemVcIl0sYz10aGlzLnRpbGVQaXhlbFJhdGlvKmlbXCJzeW1ib2wtc3BhY2luZ1wiXSxoPWlbXCJzeW1ib2wtYXZvaWQtZWRnZXNcIl0sdT1pW1widGV4dC1wYWRkaW5nXCJdKnRoaXMudGlsZVBpeGVsUmF0aW8sbT1pW1wiaWNvbi1wYWRkaW5nXCJdKnRoaXMudGlsZVBpeGVsUmF0aW8scD1pW1widGV4dC1tYXgtYW5nbGVcIl0vMTgwKk1hdGguUEkseD1cIm1hcFwiPT09aVtcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCJdJiZcImxpbmVcIj09PWlbXCJzeW1ib2wtcGxhY2VtZW50XCJdLHk9XCJtYXBcIj09PWlbXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiXSYmXCJsaW5lXCI9PT1pW1wic3ltYm9sLXBsYWNlbWVudFwiXSxkPWlbXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIl18fGlbXCJpY29uLWFsbG93LW92ZXJsYXBcIl18fGlbXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIl18fGlbXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIl0sZz1cImxpbmVcIj09PWlbXCJzeW1ib2wtcGxhY2VtZW50XCJdLGY9Yy8yO2cmJihlPWNsaXBMaW5lKGUsMCwwLDQwOTYsNDA5NikpO2Zvcih2YXIgYj0wO2I8ZS5sZW5ndGg7YisrKWZvcih2YXIgdj1lW2JdLEk9Zz9nZXRBbmNob3JzKHYsYyxwLHQsbyxzLGwsdGhpcy5vdmVyc2NhbGluZyk6W25ldyBBbmNob3IodlswXS54LHZbMF0ueSwwKV0sUz0wLEY9SS5sZW5ndGg7Rj5TO1MrKyl7dmFyIFA9SVtTXTtpZighKHQmJmcmJnRoaXMuYW5jaG9ySXNUb29DbG9zZSh0LnRleHQsZixQKSkpe3ZhciBNPSEoUC54PDB8fFAueD40MDk2fHxQLnk8MHx8UC55PjQwOTYpO2lmKCFofHxNKXt2YXIgaz1NfHxkO3RoaXMuc3ltYm9sSW5zdGFuY2VzLnB1c2gobmV3IFN5bWJvbEluc3RhbmNlKFAsdix0LG8saSxrLGEsdSx4LHIsbSx5KSl9fX19LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuYW5jaG9ySXNUb29DbG9zZT1mdW5jdGlvbihlLHQsbyl7dmFyIGk9dGhpcy5jb21wYXJlVGV4dDtpZihlIGluIGkpe2Zvcih2YXIgcz1pW2VdLG49cy5sZW5ndGgtMTtuPj0wO24tLSlpZihvLmRpc3Qoc1tuXSk8dClyZXR1cm4hMH1lbHNlIGlbZV09W107cmV0dXJuIGlbZV0ucHVzaChvKSwhMX0sU3ltYm9sQnVja2V0LnByb3RvdHlwZS5wbGFjZUZlYXR1cmVzPWZ1bmN0aW9uKGUsdCxvKXt0aGlzLmJ1ZmZlcnM9dDt2YXIgaT10aGlzLmVsZW1lbnRHcm91cHM9e3RleHQ6bmV3IEVsZW1lbnRHcm91cHModC5nbHlwaFZlcnRleCx0LmdseXBoRWxlbWVudCksaWNvbjpuZXcgRWxlbWVudEdyb3Vwcyh0Lmljb25WZXJ0ZXgsdC5pY29uRWxlbWVudCksc2RmSWNvbnM6dGhpcy5zZGZJY29uc30scz10aGlzLmxheW91dFByb3BlcnRpZXMsbj1lLm1heFNjYWxlO2kudGV4dFtcInRleHQtc2l6ZVwiXT1zW1widGV4dC1zaXplXCJdLGkuaWNvbltcImljb24tc2l6ZVwiXT1zW1wiaWNvbi1zaXplXCJdO3ZhciBhPVwibWFwXCI9PT1zW1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIl0mJlwibGluZVwiPT09c1tcInN5bWJvbC1wbGFjZW1lbnRcIl0sbD1cIm1hcFwiPT09c1tcImljb24tcm90YXRpb24tYWxpZ25tZW50XCJdJiZcImxpbmVcIj09PXNbXCJzeW1ib2wtcGxhY2VtZW50XCJdLHI9c1tcInRleHQtYWxsb3ctb3ZlcmxhcFwiXXx8c1tcImljb24tYWxsb3ctb3ZlcmxhcFwiXXx8c1tcInRleHQtaWdub3JlLXBsYWNlbWVudFwiXXx8c1tcImljb24taWdub3JlLXBsYWNlbWVudFwiXTtpZihyKXt2YXIgYz1lLmFuZ2xlLGg9TWF0aC5zaW4oYyksdT1NYXRoLmNvcyhjKTt0aGlzLnN5bWJvbEluc3RhbmNlcy5zb3J0KGZ1bmN0aW9uKGUsdCl7dmFyIG89aCplLngrdSplLnksaT1oKnQueCt1KnQueTtyZXR1cm4gaS1vfSl9Zm9yKHZhciBtPTA7bTx0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7bSsrKXt2YXIgcD10aGlzLnN5bWJvbEluc3RhbmNlc1ttXSx4PXAuaGFzVGV4dCx5PXAuaGFzSWNvbixkPXNbXCJ0ZXh0LW9wdGlvbmFsXCJdfHwheCxnPXNbXCJpY29uLW9wdGlvbmFsXCJdfHwheSxmPXgmJiFzW1widGV4dC1hbGxvdy1vdmVybGFwXCJdP2UucGxhY2VDb2xsaXNpb25GZWF0dXJlKHAudGV4dENvbGxpc2lvbkZlYXR1cmUpOmUubWluU2NhbGUsYj15JiYhc1tcImljb24tYWxsb3ctb3ZlcmxhcFwiXT9lLnBsYWNlQ29sbGlzaW9uRmVhdHVyZShwLmljb25Db2xsaXNpb25GZWF0dXJlKTplLm1pblNjYWxlO2R8fGc/IWcmJmY/Zj1NYXRoLm1heChiLGYpOiFkJiZiJiYoYj1NYXRoLm1heChiLGYpKTpiPWY9TWF0aC5tYXgoYixmKSx4JiYoc1tcInRleHQtaWdub3JlLXBsYWNlbWVudFwiXXx8ZS5pbnNlcnRDb2xsaXNpb25GZWF0dXJlKHAudGV4dENvbGxpc2lvbkZlYXR1cmUsZiksbj49ZiYmdGhpcy5hZGRTeW1ib2xzKHQuZ2x5cGhWZXJ0ZXgsdC5nbHlwaEVsZW1lbnQsaS50ZXh0LHAuZ2x5cGhRdWFkcyxmLHNbXCJ0ZXh0LWtlZXAtdXByaWdodFwiXSxhLGUuYW5nbGUpKSx5JiYoc1tcImljb24taWdub3JlLXBsYWNlbWVudFwiXXx8ZS5pbnNlcnRDb2xsaXNpb25GZWF0dXJlKHAuaWNvbkNvbGxpc2lvbkZlYXR1cmUsYiksbj49YiYmdGhpcy5hZGRTeW1ib2xzKHQuaWNvblZlcnRleCx0Lmljb25FbGVtZW50LGkuaWNvbixwLmljb25RdWFkcyxiLHNbXCJpY29uLWtlZXAtdXByaWdodFwiXSxsLGUuYW5nbGUpKX1vJiZ0aGlzLmFkZFRvRGVidWdCdWZmZXJzKGUpfSxTeW1ib2xCdWNrZXQucHJvdG90eXBlLmFkZFN5bWJvbHM9ZnVuY3Rpb24oZSx0LG8saSxzLG4sYSxsKXtvLm1ha2VSb29tRm9yKDQqaS5sZW5ndGgpO2Zvcih2YXIgcj1vLmN1cnJlbnQsYz10aGlzLnpvb20saD1NYXRoLm1heChNYXRoLmxvZyhzKS9NYXRoLkxOMitjLDApLHU9MDt1PGkubGVuZ3RoO3UrKyl7dmFyIG09aVt1XSxwPW0uYW5nbGUseD0ocCtsK01hdGguUEkpJSgyKk1hdGguUEkpO2lmKCEobiYmYSYmKHg8PU1hdGguUEkvMnx8eD4zKk1hdGguUEkvMikpKXt2YXIgeT1tLnRsLGQ9bS50cixnPW0uYmwsZj1tLmJyLGI9bS50ZXgsdj1tLmFuY2hvclBvaW50LEk9TWF0aC5tYXgoYytNYXRoLmxvZyhtLm1pblNjYWxlKS9NYXRoLkxOMixoKSxTPU1hdGgubWluKGMrTWF0aC5sb2cobS5tYXhTY2FsZSkvTWF0aC5MTjIsMjUpO2lmKCEoST49Uykpe0k9PT1oJiYoST0wKTt2YXIgRj1lLmluZGV4LXIudmVydGV4U3RhcnRJbmRleDtlLmFkZCh2Lngsdi55LHkueCx5LnksYi54LGIueSxJLFMsaCksZS5hZGQodi54LHYueSxkLngsZC55LGIueCtiLncsYi55LEksUyxoKSxlLmFkZCh2Lngsdi55LGcueCxnLnksYi54LGIueStiLmgsSSxTLGgpLGUuYWRkKHYueCx2LnksZi54LGYueSxiLngrYi53LGIueStiLmgsSSxTLGgpLHIudmVydGV4TGVuZ3RoKz00LHQuYWRkKEYsRisxLEYrMiksdC5hZGQoRisxLEYrMixGKzMpLHIuZWxlbWVudExlbmd0aCs9Mn19fX0sU3ltYm9sQnVja2V0LnByb3RvdHlwZS5nZXREZXBlbmRlbmNpZXM9ZnVuY3Rpb24oZSx0LG8pe2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGV8fHM/byhlKTp2b2lkKHM9ITApfXZhciBzPSExO3RoaXMuZ2V0VGV4dERlcGVuZGVuY2llcyhlLHQsaSksdGhpcy5nZXRJY29uRGVwZW5kZW5jaWVzKGUsdCxpKX0sU3ltYm9sQnVja2V0LnByb3RvdHlwZS5nZXRJY29uRGVwZW5kZW5jaWVzPWZ1bmN0aW9uKGUsdCxvKXtmdW5jdGlvbiBpKGUsdCl7cmV0dXJuIGU/byhlKToodGhpcy5pY29ucz10LHZvaWQgbygpKX1pZih0aGlzLmxheW91dFByb3BlcnRpZXNbXCJpY29uLWltYWdlXCJdKXt2YXIgcz10aGlzLmZlYXR1cmVzLG49cmVzb2x2ZUljb25zKHMsdGhpcy5sYXlvdXRQcm9wZXJ0aWVzKTtuLmxlbmd0aD90LnNlbmQoXCJnZXQgaWNvbnNcIix7aWNvbnM6bn0saS5iaW5kKHRoaXMpKTpvKCl9ZWxzZSBvKCl9LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuZ2V0VGV4dERlcGVuZGVuY2llcz1mdW5jdGlvbihlLHQsbyl7dmFyIGk9dGhpcy5mZWF0dXJlcyxzPXRoaXMubGF5b3V0UHJvcGVydGllc1tcInRleHQtZm9udFwiXSxuPXRoaXMuc3RhY2tzPWUuc3RhY2tzO3ZvaWQgMD09PW5bc10mJihuW3NdPXt9KTt2YXIgYT1uW3NdLGw9cmVzb2x2ZVRleHQoaSx0aGlzLmxheW91dFByb3BlcnRpZXMsYSk7dGhpcy50ZXh0RmVhdHVyZXM9bC50ZXh0RmVhdHVyZXMsdC5zZW5kKFwiZ2V0IGdseXBoc1wiLHt1aWQ6ZS51aWQsZm9udHN0YWNrOnMsY29kZXBvaW50czpsLmNvZGVwb2ludHN9LGZ1bmN0aW9uKGUsdCl7aWYoZSlyZXR1cm4gbyhlKTtmb3IodmFyIGkgaW4gdClhW2ldPXRbaV07bygpfSl9LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuYWRkVG9EZWJ1Z0J1ZmZlcnM9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50R3JvdXBzLmNvbGxpc2lvbkJveD1uZXcgRWxlbWVudEdyb3Vwcyh0aGlzLmJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4KSx0aGlzLmVsZW1lbnRHcm91cHMuY29sbGlzaW9uQm94Lm1ha2VSb29tRm9yKDApO2Zvcih2YXIgdD10aGlzLmJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4LG89LWUuYW5nbGUsaT1lLnlTdHJldGNoLHM9MDtzPHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDtzKyspZm9yKHZhciBuPTA7Mj5uO24rKyl7dmFyIGE9dGhpcy5zeW1ib2xJbnN0YW5jZXNbc11bMD09PW4/XCJ0ZXh0Q29sbGlzaW9uRmVhdHVyZVwiOlwiaWNvbkNvbGxpc2lvbkZlYXR1cmVcIl07aWYoYSlmb3IodmFyIGw9YS5ib3hlcyxyPTA7cjxsLmxlbmd0aDtyKyspe3ZhciBjPWxbcl0saD1jLmFuY2hvclBvaW50LHU9bmV3IFBvaW50KGMueDEsYy55MSppKS5fcm90YXRlKG8pLG09bmV3IFBvaW50KGMueDIsYy55MSppKS5fcm90YXRlKG8pLHA9bmV3IFBvaW50KGMueDEsYy55MippKS5fcm90YXRlKG8pLHg9bmV3IFBvaW50KGMueDIsYy55MippKS5fcm90YXRlKG8pLHk9TWF0aC5tYXgoMCxNYXRoLm1pbigyNSx0aGlzLnpvb20rTWF0aC5sb2coYy5tYXhTY2FsZSkvTWF0aC5MTjIpKSxkPU1hdGgubWF4KDAsTWF0aC5taW4oMjUsdGhpcy56b29tK01hdGgubG9nKGMucGxhY2VtZW50U2NhbGUpL01hdGguTE4yKSk7dC5hZGQoaCx1LHksZCksdC5hZGQoaCxtLHksZCksdC5hZGQoaCxtLHksZCksdC5hZGQoaCx4LHksZCksdC5hZGQoaCx4LHksZCksdC5hZGQoaCxwLHksZCksdC5hZGQoaCxwLHksZCksdC5hZGQoaCx1LHksZCksdGhpcy5lbGVtZW50R3JvdXBzLmNvbGxpc2lvbkJveC5jdXJyZW50LnZlcnRleExlbmd0aCs9OH19fTtcbn0se1wiLi4vc3ltYm9sL2FuY2hvclwiOjYyLFwiLi4vc3ltYm9sL2NsaXBfbGluZVwiOjY1LFwiLi4vc3ltYm9sL2NvbGxpc2lvbl9mZWF0dXJlXCI6NjcsXCIuLi9zeW1ib2wvZ2V0X2FuY2hvcnNcIjo2OSxcIi4uL3N5bWJvbC9tZXJnZWxpbmVzXCI6NzIsXCIuLi9zeW1ib2wvcXVhZHNcIjo3MyxcIi4uL3N5bWJvbC9yZXNvbHZlX2ljb25zXCI6NzQsXCIuLi9zeW1ib2wvcmVzb2x2ZV90ZXh0XCI6NzUsXCIuLi9zeW1ib2wvc2hhcGluZ1wiOjc2LFwiLi4vdXRpbC90b2tlblwiOjEwNSxcIi4vZWxlbWVudF9ncm91cHNcIjoxNCxcInBvaW50LWdlb21ldHJ5XCI6MTM3fV0sMTk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQ29vcmRpbmF0ZShvLHQsbil7dGhpcy5jb2x1bW49byx0aGlzLnJvdz10LHRoaXMuem9vbT1ufW1vZHVsZS5leHBvcnRzPUNvb3JkaW5hdGUsQ29vcmRpbmF0ZS5wcm90b3R5cGU9e2Nsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBDb29yZGluYXRlKHRoaXMuY29sdW1uLHRoaXMucm93LHRoaXMuem9vbSl9LHpvb21UbzpmdW5jdGlvbihvKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl96b29tVG8obyl9LHN1YjpmdW5jdGlvbihvKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9zdWIobyl9LF96b29tVG86ZnVuY3Rpb24obyl7dmFyIHQ9TWF0aC5wb3coMixvLXRoaXMuem9vbSk7cmV0dXJuIHRoaXMuY29sdW1uKj10LHRoaXMucm93Kj10LHRoaXMuem9vbT1vLHRoaXN9LF9zdWI6ZnVuY3Rpb24obyl7cmV0dXJuIG89by56b29tVG8odGhpcy56b29tKSx0aGlzLmNvbHVtbi09by5jb2x1bW4sdGhpcy5yb3ctPW8ucm93LHRoaXN9fTtcbn0se31dLDIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIExuZ0xhdCh0LG4pe2lmKGlzTmFOKHQpfHxpc05hTihuKSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIExuZ0xhdCBvYmplY3Q6IChcIit0K1wiLCBcIituK1wiKVwiKTtpZih0aGlzLmxuZz0rdCx0aGlzLmxhdD0rbix0aGlzLmxhdD45MHx8dGhpcy5sYXQ8LTkwKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTG5nTGF0IGxhdGl0dWRlIHZhbHVlOiBtdXN0IGJlIGJldHdlZW4gLTkwIGFuZCA5MFwiKX1tb2R1bGUuZXhwb3J0cz1MbmdMYXQ7dmFyIHdyYXA9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKS53cmFwO0xuZ0xhdC5wcm90b3R5cGUud3JhcD1mdW5jdGlvbigpe3JldHVybiBuZXcgTG5nTGF0KHdyYXAodGhpcy5sbmcsLTE4MCwxODApLHRoaXMubGF0KX0sTG5nTGF0LmNvbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBMbmdMYXQ/dDpBcnJheS5pc0FycmF5KHQpP25ldyBMbmdMYXQodFswXSx0WzFdKTp0fTtcbn0se1wiLi4vdXRpbC91dGlsXCI6MTA2fV0sMjE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gTG5nTGF0Qm91bmRzKHQsbil7aWYodClmb3IodmFyIGU9bj9bdCxuXTp0LHM9MCxpPWUubGVuZ3RoO2k+cztzKyspdGhpcy5leHRlbmQoZVtzXSl9bW9kdWxlLmV4cG9ydHM9TG5nTGF0Qm91bmRzO3ZhciBMbmdMYXQ9cmVxdWlyZShcIi4vbG5nX2xhdFwiKTtMbmdMYXRCb3VuZHMucHJvdG90eXBlPXtleHRlbmQ6ZnVuY3Rpb24odCl7dmFyIG4sZSxzPXRoaXMuX3N3LGk9dGhpcy5fbmU7aWYodCBpbnN0YW5jZW9mIExuZ0xhdCluPXQsZT10O2Vsc2V7aWYoISh0IGluc3RhbmNlb2YgTG5nTGF0Qm91bmRzKSlyZXR1cm4gdD90aGlzLmV4dGVuZChMbmdMYXQuY29udmVydCh0KXx8TG5nTGF0Qm91bmRzLmNvbnZlcnQodCkpOnRoaXM7aWYobj10Ll9zdyxlPXQuX25lLCFufHwhZSlyZXR1cm4gdGhpc31yZXR1cm4gc3x8aT8ocy5sbmc9TWF0aC5taW4obi5sbmcscy5sbmcpLHMubGF0PU1hdGgubWluKG4ubGF0LHMubGF0KSxpLmxuZz1NYXRoLm1heChlLmxuZyxpLmxuZyksaS5sYXQ9TWF0aC5tYXgoZS5sYXQsaS5sYXQpKToodGhpcy5fc3c9bmV3IExuZ0xhdChuLmxuZyxuLmxhdCksdGhpcy5fbmU9bmV3IExuZ0xhdChlLmxuZyxlLmxhdCkpLHRoaXN9LGdldENlbnRlcjpmdW5jdGlvbigpe3JldHVybiBuZXcgTG5nTGF0KCh0aGlzLl9zdy5sbmcrdGhpcy5fbmUubG5nKS8yLCh0aGlzLl9zdy5sYXQrdGhpcy5fbmUubGF0KS8yKX0sZ2V0U291dGhXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N3fSxnZXROb3J0aEVhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmV9LGdldE5vcnRoV2VzdDpmdW5jdGlvbigpe3JldHVybiBuZXcgTG5nTGF0KHRoaXMuZ2V0V2VzdCgpLHRoaXMuZ2V0Tm9ydGgoKSl9LGdldFNvdXRoRWFzdDpmdW5jdGlvbigpe3JldHVybiBuZXcgTG5nTGF0KHRoaXMuZ2V0RWFzdCgpLHRoaXMuZ2V0U291dGgoKSl9LGdldFdlc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3cubG5nfSxnZXRTb3V0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdy5sYXR9LGdldEVhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmUubG5nfSxnZXROb3J0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9uZS5sYXR9fSxMbmdMYXRCb3VuZHMuY29udmVydD1mdW5jdGlvbih0KXtyZXR1cm4hdHx8dCBpbnN0YW5jZW9mIExuZ0xhdEJvdW5kcz90Om5ldyBMbmdMYXRCb3VuZHModCl9O1xufSx7XCIuL2xuZ19sYXRcIjoyMH1dLDIyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFRyYW5zZm9ybSh0LGkpe3RoaXMudGlsZVNpemU9NTEyLHRoaXMuX21pblpvb209dHx8MCx0aGlzLl9tYXhab29tPWl8fDIyLHRoaXMubGF0UmFuZ2U9Wy04NS4wNTExMyw4NS4wNTExM10sdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy56b29tPTAsdGhpcy5jZW50ZXI9bmV3IExuZ0xhdCgwLDApLHRoaXMuYW5nbGU9MCx0aGlzLl9hbHRpdHVkZT0xLjUsdGhpcy5fcGl0Y2g9MH12YXIgTG5nTGF0PXJlcXVpcmUoXCIuL2xuZ19sYXRcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpLENvb3JkaW5hdGU9cmVxdWlyZShcIi4vY29vcmRpbmF0ZVwiKSx3cmFwPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIikud3JhcCxpbnRlcnA9cmVxdWlyZShcIi4uL3V0aWwvaW50ZXJwb2xhdGVcIiksdmVjND1yZXF1aXJlKFwiZ2wtbWF0cml4XCIpLnZlYzQsbWF0ND1yZXF1aXJlKFwiZ2wtbWF0cml4XCIpLm1hdDQ7bW9kdWxlLmV4cG9ydHM9VHJhbnNmb3JtLFRyYW5zZm9ybS5wcm90b3R5cGU9e2dldCBtaW5ab29tKCl7cmV0dXJuIHRoaXMuX21pblpvb219LHNldCBtaW5ab29tKHQpe3RoaXMuX21pblpvb209dCx0aGlzLnpvb209TWF0aC5tYXgodGhpcy56b29tLHQpfSxnZXQgbWF4Wm9vbSgpe3JldHVybiB0aGlzLl9tYXhab29tfSxzZXQgbWF4Wm9vbSh0KXt0aGlzLl9tYXhab29tPXQsdGhpcy56b29tPU1hdGgubWluKHRoaXMuem9vbSx0KX0sZ2V0IHdvcmxkU2l6ZSgpe3JldHVybiB0aGlzLnRpbGVTaXplKnRoaXMuc2NhbGV9LGdldCBjZW50ZXJQb2ludCgpe3JldHVybiB0aGlzLnNpemUuX2RpdigyKX0sZ2V0IHNpemUoKXtyZXR1cm4gbmV3IFBvaW50KHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpfSxnZXQgYmVhcmluZygpe3JldHVybi10aGlzLmFuZ2xlL01hdGguUEkqMTgwfSxzZXQgYmVhcmluZyh0KXt0aGlzLmFuZ2xlPS13cmFwKHQsLTE4MCwxODApKk1hdGguUEkvMTgwfSxnZXQgcGl0Y2goKXtyZXR1cm4gdGhpcy5fcGl0Y2gvTWF0aC5QSSoxODB9LHNldCBwaXRjaCh0KXt0aGlzLl9waXRjaD1NYXRoLm1pbig2MCx0KS8xODAqTWF0aC5QSX0sZ2V0IGFsdGl0dWRlKCl7cmV0dXJuIHRoaXMuX2FsdGl0dWRlfSxzZXQgYWx0aXR1ZGUodCl7dGhpcy5fYWx0aXR1ZGU9TWF0aC5tYXgoLjc1LHQpfSxnZXQgem9vbSgpe3JldHVybiB0aGlzLl96b29tfSxzZXQgem9vbSh0KXt0PU1hdGgubWluKE1hdGgubWF4KHQsdGhpcy5taW5ab29tKSx0aGlzLm1heFpvb20pLHRoaXMuX3pvb209dCx0aGlzLnNjYWxlPXRoaXMuem9vbVNjYWxlKHQpLHRoaXMudGlsZVpvb209TWF0aC5mbG9vcih0KSx0aGlzLnpvb21GcmFjdGlvbj10LXRoaXMudGlsZVpvb20sdGhpcy5fY29uc3RyYWluKCl9LGdldCBjZW50ZXIoKXtyZXR1cm4gdGhpcy5fY2VudGVyfSxzZXQgY2VudGVyKHQpe3RoaXMuX2NlbnRlcj10LHRoaXMuX2NvbnN0cmFpbigpfSx6b29tU2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDIsdCl9LHNjYWxlWm9vbTpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5MTjJ9LHByb2plY3Q6ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IFBvaW50KHRoaXMubG5nWCh0LmxuZyxpKSx0aGlzLmxhdFkodC5sYXQsaSkpfSx1bnByb2plY3Q6ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IExuZ0xhdCh0aGlzLnhMbmcodC54LGkpLHRoaXMueUxhdCh0LnksaSkpfSxnZXQgeCgpe3JldHVybiB0aGlzLmxuZ1godGhpcy5jZW50ZXIubG5nKX0sZ2V0IHkoKXtyZXR1cm4gdGhpcy5sYXRZKHRoaXMuY2VudGVyLmxhdCl9LGdldCBwb2ludCgpe3JldHVybiBuZXcgUG9pbnQodGhpcy54LHRoaXMueSl9LGxuZ1g6ZnVuY3Rpb24odCxpKXtyZXR1cm4oMTgwK3QpKihpfHx0aGlzLndvcmxkU2l6ZSkvMzYwfSxsYXRZOmZ1bmN0aW9uKHQsaSl7dmFyIG49MTgwL01hdGguUEkqTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSS80K3QqTWF0aC5QSS8zNjApKTtyZXR1cm4oMTgwLW4pKihpfHx0aGlzLndvcmxkU2l6ZSkvMzYwfSx4TG5nOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIDM2MCp0LyhpfHx0aGlzLndvcmxkU2l6ZSktMTgwfSx5TGF0OmZ1bmN0aW9uKHQsaSl7dmFyIG49MTgwLTM2MCp0LyhpfHx0aGlzLndvcmxkU2l6ZSk7cmV0dXJuIDM2MC9NYXRoLlBJKk1hdGguYXRhbihNYXRoLmV4cChuKk1hdGguUEkvMTgwKSktOTB9LHBhbkJ5OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuY2VudGVyUG9pbnQuX2FkZCh0KTt0aGlzLmNlbnRlcj10aGlzLnBvaW50TG9jYXRpb24oaSl9LHNldExvY2F0aW9uQXRQb2ludDpmdW5jdGlvbih0LGkpe3ZhciBuPXRoaXMubG9jYXRpb25Db29yZGluYXRlKHQpLG89dGhpcy5wb2ludENvb3JkaW5hdGUoaSksZT10aGlzLnBvaW50Q29vcmRpbmF0ZSh0aGlzLmNlbnRlclBvaW50KSxhPW8uX3N1YihuKTt0aGlzLmNlbnRlcj10aGlzLmNvb3JkaW5hdGVMb2NhdGlvbihlLl9zdWIoYSkpfSxzZXRab29tQXJvdW5kOmZ1bmN0aW9uKHQsaSl7dmFyIG47aSYmKG49dGhpcy5sb2NhdGlvblBvaW50KGkpKSx0aGlzLnpvb209dCxpJiZ0aGlzLnNldExvY2F0aW9uQXRQb2ludChpLG4pfSxzZXRCZWFyaW5nQXJvdW5kOmZ1bmN0aW9uKHQsaSl7dmFyIG47aSYmKG49dGhpcy5sb2NhdGlvblBvaW50KGkpKSx0aGlzLmJlYXJpbmc9dCxpJiZ0aGlzLnNldExvY2F0aW9uQXRQb2ludChpLG4pfSxsb2NhdGlvblBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvb3JkaW5hdGVQb2ludCh0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZSh0KSl9LHBvaW50TG9jYXRpb246ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRoaXMucG9pbnRDb29yZGluYXRlKHQpKX0sbG9jYXRpb25Db29yZGluYXRlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuem9vbVNjYWxlKHRoaXMudGlsZVpvb20pL3RoaXMud29ybGRTaXplLG49TG5nTGF0LmNvbnZlcnQodCk7cmV0dXJuIG5ldyBDb29yZGluYXRlKHRoaXMubG5nWChuLmxuZykqaSx0aGlzLmxhdFkobi5sYXQpKmksdGhpcy50aWxlWm9vbSl9LGNvb3JkaW5hdGVMb2NhdGlvbjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLnpvb21TY2FsZSh0Lnpvb20pO3JldHVybiBuZXcgTG5nTGF0KHRoaXMueExuZyh0LmNvbHVtbixpKSx0aGlzLnlMYXQodC5yb3csaSkpfSxwb2ludENvb3JkaW5hdGU6ZnVuY3Rpb24odCxpKXt2b2lkIDA9PT1pJiYoaT0wKTt2YXIgbj10aGlzLmNvb3JkaW5hdGVQb2ludE1hdHJpeCh0aGlzLnRpbGVab29tKSxvPW1hdDQuaW52ZXJ0KG5ldyBGbG9hdDY0QXJyYXkoMTYpLG4pO2lmKCFvKXRocm93IG5ldyBFcnJvcihcImZhaWxlZCB0byBpbnZlcnQgbWF0cml4XCIpO3ZhciBlPXZlYzQudHJhbnNmb3JtTWF0NChbXSxbdC54LHQueSwwLDFdLG8pLGE9dmVjNC50cmFuc2Zvcm1NYXQ0KFtdLFt0LngsdC55LDEsMV0sbykscj1lWzNdLGg9YVszXSxzPWVbMF0vcixjPWFbMF0vaCx1PWVbMV0vcixsPWFbMV0vaCxtPWVbMl0vcixnPWFbMl0vaCxmPW09PT1nPzA6KGktbSkvKGctbSk7cmV0dXJuIG5ldyBDb29yZGluYXRlKGludGVycChzLGMsZiksaW50ZXJwKHUsbCxmKSx0aGlzLnRpbGVab29tKX0sY29vcmRpbmF0ZVBvaW50OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuY29vcmRpbmF0ZVBvaW50TWF0cml4KHQuem9vbSksbj12ZWM0LnRyYW5zZm9ybU1hdDQoW10sW3QuY29sdW1uLHQucm93LDAsMV0saSk7cmV0dXJuIG5ldyBQb2ludChuWzBdL25bM10sblsxXS9uWzNdKX0sY29vcmRpbmF0ZVBvaW50TWF0cml4OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZ2V0UHJvak1hdHJpeCgpLG49dGhpcy53b3JsZFNpemUvdGhpcy56b29tU2NhbGUodCk7cmV0dXJuIG1hdDQuc2NhbGUoaSxpLFtuLG4sMV0pLG1hdDQubXVsdGlwbHkoaSx0aGlzLmdldFBpeGVsTWF0cml4KCksaSksaX0sZ2V0UGl4ZWxNYXRyaXg6ZnVuY3Rpb24oKXt2YXIgdD1tYXQ0LmNyZWF0ZSgpO3JldHVybiBtYXQ0LnNjYWxlKHQsdCxbdGhpcy53aWR0aC8yLC10aGlzLmhlaWdodC8yLDFdKSxtYXQ0LnRyYW5zbGF0ZSh0LHQsWzEsLTEsMF0pLHR9LF9jb25zdHJhaW46ZnVuY3Rpb24oKXtpZih0aGlzLmNlbnRlciYmdGhpcy53aWR0aCYmdGhpcy5oZWlnaHQmJiF0aGlzLl9jb25zdHJhaW5pbmcpe3RoaXMuX2NvbnN0cmFpbmluZz0hMDt2YXIgdCxpLG4sbyxlLGEscixoLHM9dGhpcy5zaXplO3RoaXMubGF0UmFuZ2UmJih0PXRoaXMubGF0WSh0aGlzLmxhdFJhbmdlWzFdKSxpPXRoaXMubGF0WSh0aGlzLmxhdFJhbmdlWzBdKSxlPWktdDxzLnk/cy55LyhpLXQpOjApLHRoaXMubG5nUmFuZ2UmJihuPXRoaXMubG5nWCh0aGlzLmxuZ1JhbmdlWzBdKSxvPXRoaXMubG5nWCh0aGlzLmxuZ1JhbmdlWzFdKSxhPW8tbjxzLng/cy54LyhvLW4pOjApO3ZhciBjPU1hdGgubWF4KGF8fDAsZXx8MCk7aWYoYylyZXR1cm4gdGhpcy5jZW50ZXI9dGhpcy51bnByb2plY3QobmV3IFBvaW50KGE/KG8rbikvMjp0aGlzLngsZT8oaSt0KS8yOnRoaXMueSkpLHRoaXMuem9vbSs9dGhpcy5zY2FsZVpvb20oYyksdm9pZCh0aGlzLl9jb25zdHJhaW5pbmc9ITEpO2lmKHRoaXMubGF0UmFuZ2Upe3ZhciB1PXRoaXMueSxsPXMueS8yO3Q+dS1sJiYoaD10K2wpLHUrbD5pJiYoaD1pLWwpfWlmKHRoaXMubG5nUmFuZ2Upe3ZhciBtPXRoaXMueCxnPXMueC8yO24+bS1nJiYocj1uK2cpLG0rZz5vJiYocj1vLWcpfSh2b2lkIDAhPT1yfHx2b2lkIDAhPT1oKSYmKHRoaXMuY2VudGVyPXRoaXMudW5wcm9qZWN0KG5ldyBQb2ludCh2b2lkIDAhPT1yP3I6dGhpcy54LHZvaWQgMCE9PWg/aDp0aGlzLnkpKSksdGhpcy5fY29uc3RyYWluaW5nPSExfX0sZ2V0UHJvak1hdHJpeDpmdW5jdGlvbigpe3ZhciB0PW5ldyBGbG9hdDY0QXJyYXkoMTYpLGk9TWF0aC5hdGFuKC41L3RoaXMuYWx0aXR1ZGUpLG49TWF0aC5zaW4oaSkqdGhpcy5hbHRpdHVkZS9NYXRoLnNpbihNYXRoLlBJLzItdGhpcy5fcGl0Y2gtaSksbz1NYXRoLmNvcyhNYXRoLlBJLzItdGhpcy5fcGl0Y2gpKm4rdGhpcy5hbHRpdHVkZTtyZXR1cm4gbWF0NC5wZXJzcGVjdGl2ZSh0LDIqTWF0aC5hdGFuKHRoaXMuaGVpZ2h0LzIvdGhpcy5hbHRpdHVkZSksdGhpcy53aWR0aC90aGlzLmhlaWdodCwuMSxvKSxtYXQ0LnRyYW5zbGF0ZSh0LHQsWzAsMCwtdGhpcy5hbHRpdHVkZV0pLG1hdDQuc2NhbGUodCx0LFsxLC0xLDEvdGhpcy5oZWlnaHRdKSxtYXQ0LnJvdGF0ZVgodCx0LHRoaXMuX3BpdGNoKSxtYXQ0LnJvdGF0ZVoodCx0LHRoaXMuYW5nbGUpLG1hdDQudHJhbnNsYXRlKHQsdCxbLXRoaXMueCwtdGhpcy55LDBdKSx0fX07XG59LHtcIi4uL3V0aWwvaW50ZXJwb2xhdGVcIjoxMDIsXCIuLi91dGlsL3V0aWxcIjoxMDYsXCIuL2Nvb3JkaW5hdGVcIjoxOSxcIi4vbG5nX2xhdFwiOjIwLFwiZ2wtbWF0cml4XCI6MTE2LFwicG9pbnQtZ2VvbWV0cnlcIjoxMzd9XSwyMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgc2ltcGxleEZvbnQ9e1wiIFwiOlsxNixbXV0sXCIhXCI6WzEwLFs1LDIxLDUsNywtMSwtMSw1LDIsNCwxLDUsMCw2LDEsNSwyXV0sJ1wiJzpbMTYsWzQsMjEsNCwxNCwtMSwtMSwxMiwyMSwxMiwxNF1dLFwiI1wiOlsyMSxbMTEsMjUsNCwtNywtMSwtMSwxNywyNSwxMCwtNywtMSwtMSw0LDEyLDE4LDEyLC0xLC0xLDMsNiwxNyw2XV0sJDpbMjAsWzgsMjUsOCwtNCwtMSwtMSwxMiwyNSwxMiwtNCwtMSwtMSwxNywxOCwxNSwyMCwxMiwyMSw4LDIxLDUsMjAsMywxOCwzLDE2LDQsMTQsNSwxMyw3LDEyLDEzLDEwLDE1LDksMTYsOCwxNyw2LDE3LDMsMTUsMSwxMiwwLDgsMCw1LDEsMywzXV0sXCIlXCI6WzI0LFsyMSwyMSwzLDAsLTEsLTEsOCwyMSwxMCwxOSwxMCwxNyw5LDE1LDcsMTQsNSwxNCwzLDE2LDMsMTgsNCwyMCw2LDIxLDgsMjEsMTAsMjAsMTMsMTksMTYsMTksMTksMjAsMjEsMjEsLTEsLTEsMTcsNywxNSw2LDE0LDQsMTQsMiwxNiwwLDE4LDAsMjAsMSwyMSwzLDIxLDUsMTksNywxNyw3XV0sXCImXCI6WzI2LFsyMywxMiwyMywxMywyMiwxNCwyMSwxNCwyMCwxMywxOSwxMSwxNyw2LDE1LDMsMTMsMSwxMSwwLDcsMCw1LDEsNCwyLDMsNCwzLDYsNCw4LDUsOSwxMiwxMywxMywxNCwxNCwxNiwxNCwxOCwxMywyMCwxMSwyMSw5LDIwLDgsMTgsOCwxNiw5LDEzLDExLDEwLDE2LDMsMTgsMSwyMCwwLDIyLDAsMjMsMSwyMywyXV0sXCInXCI6WzEwLFs1LDE5LDQsMjAsNSwyMSw2LDIwLDYsMTgsNSwxNiw0LDE1XV0sXCIoXCI6WzE0LFsxMSwyNSw5LDIzLDcsMjAsNSwxNiw0LDExLDQsNyw1LDIsNywtMiw5LC01LDExLC03XV0sXCIpXCI6WzE0LFszLDI1LDUsMjMsNywyMCw5LDE2LDEwLDExLDEwLDcsOSwyLDcsLTIsNSwtNSwzLC03XV0sXCIqXCI6WzE2LFs4LDIxLDgsOSwtMSwtMSwzLDE4LDEzLDEyLC0xLC0xLDEzLDE4LDMsMTJdXSxcIitcIjpbMjYsWzEzLDE4LDEzLDAsLTEsLTEsNCw5LDIyLDldXSxcIixcIjpbMTAsWzYsMSw1LDAsNCwxLDUsMiw2LDEsNiwtMSw1LC0zLDQsLTRdXSxcIi1cIjpbMjYsWzQsOSwyMiw5XV0sXCIuXCI6WzEwLFs1LDIsNCwxLDUsMCw2LDEsNSwyXV0sXCIvXCI6WzIyLFsyMCwyNSwyLC03XV0sMDpbMjAsWzksMjEsNiwyMCw0LDE3LDMsMTIsMyw5LDQsNCw2LDEsOSwwLDExLDAsMTQsMSwxNiw0LDE3LDksMTcsMTIsMTYsMTcsMTQsMjAsMTEsMjEsOSwyMV1dLDE6WzIwLFs2LDE3LDgsMTgsMTEsMjEsMTEsMF1dLDI6WzIwLFs0LDE2LDQsMTcsNSwxOSw2LDIwLDgsMjEsMTIsMjEsMTQsMjAsMTUsMTksMTYsMTcsMTYsMTUsMTUsMTMsMTMsMTAsMywwLDE3LDBdXSwzOlsyMCxbNSwyMSwxNiwyMSwxMCwxMywxMywxMywxNSwxMiwxNiwxMSwxNyw4LDE3LDYsMTYsMywxNCwxLDExLDAsOCwwLDUsMSw0LDIsMyw0XV0sNDpbMjAsWzEzLDIxLDMsNywxOCw3LC0xLC0xLDEzLDIxLDEzLDBdXSw1OlsyMCxbMTUsMjEsNSwyMSw0LDEyLDUsMTMsOCwxNCwxMSwxNCwxNCwxMywxNiwxMSwxNyw4LDE3LDYsMTYsMywxNCwxLDExLDAsOCwwLDUsMSw0LDIsMyw0XV0sNjpbMjAsWzE2LDE4LDE1LDIwLDEyLDIxLDEwLDIxLDcsMjAsNSwxNyw0LDEyLDQsNyw1LDMsNywxLDEwLDAsMTEsMCwxNCwxLDE2LDMsMTcsNiwxNyw3LDE2LDEwLDE0LDEyLDExLDEzLDEwLDEzLDcsMTIsNSwxMCw0LDddXSw3OlsyMCxbMTcsMjEsNywwLC0xLC0xLDMsMjEsMTcsMjFdXSw4OlsyMCxbOCwyMSw1LDIwLDQsMTgsNCwxNiw1LDE0LDcsMTMsMTEsMTIsMTQsMTEsMTYsOSwxNyw3LDE3LDQsMTYsMiwxNSwxLDEyLDAsOCwwLDUsMSw0LDIsMyw0LDMsNyw0LDksNiwxMSw5LDEyLDEzLDEzLDE1LDE0LDE2LDE2LDE2LDE4LDE1LDIwLDEyLDIxLDgsMjFdXSw5OlsyMCxbMTYsMTQsMTUsMTEsMTMsOSwxMCw4LDksOCw2LDksNCwxMSwzLDE0LDMsMTUsNCwxOCw2LDIwLDksMjEsMTAsMjEsMTMsMjAsMTUsMTgsMTYsMTQsMTYsOSwxNSw0LDEzLDEsMTAsMCw4LDAsNSwxLDQsM11dLFwiOlwiOlsxMCxbNSwxNCw0LDEzLDUsMTIsNiwxMyw1LDE0LC0xLC0xLDUsMiw0LDEsNSwwLDYsMSw1LDJdXSxcIjtcIjpbMTAsWzUsMTQsNCwxMyw1LDEyLDYsMTMsNSwxNCwtMSwtMSw2LDEsNSwwLDQsMSw1LDIsNiwxLDYsLTEsNSwtMyw0LC00XV0sXCI8XCI6WzI0LFsyMCwxOCw0LDksMjAsMF1dLFwiPVwiOlsyNixbNCwxMiwyMiwxMiwtMSwtMSw0LDYsMjIsNl1dLFwiPlwiOlsyNCxbNCwxOCwyMCw5LDQsMF1dLFwiP1wiOlsxOCxbMywxNiwzLDE3LDQsMTksNSwyMCw3LDIxLDExLDIxLDEzLDIwLDE0LDE5LDE1LDE3LDE1LDE1LDE0LDEzLDEzLDEyLDksMTAsOSw3LC0xLC0xLDksMiw4LDEsOSwwLDEwLDEsOSwyXV0sXCJAXCI6WzI3LFsxOCwxMywxNywxNSwxNSwxNiwxMiwxNiwxMCwxNSw5LDE0LDgsMTEsOCw4LDksNiwxMSw1LDE0LDUsMTYsNiwxNyw4LC0xLC0xLDEyLDE2LDEwLDE0LDksMTEsOSw4LDEwLDYsMTEsNSwtMSwtMSwxOCwxNiwxNyw4LDE3LDYsMTksNSwyMSw1LDIzLDcsMjQsMTAsMjQsMTIsMjMsMTUsMjIsMTcsMjAsMTksMTgsMjAsMTUsMjEsMTIsMjEsOSwyMCw3LDE5LDUsMTcsNCwxNSwzLDEyLDMsOSw0LDYsNSw0LDcsMiw5LDEsMTIsMCwxNSwwLDE4LDEsMjAsMiwyMSwzLC0xLC0xLDE5LDE2LDE4LDgsMTgsNiwxOSw1XV0sQTpbMTgsWzksMjEsMSwwLC0xLC0xLDksMjEsMTcsMCwtMSwtMSw0LDcsMTQsN11dLEI6WzIxLFs0LDIxLDQsMCwtMSwtMSw0LDIxLDEzLDIxLDE2LDIwLDE3LDE5LDE4LDE3LDE4LDE1LDE3LDEzLDE2LDEyLDEzLDExLC0xLC0xLDQsMTEsMTMsMTEsMTYsMTAsMTcsOSwxOCw3LDE4LDQsMTcsMiwxNiwxLDEzLDAsNCwwXV0sQzpbMjEsWzE4LDE2LDE3LDE4LDE1LDIwLDEzLDIxLDksMjEsNywyMCw1LDE4LDQsMTYsMywxMywzLDgsNCw1LDUsMyw3LDEsOSwwLDEzLDAsMTUsMSwxNywzLDE4LDVdXSxEOlsyMSxbNCwyMSw0LDAsLTEsLTEsNCwyMSwxMSwyMSwxNCwyMCwxNiwxOCwxNywxNiwxOCwxMywxOCw4LDE3LDUsMTYsMywxNCwxLDExLDAsNCwwXV0sRTpbMTksWzQsMjEsNCwwLC0xLC0xLDQsMjEsMTcsMjEsLTEsLTEsNCwxMSwxMiwxMSwtMSwtMSw0LDAsMTcsMF1dLEY6WzE4LFs0LDIxLDQsMCwtMSwtMSw0LDIxLDE3LDIxLC0xLC0xLDQsMTEsMTIsMTFdXSxHOlsyMSxbMTgsMTYsMTcsMTgsMTUsMjAsMTMsMjEsOSwyMSw3LDIwLDUsMTgsNCwxNiwzLDEzLDMsOCw0LDUsNSwzLDcsMSw5LDAsMTMsMCwxNSwxLDE3LDMsMTgsNSwxOCw4LC0xLC0xLDEzLDgsMTgsOF1dLEg6WzIyLFs0LDIxLDQsMCwtMSwtMSwxOCwyMSwxOCwwLC0xLC0xLDQsMTEsMTgsMTFdXSxJOls4LFs0LDIxLDQsMF1dLEo6WzE2LFsxMiwyMSwxMiw1LDExLDIsMTAsMSw4LDAsNiwwLDQsMSwzLDIsMiw1LDIsN11dLEs6WzIxLFs0LDIxLDQsMCwtMSwtMSwxOCwyMSw0LDcsLTEsLTEsOSwxMiwxOCwwXV0sTDpbMTcsWzQsMjEsNCwwLC0xLC0xLDQsMCwxNiwwXV0sTTpbMjQsWzQsMjEsNCwwLC0xLC0xLDQsMjEsMTIsMCwtMSwtMSwyMCwyMSwxMiwwLC0xLC0xLDIwLDIxLDIwLDBdXSxOOlsyMixbNCwyMSw0LDAsLTEsLTEsNCwyMSwxOCwwLC0xLC0xLDE4LDIxLDE4LDBdXSxPOlsyMixbOSwyMSw3LDIwLDUsMTgsNCwxNiwzLDEzLDMsOCw0LDUsNSwzLDcsMSw5LDAsMTMsMCwxNSwxLDE3LDMsMTgsNSwxOSw4LDE5LDEzLDE4LDE2LDE3LDE4LDE1LDIwLDEzLDIxLDksMjFdXSxQOlsyMSxbNCwyMSw0LDAsLTEsLTEsNCwyMSwxMywyMSwxNiwyMCwxNywxOSwxOCwxNywxOCwxNCwxNywxMiwxNiwxMSwxMywxMCw0LDEwXV0sUTpbMjIsWzksMjEsNywyMCw1LDE4LDQsMTYsMywxMywzLDgsNCw1LDUsMyw3LDEsOSwwLDEzLDAsMTUsMSwxNywzLDE4LDUsMTksOCwxOSwxMywxOCwxNiwxNywxOCwxNSwyMCwxMywyMSw5LDIxLC0xLC0xLDEyLDQsMTgsLTJdXSxSOlsyMSxbNCwyMSw0LDAsLTEsLTEsNCwyMSwxMywyMSwxNiwyMCwxNywxOSwxOCwxNywxOCwxNSwxNywxMywxNiwxMiwxMywxMSw0LDExLC0xLC0xLDExLDExLDE4LDBdXSxTOlsyMCxbMTcsMTgsMTUsMjAsMTIsMjEsOCwyMSw1LDIwLDMsMTgsMywxNiw0LDE0LDUsMTMsNywxMiwxMywxMCwxNSw5LDE2LDgsMTcsNiwxNywzLDE1LDEsMTIsMCw4LDAsNSwxLDMsM11dLFQ6WzE2LFs4LDIxLDgsMCwtMSwtMSwxLDIxLDE1LDIxXV0sVTpbMjIsWzQsMjEsNCw2LDUsMyw3LDEsMTAsMCwxMiwwLDE1LDEsMTcsMywxOCw2LDE4LDIxXV0sVjpbMTgsWzEsMjEsOSwwLC0xLC0xLDE3LDIxLDksMF1dLFc6WzI0LFsyLDIxLDcsMCwtMSwtMSwxMiwyMSw3LDAsLTEsLTEsMTIsMjEsMTcsMCwtMSwtMSwyMiwyMSwxNywwXV0sWDpbMjAsWzMsMjEsMTcsMCwtMSwtMSwxNywyMSwzLDBdXSxZOlsxOCxbMSwyMSw5LDExLDksMCwtMSwtMSwxNywyMSw5LDExXV0sWjpbMjAsWzE3LDIxLDMsMCwtMSwtMSwzLDIxLDE3LDIxLC0xLC0xLDMsMCwxNywwXV0sXCJbXCI6WzE0LFs0LDI1LDQsLTcsLTEsLTEsNSwyNSw1LC03LC0xLC0xLDQsMjUsMTEsMjUsLTEsLTEsNCwtNywxMSwtN11dLFwiXFxcXFwiOlsxNCxbMCwyMSwxNCwtM11dLFwiXVwiOlsxNCxbOSwyNSw5LC03LC0xLC0xLDEwLDI1LDEwLC03LC0xLC0xLDMsMjUsMTAsMjUsLTEsLTEsMywtNywxMCwtN11dLFwiXlwiOlsxNixbNiwxNSw4LDE4LDEwLDE1LC0xLC0xLDMsMTIsOCwxNywxMywxMiwtMSwtMSw4LDE3LDgsMF1dLF86WzE2LFswLC0yLDE2LC0yXV0sXCJgXCI6WzEwLFs2LDIxLDUsMjAsNCwxOCw0LDE2LDUsMTUsNiwxNiw1LDE3XV0sYTpbMTksWzE1LDE0LDE1LDAsLTEsLTEsMTUsMTEsMTMsMTMsMTEsMTQsOCwxNCw2LDEzLDQsMTEsMyw4LDMsNiw0LDMsNiwxLDgsMCwxMSwwLDEzLDEsMTUsM11dLGI6WzE5LFs0LDIxLDQsMCwtMSwtMSw0LDExLDYsMTMsOCwxNCwxMSwxNCwxMywxMywxNSwxMSwxNiw4LDE2LDYsMTUsMywxMywxLDExLDAsOCwwLDYsMSw0LDNdXSxjOlsxOCxbMTUsMTEsMTMsMTMsMTEsMTQsOCwxNCw2LDEzLDQsMTEsMyw4LDMsNiw0LDMsNiwxLDgsMCwxMSwwLDEzLDEsMTUsM11dLGQ6WzE5LFsxNSwyMSwxNSwwLC0xLC0xLDE1LDExLDEzLDEzLDExLDE0LDgsMTQsNiwxMyw0LDExLDMsOCwzLDYsNCwzLDYsMSw4LDAsMTEsMCwxMywxLDE1LDNdXSxlOlsxOCxbMyw4LDE1LDgsMTUsMTAsMTQsMTIsMTMsMTMsMTEsMTQsOCwxNCw2LDEzLDQsMTEsMyw4LDMsNiw0LDMsNiwxLDgsMCwxMSwwLDEzLDEsMTUsM11dLGY6WzEyLFsxMCwyMSw4LDIxLDYsMjAsNSwxNyw1LDAsLTEsLTEsMiwxNCw5LDE0XV0sZzpbMTksWzE1LDE0LDE1LC0yLDE0LC01LDEzLC02LDExLC03LDgsLTcsNiwtNiwtMSwtMSwxNSwxMSwxMywxMywxMSwxNCw4LDE0LDYsMTMsNCwxMSwzLDgsMyw2LDQsMyw2LDEsOCwwLDExLDAsMTMsMSwxNSwzXV0saDpbMTksWzQsMjEsNCwwLC0xLC0xLDQsMTAsNywxMyw5LDE0LDEyLDE0LDE0LDEzLDE1LDEwLDE1LDBdXSxpOls4LFszLDIxLDQsMjAsNSwyMSw0LDIyLDMsMjEsLTEsLTEsNCwxNCw0LDBdXSxqOlsxMCxbNSwyMSw2LDIwLDcsMjEsNiwyMiw1LDIxLC0xLC0xLDYsMTQsNiwtMyw1LC02LDMsLTcsMSwtN11dLGs6WzE3LFs0LDIxLDQsMCwtMSwtMSwxNCwxNCw0LDQsLTEsLTEsOCw4LDE1LDBdXSxsOls4LFs0LDIxLDQsMF1dLG06WzMwLFs0LDE0LDQsMCwtMSwtMSw0LDEwLDcsMTMsOSwxNCwxMiwxNCwxNCwxMywxNSwxMCwxNSwwLC0xLC0xLDE1LDEwLDE4LDEzLDIwLDE0LDIzLDE0LDI1LDEzLDI2LDEwLDI2LDBdXSxuOlsxOSxbNCwxNCw0LDAsLTEsLTEsNCwxMCw3LDEzLDksMTQsMTIsMTQsMTQsMTMsMTUsMTAsMTUsMF1dLG86WzE5LFs4LDE0LDYsMTMsNCwxMSwzLDgsMyw2LDQsMyw2LDEsOCwwLDExLDAsMTMsMSwxNSwzLDE2LDYsMTYsOCwxNSwxMSwxMywxMywxMSwxNCw4LDE0XV0scDpbMTksWzQsMTQsNCwtNywtMSwtMSw0LDExLDYsMTMsOCwxNCwxMSwxNCwxMywxMywxNSwxMSwxNiw4LDE2LDYsMTUsMywxMywxLDExLDAsOCwwLDYsMSw0LDNdXSxxOlsxOSxbMTUsMTQsMTUsLTcsLTEsLTEsMTUsMTEsMTMsMTMsMTEsMTQsOCwxNCw2LDEzLDQsMTEsMyw4LDMsNiw0LDMsNiwxLDgsMCwxMSwwLDEzLDEsMTUsM11dLHI6WzEzLFs0LDE0LDQsMCwtMSwtMSw0LDgsNSwxMSw3LDEzLDksMTQsMTIsMTRdXSxzOlsxNyxbMTQsMTEsMTMsMTMsMTAsMTQsNywxNCw0LDEzLDMsMTEsNCw5LDYsOCwxMSw3LDEzLDYsMTQsNCwxNCwzLDEzLDEsMTAsMCw3LDAsNCwxLDMsM11dLHQ6WzEyLFs1LDIxLDUsNCw2LDEsOCwwLDEwLDAsLTEsLTEsMiwxNCw5LDE0XV0sdTpbMTksWzQsMTQsNCw0LDUsMSw3LDAsMTAsMCwxMiwxLDE1LDQsLTEsLTEsMTUsMTQsMTUsMF1dLHY6WzE2LFsyLDE0LDgsMCwtMSwtMSwxNCwxNCw4LDBdXSx3OlsyMixbMywxNCw3LDAsLTEsLTEsMTEsMTQsNywwLC0xLC0xLDExLDE0LDE1LDAsLTEsLTEsMTksMTQsMTUsMF1dLHg6WzE3LFszLDE0LDE0LDAsLTEsLTEsMTQsMTQsMywwXV0seTpbMTYsWzIsMTQsOCwwLC0xLC0xLDE0LDE0LDgsMCw2LC00LDQsLTYsMiwtNywxLC03XV0sejpbMTcsWzE0LDE0LDMsMCwtMSwtMSwzLDE0LDE0LDE0LC0xLC0xLDMsMCwxNCwwXV0sXCJ7XCI6WzE0LFs5LDI1LDcsMjQsNiwyMyw1LDIxLDUsMTksNiwxNyw3LDE2LDgsMTQsOCwxMiw2LDEwLC0xLC0xLDcsMjQsNiwyMiw2LDIwLDcsMTgsOCwxNyw5LDE1LDksMTMsOCwxMSw0LDksOCw3LDksNSw5LDMsOCwxLDcsMCw2LC0yLDYsLTQsNywtNiwtMSwtMSw2LDgsOCw2LDgsNCw3LDIsNiwxLDUsLTEsNSwtMyw2LC01LDcsLTYsOSwtN11dLFwifFwiOls4LFs0LDI1LDQsLTddXSxcIn1cIjpbMTQsWzUsMjUsNywyNCw4LDIzLDksMjEsOSwxOSw4LDE3LDcsMTYsNiwxNCw2LDEyLDgsMTAsLTEsLTEsNywyNCw4LDIyLDgsMjAsNywxOCw2LDE3LDUsMTUsNSwxMyw2LDExLDEwLDksNiw3LDUsNSw1LDMsNiwxLDcsMCw4LC0yLDgsLTQsNywtNiwtMSwtMSw4LDgsNiw2LDYsNCw3LDIsOCwxLDksLTEsOSwtMyw4LC01LDcsLTYsNSwtN11dLFwiflwiOlsyNCxbMyw2LDMsOCw0LDExLDYsMTIsOCwxMiwxMCwxMSwxNCw4LDE2LDcsMTgsNywyMCw4LDIxLDEwLC0xLC0xLDMsOCw0LDEwLDYsMTEsOCwxMSwxMCwxMCwxNCw3LDE2LDYsMTgsNiwyMCw3LDIxLDEwLDIxLDEyXV19O21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGwsbix0LGUpe2U9ZXx8MTt2YXIgcixvLHUscyxpLHgsZixwLGg9W107Zm9yKHI9MCxvPWwubGVuZ3RoO28+cjtyKyspaWYoaT1zaW1wbGV4Rm9udFtsW3JdXSl7Zm9yKHA9bnVsbCx1PTAscz1pWzFdLmxlbmd0aDtzPnU7dSs9MiktMT09PWlbMV1bdV0mJi0xPT09aVsxXVt1KzFdP3A9bnVsbDooeD1uK2lbMV1bdV0qZSxmPXQtaVsxXVt1KzFdKmUscCYmaC5wdXNoKHAueCxwLnkseCxmKSxwPXt4OngseTpmfSk7bis9aVswXSplfXJldHVybiBofTtcbn0se31dLDI0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBtYXBib3hnbD1tb2R1bGUuZXhwb3J0cz17fTttYXBib3hnbC5NYXA9cmVxdWlyZShcIi4vdWkvbWFwXCIpLG1hcGJveGdsLkNvbnRyb2w9cmVxdWlyZShcIi4vdWkvY29udHJvbC9jb250cm9sXCIpLG1hcGJveGdsLk5hdmlnYXRpb249cmVxdWlyZShcIi4vdWkvY29udHJvbC9uYXZpZ2F0aW9uXCIpLG1hcGJveGdsLkF0dHJpYnV0aW9uPXJlcXVpcmUoXCIuL3VpL2NvbnRyb2wvYXR0cmlidXRpb25cIiksbWFwYm94Z2wuUG9wdXA9cmVxdWlyZShcIi4vdWkvcG9wdXBcIiksbWFwYm94Z2wuR2VvSlNPTlNvdXJjZT1yZXF1aXJlKFwiLi9zb3VyY2UvZ2VvanNvbl9zb3VyY2VcIiksbWFwYm94Z2wuVmlkZW9Tb3VyY2U9cmVxdWlyZShcIi4vc291cmNlL3ZpZGVvX3NvdXJjZVwiKSxtYXBib3hnbC5JbWFnZVNvdXJjZT1yZXF1aXJlKFwiLi9zb3VyY2UvaW1hZ2Vfc291cmNlXCIpLG1hcGJveGdsLlN0eWxlPXJlcXVpcmUoXCIuL3N0eWxlL3N0eWxlXCIpLG1hcGJveGdsLkxuZ0xhdD1yZXF1aXJlKFwiLi9nZW8vbG5nX2xhdFwiKSxtYXBib3hnbC5MbmdMYXRCb3VuZHM9cmVxdWlyZShcIi4vZ2VvL2xuZ19sYXRfYm91bmRzXCIpLG1hcGJveGdsLlBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKSxtYXBib3hnbC5FdmVudGVkPXJlcXVpcmUoXCIuL3V0aWwvZXZlbnRlZFwiKSxtYXBib3hnbC51dGlsPXJlcXVpcmUoXCIuL3V0aWwvdXRpbFwiKSxtYXBib3hnbC5zdXBwb3J0ZWQ9cmVxdWlyZShcIi4vdXRpbC9icm93c2VyXCIpLnN1cHBvcnRlZDt2YXIgYWpheD1yZXF1aXJlKFwiLi91dGlsL2FqYXhcIik7bWFwYm94Z2wudXRpbC5nZXRKU09OPWFqYXguZ2V0SlNPTixtYXBib3hnbC51dGlsLmdldEFycmF5QnVmZmVyPWFqYXguZ2V0QXJyYXlCdWZmZXI7dmFyIGNvbmZpZz1yZXF1aXJlKFwiLi91dGlsL2NvbmZpZ1wiKTttYXBib3hnbC5jb25maWc9Y29uZmlnLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtYXBib3hnbCxcImFjY2Vzc1Rva2VuXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBjb25maWcuQUNDRVNTX1RPS0VOfSxzZXQ6ZnVuY3Rpb24oZSl7Y29uZmlnLkFDQ0VTU19UT0tFTj1lfX0pO1xufSx7XCIuL2dlby9sbmdfbGF0XCI6MjAsXCIuL2dlby9sbmdfbGF0X2JvdW5kc1wiOjIxLFwiLi9zb3VyY2UvZ2VvanNvbl9zb3VyY2VcIjozOSxcIi4vc291cmNlL2ltYWdlX3NvdXJjZVwiOjQxLFwiLi9zb3VyY2UvdmlkZW9fc291cmNlXCI6NDgsXCIuL3N0eWxlL3N0eWxlXCI6NTYsXCIuL3VpL2NvbnRyb2wvYXR0cmlidXRpb25cIjo3OSxcIi4vdWkvY29udHJvbC9jb250cm9sXCI6ODAsXCIuL3VpL2NvbnRyb2wvbmF2aWdhdGlvblwiOjgxLFwiLi91aS9tYXBcIjo5MSxcIi4vdWkvcG9wdXBcIjo5MixcIi4vdXRpbC9hamF4XCI6OTQsXCIuL3V0aWwvYnJvd3NlclwiOjk1LFwiLi91dGlsL2NvbmZpZ1wiOjk5LFwiLi91dGlsL2V2ZW50ZWRcIjoxMDAsXCIuL3V0aWwvdXRpbFwiOjEwNixcInBvaW50LWdlb21ldHJ5XCI6MTM3fV0sMjU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd0JhY2tncm91bmQodCxhLHIpe3ZhciBlLGk9dC5nbCxvPWEucGFpbnRbXCJiYWNrZ3JvdW5kLWNvbG9yXCJdLG49YS5wYWludFtcImJhY2tncm91bmQtcGF0dGVyblwiXSxsPWEucGFpbnRbXCJiYWNrZ3JvdW5kLW9wYWNpdHlcIl0sdT1uP3Quc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24obi5mcm9tLCEwKTpudWxsLG09bj90LnNwcml0ZUF0bGFzLmdldFBvc2l0aW9uKG4udG8sITApOm51bGw7aWYodSYmbSl7ZT10LnBhdHRlcm5TaGFkZXIsaS5zd2l0Y2hTaGFkZXIoZSxyKSxpLnVuaWZvcm0xaShlLnVfaW1hZ2UsMCksaS51bmlmb3JtMmZ2KGUudV9wYXR0ZXJuX3RsX2EsdS50bCksaS51bmlmb3JtMmZ2KGUudV9wYXR0ZXJuX2JyX2EsdS5iciksaS51bmlmb3JtMmZ2KGUudV9wYXR0ZXJuX3RsX2IsbS50bCksaS51bmlmb3JtMmZ2KGUudV9wYXR0ZXJuX2JyX2IsbS5iciksaS51bmlmb3JtMWYoZS51X29wYWNpdHksbCk7dmFyIGM9dC50cmFuc2Zvcm0sZj11LnNpemUscz1tLnNpemUsXz1jLmxvY2F0aW9uQ29vcmRpbmF0ZShjLmNlbnRlciksUz0xL01hdGgucG93KDIsYy56b29tRnJhY3Rpb24pO2kudW5pZm9ybTFmKGUudV9taXgsbi50KTt2YXIgZD1tYXQzLmNyZWF0ZSgpO21hdDMuc2NhbGUoZCxkLFsxLyhmWzBdKm4uZnJvbVNjYWxlKSwxLyhmWzFdKm4uZnJvbVNjYWxlKV0pLG1hdDMudHJhbnNsYXRlKGQsZCxbXy5jb2x1bW4qYy50aWxlU2l6ZSUoZlswXSpuLmZyb21TY2FsZSksXy5yb3cqYy50aWxlU2l6ZSUoZlsxXSpuLmZyb21TY2FsZSldKSxtYXQzLnJvdGF0ZShkLGQsLWMuYW5nbGUpLG1hdDMuc2NhbGUoZCxkLFtTKmMud2lkdGgvMiwtUypjLmhlaWdodC8yXSk7dmFyIHA9bWF0My5jcmVhdGUoKTttYXQzLnNjYWxlKHAscCxbMS8oc1swXSpuLnRvU2NhbGUpLDEvKHNbMV0qbi50b1NjYWxlKV0pLG1hdDMudHJhbnNsYXRlKHAscCxbXy5jb2x1bW4qYy50aWxlU2l6ZSUoc1swXSpuLnRvU2NhbGUpLF8ucm93KmMudGlsZVNpemUlKHNbMV0qbi50b1NjYWxlKV0pLG1hdDMucm90YXRlKHAscCwtYy5hbmdsZSksbWF0My5zY2FsZShwLHAsW1MqYy53aWR0aC8yLC1TKmMuaGVpZ2h0LzJdKSxpLnVuaWZvcm1NYXRyaXgzZnYoZS51X3BhdHRlcm5tYXRyaXhfYSwhMSxkKSxpLnVuaWZvcm1NYXRyaXgzZnYoZS51X3BhdHRlcm5tYXRyaXhfYiwhMSxwKSx0LnNwcml0ZUF0bGFzLmJpbmQoaSwhMCl9ZWxzZSBlPXQuZmlsbFNoYWRlcixpLnN3aXRjaFNoYWRlcihlLHIpLGkudW5pZm9ybTRmdihlLnVfY29sb3Isbyk7aS5kaXNhYmxlKGkuU1RFTkNJTF9URVNUKSxpLmJpbmRCdWZmZXIoaS5BUlJBWV9CVUZGRVIsdC5iYWNrZ3JvdW5kQnVmZmVyKSxpLnZlcnRleEF0dHJpYlBvaW50ZXIoZS5hX3Bvcyx0LmJhY2tncm91bmRCdWZmZXIuaXRlbVNpemUsaS5TSE9SVCwhMSwwLDApLGkuZHJhd0FycmF5cyhpLlRSSUFOR0xFX1NUUklQLDAsdC5iYWNrZ3JvdW5kQnVmZmVyLml0ZW1Db3VudCksaS5lbmFibGUoaS5TVEVOQ0lMX1RFU1QpLGkuc3RlbmNpbE1hc2soMCksaS5zdGVuY2lsRnVuYyhpLkVRVUFMLDEyOCwxMjgpfXZhciBtYXQzPXJlcXVpcmUoXCJnbC1tYXRyaXhcIikubWF0Mzttb2R1bGUuZXhwb3J0cz1kcmF3QmFja2dyb3VuZDtcbn0se1wiZ2wtbWF0cml4XCI6MTE2fV0sMjY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd0NpcmNsZXMoZSxyLGksYSl7aWYoYS5idWZmZXJzKXtpPWUudHJhbnNsYXRlTWF0cml4KGksYSxyLnBhaW50W1wiY2lyY2xlLXRyYW5zbGF0ZVwiXSxyLnBhaW50W1wiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIl0pO3ZhciB0PWEuZWxlbWVudEdyb3Vwc1tyLnJlZnx8ci5pZF07aWYodCl7dmFyIGw9ZS5nbDtsLmRpc2FibGUobC5TVEVOQ0lMX1RFU1QpLGwuc3dpdGNoU2hhZGVyKGUuY2lyY2xlU2hhZGVyLGksYS5leE1hdHJpeCk7dmFyIGM9YS5idWZmZXJzLmNpcmNsZVZlcnRleCxuPWUuY2lyY2xlU2hhZGVyLHM9YS5idWZmZXJzLmNpcmNsZUVsZW1lbnQsdT0xL2Jyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpby9yLnBhaW50W1wiY2lyY2xlLXJhZGl1c1wiXTtsLnVuaWZvcm00ZnYobi51X2NvbG9yLHIucGFpbnRbXCJjaXJjbGUtY29sb3JcIl0pLGwudW5pZm9ybTFmKG4udV9ibHVyLE1hdGgubWF4KHIucGFpbnRbXCJjaXJjbGUtYmx1clwiXSx1KSksbC51bmlmb3JtMWYobi51X3NpemUsci5wYWludFtcImNpcmNsZS1yYWRpdXNcIl0pO2Zvcih2YXIgbz0wO288dC5ncm91cHMubGVuZ3RoO28rKyl7dmFyIGY9dC5ncm91cHNbb10sZD1mLnZlcnRleFN0YXJ0SW5kZXgqYy5pdGVtU2l6ZTtjLmJpbmQobCxuLGQpLHMuYmluZChsLG4sZCk7dmFyIFM9MypmLmVsZW1lbnRMZW5ndGgsYj1mLmVsZW1lbnRTdGFydEluZGV4KnMuaXRlbVNpemU7bC5kcmF3RWxlbWVudHMobC5UUklBTkdMRVMsUyxsLlVOU0lHTkVEX1NIT1JULGIpfWwuZW5hYmxlKGwuU1RFTkNJTF9URVNUKX19fXZhciBicm93c2VyPXJlcXVpcmUoXCIuLi91dGlsL2Jyb3dzZXIuanNcIik7bW9kdWxlLmV4cG9ydHM9ZHJhd0NpcmNsZXM7XG59LHtcIi4uL3V0aWwvYnJvd3Nlci5qc1wiOjk1fV0sMjc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd1BsYWNlbWVudERlYnVnKHIsZSxvLHQpe3ZhciBhPXQuZWxlbWVudEdyb3Vwc1tlLnJlZnx8ZS5pZF0uY29sbGlzaW9uQm94O2lmKGEpe3ZhciBpPXIuZ2wsbj10LmJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4LHM9ci5jb2xsaXNpb25Cb3hTaGFkZXI7aS5lbmFibGUoaS5TVEVOQ0lMX1RFU1QpLGkuc3dpdGNoU2hhZGVyKHMsbyksbi5iaW5kKGkscyksaS5saW5lV2lkdGgoMSk7dmFyIHU9MTI7aS52ZXJ0ZXhBdHRyaWJQb2ludGVyKHMuYV9wb3MsMixpLlNIT1JULCExLHUsMCksaS52ZXJ0ZXhBdHRyaWJQb2ludGVyKHMuYV9leHRydWRlLDIsaS5TSE9SVCwhMSx1LDQpLGkudmVydGV4QXR0cmliUG9pbnRlcihzLmFfZGF0YSwyLGkuVU5TSUdORURfQllURSwhMSx1LDgpLGkudW5pZm9ybTFmKHMudV9zY2FsZSxNYXRoLnBvdygyLHIudHJhbnNmb3JtLnpvb20tdC5jb29yZC56KSksaS51bmlmb3JtMWYocy51X3pvb20sMTAqci50cmFuc2Zvcm0uem9vbSksaS51bmlmb3JtMWYocy51X21heHpvb20sMTAqKHQuY29vcmQueisxKSk7dmFyIGQ9YS5ncm91cHNbMF0udmVydGV4U3RhcnRJbmRleCxsPWEuZ3JvdXBzWzBdLnZlcnRleExlbmd0aDtpLmRyYXdBcnJheXMoaS5MSU5FUyxkLGwpLGkuZGlzYWJsZShpLlNURU5DSUxfVEVTVCl9fW1vZHVsZS5leHBvcnRzPWRyYXdQbGFjZW1lbnREZWJ1Zztcbn0se31dLDI4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGRyYXdEZWJ1ZyhlLHIpe3ZhciB0PWUuZ2w7dC5ibGVuZEZ1bmModC5PTkUsdC5PTkVfTUlOVVNfU1JDX0FMUEhBKSx0LnN3aXRjaFNoYWRlcihlLmRlYnVnU2hhZGVyLHIucG9zTWF0cml4KSx0LmJpbmRCdWZmZXIodC5BUlJBWV9CVUZGRVIsZS5kZWJ1Z0J1ZmZlciksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuZGVidWdTaGFkZXIuYV9wb3MsZS5kZWJ1Z0J1ZmZlci5pdGVtU2l6ZSx0LlNIT1JULCExLDAsMCksdC51bmlmb3JtNGYoZS5kZWJ1Z1NoYWRlci51X2NvbG9yLDEsMCwwLDEpLHQubGluZVdpZHRoKDQpLHQuZHJhd0FycmF5cyh0LkxJTkVfU1RSSVAsMCxlLmRlYnVnQnVmZmVyLml0ZW1Db3VudCk7dmFyIGk9dGV4dFZlcnRpY2VzKHIuY29vcmQudG9TdHJpbmcoKSw1MCwyMDAsNSk7dC5iaW5kQnVmZmVyKHQuQVJSQVlfQlVGRkVSLGUuZGVidWdUZXh0QnVmZmVyKSx0LmJ1ZmZlckRhdGEodC5BUlJBWV9CVUZGRVIsbmV3IEludDE2QXJyYXkoaSksdC5TVFJFQU1fRFJBVyksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuZGVidWdTaGFkZXIuYV9wb3MsZS5kZWJ1Z1RleHRCdWZmZXIuaXRlbVNpemUsdC5TSE9SVCwhMSwwLDApLHQubGluZVdpZHRoKDgqYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKSx0LnVuaWZvcm00ZihlLmRlYnVnU2hhZGVyLnVfY29sb3IsMSwxLDEsMSksdC5kcmF3QXJyYXlzKHQuTElORVMsMCxpLmxlbmd0aC9lLmRlYnVnVGV4dEJ1ZmZlci5pdGVtU2l6ZSksdC5saW5lV2lkdGgoMipicm93c2VyLmRldmljZVBpeGVsUmF0aW8pLHQudW5pZm9ybTRmKGUuZGVidWdTaGFkZXIudV9jb2xvciwwLDAsMCwxKSx0LmRyYXdBcnJheXModC5MSU5FUywwLGkubGVuZ3RoL2UuZGVidWdUZXh0QnVmZmVyLml0ZW1TaXplKSx0LmJsZW5kRnVuYyh0Lk9ORV9NSU5VU19EU1RfQUxQSEEsdC5PTkUpfXZhciB0ZXh0VmVydGljZXM9cmVxdWlyZShcIi4uL2xpYi9kZWJ1Z3RleHRcIiksYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpO21vZHVsZS5leHBvcnRzPWRyYXdEZWJ1Zztcbn0se1wiLi4vbGliL2RlYnVndGV4dFwiOjIzLFwiLi4vdXRpbC9icm93c2VyXCI6OTV9XSwyOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkcmF3RmlsbChlLHQscixpKXtpZihpLmJ1ZmZlcnMpe3ZhciBhPWkuZWxlbWVudEdyb3Vwc1t0LnJlZnx8dC5pZF07aWYoYSl7dmFyIGwsbixvLGYscz1lLmdsLHU9ZS50cmFuc2xhdGVNYXRyaXgocixpLHQucGFpbnRbXCJmaWxsLXRyYW5zbGF0ZVwiXSx0LnBhaW50W1wiZmlsbC10cmFuc2xhdGUtYW5jaG9yXCJdKSxjPXQucGFpbnRbXCJmaWxsLWNvbG9yXCJdO3Muc3RlbmNpbE1hc2soNjMpLHMuY2xlYXIocy5TVEVOQ0lMX0JVRkZFUl9CSVQpLHMuc3RlbmNpbEZ1bmMocy5OT1RFUVVBTCwxMjgsMTI4KSxzLnN0ZW5jaWxPcFNlcGFyYXRlKHMuRlJPTlQscy5JTkNSX1dSQVAscy5LRUVQLHMuS0VFUCkscy5zdGVuY2lsT3BTZXBhcmF0ZShzLkJBQ0sscy5ERUNSX1dSQVAscy5LRUVQLHMuS0VFUCkscy5jb2xvck1hc2soITEsITEsITEsITEpLHMuc3dpdGNoU2hhZGVyKGUuZmlsbFNoYWRlcix1KSxsPWkuYnVmZmVycy5maWxsVmVydGV4LGwuYmluZChzKSxuPWkuYnVmZmVycy5maWxsRWxlbWVudCxuLmJpbmQocyk7Zm9yKHZhciBtLFMsRT0wO0U8YS5ncm91cHMubGVuZ3RoO0UrKylvPWEuZ3JvdXBzW0VdLG09by52ZXJ0ZXhTdGFydEluZGV4KmwuaXRlbVNpemUscy52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuZmlsbFNoYWRlci5hX3BvcywyLHMuU0hPUlQsITEsNCxtKzApLGY9MypvLmVsZW1lbnRMZW5ndGgsUz1vLmVsZW1lbnRTdGFydEluZGV4Km4uaXRlbVNpemUscy5kcmF3RWxlbWVudHMocy5UUklBTkdMRVMsZixzLlVOU0lHTkVEX1NIT1JULFMpO3MuY29sb3JNYXNrKCEwLCEwLCEwLCEwKSxzLnN0ZW5jaWxPcChzLktFRVAscy5LRUVQLHMuS0VFUCkscy5zdGVuY2lsTWFzaygwKTt2YXIgZD10LnBhaW50W1wiZmlsbC1vdXRsaW5lLWNvbG9yXCJdO2lmKHQucGFpbnRbXCJmaWxsLWFudGlhbGlhc1wiXT09PSEwJiYoIXQucGFpbnRbXCJmaWxsLXBhdHRlcm5cIl18fGQpKXtzLnN3aXRjaFNoYWRlcihlLm91dGxpbmVTaGFkZXIsdSkscy5saW5lV2lkdGgoMipicm93c2VyLmRldmljZVBpeGVsUmF0aW8pLGQ/cy5zdGVuY2lsRnVuYyhzLkVRVUFMLDEyOCwxMjgpOnMuc3RlbmNpbEZ1bmMocy5FUVVBTCwxMjgsMTkxKSxzLnVuaWZvcm0yZihlLm91dGxpbmVTaGFkZXIudV93b3JsZCxzLmRyYXdpbmdCdWZmZXJXaWR0aCxzLmRyYXdpbmdCdWZmZXJIZWlnaHQpLHMudW5pZm9ybTRmdihlLm91dGxpbmVTaGFkZXIudV9jb2xvcixkP2Q6YyksbD1pLmJ1ZmZlcnMuZmlsbFZlcnRleCxuPWkuYnVmZmVycy5vdXRsaW5lRWxlbWVudCxuLmJpbmQocyk7Zm9yKHZhciBwPTA7cDxhLmdyb3Vwcy5sZW5ndGg7cCsrKW89YS5ncm91cHNbcF0sbT1vLnZlcnRleFN0YXJ0SW5kZXgqbC5pdGVtU2l6ZSxzLnZlcnRleEF0dHJpYlBvaW50ZXIoZS5vdXRsaW5lU2hhZGVyLmFfcG9zLDIscy5TSE9SVCwhMSw0LG0rMCksZj0yKm8uc2Vjb25kRWxlbWVudExlbmd0aCxTPW8uc2Vjb25kRWxlbWVudFN0YXJ0SW5kZXgqbi5pdGVtU2l6ZSxzLmRyYXdFbGVtZW50cyhzLkxJTkVTLGYscy5VTlNJR05FRF9TSE9SVCxTKX12YXIgXyxoPXQucGFpbnRbXCJmaWxsLXBhdHRlcm5cIl0sdj10LnBhaW50W1wiZmlsbC1vcGFjaXR5XCJdfHwxO2lmKGgpe3ZhciB4PWUuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oaC5mcm9tLCEwKSxiPWUuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oaC50bywhMCk7aWYoIXh8fCFiKXJldHVybjtfPWUucGF0dGVyblNoYWRlcixzLnN3aXRjaFNoYWRlcihfLHIpLHMudW5pZm9ybTFpKF8udV9pbWFnZSwwKSxzLnVuaWZvcm0yZnYoXy51X3BhdHRlcm5fdGxfYSx4LnRsKSxzLnVuaWZvcm0yZnYoXy51X3BhdHRlcm5fYnJfYSx4LmJyKSxzLnVuaWZvcm0yZnYoXy51X3BhdHRlcm5fdGxfYixiLnRsKSxzLnVuaWZvcm0yZnYoXy51X3BhdHRlcm5fYnJfYixiLmJyKSxzLnVuaWZvcm0xZihfLnVfb3BhY2l0eSx2KSxzLnVuaWZvcm0xZihfLnVfbWl4LGgudCk7dmFyIEE9aS50aWxlRXh0ZW50L2kudGlsZVNpemUvTWF0aC5wb3coMixlLnRyYW5zZm9ybS50aWxlWm9vbS1pLmNvb3JkLnopLFI9bWF0My5jcmVhdGUoKTttYXQzLnNjYWxlKFIsUixbMS8oeC5zaXplWzBdKkEqaC5mcm9tU2NhbGUpLDEvKHguc2l6ZVsxXSpBKmguZnJvbVNjYWxlKV0pO3ZhciBnPW1hdDMuY3JlYXRlKCk7bWF0My5zY2FsZShnLGcsWzEvKGIuc2l6ZVswXSpBKmgudG9TY2FsZSksMS8oYi5zaXplWzFdKkEqaC50b1NjYWxlKV0pLHMudW5pZm9ybU1hdHJpeDNmdihfLnVfcGF0dGVybm1hdHJpeF9hLCExLFIpLHMudW5pZm9ybU1hdHJpeDNmdihfLnVfcGF0dGVybm1hdHJpeF9iLCExLGcpLGUuc3ByaXRlQXRsYXMuYmluZChzLCEwKX1lbHNlIF89ZS5maWxsU2hhZGVyLHMuc3dpdGNoU2hhZGVyKF8scikscy51bmlmb3JtNGZ2KF8udV9jb2xvcixjKTtzLnN0ZW5jaWxGdW5jKHMuTk9URVFVQUwsMCw2Mykscy5iaW5kQnVmZmVyKHMuQVJSQVlfQlVGRkVSLGUudGlsZUV4dGVudEJ1ZmZlcikscy52ZXJ0ZXhBdHRyaWJQb2ludGVyKF8uYV9wb3MsZS50aWxlRXh0ZW50QnVmZmVyLml0ZW1TaXplLHMuU0hPUlQsITEsMCwwKSxzLmRyYXdBcnJheXMocy5UUklBTkdMRV9TVFJJUCwwLGUudGlsZUV4dGVudEJ1ZmZlci5pdGVtQ291bnQpLHMuc3RlbmNpbE1hc2soMCkscy5zdGVuY2lsRnVuYyhzLkVRVUFMLDEyOCwxMjgpfX19dmFyIGJyb3dzZXI9cmVxdWlyZShcIi4uL3V0aWwvYnJvd3NlclwiKSxtYXQzPXJlcXVpcmUoXCJnbC1tYXRyaXhcIikubWF0Mzttb2R1bGUuZXhwb3J0cz1kcmF3RmlsbDtcbn0se1wiLi4vdXRpbC9icm93c2VyXCI6OTUsXCJnbC1tYXRyaXhcIjoxMTZ9XSwzMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpLG1hdDI9cmVxdWlyZShcImdsLW1hdHJpeFwiKS5tYXQyO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHQsaSxlLHIpe2lmKHIuYnVmZmVycyl7dmFyIGE9ci5lbGVtZW50R3JvdXBzW2kucmVmfHxpLmlkXTtpZihhKXt2YXIgbj10LmdsO2lmKCEoaS5wYWludFtcImxpbmUtd2lkdGhcIl08PTApKXt2YXIgbz0xL2Jyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxmPWkucGFpbnRbXCJsaW5lLWJsdXJcIl0rbyxsPWkucGFpbnRbXCJsaW5lLXdpZHRoXCJdLzIsdT0tMSxtPTAscz0wO2kucGFpbnRbXCJsaW5lLWdhcC13aWR0aFwiXT4wJiYodT1pLnBhaW50W1wibGluZS1nYXAtd2lkdGhcIl0vMisuNSpvLGw9aS5wYWludFtcImxpbmUtd2lkdGhcIl0sbT11LW8vMik7dmFyIF89bStsK28vMitzLGg9aS5wYWludFtcImxpbmUtY29sb3JcIl0sZD10LnRyYW5zZm9ybS5zY2FsZS8oMTw8ci5jb29yZC56KS8oci50aWxlRXh0ZW50L3IudGlsZVNpemUpLHA9dC50cmFuc2xhdGVNYXRyaXgoZSxyLGkucGFpbnRbXCJsaW5lLXRyYW5zbGF0ZVwiXSxpLnBhaW50W1wibGluZS10cmFuc2xhdGUtYW5jaG9yXCJdKSx2PXQudHJhbnNmb3JtLGM9bWF0Mi5jcmVhdGUoKTttYXQyLnNjYWxlKGMsYyxbMSxNYXRoLmNvcyh2Ll9waXRjaCldKSxtYXQyLnJvdGF0ZShjLGMsdC50cmFuc2Zvcm0uYW5nbGUpO3ZhciB4LGI9TWF0aC5zcXJ0KHYuaGVpZ2h0KnYuaGVpZ2h0LzQqKDErdi5hbHRpdHVkZSp2LmFsdGl0dWRlKSksdz12LmhlaWdodC8yKk1hdGgudGFuKHYuX3BpdGNoKSxnPShiK3cpL2ItMSxTPXIudGlsZVNpemUvdC50cmFuc2Zvcm0udGlsZVNpemUsTT1pLnBhaW50W1wibGluZS1kYXNoYXJyYXlcIl0sej1pLnBhaW50W1wibGluZS1wYXR0ZXJuXCJdO2lmKE0pe3g9dC5saW5lc2RmcGF0dGVyblNoYWRlcixuLnN3aXRjaFNoYWRlcih4LHAsci5leE1hdHJpeCksbi51bmlmb3JtMmZ2KHgudV9saW5ld2lkdGgsW18sdV0pLG4udW5pZm9ybTFmKHgudV9yYXRpbyxkKSxuLnVuaWZvcm0xZih4LnVfYmx1cixmKSxuLnVuaWZvcm00ZnYoeC51X2NvbG9yLGgpO3ZhciBBPXQubGluZUF0bGFzLmdldERhc2goTS5mcm9tLFwicm91bmRcIj09PWkubGF5b3V0W1wibGluZS1jYXBcIl0pLHk9dC5saW5lQXRsYXMuZ2V0RGFzaChNLnRvLFwicm91bmRcIj09PWkubGF5b3V0W1wibGluZS1jYXBcIl0pO3QubGluZUF0bGFzLmJpbmQobik7dmFyIEU9TWF0aC5wb3coMixNYXRoLmZsb29yKE1hdGgubG9nKHQudHJhbnNmb3JtLnNjYWxlKS9NYXRoLkxOMiktci5jb29yZC56KS84KlMsUD1bRS9BLndpZHRoL00uZnJvbVNjYWxlLC1BLmhlaWdodC8yXSxSPXQubGluZUF0bGFzLndpZHRoLyhNLmZyb21TY2FsZSpBLndpZHRoKjI1Nipicm93c2VyLmRldmljZVBpeGVsUmF0aW8pLzIsST1bRS95LndpZHRoL00udG9TY2FsZSwteS5oZWlnaHQvMl0sTj10LmxpbmVBdGxhcy53aWR0aC8oTS50b1NjYWxlKnkud2lkdGgqMjU2KmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbykvMjtuLnVuaWZvcm0yZnYoeC51X3BhdHRlcm5zY2FsZV9hLFApLG4udW5pZm9ybTFmKHgudV90ZXhfeV9hLEEueSksbi51bmlmb3JtMmZ2KHgudV9wYXR0ZXJuc2NhbGVfYixJKSxuLnVuaWZvcm0xZih4LnVfdGV4X3lfYix5LnkpLG4udW5pZm9ybTFpKHgudV9pbWFnZSwwKSxuLnVuaWZvcm0xZih4LnVfc2RmZ2FtbWEsTWF0aC5tYXgoUixOKSksbi51bmlmb3JtMWYoeC51X21peCxNLnQpLG4udW5pZm9ybTFmKHgudV9leHRyYSxnKSxuLnVuaWZvcm1NYXRyaXgyZnYoeC51X2FudGlhbGlhc2luZ21hdHJpeCwhMSxjKX1lbHNlIGlmKHope3ZhciBUPXQuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oei5mcm9tLCEwKSxxPXQuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oei50bywhMCk7aWYoIVR8fCFxKXJldHVybjt2YXIgRD1yLnRpbGVFeHRlbnQvci50aWxlU2l6ZS9NYXRoLnBvdygyLHQudHJhbnNmb3JtLnRpbGVab29tLXIuY29vcmQueikqUzt0LnNwcml0ZUF0bGFzLmJpbmQobiwhMCkseD10LmxpbmVwYXR0ZXJuU2hhZGVyLG4uc3dpdGNoU2hhZGVyKHgscCxyLmV4TWF0cml4KSxuLnVuaWZvcm0yZnYoeC51X2xpbmV3aWR0aCxbXyx1XSksbi51bmlmb3JtMWYoeC51X3JhdGlvLGQpLG4udW5pZm9ybTFmKHgudV9ibHVyLGYpLG4udW5pZm9ybTJmdih4LnVfcGF0dGVybl9zaXplX2EsW1Quc2l6ZVswXSpEKnouZnJvbVNjYWxlLHEuc2l6ZVsxXV0pLG4udW5pZm9ybTJmdih4LnVfcGF0dGVybl9zaXplX2IsW3Euc2l6ZVswXSpEKnoudG9TY2FsZSxxLnNpemVbMV1dKSxuLnVuaWZvcm0yZnYoeC51X3BhdHRlcm5fdGxfYSxULnRsKSxuLnVuaWZvcm0yZnYoeC51X3BhdHRlcm5fYnJfYSxULmJyKSxuLnVuaWZvcm0yZnYoeC51X3BhdHRlcm5fdGxfYixxLnRsKSxuLnVuaWZvcm0yZnYoeC51X3BhdHRlcm5fYnJfYixxLmJyKSxuLnVuaWZvcm0xZih4LnVfZmFkZSx6LnQpLG4udW5pZm9ybTFmKHgudV9vcGFjaXR5LGkucGFpbnRbXCJsaW5lLW9wYWNpdHlcIl0pLG4udW5pZm9ybTFmKHgudV9leHRyYSxnKSxuLnVuaWZvcm1NYXRyaXgyZnYoeC51X2FudGlhbGlhc2luZ21hdHJpeCwhMSxjKX1lbHNlIHg9dC5saW5lU2hhZGVyLG4uc3dpdGNoU2hhZGVyKHgscCxyLmV4TWF0cml4KSxuLnVuaWZvcm0yZnYoeC51X2xpbmV3aWR0aCxbXyx1XSksbi51bmlmb3JtMWYoeC51X3JhdGlvLGQpLG4udW5pZm9ybTFmKHgudV9ibHVyLGYpLG4udW5pZm9ybTFmKHgudV9leHRyYSxnKSxuLnVuaWZvcm1NYXRyaXgyZnYoeC51X2FudGlhbGlhc2luZ21hdHJpeCwhMSxjKSxuLnVuaWZvcm00ZnYoeC51X2NvbG9yLGgpO3ZhciBHPXIuYnVmZmVycy5saW5lVmVydGV4O0cuYmluZChuKTt2YXIgTD1yLmJ1ZmZlcnMubGluZUVsZW1lbnQ7TC5iaW5kKG4pO2Zvcih2YXIgSD0wO0g8YS5ncm91cHMubGVuZ3RoO0grKyl7dmFyIE89YS5ncm91cHNbSF0sQj1PLnZlcnRleFN0YXJ0SW5kZXgqRy5pdGVtU2l6ZTtuLnZlcnRleEF0dHJpYlBvaW50ZXIoeC5hX3BvcywyLG4uU0hPUlQsITEsOCxCKzApLG4udmVydGV4QXR0cmliUG9pbnRlcih4LmFfZGF0YSw0LG4uQllURSwhMSw4LEIrNCk7dmFyIFU9MypPLmVsZW1lbnRMZW5ndGgsVj1PLmVsZW1lbnRTdGFydEluZGV4KkwuaXRlbVNpemU7bi5kcmF3RWxlbWVudHMobi5UUklBTkdMRVMsVSxuLlVOU0lHTkVEX1NIT1JULFYpfX19fX07XG59LHtcIi4uL3V0aWwvYnJvd3NlclwiOjk1LFwiZ2wtbWF0cml4XCI6MTE2fV0sMzE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd1Jhc3Rlcih0LHIsZSxhKXt2YXIgaT10LmdsO2kuZGlzYWJsZShpLlNURU5DSUxfVEVTVCk7dmFyIG89dC5yYXN0ZXJTaGFkZXI7aS5zd2l0Y2hTaGFkZXIobyxlKSxpLnVuaWZvcm0xZihvLnVfYnJpZ2h0bmVzc19sb3csci5wYWludFtcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiXSksaS51bmlmb3JtMWYoby51X2JyaWdodG5lc3NfaGlnaCxyLnBhaW50W1wicmFzdGVyLWJyaWdodG5lc3MtbWF4XCJdKSxpLnVuaWZvcm0xZihvLnVfc2F0dXJhdGlvbl9mYWN0b3Isc2F0dXJhdGlvbkZhY3RvcihyLnBhaW50W1wicmFzdGVyLXNhdHVyYXRpb25cIl0pKSxpLnVuaWZvcm0xZihvLnVfY29udHJhc3RfZmFjdG9yLGNvbnRyYXN0RmFjdG9yKHIucGFpbnRbXCJyYXN0ZXItY29udHJhc3RcIl0pKSxpLnVuaWZvcm0zZnYoby51X3NwaW5fd2VpZ2h0cyxzcGluV2VpZ2h0cyhyLnBhaW50W1wicmFzdGVyLWh1ZS1yb3RhdGVcIl0pKTt2YXIgbix1LHM9YS5zb3VyY2UmJmEuc291cmNlLl9weXJhbWlkLmZpbmRMb2FkZWRQYXJlbnQoYS5jb29yZCwwLHt9KSxjPWdldE9wYWNpdGllcyhhLHMscix0LnRyYW5zZm9ybSk7aS5hY3RpdmVUZXh0dXJlKGkuVEVYVFVSRTApLGkuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELGEudGV4dHVyZSkscz8oaS5hY3RpdmVUZXh0dXJlKGkuVEVYVFVSRTEpLGkuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELHMudGV4dHVyZSksbj1NYXRoLnBvdygyLHMuY29vcmQuei1hLmNvb3JkLnopLHU9W2EuY29vcmQueCpuJTEsYS5jb29yZC55Km4lMV0pOmNbMV09MCxpLnVuaWZvcm0yZnYoby51X3RsX3BhcmVudCx1fHxbMCwwXSksaS51bmlmb3JtMWYoby51X3NjYWxlX3BhcmVudCxufHwxKSxpLnVuaWZvcm0xZihvLnVfYnVmZmVyX3NjYWxlLDEpLGkudW5pZm9ybTFmKG8udV9vcGFjaXR5MCxjWzBdKSxpLnVuaWZvcm0xZihvLnVfb3BhY2l0eTEsY1sxXSksaS51bmlmb3JtMWkoby51X2ltYWdlMCwwKSxpLnVuaWZvcm0xaShvLnVfaW1hZ2UxLDEpLGkuYmluZEJ1ZmZlcihpLkFSUkFZX0JVRkZFUixhLmJvdW5kc0J1ZmZlcnx8dC50aWxlRXh0ZW50QnVmZmVyKSxpLnZlcnRleEF0dHJpYlBvaW50ZXIoby5hX3BvcywyLGkuU0hPUlQsITEsOCwwKSxpLnZlcnRleEF0dHJpYlBvaW50ZXIoby5hX3RleHR1cmVfcG9zLDIsaS5TSE9SVCwhMSw4LDQpLGkuZHJhd0FycmF5cyhpLlRSSUFOR0xFX1NUUklQLDAsNCksaS5lbmFibGUoaS5TVEVOQ0lMX1RFU1QpfWZ1bmN0aW9uIHNwaW5XZWlnaHRzKHQpe3QqPU1hdGguUEkvMTgwO3ZhciByPU1hdGguc2luKHQpLGU9TWF0aC5jb3ModCk7cmV0dXJuWygyKmUrMSkvMywoLU1hdGguc3FydCgzKSpyLWUrMSkvMywoTWF0aC5zcXJ0KDMpKnItZSsxKS8zXX1mdW5jdGlvbiBjb250cmFzdEZhY3Rvcih0KXtyZXR1cm4gdD4wPzEvKDEtdCk6MSt0fWZ1bmN0aW9uIHNhdHVyYXRpb25GYWN0b3IodCl7cmV0dXJuIHQ+MD8xLTEvKDEuMDAxLXQpOi10fWZ1bmN0aW9uIGdldE9wYWNpdGllcyh0LHIsZSxhKXtpZighdC5zb3VyY2UpcmV0dXJuWzEsMF07dmFyIGk9KG5ldyBEYXRlKS5nZXRUaW1lKCksbz1lLnBhaW50W1wicmFzdGVyLWZhZGUtZHVyYXRpb25cIl0sbj0oaS10LnRpbWVBZGRlZCkvbyx1PXI/KGktci50aW1lQWRkZWQpL286LTEscz10LnNvdXJjZS5fcHlyYW1pZC5jb3ZlcmluZ1pvb21MZXZlbChhKSxjPXI/TWF0aC5hYnMoci5jb29yZC56LXMpPk1hdGguYWJzKHQuY29vcmQuei1zKTohMSxmPVtdOyFyfHxjPyhmWzBdPXV0aWwuY2xhbXAobiwwLDEpLGZbMV09MS1mWzBdKTooZlswXT11dGlsLmNsYW1wKDEtdSwwLDEpLGZbMV09MS1mWzBdKTt2YXIgZD1lLnBhaW50W1wicmFzdGVyLW9wYWNpdHlcIl07cmV0dXJuIGZbMF0qPWQsZlsxXSo9ZCxmfXZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIik7bW9kdWxlLmV4cG9ydHM9ZHJhd1Jhc3Rlcjtcbn0se1wiLi4vdXRpbC91dGlsXCI6MTA2fV0sMzI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd1N5bWJvbHMoZSx0LHIsYSl7aWYoYS5idWZmZXJzKXt2YXIgbz1hLmVsZW1lbnRHcm91cHNbdC5yZWZ8fHQuaWRdO2lmKG8pe3ZhciBpPSEodC5sYXlvdXRbXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIl18fHQubGF5b3V0W1wiaWNvbi1hbGxvdy1vdmVybGFwXCJdfHx0LmxheW91dFtcInRleHQtaWdub3JlLXBsYWNlbWVudFwiXXx8dC5sYXlvdXRbXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIl0pLG49ZS5nbDtpJiZuLmRpc2FibGUobi5TVEVOQ0lMX1RFU1QpLG8udGV4dC5ncm91cHMubGVuZ3RoJiZkcmF3U3ltYm9sKGUsdCxyLGEsby50ZXh0LFwidGV4dFwiLCEwKSxvLmljb24uZ3JvdXBzLmxlbmd0aCYmZHJhd1N5bWJvbChlLHQscixhLG8uaWNvbixcImljb25cIixvLnNkZkljb25zKSxkcmF3Q29sbGlzaW9uRGVidWcoZSx0LHIsYSksaSYmbi5lbmFibGUobi5TVEVOQ0lMX1RFU1QpfX19ZnVuY3Rpb24gZHJhd1N5bWJvbChlLHQscixhLG8saSxuKXt2YXIgbD1lLmdsO3I9ZS50cmFuc2xhdGVNYXRyaXgocixhLHQucGFpbnRbaStcIi10cmFuc2xhdGVcIl0sdC5wYWludFtpK1wiLXRyYW5zbGF0ZS1hbmNob3JcIl0pO3ZhciBtLGYsdSxzPWUudHJhbnNmb3JtLGQ9XCJtYXBcIj09PXQubGF5b3V0W2krXCItcm90YXRpb24tYWxpZ25tZW50XCJdLGg9ZDtoPyhtPW1hdDQuY3JlYXRlKCksZj1hLnRpbGVFeHRlbnQvYS50aWxlU2l6ZS9NYXRoLnBvdygyLGUudHJhbnNmb3JtLnpvb20tYS5jb29yZC56KSx1PTEvTWF0aC5jb3Mocy5fcGl0Y2gpKToobT1tYXQ0LmNsb25lKGEuZXhNYXRyaXgpLGY9ZS50cmFuc2Zvcm0uYWx0aXR1ZGUsdT0xKSxtYXQ0LnNjYWxlKG0sbSxbZixmLDFdKTt2YXIgcD10LnBhaW50W2krXCItc2l6ZVwiXSxnPXAvZGVmYXVsdFNpemVzW2ldO21hdDQuc2NhbGUobSxtLFtnLGcsMV0pO3ZhciBTLGMseCxiLHY9TWF0aC5zcXJ0KHMuaGVpZ2h0KnMuaGVpZ2h0LzQqKDErcy5hbHRpdHVkZSpzLmFsdGl0dWRlKSksXz1zLmhlaWdodC8yKk1hdGgudGFuKHMuX3BpdGNoKSx6PSh2K18pL3YtMSx3PVwidGV4dFwiPT09aTtpZih3fHxlLnN0eWxlLnNwcml0ZS5sb2FkZWQoKSl7bC5hY3RpdmVUZXh0dXJlKGwuVEVYVFVSRTApLFM9bj9lLnNkZlNoYWRlcjplLmljb25TaGFkZXIsdz8oZS5nbHlwaEF0bGFzLnVwZGF0ZVRleHR1cmUobCksYz1hLmJ1ZmZlcnMuZ2x5cGhWZXJ0ZXgseD1hLmJ1ZmZlcnMuZ2x5cGhFbGVtZW50LGI9W2UuZ2x5cGhBdGxhcy53aWR0aC80LGUuZ2x5cGhBdGxhcy5oZWlnaHQvNF0pOihlLnNwcml0ZUF0bGFzLmJpbmQobCxkfHxlLm9wdGlvbnMucm90YXRpbmd8fGUub3B0aW9ucy56b29taW5nfHwxIT09Z3x8bnx8ZS50cmFuc2Zvcm0ucGl0Y2gpLGM9YS5idWZmZXJzLmljb25WZXJ0ZXgseD1hLmJ1ZmZlcnMuaWNvbkVsZW1lbnQsYj1bZS5zcHJpdGVBdGxhcy53aWR0aC80LGUuc3ByaXRlQXRsYXMuaGVpZ2h0LzRdKSxsLnN3aXRjaFNoYWRlcihTLHIsbSksbC51bmlmb3JtMWkoUy51X3RleHR1cmUsMCksbC51bmlmb3JtMmZ2KFMudV90ZXhzaXplLGIpLGwudW5pZm9ybTFpKFMudV9za2V3ZWQsaCksbC51bmlmb3JtMWYoUy51X2V4dHJhLHopO3ZhciB5PU1hdGgubG9nKHAvb1tpK1wiLXNpemVcIl0pL01hdGguTE4yfHwwO2wudW5pZm9ybTFmKFMudV96b29tLDEwKihlLnRyYW5zZm9ybS56b29tLXkpKTt2YXIgRT1lLmZyYW1lSGlzdG9yeS5nZXRGYWRlUHJvcGVydGllcygzMDApO2wudW5pZm9ybTFmKFMudV9mYWRlZGlzdCwxMCpFLmZhZGVkaXN0KSxsLnVuaWZvcm0xZihTLnVfbWluZmFkZXpvb20sTWF0aC5mbG9vcigxMCpFLm1pbmZhZGV6b29tKSksbC51bmlmb3JtMWYoUy51X21heGZhZGV6b29tLE1hdGguZmxvb3IoMTAqRS5tYXhmYWRlem9vbSkpLGwudW5pZm9ybTFmKFMudV9mYWRlem9vbSwxMCooZS50cmFuc2Zvcm0uem9vbStFLmJ1bXApKTt2YXIgVCxJLE4sTTtpZih4LmJpbmQobCksbil7dmFyIEE9OCxMPTEuMTksUj02LEc9LjEwNSpkZWZhdWx0U2l6ZXNbaV0vcC9icm93c2VyLmRldmljZVBpeGVsUmF0aW87bC51bmlmb3JtMWYoUy51X2dhbW1hLEcqdSksbC51bmlmb3JtNGZ2KFMudV9jb2xvcix0LnBhaW50W2krXCItY29sb3JcIl0pLGwudW5pZm9ybTFmKFMudV9idWZmZXIsLjc1KTtmb3IodmFyIEQ9MDtEPG8uZ3JvdXBzLmxlbmd0aDtEKyspVD1vLmdyb3Vwc1tEXSxJPVQudmVydGV4U3RhcnRJbmRleCpjLml0ZW1TaXplLGMuYmluZChsLFMsSSksTj0zKlQuZWxlbWVudExlbmd0aCxNPVQuZWxlbWVudFN0YXJ0SW5kZXgqeC5pdGVtU2l6ZSxsLmRyYXdFbGVtZW50cyhsLlRSSUFOR0xFUyxOLGwuVU5TSUdORURfU0hPUlQsTSk7aWYodC5wYWludFtpK1wiLWhhbG8td2lkdGhcIl0pe2wudW5pZm9ybTFmKFMudV9nYW1tYSwodC5wYWludFtpK1wiLWhhbG8tYmx1clwiXSpML2cvQStHKSp1KSxsLnVuaWZvcm00ZnYoUy51X2NvbG9yLHQucGFpbnRbaStcIi1oYWxvLWNvbG9yXCJdKSxsLnVuaWZvcm0xZihTLnVfYnVmZmVyLChSLXQucGFpbnRbaStcIi1oYWxvLXdpZHRoXCJdL2cpL0EpO2Zvcih2YXIgcT0wO3E8by5ncm91cHMubGVuZ3RoO3ErKylUPW8uZ3JvdXBzW3FdLEk9VC52ZXJ0ZXhTdGFydEluZGV4KmMuaXRlbVNpemUsYy5iaW5kKGwsUyxJKSxOPTMqVC5lbGVtZW50TGVuZ3RoLE09VC5lbGVtZW50U3RhcnRJbmRleCp4Lml0ZW1TaXplLGwuZHJhd0VsZW1lbnRzKGwuVFJJQU5HTEVTLE4sbC5VTlNJR05FRF9TSE9SVCxNKX19ZWxzZXtsLnVuaWZvcm0xZihTLnVfb3BhY2l0eSx0LnBhaW50W1wiaWNvbi1vcGFjaXR5XCJdKTtmb3IodmFyIEM9MDtDPG8uZ3JvdXBzLmxlbmd0aDtDKyspVD1vLmdyb3Vwc1tDXSxJPVQudmVydGV4U3RhcnRJbmRleCpjLml0ZW1TaXplLGMuYmluZChsLFMsSSksTj0zKlQuZWxlbWVudExlbmd0aCxNPVQuZWxlbWVudFN0YXJ0SW5kZXgqeC5pdGVtU2l6ZSxsLmRyYXdFbGVtZW50cyhsLlRSSUFOR0xFUyxOLGwuVU5TSUdORURfU0hPUlQsTSl9fX12YXIgYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpLG1hdDQ9cmVxdWlyZShcImdsLW1hdHJpeFwiKS5tYXQ0LGRyYXdDb2xsaXNpb25EZWJ1Zz1yZXF1aXJlKFwiLi9kcmF3X2NvbGxpc2lvbl9kZWJ1Z1wiKTttb2R1bGUuZXhwb3J0cz1kcmF3U3ltYm9sczt2YXIgZGVmYXVsdFNpemVzPXtpY29uOjEsdGV4dDoyNH07XG59LHtcIi4uL3V0aWwvYnJvd3NlclwiOjk1LFwiLi9kcmF3X2NvbGxpc2lvbl9kZWJ1Z1wiOjI3LFwiZ2wtbWF0cml4XCI6MTE2fV0sMzM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd1ZlcnRpY2VzKGUscix0LGkpe2Z1bmN0aW9uIG8ocix0LGksbyl7Zi5zd2l0Y2hTaGFkZXIoZS5kb3RTaGFkZXIsaSksZi51bmlmb3JtMWYoZS5kb3RTaGFkZXIudV9zaXplLDQqYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKSxmLnVuaWZvcm0xZihlLmRvdFNoYWRlci51X2JsdXIsLjI1KSxmLnVuaWZvcm00ZnYoZS5kb3RTaGFkZXIudV9jb2xvcixbLjEsMCwwLC4xXSksci5iaW5kKGYsZS5kb3RTaGFkZXIsMCk7Zm9yKHZhciBhPTA7YTx0Lmxlbmd0aDthKyspe3ZhciBzPXRbYV0sdT1zLnZlcnRleFN0YXJ0SW5kZXgsZD1zLnZlcnRleExlbmd0aDtmLnZlcnRleEF0dHJpYlBvaW50ZXIoZS5kb3RTaGFkZXIuYV9wb3MsMixmLlNIT1JULCExLG8sMCksZi5kcmF3QXJyYXlzKGYuUE9JTlRTLHUsZCl9fXZhciBmPWUuZ2w7aWYoaSYmaS5idWZmZXJzKXt2YXIgYT1pLmVsZW1lbnRHcm91cHNbci5yZWZ8fHIuaWRdO2lmKGEpe2lmKGYuYmxlbmRGdW5jKGYuT05FLGYuT05FX01JTlVTX1NSQ19BTFBIQSksXCJmaWxsXCI9PT1yLnR5cGUpbyhpLmJ1ZmZlcnMuZmlsbFZlcnRleCxhLmdyb3Vwcyx0LDQpO2Vsc2UgaWYoXCJzeW1ib2xcIj09PXIudHlwZSlvKGkuYnVmZmVycy5pY29uVmVydGV4LGEuaWNvbi5ncm91cHMsdCwxNiksbyhpLmJ1ZmZlcnMuZ2x5cGhWZXJ0ZXgsYS50ZXh0Lmdyb3Vwcyx0LDE2KTtlbHNlIGlmKFwibGluZVwiPT09ci50eXBlKXt2YXIgcz1tYXQ0LmNsb25lKHQpO21hdDQuc2NhbGUocyxzLFsuNSwuNSwxXSksbyhpLmJ1ZmZlcnMubGluZVZlcnRleCxhLmdyb3VwcyxzLDgpfWYuYmxlbmRGdW5jKGYuT05FX01JTlVTX0RTVF9BTFBIQSxmLk9ORSl9fX12YXIgYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpLG1hdDQ9cmVxdWlyZShcImdsLW1hdHJpeFwiKS5tYXQ0O21vZHVsZS5leHBvcnRzPWRyYXdWZXJ0aWNlcztcbn0se1wiLi4vdXRpbC9icm93c2VyXCI6OTUsXCJnbC1tYXRyaXhcIjoxMTZ9XSwzNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBGcmFtZUhpc3RvcnkoKXt0aGlzLmZyYW1lSGlzdG9yeT1bXX1tb2R1bGUuZXhwb3J0cz1GcmFtZUhpc3RvcnksRnJhbWVIaXN0b3J5LnByb3RvdHlwZS5nZXRGYWRlUHJvcGVydGllcz1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0zMDApO2Zvcih2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmZyYW1lSGlzdG9yeS5sZW5ndGg+MyYmdGhpcy5mcmFtZUhpc3RvcnlbMV0udGltZSt0PGU7KXRoaXMuZnJhbWVIaXN0b3J5LnNoaWZ0KCk7dGhpcy5mcmFtZUhpc3RvcnlbMV0udGltZSt0PGUmJih0aGlzLmZyYW1lSGlzdG9yeVswXS56PXRoaXMuZnJhbWVIaXN0b3J5WzFdLnopO3ZhciByPXRoaXMuZnJhbWVIaXN0b3J5Lmxlbmd0aDszPnImJmNvbnNvbGUud2FybihcInRoZXJlIHNob3VsZCBuZXZlciBiZSBsZXNzIHRoYW4gdGhyZWUgZnJhbWVzIGluIHRoZSBoaXN0b3J5XCIpO3ZhciBpPXRoaXMuZnJhbWVIaXN0b3J5WzBdLnoscz10aGlzLmZyYW1lSGlzdG9yeVtyLTFdLG89cy56LGE9TWF0aC5taW4oaSxvKSxtPU1hdGgubWF4KGksbyksaD1zLnotdGhpcy5mcmFtZUhpc3RvcnlbMV0ueixmPXMudGltZS10aGlzLmZyYW1lSGlzdG9yeVsxXS50aW1lLHk9aC8oZi90KTtpc05hTih5KSYmY29uc29sZS53YXJuKFwiZmFkZWRpc3Qgc2hvdWxkIG5ldmVyIGJlIE5hTlwiKTt2YXIgbj0oZS1zLnRpbWUpL3QqeTtyZXR1cm57ZmFkZWRpc3Q6eSxtaW5mYWRlem9vbTphLG1heGZhZGV6b29tOm0sYnVtcDpufX0sRnJhbWVIaXN0b3J5LnByb3RvdHlwZS5yZWNvcmQ9ZnVuY3Rpb24odCl7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7dGhpcy5mcmFtZUhpc3RvcnkubGVuZ3RofHx0aGlzLmZyYW1lSGlzdG9yeS5wdXNoKHt0aW1lOjAsejp0fSx7dGltZTowLHo6dH0pLCgyPT09dGhpcy5mcmFtZUhpc3RvcnkubGVuZ3RofHx0aGlzLmZyYW1lSGlzdG9yeVt0aGlzLmZyYW1lSGlzdG9yeS5sZW5ndGgtMV0ueiE9PXQpJiZ0aGlzLmZyYW1lSGlzdG9yeS5wdXNoKHt0aW1lOmUsejp0fSl9O1xufSx7fV0sMzU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIHNoYWRlcnM9cmVxdWlyZShcIi4vc2hhZGVyc1wiKSx1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIik7ZXhwb3J0cy5leHRlbmQ9ZnVuY3Rpb24ocil7dmFyIHQ9ci5saW5lV2lkdGgsZT1yLmdldFBhcmFtZXRlcihyLkFMSUFTRURfTElORV9XSURUSF9SQU5HRSk7cmV0dXJuIHIubGluZVdpZHRoPWZ1bmN0aW9uKGkpe3QuY2FsbChyLHV0aWwuY2xhbXAoaSxlWzBdLGVbMV0pKX0sci5nZXRTaGFkZXI9ZnVuY3Rpb24ocix0KXt2YXIgZT10PT09dGhpcy5GUkFHTUVOVF9TSEFERVI/XCJmcmFnbWVudFwiOlwidmVydGV4XCI7aWYoIXNoYWRlcnNbcl18fCFzaGFkZXJzW3JdW2VdKXRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHNoYWRlciBcIityKTt2YXIgaT10aGlzLmNyZWF0ZVNoYWRlcih0KSxhPXNoYWRlcnNbcl1bZV07aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIG9yaWVudGF0aW9uJiYoYT1hLnJlcGxhY2UoLyBoaWdocCAvZyxcIiBcIikpLHRoaXMuc2hhZGVyU291cmNlKGksYSksdGhpcy5jb21waWxlU2hhZGVyKGkpLCF0aGlzLmdldFNoYWRlclBhcmFtZXRlcihpLHRoaXMuQ09NUElMRV9TVEFUVVMpKXRocm93IG5ldyBFcnJvcih0aGlzLmdldFNoYWRlckluZm9Mb2coaSkpO3JldHVybiBpfSxyLmluaXRpYWxpemVTaGFkZXI9ZnVuY3Rpb24ocix0LGUpe3ZhciBpPXtwcm9ncmFtOnRoaXMuY3JlYXRlUHJvZ3JhbSgpLGZyYWdtZW50OnRoaXMuZ2V0U2hhZGVyKHIsdGhpcy5GUkFHTUVOVF9TSEFERVIpLHZlcnRleDp0aGlzLmdldFNoYWRlcihyLHRoaXMuVkVSVEVYX1NIQURFUiksYXR0cmlidXRlczpbXX07aWYodGhpcy5hdHRhY2hTaGFkZXIoaS5wcm9ncmFtLGkudmVydGV4KSx0aGlzLmF0dGFjaFNoYWRlcihpLnByb2dyYW0saS5mcmFnbWVudCksdGhpcy5saW5rUHJvZ3JhbShpLnByb2dyYW0pLHRoaXMuZ2V0UHJvZ3JhbVBhcmFtZXRlcihpLnByb2dyYW0sdGhpcy5MSU5LX1NUQVRVUykpe2Zvcih2YXIgYT0wO2E8dC5sZW5ndGg7YSsrKWlbdFthXV09dGhpcy5nZXRBdHRyaWJMb2NhdGlvbihpLnByb2dyYW0sdFthXSksaS5hdHRyaWJ1dGVzLnB1c2goaVt0W2FdXSk7Zm9yKHZhciBoPTA7aDxlLmxlbmd0aDtoKyspaVtlW2hdXT10aGlzLmdldFVuaWZvcm1Mb2NhdGlvbihpLnByb2dyYW0sZVtoXSl9ZWxzZSBjb25zb2xlLmVycm9yKHRoaXMuZ2V0UHJvZ3JhbUluZm9Mb2coaS5wcm9ncmFtKSk7cmV0dXJuIGl9LHIuc3dpdGNoU2hhZGVyPWZ1bmN0aW9uKHIsdCxlKXtpZih0fHxjb25zb2xlLnRyYWNlKFwicG9zTWF0cml4IGRvZXMgbm90IGhhdmUgcmVxdWlyZWQgYXJndW1lbnRcIiksdGhpcy5jdXJyZW50U2hhZGVyIT09cil7dGhpcy51c2VQcm9ncmFtKHIucHJvZ3JhbSk7Zm9yKHZhciBpPXRoaXMuY3VycmVudFNoYWRlcj90aGlzLmN1cnJlbnRTaGFkZXIuYXR0cmlidXRlczpbXSxhPXIuYXR0cmlidXRlcyxoPTA7aDxpLmxlbmd0aDtoKyspYS5pbmRleE9mKGlbaF0pPDAmJnRoaXMuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGlbaF0pO2Zvcih2YXIgbz0wO288YS5sZW5ndGg7bysrKWkuaW5kZXhPZihhW29dKTwwJiZ0aGlzLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGFbb10pO3RoaXMuY3VycmVudFNoYWRlcj1yfXIucG9zTWF0cml4IT09dCYmKHRoaXMudW5pZm9ybU1hdHJpeDRmdihyLnVfbWF0cml4LCExLHQpLHIucG9zTWF0cml4PXQpLGUmJnIuZXhNYXRyaXghPT1lJiZyLnVfZXhtYXRyaXgmJih0aGlzLnVuaWZvcm1NYXRyaXg0ZnYoci51X2V4bWF0cml4LCExLGUpLHIuZXhNYXRyaXg9ZSl9LHIudmVydGV4QXR0cmliMmZ2PWZ1bmN0aW9uKHQsZSl7ci52ZXJ0ZXhBdHRyaWIyZih0LGVbMF0sZVsxXSl9LHIudmVydGV4QXR0cmliM2Z2PWZ1bmN0aW9uKHQsZSl7ci52ZXJ0ZXhBdHRyaWIzZih0LGVbMF0sZVsxXSxlWzJdKX0sci52ZXJ0ZXhBdHRyaWI0ZnY9ZnVuY3Rpb24odCxlKXtyLnZlcnRleEF0dHJpYjRmKHQsZVswXSxlWzFdLGVbMl0sZVszXSl9LHJ9O1xufSx7XCIuLi91dGlsL3V0aWxcIjoxMDYsXCIuL3NoYWRlcnNcIjozOH1dLDM2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIExpbmVBdGxhcyh0LGkpe3RoaXMud2lkdGg9dCx0aGlzLmhlaWdodD1pLHRoaXMubmV4dFJvdz0wLHRoaXMuYnl0ZXM9NCx0aGlzLmRhdGE9bmV3IFVpbnQ4QXJyYXkodGhpcy53aWR0aCp0aGlzLmhlaWdodCp0aGlzLmJ5dGVzKSx0aGlzLnBvc2l0aW9ucz17fX1tb2R1bGUuZXhwb3J0cz1MaW5lQXRsYXMsTGluZUF0bGFzLnByb3RvdHlwZS5zZXRTcHJpdGU9ZnVuY3Rpb24odCl7dGhpcy5zcHJpdGU9dH0sTGluZUF0bGFzLnByb3RvdHlwZS5nZXREYXNoPWZ1bmN0aW9uKHQsaSl7dmFyIGU9dC5qb2luKFwiLFwiKStpO3JldHVybiB0aGlzLnBvc2l0aW9uc1tlXXx8KHRoaXMucG9zaXRpb25zW2VdPXRoaXMuYWRkRGFzaCh0LGkpKSx0aGlzLnBvc2l0aW9uc1tlXX0sTGluZUF0bGFzLnByb3RvdHlwZS5hZGREYXNoPWZ1bmN0aW9uKHQsaSl7dmFyIGU9aT83OjAsaD0yKmUrMSxzPTEyODtpZih0aGlzLm5leHRSb3craD50aGlzLmhlaWdodClyZXR1cm4gY29uc29sZS53YXJuKFwiTGluZUF0bGFzIG91dCBvZiBzcGFjZVwiKSxudWxsO2Zvcih2YXIgYT0wLHI9MDtyPHQubGVuZ3RoO3IrKylhKz10W3JdO2Zvcih2YXIgbj10aGlzLndpZHRoL2Esbz1uLzIsZD10Lmxlbmd0aCUyPT09MSxFPS1lO2U+PUU7RSsrKWZvcih2YXIgVD10aGlzLm5leHRSb3crZStFLGw9dGhpcy53aWR0aCpULFI9ZD8tdFt0Lmxlbmd0aC0xXTowLHU9dFswXSxnPTEscD0wO3A8dGhpcy53aWR0aDtwKyspe2Zvcig7cC9uPnU7KVI9dSx1Kz10W2ddLGQmJmc9PT10Lmxlbmd0aC0xJiYodSs9dFswXSksZysrO3ZhciB4LGY9TWF0aC5hYnMocC1SKm4pLEE9TWF0aC5hYnMocC11Km4pLHc9TWF0aC5taW4oZixBKSxfPWclMj09PTE7aWYoaSl7dmFyIHk9ZT9FL2UqKG8rMSk6MDtpZihfKXt2YXIgRD1vLU1hdGguYWJzKHkpO3g9TWF0aC5zcXJ0KHcqdytEKkQpfWVsc2UgeD1vLU1hdGguc3FydCh3KncreSp5KX1lbHNlIHg9KF8/MTotMSkqdzt0aGlzLmRhdGFbMys0KihsK3ApXT1NYXRoLm1heCgwLE1hdGgubWluKDI1NSx4K3MpKX12YXIgYz17eToodGhpcy5uZXh0Um93K2UrLjUpL3RoaXMuaGVpZ2h0LGhlaWdodDoyKmUvdGhpcy5oZWlnaHQsd2lkdGg6YX07cmV0dXJuIHRoaXMubmV4dFJvdys9aCx0aGlzLmRpcnR5PSEwLGN9LExpbmVBdGxhcy5wcm90b3R5cGUuYmluZD1mdW5jdGlvbih0KXt0aGlzLnRleHR1cmU/KHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELHRoaXMudGV4dHVyZSksdGhpcy5kaXJ0eSYmKHRoaXMuZGlydHk9ITEsdC50ZXhTdWJJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LHQuUkdCQSx0LlVOU0lHTkVEX0JZVEUsdGhpcy5kYXRhKSkpOih0aGlzLnRleHR1cmU9dC5jcmVhdGVUZXh0dXJlKCksdC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9XUkFQX1MsdC5SRVBFQVQpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX1dSQVBfVCx0LlJFUEVBVCksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUlOX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUFHX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLHQuUkdCQSx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LDAsdC5SR0JBLHQuVU5TSUdORURfQllURSx0aGlzLmRhdGEpKX0sTGluZUF0bGFzLnByb3RvdHlwZS5kZWJ1Zz1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KSx0LnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIix0LnN0eWxlLnRvcD0wLHQuc3R5bGUubGVmdD0wLHQuc3R5bGUuYmFja2dyb3VuZD1cIiNmZjBcIix0LndpZHRoPXRoaXMud2lkdGgsdC5oZWlnaHQ9dGhpcy5oZWlnaHQ7Zm9yKHZhciBpPXQuZ2V0Q29udGV4dChcIjJkXCIpLGU9aS5nZXRJbWFnZURhdGEoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLGg9MDtoPHRoaXMuZGF0YS5sZW5ndGg7aCsrKWlmKHRoaXMuc2RmKXt2YXIgcz00Kmg7ZS5kYXRhW3NdPWUuZGF0YVtzKzFdPWUuZGF0YVtzKzJdPTAsZS5kYXRhW3MrM109dGhpcy5kYXRhW2hdfWVsc2UgZS5kYXRhW2hdPXRoaXMuZGF0YVtoXTtpLnB1dEltYWdlRGF0YShlLDAsMCl9O1xufSx7fV0sMzc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gUGFpbnRlcih0LGUpe3RoaXMuZ2w9Z2x1dGlsLmV4dGVuZCh0KSx0aGlzLnRyYW5zZm9ybT1lLHRoaXMucmV1c2FibGVUZXh0dXJlcz17fSx0aGlzLnByZUZib3M9e30sdGhpcy5mcmFtZUhpc3Rvcnk9bmV3IEZyYW1lSGlzdG9yeSx0aGlzLnNldHVwKCl9dmFyIGdsdXRpbD1yZXF1aXJlKFwiLi9nbF91dGlsXCIpLGJyb3dzZXI9cmVxdWlyZShcIi4uL3V0aWwvYnJvd3NlclwiKSxtYXQ0PXJlcXVpcmUoXCJnbC1tYXRyaXhcIikubWF0NCxGcmFtZUhpc3Rvcnk9cmVxdWlyZShcIi4vZnJhbWVfaGlzdG9yeVwiKTttb2R1bGUuZXhwb3J0cz1QYWludGVyLFBhaW50ZXIucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2w7dGhpcy53aWR0aD10KmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyx0aGlzLmhlaWdodD1lKmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxpLnZpZXdwb3J0KDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX0sUGFpbnRlci5wcm90b3R5cGUuc2V0dXA9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdsO3QudmVyYm9zZT0hMCx0LmVuYWJsZSh0LkJMRU5EKSx0LmJsZW5kRnVuYyh0Lk9ORV9NSU5VU19EU1RfQUxQSEEsdC5PTkUpLHQuZW5hYmxlKHQuU1RFTkNJTF9URVNUKSx0aGlzLmRlYnVnU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcImRlYnVnXCIsW1wiYV9wb3NcIl0sW1widV9tYXRyaXhcIixcInVfY29sb3JcIl0pLHRoaXMucmFzdGVyU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcInJhc3RlclwiLFtcImFfcG9zXCIsXCJhX3RleHR1cmVfcG9zXCJdLFtcInVfbWF0cml4XCIsXCJ1X2JyaWdodG5lc3NfbG93XCIsXCJ1X2JyaWdodG5lc3NfaGlnaFwiLFwidV9zYXR1cmF0aW9uX2ZhY3RvclwiLFwidV9zcGluX3dlaWdodHNcIixcInVfY29udHJhc3RfZmFjdG9yXCIsXCJ1X29wYWNpdHkwXCIsXCJ1X29wYWNpdHkxXCIsXCJ1X2ltYWdlMFwiLFwidV9pbWFnZTFcIixcInVfdGxfcGFyZW50XCIsXCJ1X3NjYWxlX3BhcmVudFwiLFwidV9idWZmZXJfc2NhbGVcIl0pLHRoaXMuY2lyY2xlU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcImNpcmNsZVwiLFtcImFfcG9zXCJdLFtcInVfbWF0cml4XCIsXCJ1X2V4bWF0cml4XCIsXCJ1X2JsdXJcIixcInVfc2l6ZVwiLFwidV9jb2xvclwiXSksdGhpcy5saW5lU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcImxpbmVcIixbXCJhX3Bvc1wiLFwiYV9kYXRhXCJdLFtcInVfbWF0cml4XCIsXCJ1X2xpbmV3aWR0aFwiLFwidV9jb2xvclwiLFwidV9yYXRpb1wiLFwidV9ibHVyXCIsXCJ1X2V4dHJhXCIsXCJ1X2FudGlhbGlhc2luZ21hdHJpeFwiXSksdGhpcy5saW5lcGF0dGVyblNoYWRlcj10LmluaXRpYWxpemVTaGFkZXIoXCJsaW5lcGF0dGVyblwiLFtcImFfcG9zXCIsXCJhX2RhdGFcIl0sW1widV9tYXRyaXhcIixcInVfbGluZXdpZHRoXCIsXCJ1X3JhdGlvXCIsXCJ1X3BhdHRlcm5fc2l6ZV9hXCIsXCJ1X3BhdHRlcm5fc2l6ZV9iXCIsXCJ1X3BhdHRlcm5fdGxfYVwiLFwidV9wYXR0ZXJuX2JyX2FcIixcInVfcGF0dGVybl90bF9iXCIsXCJ1X3BhdHRlcm5fYnJfYlwiLFwidV9ibHVyXCIsXCJ1X2ZhZGVcIixcInVfb3BhY2l0eVwiLFwidV9leHRyYVwiLFwidV9hbnRpYWxpYXNpbmdtYXRyaXhcIl0pLHRoaXMubGluZXNkZnBhdHRlcm5TaGFkZXI9dC5pbml0aWFsaXplU2hhZGVyKFwibGluZXNkZnBhdHRlcm5cIixbXCJhX3Bvc1wiLFwiYV9kYXRhXCJdLFtcInVfbWF0cml4XCIsXCJ1X2xpbmV3aWR0aFwiLFwidV9jb2xvclwiLFwidV9yYXRpb1wiLFwidV9ibHVyXCIsXCJ1X3BhdHRlcm5zY2FsZV9hXCIsXCJ1X3RleF95X2FcIixcInVfcGF0dGVybnNjYWxlX2JcIixcInVfdGV4X3lfYlwiLFwidV9pbWFnZVwiLFwidV9zZGZnYW1tYVwiLFwidV9taXhcIixcInVfZXh0cmFcIixcInVfYW50aWFsaWFzaW5nbWF0cml4XCJdKSx0aGlzLmRvdFNoYWRlcj10LmluaXRpYWxpemVTaGFkZXIoXCJkb3RcIixbXCJhX3Bvc1wiXSxbXCJ1X21hdHJpeFwiLFwidV9zaXplXCIsXCJ1X2NvbG9yXCIsXCJ1X2JsdXJcIl0pLHRoaXMuc2RmU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcInNkZlwiLFtcImFfcG9zXCIsXCJhX29mZnNldFwiLFwiYV9kYXRhMVwiLFwiYV9kYXRhMlwiXSxbXCJ1X21hdHJpeFwiLFwidV9leG1hdHJpeFwiLFwidV90ZXh0dXJlXCIsXCJ1X3RleHNpemVcIixcInVfY29sb3JcIixcInVfZ2FtbWFcIixcInVfYnVmZmVyXCIsXCJ1X3pvb21cIixcInVfZmFkZWRpc3RcIixcInVfbWluZmFkZXpvb21cIixcInVfbWF4ZmFkZXpvb21cIixcInVfZmFkZXpvb21cIixcInVfc2tld2VkXCIsXCJ1X2V4dHJhXCJdKSx0aGlzLmljb25TaGFkZXI9dC5pbml0aWFsaXplU2hhZGVyKFwiaWNvblwiLFtcImFfcG9zXCIsXCJhX29mZnNldFwiLFwiYV9kYXRhMVwiLFwiYV9kYXRhMlwiXSxbXCJ1X21hdHJpeFwiLFwidV9leG1hdHJpeFwiLFwidV90ZXh0dXJlXCIsXCJ1X3RleHNpemVcIixcInVfem9vbVwiLFwidV9mYWRlZGlzdFwiLFwidV9taW5mYWRlem9vbVwiLFwidV9tYXhmYWRlem9vbVwiLFwidV9mYWRlem9vbVwiLFwidV9vcGFjaXR5XCIsXCJ1X3NrZXdlZFwiLFwidV9leHRyYVwiXSksdGhpcy5vdXRsaW5lU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcIm91dGxpbmVcIixbXCJhX3Bvc1wiXSxbXCJ1X21hdHJpeFwiLFwidV9jb2xvclwiLFwidV93b3JsZFwiXSksdGhpcy5wYXR0ZXJuU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcInBhdHRlcm5cIixbXCJhX3Bvc1wiXSxbXCJ1X21hdHJpeFwiLFwidV9wYXR0ZXJuX3RsX2FcIixcInVfcGF0dGVybl9icl9hXCIsXCJ1X3BhdHRlcm5fdGxfYlwiLFwidV9wYXR0ZXJuX2JyX2JcIixcInVfbWl4XCIsXCJ1X3BhdHRlcm5tYXRyaXhfYVwiLFwidV9wYXR0ZXJubWF0cml4X2JcIixcInVfb3BhY2l0eVwiLFwidV9pbWFnZVwiXSksdGhpcy5maWxsU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcImZpbGxcIixbXCJhX3Bvc1wiXSxbXCJ1X21hdHJpeFwiLFwidV9jb2xvclwiXSksdGhpcy5jb2xsaXNpb25Cb3hTaGFkZXI9dC5pbml0aWFsaXplU2hhZGVyKFwiY29sbGlzaW9uYm94XCIsW1wiYV9wb3NcIixcImFfZXh0cnVkZVwiLFwiYV9kYXRhXCJdLFtcInVfbWF0cml4XCIsXCJ1X3NjYWxlXCIsXCJ1X3pvb21cIixcInVfbWF4em9vbVwiXSksdGhpcy5pZGVudGl0eU1hdHJpeD1tYXQ0LmNyZWF0ZSgpLHRoaXMuYmFja2dyb3VuZEJ1ZmZlcj10LmNyZWF0ZUJ1ZmZlcigpLHRoaXMuYmFja2dyb3VuZEJ1ZmZlci5pdGVtU2l6ZT0yLHRoaXMuYmFja2dyb3VuZEJ1ZmZlci5pdGVtQ291bnQ9NCx0LmJpbmRCdWZmZXIodC5BUlJBWV9CVUZGRVIsdGhpcy5iYWNrZ3JvdW5kQnVmZmVyKSx0LmJ1ZmZlckRhdGEodC5BUlJBWV9CVUZGRVIsbmV3IEludDE2QXJyYXkoWy0xLC0xLDEsLTEsLTEsMSwxLDFdKSx0LlNUQVRJQ19EUkFXKSx0aGlzLnNldEV4dGVudCg0MDk2KSx0aGlzLmRlYnVnVGV4dEJ1ZmZlcj10LmNyZWF0ZUJ1ZmZlcigpLHRoaXMuZGVidWdUZXh0QnVmZmVyLml0ZW1TaXplPTJ9LFBhaW50ZXIucHJvdG90eXBlLnNldEV4dGVudD1mdW5jdGlvbih0KXtpZih0JiZ0IT09dGhpcy50aWxlRXh0ZW50KXt0aGlzLnRpbGVFeHRlbnQ9dDt2YXIgZT10aGlzLmdsO3RoaXMudGlsZUV4dGVudEJ1ZmZlcj1lLmNyZWF0ZUJ1ZmZlcigpLHRoaXMudGlsZUV4dGVudEJ1ZmZlci5pdGVtU2l6ZT00LHRoaXMudGlsZUV4dGVudEJ1ZmZlci5pdGVtQ291bnQ9NCxlLmJpbmRCdWZmZXIoZS5BUlJBWV9CVUZGRVIsdGhpcy50aWxlRXh0ZW50QnVmZmVyKSxlLmJ1ZmZlckRhdGEoZS5BUlJBWV9CVUZGRVIsbmV3IEludDE2QXJyYXkoWzAsMCwwLDAsdGhpcy50aWxlRXh0ZW50LDAsMzI3NjcsMCwwLHRoaXMudGlsZUV4dGVudCwwLDMyNzY3LHRoaXMudGlsZUV4dGVudCx0aGlzLnRpbGVFeHRlbnQsMzI3NjcsMzI3NjddKSxlLlNUQVRJQ19EUkFXKSx0aGlzLmRlYnVnQnVmZmVyPWUuY3JlYXRlQnVmZmVyKCksdGhpcy5kZWJ1Z0J1ZmZlci5pdGVtU2l6ZT0yLHRoaXMuZGVidWdCdWZmZXIuaXRlbUNvdW50PTUsZS5iaW5kQnVmZmVyKGUuQVJSQVlfQlVGRkVSLHRoaXMuZGVidWdCdWZmZXIpLGUuYnVmZmVyRGF0YShlLkFSUkFZX0JVRkZFUixuZXcgSW50MTZBcnJheShbMCwwLHRoaXMudGlsZUV4dGVudC0xLDAsdGhpcy50aWxlRXh0ZW50LTEsdGhpcy50aWxlRXh0ZW50LTEsMCx0aGlzLnRpbGVFeHRlbnQtMSwwLDBdKSxlLlNUQVRJQ19EUkFXKX19LFBhaW50ZXIucHJvdG90eXBlLmNsZWFyQ29sb3I9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdsO3QuY2xlYXJDb2xvcigwLDAsMCwwKSx0LmNsZWFyKHQuQ09MT1JfQlVGRkVSX0JJVCl9LFBhaW50ZXIucHJvdG90eXBlLmNsZWFyU3RlbmNpbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2w7dC5jbGVhclN0ZW5jaWwoMCksdC5zdGVuY2lsTWFzaygyNTUpLHQuY2xlYXIodC5TVEVOQ0lMX0JVRkZFUl9CSVQpfSxQYWludGVyLnByb3RvdHlwZS5kcmF3Q2xpcHBpbmdNYXNrPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2w7ZS5zd2l0Y2hTaGFkZXIodGhpcy5maWxsU2hhZGVyLHQucG9zTWF0cml4KSxlLmNvbG9yTWFzayghMSwhMSwhMSwhMSksZS5jbGVhclN0ZW5jaWwoMCksZS5zdGVuY2lsTWFzaygxOTEpLGUuY2xlYXIoZS5TVEVOQ0lMX0JVRkZFUl9CSVQpLGUuc3RlbmNpbEZ1bmMoZS5FUVVBTCwxOTIsNjQpLGUuc3RlbmNpbE1hc2soMTkyKSxlLnN0ZW5jaWxPcChlLlJFUExBQ0UsZS5LRUVQLGUuS0VFUCksZS5iaW5kQnVmZmVyKGUuQVJSQVlfQlVGRkVSLHRoaXMudGlsZUV4dGVudEJ1ZmZlciksZS52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMuZmlsbFNoYWRlci5hX3Bvcyx0aGlzLnRpbGVFeHRlbnRCdWZmZXIuaXRlbVNpemUsZS5TSE9SVCwhMSw4LDApLGUuZHJhd0FycmF5cyhlLlRSSUFOR0xFX1NUUklQLDAsdGhpcy50aWxlRXh0ZW50QnVmZmVyLml0ZW1Db3VudCksZS5zdGVuY2lsRnVuYyhlLkVRVUFMLDEyOCwxMjgpLGUuc3RlbmNpbE9wKGUuS0VFUCxlLktFRVAsZS5SRVBMQUNFKSxlLnN0ZW5jaWxNYXNrKDApLGUuY29sb3JNYXNrKCEwLCEwLCEwLCEwKX0sUGFpbnRlci5wcm90b3R5cGUucHJlcGFyZUJ1ZmZlcnM9ZnVuY3Rpb24oKXt9LFBhaW50ZXIucHJvdG90eXBlLmJpbmREZWZhdWx0RnJhbWVidWZmZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdsO3QuYmluZEZyYW1lYnVmZmVyKHQuRlJBTUVCVUZGRVIsbnVsbCl9O3ZhciBkcmF3PXtzeW1ib2w6cmVxdWlyZShcIi4vZHJhd19zeW1ib2xcIiksY2lyY2xlOnJlcXVpcmUoXCIuL2RyYXdfY2lyY2xlXCIpLGxpbmU6cmVxdWlyZShcIi4vZHJhd19saW5lXCIpLGZpbGw6cmVxdWlyZShcIi4vZHJhd19maWxsXCIpLHJhc3RlcjpyZXF1aXJlKFwiLi9kcmF3X3Jhc3RlclwiKSxiYWNrZ3JvdW5kOnJlcXVpcmUoXCIuL2RyYXdfYmFja2dyb3VuZFwiKSxkZWJ1ZzpyZXF1aXJlKFwiLi9kcmF3X2RlYnVnXCIpLHZlcnRpY2VzOnJlcXVpcmUoXCIuL2RyYXdfdmVydGljZXNcIil9O1BhaW50ZXIucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUpe3RoaXMuc3R5bGU9dCx0aGlzLm9wdGlvbnM9ZSx0aGlzLmxpbmVBdGxhcz10LmxpbmVBdGxhcyx0aGlzLnNwcml0ZUF0bGFzPXQuc3ByaXRlQXRsYXMsdGhpcy5zcHJpdGVBdGxhcy5zZXRTcHJpdGUodC5zcHJpdGUpLHRoaXMuZ2x5cGhBdGxhcz10LmdseXBoQXRsYXMsdGhpcy5nbHlwaEF0bGFzLmJpbmQodGhpcy5nbCksdGhpcy5mcmFtZUhpc3RvcnkucmVjb3JkKHRoaXMudHJhbnNmb3JtLnpvb20pLHRoaXMucHJlcGFyZUJ1ZmZlcnMoKSx0aGlzLmNsZWFyQ29sb3IoKTtmb3IodmFyIGk9dC5fZ3JvdXBzLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgcj10Ll9ncm91cHNbaV0sYT10LnNvdXJjZXNbci5zb3VyY2VdO2E/KHRoaXMuY2xlYXJTdGVuY2lsKCksYS5yZW5kZXIocix0aGlzKSk6dm9pZCAwPT09ci5zb3VyY2UmJnRoaXMuZHJhd0xheWVycyhyLHRoaXMuaWRlbnRpdHlNYXRyaXgpfX0sUGFpbnRlci5wcm90b3R5cGUuZHJhd1RpbGU9ZnVuY3Rpb24odCxlKXt0aGlzLnNldEV4dGVudCh0LnRpbGVFeHRlbnQpLHRoaXMuZHJhd0NsaXBwaW5nTWFzayh0KSx0aGlzLmRyYXdMYXllcnMoZSx0LnBvc01hdHJpeCx0KSx0aGlzLm9wdGlvbnMuZGVidWcmJmRyYXcuZGVidWcodGhpcyx0KX0sUGFpbnRlci5wcm90b3R5cGUuZHJhd0xheWVycz1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciByPXQubGVuZ3RoLTE7cj49MDtyLS0pe3ZhciBhPXRbcl07YS5oaWRkZW58fChkcmF3W2EudHlwZV0odGhpcyxhLGUsaSksdGhpcy5vcHRpb25zLnZlcnRpY2VzJiZkcmF3LnZlcnRpY2VzKHRoaXMsYSxlLGkpKX19LFBhaW50ZXIucHJvdG90eXBlLmRyYXdTdGVuY2lsQnVmZmVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nbDt0LnN3aXRjaFNoYWRlcih0aGlzLmZpbGxTaGFkZXIsdGhpcy5pZGVudGl0eU1hdHJpeCksdC5ibGVuZEZ1bmModC5PTkUsdC5PTkVfTUlOVVNfU1JDX0FMUEhBKSx0LnN0ZW5jaWxNYXNrKDApLHQuc3RlbmNpbEZ1bmModC5FUVVBTCwxMjgsMTI4KSx0LmJpbmRCdWZmZXIodC5BUlJBWV9CVUZGRVIsdGhpcy5iYWNrZ3JvdW5kQnVmZmVyKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIodGhpcy5maWxsU2hhZGVyLmFfcG9zLHRoaXMuYmFja2dyb3VuZEJ1ZmZlci5pdGVtU2l6ZSx0LlNIT1JULCExLDAsMCksdC51bmlmb3JtNGZ2KHRoaXMuZmlsbFNoYWRlci51X2NvbG9yLFswLDAsMCwuNV0pLHQuZHJhd0FycmF5cyh0LlRSSUFOR0xFX1NUUklQLDAsdGhpcy50aWxlRXh0ZW50QnVmZmVyLml0ZW1Db3VudCksdC5ibGVuZEZ1bmModC5PTkVfTUlOVVNfRFNUX0FMUEhBLHQuT05FKX0sUGFpbnRlci5wcm90b3R5cGUudHJhbnNsYXRlTWF0cml4PWZ1bmN0aW9uKHQsZSxpLHIpe2lmKCFpWzBdJiYhaVsxXSlyZXR1cm4gdDtpZihcInZpZXdwb3J0XCI9PT1yKXt2YXIgYT1NYXRoLnNpbigtdGhpcy50cmFuc2Zvcm0uYW5nbGUpLHM9TWF0aC5jb3MoLXRoaXMudHJhbnNmb3JtLmFuZ2xlKTtpPVtpWzBdKnMtaVsxXSphLGlbMF0qYStpWzFdKnNdfXZhciB1PXRoaXMudHJhbnNmb3JtLnNjYWxlLygxPDxlLmNvb3JkLnopLyhlLnRpbGVFeHRlbnQvZS50aWxlU2l6ZSksbj1baVswXS91LGlbMV0vdSwwXSxfPW5ldyBGbG9hdDMyQXJyYXkoMTYpO3JldHVybiBtYXQ0LnRyYW5zbGF0ZShfLHQsbiksX30sUGFpbnRlci5wcm90b3R5cGUuc2F2ZVRleHR1cmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yZXVzYWJsZVRleHR1cmVzW3Quc2l6ZV07ZT9lLnB1c2godCk6dGhpcy5yZXVzYWJsZVRleHR1cmVzW3Quc2l6ZV09W3RdfSxQYWludGVyLnByb3RvdHlwZS5nZXRUZXh0dXJlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucmV1c2FibGVUZXh0dXJlc1t0XTtyZXR1cm4gZSYmZS5sZW5ndGg+MD9lLnBvcCgpOm51bGx9O1xufSx7XCIuLi91dGlsL2Jyb3dzZXJcIjo5NSxcIi4vZHJhd19iYWNrZ3JvdW5kXCI6MjUsXCIuL2RyYXdfY2lyY2xlXCI6MjYsXCIuL2RyYXdfZGVidWdcIjoyOCxcIi4vZHJhd19maWxsXCI6MjksXCIuL2RyYXdfbGluZVwiOjMwLFwiLi9kcmF3X3Jhc3RlclwiOjMxLFwiLi9kcmF3X3N5bWJvbFwiOjMyLFwiLi9kcmF3X3ZlcnRpY2VzXCI6MzMsXCIuL2ZyYW1lX2hpc3RvcnlcIjozNCxcIi4vZ2xfdXRpbFwiOjM1LFwiZ2wtbWF0cml4XCI6MTE2fV0sMzg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIGdsaWZ5PXZvaWQgMDttb2R1bGUuZXhwb3J0cz17ZGVidWc6e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLHN0ZXAoMzI3NjcuLGFfcG9zLngpLDEpO31cIixmcmFnbWVudDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gdmVjNCB1X2NvbG9yO3ZvaWQgbWFpbigpe2dsX0ZyYWdDb2xvcj11X2NvbG9yO31cIn0sZG90Ont2ZXJ0ZXg6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3NpemU7YXR0cmlidXRlIHZlYzIgYV9wb3M7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2dsX1BvaW50U2l6ZT11X3NpemU7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWM0IHVfY29sb3I7dW5pZm9ybSBmbG9hdCB1X2JsdXI7dm9pZCBtYWluKCl7ZmxvYXQgYSxiO2E9bGVuZ3RoKGdsX1BvaW50Q29vcmQtLjUpO2I9c21vb3Roc3RlcCguNSwuNS11X2JsdXIsYSk7Z2xfRnJhZ0NvbG9yPXVfY29sb3IqYjt9XCJ9LGZpbGw6e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWM0IHVfY29sb3I7dm9pZCBtYWluKCl7Z2xfRnJhZ0NvbG9yPXVfY29sb3I7fVwifSxjaXJjbGU6e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gZmxvYXQgdV9zaXplO2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3VuaWZvcm0gbWF0NCB1X21hdHJpeCx1X2V4bWF0cml4O3ZhcnlpbmcgdmVjMiBhO3ZvaWQgbWFpbigpe2E9dmVjMihtb2QoYV9wb3MsMi4pKjIuLTEuKTt2ZWM0IGI9dV9leG1hdHJpeCp2ZWM0KGEqdV9zaXplLDAsMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChmbG9vcihhX3BvcyouNSksMCwxKTtnbF9Qb3NpdGlvbis9YipnbF9Qb3NpdGlvbi53O31cIixmcmFnbWVudDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gZmxvYXQgdV9ibHVyLHVfc2l6ZTt2YXJ5aW5nIHZlYzIgYTt2b2lkIG1haW4oKXtmbG9hdCBiPXNtb290aHN0ZXAoMS4tdV9ibHVyLDEuLGxlbmd0aChhKSk7Z2xfRnJhZ0NvbG9yPXVfY29sb3IqKDEuLWIpO31cIn0sbGluZTp7dmVydGV4OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3M7YXR0cmlidXRlIHZlYzQgYV9kYXRhO3VuaWZvcm0gaGlnaHAgbWF0NCB1X21hdHJpeDt1bmlmb3JtIGZsb2F0IHVfcmF0aW8sdV9leHRyYTt1bmlmb3JtIHZlYzIgdV9saW5ld2lkdGg7dW5pZm9ybSBtYXQyIHVfYW50aWFsaWFzaW5nbWF0cml4O3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjO3ZvaWQgbWFpbigpe3ZlYzIgZCxlO2Q9YV9kYXRhLnh5O2U9bW9kKGFfcG9zLDIuKTtlLnk9c2lnbihlLnktLjUpO2E9ZTt2ZWM0IGY9dmVjNCh1X2xpbmV3aWR0aC5zKmQqLjAxNTg3MzAxNiwwLDApO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoZmxvb3IoYV9wb3MqLjUpK2YueHkvdV9yYXRpbywwLDEpO2Zsb2F0IGcsaCxpO2c9Z2xfUG9zaXRpb24ueS9nbF9Qb3NpdGlvbi53O2g9bGVuZ3RoKGQpL2xlbmd0aCh1X2FudGlhbGlhc2luZ21hdHJpeCpkKTtpPTEuLygxLi1taW4oZyp1X2V4dHJhLC45KSk7Yz1pKmg7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWMyIHVfbGluZXdpZHRoO3VuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gZmxvYXQgdV9ibHVyO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjO3ZvaWQgbWFpbigpe2Zsb2F0IGQsZSxmO2Q9bGVuZ3RoKGEpKnVfbGluZXdpZHRoLnM7ZT11X2JsdXIqYztmPWNsYW1wKG1pbihkLSh1X2xpbmV3aWR0aC50LWUpLHVfbGluZXdpZHRoLnMtZCkvZSwwLiwxLik7Z2xfRnJhZ0NvbG9yPXVfY29sb3IqZjt9XCJ9LGxpbmVwYXR0ZXJuOnt2ZXJ0ZXg6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDthdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgdmVjNCBhX2RhdGE7dW5pZm9ybSBoaWdocCBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gZmxvYXQgdV9yYXRpbyx1X2V4dHJhO3VuaWZvcm0gdmVjMiB1X2xpbmV3aWR0aDt1bmlmb3JtIHZlYzQgdV9jb2xvcjt1bmlmb3JtIG1hdDIgdV9hbnRpYWxpYXNpbmdtYXRyaXg7dmFyeWluZyB2ZWMyIGE7dmFyeWluZyBmbG9hdCBiLGM7dm9pZCBtYWluKCl7dmVjMiBkLGYsZyxoO2Q9YV9kYXRhLnh5O2Zsb2F0IGUsaSxqLGs7ZT1hX2RhdGEueioxMjguK2FfZGF0YS53O2Y9bW9kKGFfcG9zLDIuKTtmLnk9c2lnbihmLnktLjUpO2E9ZjtnPWQqLjAxNTg3MzAxNjtoPXVfbGluZXdpZHRoLnMqZztnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGZsb29yKGFfcG9zKi41KStoLnh5L3VfcmF0aW8sMCwxKTtiPWU7aT1nbF9Qb3NpdGlvbi55L2dsX1Bvc2l0aW9uLnc7aj1sZW5ndGgoZCkvbGVuZ3RoKHVfYW50aWFsaWFzaW5nbWF0cml4KmQpO2s9MS4vKDEuLW1pbihpKnVfZXh0cmEsLjkpKTtjPWsqajt9XCIsZnJhZ21lbnQ6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIHZlYzIgdV9saW5ld2lkdGgsdV9wYXR0ZXJuX3NpemVfYSx1X3BhdHRlcm5fc2l6ZV9iLHVfcGF0dGVybl90bF9hLHVfcGF0dGVybl9icl9hLHVfcGF0dGVybl90bF9iLHVfcGF0dGVybl9icl9iO3VuaWZvcm0gZmxvYXQgdV9wb2ludCx1X2JsdXIsdV9mYWRlLHVfb3BhY2l0eTt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjO3ZvaWQgbWFpbigpe2Zsb2F0IGQsZSxmLGcsaCxpLGo7ZD1sZW5ndGgoYSkqdV9saW5ld2lkdGgucztlPXVfYmx1cipjO2Y9Y2xhbXAobWluKGQtKHVfbGluZXdpZHRoLnQtZSksdV9saW5ld2lkdGgucy1kKS9lLDAuLDEuKTtnPW1vZChiL3VfcGF0dGVybl9zaXplX2EueCwxLik7aD1tb2QoYi91X3BhdHRlcm5fc2l6ZV9iLngsMS4pO2k9LjUrYS55KnVfbGluZXdpZHRoLnMvdV9wYXR0ZXJuX3NpemVfYS55O2o9LjUrYS55KnVfbGluZXdpZHRoLnMvdV9wYXR0ZXJuX3NpemVfYi55O3ZlYzIgayxsO2s9bWl4KHVfcGF0dGVybl90bF9hLHVfcGF0dGVybl9icl9hLHZlYzIoZyxpKSk7bD1taXgodV9wYXR0ZXJuX3RsX2IsdV9wYXR0ZXJuX2JyX2IsdmVjMihoLGopKTt2ZWM0IG09bWl4KHRleHR1cmUyRCh1X2ltYWdlLGspLHRleHR1cmUyRCh1X2ltYWdlLGwpLHVfZmFkZSk7Zio9dV9vcGFjaXR5O2dsX0ZyYWdDb2xvcj1tKmY7fVwifSxsaW5lc2RmcGF0dGVybjp7dmVydGV4OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3M7YXR0cmlidXRlIHZlYzQgYV9kYXRhO3VuaWZvcm0gaGlnaHAgbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV9saW5ld2lkdGgsdV9wYXR0ZXJuc2NhbGVfYSx1X3BhdHRlcm5zY2FsZV9iO3VuaWZvcm0gZmxvYXQgdV9yYXRpbyx1X3RleF95X2EsdV90ZXhfeV9iLHVfZXh0cmE7dW5pZm9ybSBtYXQyIHVfYW50aWFsaWFzaW5nbWF0cml4O3ZhcnlpbmcgdmVjMiBhLGIsYzt2YXJ5aW5nIGZsb2F0IGQ7dm9pZCBtYWluKCl7dmVjMiBlLGc7ZT1hX2RhdGEueHk7ZmxvYXQgZixpLGosaztmPWFfZGF0YS56KjEyOC4rYV9kYXRhLnc7Zz1tb2QoYV9wb3MsMi4pO2cueT1zaWduKGcueS0uNSk7YT1nO3ZlYzQgaD12ZWM0KHVfbGluZXdpZHRoLnMqZSouMDE1ODczMDE2LDAsMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChmbG9vcihhX3BvcyouNSkraC54eS91X3JhdGlvLDAsMSk7Yj12ZWMyKGYqdV9wYXR0ZXJuc2NhbGVfYS54LGcueSp1X3BhdHRlcm5zY2FsZV9hLnkrdV90ZXhfeV9hKTtjPXZlYzIoZip1X3BhdHRlcm5zY2FsZV9iLngsZy55KnVfcGF0dGVybnNjYWxlX2IueSt1X3RleF95X2IpO2k9Z2xfUG9zaXRpb24ueS9nbF9Qb3NpdGlvbi53O2o9bGVuZ3RoKGUpL2xlbmd0aCh1X2FudGlhbGlhc2luZ21hdHJpeCplKTtrPTEuLygxLi1taW4oaSp1X2V4dHJhLC45KSk7ZD1rKmo7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWMyIHVfbGluZXdpZHRoO3VuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gZmxvYXQgdV9ibHVyLHVfc2RmZ2FtbWEsdV9taXg7dW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTt2YXJ5aW5nIHZlYzIgYSxiLGM7dmFyeWluZyBmbG9hdCBkO3ZvaWQgbWFpbigpe2Zsb2F0IGUsZixnLGgsaSxqO2U9bGVuZ3RoKGEpKnVfbGluZXdpZHRoLnM7Zj11X2JsdXIqZDtnPWNsYW1wKG1pbihlLSh1X2xpbmV3aWR0aC50LWYpLHVfbGluZXdpZHRoLnMtZSkvZiwwLiwxLik7aD10ZXh0dXJlMkQodV9pbWFnZSxiKS5hO2k9dGV4dHVyZTJEKHVfaW1hZ2UsYykuYTtqPW1peChoLGksdV9taXgpO2cqPXNtb290aHN0ZXAoLjUtdV9zZGZnYW1tYSwuNSt1X3NkZmdhbW1hLGopO2dsX0ZyYWdDb2xvcj11X2NvbG9yKmc7fVwifSxvdXRsaW5lOnt2ZXJ0ZXg6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDthdHRyaWJ1dGUgdmVjMiBhX3Bvczt1bmlmb3JtIGhpZ2hwIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSB2ZWMyIHVfd29ybGQ7dmFyeWluZyB2ZWMyIGE7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2E9KGdsX1Bvc2l0aW9uLnh5L2dsX1Bvc2l0aW9uLncrMS4pLzIuKnVfd29ybGQ7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWM0IHVfY29sb3I7dmFyeWluZyB2ZWMyIGE7dm9pZCBtYWluKCl7ZmxvYXQgYixjO2I9bGVuZ3RoKGEtZ2xfRnJhZ0Nvb3JkLnh5KTtjPXNtb290aHN0ZXAoMS4sMC4sYik7Z2xfRnJhZ0NvbG9yPXVfY29sb3IqYzt9XCJ9LHBhdHRlcm46e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDMgdV9wYXR0ZXJubWF0cml4X2EsdV9wYXR0ZXJubWF0cml4X2I7YXR0cmlidXRlIHZlYzIgYV9wb3M7dmFyeWluZyB2ZWMyIGEsYjt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7YT0odV9wYXR0ZXJubWF0cml4X2EqdmVjMyhhX3BvcywxKSkueHk7Yj0odV9wYXR0ZXJubWF0cml4X2IqdmVjMyhhX3BvcywxKSkueHk7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBmbG9hdCB1X29wYWNpdHksdV9taXg7dW5pZm9ybSB2ZWMyIHVfcGF0dGVybl90bF9hLHVfcGF0dGVybl9icl9hLHVfcGF0dGVybl90bF9iLHVfcGF0dGVybl9icl9iO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIGEsYjt2b2lkIG1haW4oKXt2ZWMyIGMsZCxmLGc7Yz1tb2QoYSwxLik7ZD1taXgodV9wYXR0ZXJuX3RsX2EsdV9wYXR0ZXJuX2JyX2EsYyk7dmVjNCBlLGg7ZT10ZXh0dXJlMkQodV9pbWFnZSxkKTtmPW1vZChiLDEuKTtnPW1peCh1X3BhdHRlcm5fdGxfYix1X3BhdHRlcm5fYnJfYixmKTtoPXRleHR1cmUyRCh1X2ltYWdlLGcpO2dsX0ZyYWdDb2xvcj1taXgoZSxoLHVfbWl4KSp1X29wYWNpdHk7fVwifSxyYXN0ZXI6e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV90bF9wYXJlbnQ7dW5pZm9ybSBmbG9hdCB1X3NjYWxlX3BhcmVudCx1X2J1ZmZlcl9zY2FsZTthdHRyaWJ1dGUgdmVjMiBhX3BvcyxhX3RleHR1cmVfcG9zO3ZhcnlpbmcgdmVjMiBhLGI7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2E9KGFfdGV4dHVyZV9wb3MvMzI3NjcuLS41KS91X2J1ZmZlcl9zY2FsZSsuNTtiPWEqdV9zY2FsZV9wYXJlbnQrdV90bF9wYXJlbnQ7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBmbG9hdCB1X29wYWNpdHkwLHVfb3BhY2l0eTEsdV9icmlnaHRuZXNzX2xvdyx1X2JyaWdodG5lc3NfaGlnaCx1X3NhdHVyYXRpb25fZmFjdG9yLHVfY29udHJhc3RfZmFjdG9yO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2UwLHVfaW1hZ2UxO3ZhcnlpbmcgdmVjMiBhLGI7dW5pZm9ybSB2ZWMzIHVfc3Bpbl93ZWlnaHRzO3ZvaWQgbWFpbigpe3ZlYzQgYyxkLGU7Yz10ZXh0dXJlMkQodV9pbWFnZTAsYSk7ZD10ZXh0dXJlMkQodV9pbWFnZTEsYik7ZT1jKnVfb3BhY2l0eTArZCp1X29wYWNpdHkxO3ZlYzMgZixoLGk7Zj1lLnJnYjtmPXZlYzMoZG90KGYsdV9zcGluX3dlaWdodHMueHl6KSxkb3QoZix1X3NwaW5fd2VpZ2h0cy56eHkpLGRvdChmLHVfc3Bpbl93ZWlnaHRzLnl6eCkpO2Zsb2F0IGc9KGUucitlLmcrZS5iKS8zLjtmKz0oZy1mKSp1X3NhdHVyYXRpb25fZmFjdG9yO2Y9KGYtLjUpKnVfY29udHJhc3RfZmFjdG9yKy41O2g9dmVjMyh1X2JyaWdodG5lc3NfbG93KTtpPXZlYzModV9icmlnaHRuZXNzX2hpZ2gpO2dsX0ZyYWdDb2xvcj12ZWM0KG1peChoLGksZiksZS5hKTt9XCJ9LGljb246e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zLGFfb2Zmc2V0O2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTEsYV9kYXRhMjt1bmlmb3JtIGhpZ2hwIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfZXhtYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3pvb20sdV9mYWRlZGlzdCx1X21pbmZhZGV6b29tLHVfbWF4ZmFkZXpvb20sdV9mYWRlem9vbSx1X29wYWNpdHksdV9leHRyYTt1bmlmb3JtIGJvb2wgdV9za2V3ZWQ7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt2YXJ5aW5nIHZlYzIgYTt2YXJ5aW5nIGZsb2F0IGI7dm9pZCBtYWluKCl7dmVjMiBjLGU7Yz1hX2RhdGExLnh5O2Zsb2F0IGQsZixnLGgsaSxqO2Q9YV9kYXRhMVsyXTtlPWFfZGF0YTIuc3Q7Zj1lWzBdO2c9ZVsxXTtoPTEwLjtpPTIuLXN0ZXAoZix1X3pvb20pLSgxLi1zdGVwKGcsdV96b29tKSk7aj1jbGFtcCgodV9mYWRlem9vbS1kKS91X2ZhZGVkaXN0LDAuLDEuKTtpZih1X2ZhZGVkaXN0Pj0wLiliPWo7ZWxzZSBiPTEuLWo7aWYodV9tYXhmYWRlem9vbTxkKWI9MC47aWYodV9taW5mYWRlem9vbT49ZCliPTEuO2krPXN0ZXAoYiwwLik7aWYodV9za2V3ZWQpe3ZlYzQgaz11X2V4bWF0cml4KnZlYzQoYV9vZmZzZXQvNjQuLDAsMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcytrLnh5LDAsMSk7Z2xfUG9zaXRpb24ueis9aSpnbF9Qb3NpdGlvbi53O31lbHNle3ZlYzQgaz11X2V4bWF0cml4KnZlYzQoYV9vZmZzZXQvNjQuLGksMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpK2s7fWE9Yy91X3RleHNpemU7Yio9dV9vcGFjaXR5O31cIixmcmFnbWVudDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTt2YXJ5aW5nIHZlYzIgYTt2YXJ5aW5nIGZsb2F0IGI7dm9pZCBtYWluKCl7Z2xfRnJhZ0NvbG9yPXRleHR1cmUyRCh1X3RleHR1cmUsYSkqYjt9XCJ9LHNkZjp7dmVydGV4OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3MsYV9vZmZzZXQ7YXR0cmlidXRlIHZlYzQgYV9kYXRhMSxhX2RhdGEyO3VuaWZvcm0gaGlnaHAgbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDQgdV9leG1hdHJpeDt1bmlmb3JtIGZsb2F0IHVfem9vbSx1X2ZhZGVkaXN0LHVfbWluZmFkZXpvb20sdV9tYXhmYWRlem9vbSx1X2ZhZGV6b29tLHVfZXh0cmE7dW5pZm9ybSBib29sIHVfc2tld2VkO3VuaWZvcm0gdmVjMiB1X3RleHNpemU7dmFyeWluZyB2ZWMyIGE7dmFyeWluZyBmbG9hdCBiLGM7dm9pZCBtYWluKCl7dmVjMiBkLGY7ZD1hX2RhdGExLnh5O2Zsb2F0IGUsZyxoLGksaixrLGw7ZT1hX2RhdGExWzJdO2Y9YV9kYXRhMi5zdDtnPWZbMF07aD1mWzFdO2k9Mi4tc3RlcChnLHVfem9vbSktKDEuLXN0ZXAoaCx1X3pvb20pKTtqPWNsYW1wKCh1X2ZhZGV6b29tLWUpL3VfZmFkZWRpc3QsMC4sMS4pO2lmKHVfZmFkZWRpc3Q+PTAuKWI9ajtlbHNlIGI9MS4tajtpZih1X21heGZhZGV6b29tPGUpYj0wLjtpZih1X21pbmZhZGV6b29tPj1lKWI9MS47aSs9c3RlcChiLDAuKTtpZih1X3NrZXdlZCl7dmVjNCBrPXVfZXhtYXRyaXgqdmVjNChhX29mZnNldC82NC4sMCwwKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zK2sueHksMCwxKTtnbF9Qb3NpdGlvbi56Kz1pKmdsX1Bvc2l0aW9uLnc7fWVsc2V7dmVjNCBrPXVfZXhtYXRyaXgqdmVjNChhX29mZnNldC82NC4saSwwKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSkrazt9az1nbF9Qb3NpdGlvbi55L2dsX1Bvc2l0aW9uLnc7bD0xLi8oMS4tayp1X2V4dHJhKTtjPWw7YT1kL3VfdGV4c2l6ZTt9XCIsZnJhZ21lbnQ6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7dW5pZm9ybSB2ZWM0IHVfY29sb3I7dW5pZm9ybSBmbG9hdCB1X2J1ZmZlcix1X2dhbW1hO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjO3ZvaWQgbWFpbigpe2Zsb2F0IGQsZSxmO2Q9dV9nYW1tYSpjO2U9dGV4dHVyZTJEKHVfdGV4dHVyZSxhKS5hO2Y9c21vb3Roc3RlcCh1X2J1ZmZlci1kLHVfYnVmZmVyK2QsZSkqYjtnbF9GcmFnQ29sb3I9dV9jb2xvcipmO31cIn0sY29sbGlzaW9uYm94Ont2ZXJ0ZXg6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDthdHRyaWJ1dGUgdmVjMiBhX3BvcyxhX2V4dHJ1ZGUsYV9kYXRhO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIGZsb2F0IHVfc2NhbGU7dmFyeWluZyBmbG9hdCBhLGI7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcythX2V4dHJ1ZGUvdV9zY2FsZSwwLDEpO2E9YV9kYXRhLng7Yj1hX2RhdGEueTt9XCIsZnJhZ21lbnQ6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIGZsb2F0IHVfem9vbSx1X21heHpvb207dmFyeWluZyBmbG9hdCBhLGI7dm9pZCBtYWluKCl7ZmxvYXQgYz0uNTtnbF9GcmFnQ29sb3I9dmVjNCgwLDEsMCwxKSpjO2lmKGI+dV96b29tKWdsX0ZyYWdDb2xvcj12ZWM0KDEsMCwwLDEpKmM7aWYodV96b29tPj1hKWdsX0ZyYWdDb2xvcj12ZWM0KDAsMCwwLDEpKmMqLjI1O2lmKGI+PXVfbWF4em9vbSlnbF9GcmFnQ29sb3I9dmVjNCgwLDAsMSwxKSpjKi4yO31cIn19O1xufSx7fV0sMzk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gR2VvSlNPTlNvdXJjZShpKXtpPWl8fHt9LHRoaXMuX2RhdGE9aS5kYXRhLHZvaWQgMCE9PWkubWF4em9vbSYmKHRoaXMubWF4em9vbT1pLm1heHpvb20pLHRoaXMuZ2VvanNvblZ0T3B0aW9ucz17bWF4Wm9vbTp0aGlzLm1heHpvb219LHZvaWQgMCE9PWkuYnVmZmVyJiYodGhpcy5nZW9qc29uVnRPcHRpb25zLmJ1ZmZlcj1pLmJ1ZmZlciksdm9pZCAwIT09aS50b2xlcmFuY2UmJih0aGlzLmdlb2pzb25WdE9wdGlvbnMudG9sZXJhbmNlPWkudG9sZXJhbmNlKSx0aGlzLl9weXJhbWlkPW5ldyBUaWxlUHlyYW1pZCh7dGlsZVNpemU6NTEyLG1pbnpvb206dGhpcy5taW56b29tLG1heHpvb206dGhpcy5tYXh6b29tLGNhY2hlU2l6ZToyMCxsb2FkOnRoaXMuX2xvYWRUaWxlLmJpbmQodGhpcyksYWJvcnQ6dGhpcy5fYWJvcnRUaWxlLmJpbmQodGhpcyksdW5sb2FkOnRoaXMuX3VubG9hZFRpbGUuYmluZCh0aGlzKSxhZGQ6dGhpcy5fYWRkVGlsZS5iaW5kKHRoaXMpLHJlbW92ZTp0aGlzLl9yZW1vdmVUaWxlLmJpbmQodGhpcyl9KX12YXIgdXRpbD1yZXF1aXJlKFwiLi4vdXRpbC91dGlsXCIpLEV2ZW50ZWQ9cmVxdWlyZShcIi4uL3V0aWwvZXZlbnRlZFwiKSxUaWxlUHlyYW1pZD1yZXF1aXJlKFwiLi90aWxlX3B5cmFtaWRcIiksU291cmNlPXJlcXVpcmUoXCIuL3NvdXJjZVwiKSx1cmxSZXNvbHZlPXJlcXVpcmUoXCJyZXNvbHZlLXVybFwiKTttb2R1bGUuZXhwb3J0cz1HZW9KU09OU291cmNlLEdlb0pTT05Tb3VyY2UucHJvdG90eXBlPXV0aWwuaW5oZXJpdChFdmVudGVkLHttaW56b29tOjAsbWF4em9vbToxNCxfZGlydHk6ITAsc2V0RGF0YTpmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5fZGF0YT1pLHRoaXMuX2RpcnR5PSEwLHRoaXMuZmlyZShcImNoYW5nZVwiKSx0aGlzLm1hcCYmdGhpcy51cGRhdGUodGhpcy5tYXAudHJhbnNmb3JtKSx0aGlzfSxvbkFkZDpmdW5jdGlvbihpKXt0aGlzLm1hcD1pfSxsb2FkZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9hZGVkJiZ0aGlzLl9weXJhbWlkLmxvYWRlZCgpfSx1cGRhdGU6ZnVuY3Rpb24oaSl7dGhpcy5fZGlydHkmJnRoaXMuX3VwZGF0ZURhdGEoKSx0aGlzLl9sb2FkZWQmJnRoaXMuX3B5cmFtaWQudXBkYXRlKHRoaXMudXNlZCxpKX0scmVsb2FkOmZ1bmN0aW9uKCl7dGhpcy5fbG9hZGVkJiZ0aGlzLl9weXJhbWlkLnJlbG9hZCgpfSxyZW5kZXI6U291cmNlLl9yZW5kZXJUaWxlcyxmZWF0dXJlc0F0OlNvdXJjZS5fdmVjdG9yRmVhdHVyZXNBdCxmZWF0dXJlc0luOlNvdXJjZS5fdmVjdG9yRmVhdHVyZXNJbixfdXBkYXRlRGF0YTpmdW5jdGlvbigpe3RoaXMuX2RpcnR5PSExO3ZhciBpPXRoaXMuX2RhdGE7XCJzdHJpbmdcIj09dHlwZW9mIGkmJihpPXVybFJlc29sdmUod2luZG93LmxvY2F0aW9uLmhyZWYsaSkpLHRoaXMud29ya2VySUQ9dGhpcy5kaXNwYXRjaGVyLnNlbmQoXCJwYXJzZSBnZW9qc29uXCIse2RhdGE6aSx0aWxlU2l6ZTo1MTIsc291cmNlOnRoaXMuaWQsZ2VvanNvblZ0T3B0aW9uczp0aGlzLmdlb2pzb25WdE9wdGlvbnN9LGZ1bmN0aW9uKGkpe3JldHVybiBpP3ZvaWQgdGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6aX0pOih0aGlzLl9sb2FkZWQ9ITAsdGhpcy5fcHlyYW1pZC5yZWxvYWQoKSx2b2lkIHRoaXMuZmlyZShcImNoYW5nZVwiKSl9LmJpbmQodGhpcykpfSxfbG9hZFRpbGU6ZnVuY3Rpb24oaSl7dmFyIHQ9aS5jb29yZC56PnRoaXMubWF4em9vbT9NYXRoLnBvdygyLGkuY29vcmQuei10aGlzLm1heHpvb20pOjEsZT17dWlkOmkudWlkLGNvb3JkOmkuY29vcmQsem9vbTppLmNvb3JkLnosbWF4Wm9vbTp0aGlzLm1heHpvb20sdGlsZVNpemU6NTEyLHNvdXJjZTp0aGlzLmlkLG92ZXJzY2FsaW5nOnQsYW5nbGU6dGhpcy5tYXAudHJhbnNmb3JtLmFuZ2xlLHBpdGNoOnRoaXMubWFwLnRyYW5zZm9ybS5waXRjaCxjb2xsaXNpb25EZWJ1Zzp0aGlzLm1hcC5jb2xsaXNpb25EZWJ1Z307aS53b3JrZXJJRD10aGlzLmRpc3BhdGNoZXIuc2VuZChcImxvYWQgZ2VvanNvbiB0aWxlXCIsZSxmdW5jdGlvbih0LGUpe2lmKGkudW5sb2FkVmVjdG9yRGF0YSh0aGlzLm1hcC5wYWludGVyKSwhaS5hYm9ydGVkKXtpZih0KXJldHVybiB2b2lkIHRoaXMuZmlyZShcInRpbGUuZXJyb3JcIix7dGlsZTppfSk7aS5sb2FkVmVjdG9yRGF0YShlKSx0aGlzLmZpcmUoXCJ0aWxlLmxvYWRcIix7dGlsZTppfSl9fS5iaW5kKHRoaXMpLHRoaXMud29ya2VySUQpfSxfYWJvcnRUaWxlOmZ1bmN0aW9uKGkpe2kuYWJvcnRlZD0hMH0sX2FkZFRpbGU6ZnVuY3Rpb24oaSl7dGhpcy5maXJlKFwidGlsZS5hZGRcIix7dGlsZTppfSl9LF9yZW1vdmVUaWxlOmZ1bmN0aW9uKGkpe3RoaXMuZmlyZShcInRpbGUucmVtb3ZlXCIse3RpbGU6aX0pfSxfdW5sb2FkVGlsZTpmdW5jdGlvbihpKXtpLnVubG9hZFZlY3RvckRhdGEodGhpcy5tYXAucGFpbnRlciksdGhpcy5nbHlwaEF0bGFzLnJlbW92ZUdseXBocyhpLnVpZCksdGhpcy5kaXNwYXRjaGVyLnNlbmQoXCJyZW1vdmUgdGlsZVwiLHt1aWQ6aS51aWQsc291cmNlOnRoaXMuaWR9LG51bGwsaS53b3JrZXJJRCl9fSk7XG59LHtcIi4uL3V0aWwvZXZlbnRlZFwiOjEwMCxcIi4uL3V0aWwvdXRpbFwiOjEwNixcIi4vc291cmNlXCI6NDMsXCIuL3RpbGVfcHlyYW1pZFwiOjQ2LFwicmVzb2x2ZS11cmxcIjoxNDB9XSw0MDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBHZW9KU09OV3JhcHBlcihlKXt0aGlzLmZlYXR1cmVzPWUsdGhpcy5sZW5ndGg9ZS5sZW5ndGh9ZnVuY3Rpb24gRmVhdHVyZVdyYXBwZXIoZSl7dGhpcy50eXBlPWUudHlwZSx0aGlzLnJhd0dlb21ldHJ5PTE9PT1lLnR5cGU/W2UuZ2VvbWV0cnldOmUuZ2VvbWV0cnksdGhpcy5wcm9wZXJ0aWVzPWUudGFncyx0aGlzLmV4dGVudD00MDk2fXZhciBQb2ludD1yZXF1aXJlKFwicG9pbnQtZ2VvbWV0cnlcIiksVmVjdG9yVGlsZUZlYXR1cmU9cmVxdWlyZShcInZlY3Rvci10aWxlXCIpLlZlY3RvclRpbGVGZWF0dXJlO21vZHVsZS5leHBvcnRzPUdlb0pTT05XcmFwcGVyLEdlb0pTT05XcmFwcGVyLnByb3RvdHlwZS5mZWF0dXJlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgRmVhdHVyZVdyYXBwZXIodGhpcy5mZWF0dXJlc1tlXSl9LEZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS5sb2FkR2VvbWV0cnk9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJhd0dlb21ldHJ5O3RoaXMuZ2VvbWV0cnk9W107Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe2Zvcih2YXIgcj1lW3RdLG89W10sYT0wO2E8ci5sZW5ndGg7YSsrKW8ucHVzaChuZXcgUG9pbnQoclthXVswXSxyW2FdWzFdKSk7dGhpcy5nZW9tZXRyeS5wdXNoKG8pfXJldHVybiB0aGlzLmdlb21ldHJ5fSxGZWF0dXJlV3JhcHBlci5wcm90b3R5cGUuYmJveD1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnl8fHRoaXMubG9hZEdlb21ldHJ5KCk7Zm9yKHZhciBlPXRoaXMuZ2VvbWV0cnksdD0xLzAscj0tKDEvMCksbz0xLzAsYT0tKDEvMCkscD0wO3A8ZS5sZW5ndGg7cCsrKWZvcih2YXIgaT1lW3BdLG49MDtuPGkubGVuZ3RoO24rKyl7dmFyIGg9aVtuXTt0PU1hdGgubWluKHQsaC54KSxyPU1hdGgubWF4KHIsaC54KSxvPU1hdGgubWluKG8saC55KSxhPU1hdGgubWF4KGEsaC55KX1yZXR1cm5bdCxvLHIsYV19LEZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS50b0dlb0pTT049VmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTjtcbn0se1wicG9pbnQtZ2VvbWV0cnlcIjoxMzcsXCJ2ZWN0b3ItdGlsZVwiOjE0NH1dLDQxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEltYWdlU291cmNlKGUpe3RoaXMuY29vcmRpbmF0ZXM9ZS5jb29yZGluYXRlcyxhamF4LmdldEltYWdlKGUudXJsLGZ1bmN0aW9uKGUsdCl7ZXx8KHRoaXMuaW1hZ2U9dCx0aGlzLmltYWdlLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsZnVuY3Rpb24oKXt0aGlzLm1hcC5fcmVyZW5kZXIoKX0uYmluZCh0aGlzKSksdGhpcy5fbG9hZGVkPSEwLHRoaXMubWFwJiYodGhpcy5jcmVhdGVUaWxlKCksdGhpcy5maXJlKFwiY2hhbmdlXCIpKSl9LmJpbmQodGhpcykpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksVGlsZT1yZXF1aXJlKFwiLi90aWxlXCIpLExuZ0xhdD1yZXF1aXJlKFwiLi4vZ2VvL2xuZ19sYXRcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpLEV2ZW50ZWQ9cmVxdWlyZShcIi4uL3V0aWwvZXZlbnRlZFwiKSxhamF4PXJlcXVpcmUoXCIuLi91dGlsL2FqYXhcIik7bW9kdWxlLmV4cG9ydHM9SW1hZ2VTb3VyY2UsSW1hZ2VTb3VyY2UucHJvdG90eXBlPXV0aWwuaW5oZXJpdChFdmVudGVkLHtvbkFkZDpmdW5jdGlvbihlKXt0aGlzLm1hcD1lLHRoaXMuaW1hZ2UmJnRoaXMuY3JlYXRlVGlsZSgpfSxjcmVhdGVUaWxlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5tYXAsdD10aGlzLmNvb3JkaW5hdGVzLm1hcChmdW5jdGlvbih0KXt2YXIgaT1MbmdMYXQuY29udmVydCh0KTtyZXR1cm4gZS50cmFuc2Zvcm0ubG9jYXRpb25Db29yZGluYXRlKGkpLnpvb21UbygwKX0pLGk9dXRpbC5nZXRDb29yZGluYXRlc0NlbnRlcih0KSxyPTQwOTYsYT10Lm1hcChmdW5jdGlvbihlKXt2YXIgdD1lLnpvb21UbyhpLnpvb20pO3JldHVybiBuZXcgUG9pbnQoTWF0aC5yb3VuZCgodC5jb2x1bW4taS5jb2x1bW4pKnIpLE1hdGgucm91bmQoKHQucm93LWkucm93KSpyKSl9KSxuPWUucGFpbnRlci5nbCxvPTMyNzY3LHU9bmV3IEludDE2QXJyYXkoW2FbMF0ueCxhWzBdLnksMCwwLGFbMV0ueCxhWzFdLnksbywwLGFbM10ueCxhWzNdLnksMCxvLGFbMl0ueCxhWzJdLnksbyxvXSk7dGhpcy50aWxlPW5ldyBUaWxlLHRoaXMudGlsZS5idWNrZXRzPXt9LHRoaXMudGlsZS5ib3VuZHNCdWZmZXI9bi5jcmVhdGVCdWZmZXIoKSxuLmJpbmRCdWZmZXIobi5BUlJBWV9CVUZGRVIsdGhpcy50aWxlLmJvdW5kc0J1ZmZlciksbi5idWZmZXJEYXRhKG4uQVJSQVlfQlVGRkVSLHUsbi5TVEFUSUNfRFJBVyksdGhpcy5jZW50ZXI9aX0sbG9hZGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW1hZ2UmJnRoaXMuaW1hZ2UuY29tcGxldGV9LHVwZGF0ZTpmdW5jdGlvbigpe30scmVsb2FkOmZ1bmN0aW9uKCl7fSxyZW5kZXI6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLl9sb2FkZWQmJnRoaXMubG9hZGVkKCkpe3ZhciBpPXRoaXMuY2VudGVyO3RoaXMudGlsZS5jYWxjdWxhdGVNYXRyaWNlcyhpLnpvb20saS5jb2x1bW4saS5yb3csdGhpcy5tYXAudHJhbnNmb3JtLHQpO3ZhciByPXQuZ2w7dGhpcy50aWxlLnRleHR1cmU/KHIuYmluZFRleHR1cmUoci5URVhUVVJFXzJELHRoaXMudGlsZS50ZXh0dXJlKSxyLnRleFN1YkltYWdlMkQoci5URVhUVVJFXzJELDAsMCwwLHIuUkdCQSxyLlVOU0lHTkVEX0JZVEUsdGhpcy5pbWFnZSkpOih0aGlzLnRpbGUudGV4dHVyZT1yLmNyZWF0ZVRleHR1cmUoKSxyLmJpbmRUZXh0dXJlKHIuVEVYVFVSRV8yRCx0aGlzLnRpbGUudGV4dHVyZSksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfV1JBUF9TLHIuQ0xBTVBfVE9fRURHRSksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfV1JBUF9ULHIuQ0xBTVBfVE9fRURHRSksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfTUlOX0ZJTFRFUixyLkxJTkVBUiksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfTUFHX0ZJTFRFUixyLkxJTkVBUiksci50ZXhJbWFnZTJEKHIuVEVYVFVSRV8yRCwwLHIuUkdCQSxyLlJHQkEsci5VTlNJR05FRF9CWVRFLHRoaXMuaW1hZ2UpKSx0LmRyYXdMYXllcnMoZSx0aGlzLnRpbGUucG9zTWF0cml4LHRoaXMudGlsZSl9fSxmZWF0dXJlc0F0OmZ1bmN0aW9uKGUsdCxpKXtyZXR1cm4gaShudWxsLFtdKX19KTtcbn0se1wiLi4vZ2VvL2xuZ19sYXRcIjoyMCxcIi4uL3V0aWwvYWpheFwiOjk0LFwiLi4vdXRpbC9ldmVudGVkXCI6MTAwLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi90aWxlXCI6NDQsXCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDQyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFJhc3RlclRpbGVTb3VyY2UoZSl7dXRpbC5leHRlbmQodGhpcyx1dGlsLnBpY2soZSxbXCJ1cmxcIixcInRpbGVTaXplXCJdKSksU291cmNlLl9sb2FkVGlsZUpTT04uY2FsbCh0aGlzLGUpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksYWpheD1yZXF1aXJlKFwiLi4vdXRpbC9hamF4XCIpLEV2ZW50ZWQ9cmVxdWlyZShcIi4uL3V0aWwvZXZlbnRlZFwiKSxTb3VyY2U9cmVxdWlyZShcIi4vc291cmNlXCIpLG5vcm1hbGl6ZVVSTD1yZXF1aXJlKFwiLi4vdXRpbC9tYXBib3hcIikubm9ybWFsaXplVGlsZVVSTDttb2R1bGUuZXhwb3J0cz1SYXN0ZXJUaWxlU291cmNlLFJhc3RlclRpbGVTb3VyY2UucHJvdG90eXBlPXV0aWwuaW5oZXJpdChFdmVudGVkLHttaW56b29tOjAsbWF4em9vbToyMixyb3VuZFpvb206ITAsdGlsZVNpemU6NTEyLF9sb2FkZWQ6ITEsb25BZGQ6ZnVuY3Rpb24oZSl7dGhpcy5tYXA9ZX0sbG9hZGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B5cmFtaWQmJnRoaXMuX3B5cmFtaWQubG9hZGVkKCl9LHVwZGF0ZTpmdW5jdGlvbihlKXt0aGlzLl9weXJhbWlkJiZ0aGlzLl9weXJhbWlkLnVwZGF0ZSh0aGlzLnVzZWQsZSx0aGlzLm1hcC5zdHlsZS5yYXN0ZXJGYWRlRHVyYXRpb24pfSxyZWxvYWQ6ZnVuY3Rpb24oKXt9LHJlbmRlcjpTb3VyY2UuX3JlbmRlclRpbGVzLF9sb2FkVGlsZTpmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQsaSl7aWYoZGVsZXRlIGUucmVxdWVzdCwhZS5hYm9ydGVkKXtpZih0KXJldHVybiB2b2lkIHRoaXMuZmlyZShcInRpbGUuZXJyb3JcIix7dGlsZTplfSk7dmFyIHI9dGhpcy5tYXAucGFpbnRlci5nbDtlLnRleHR1cmU9dGhpcy5tYXAucGFpbnRlci5nZXRUZXh0dXJlKGkud2lkdGgpLGUudGV4dHVyZT8oci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsZS50ZXh0dXJlKSxyLnRleFN1YkltYWdlMkQoci5URVhUVVJFXzJELDAsMCwwLHIuUkdCQSxyLlVOU0lHTkVEX0JZVEUsaSkpOihlLnRleHR1cmU9ci5jcmVhdGVUZXh0dXJlKCksci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsZS50ZXh0dXJlKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NSU5fRklMVEVSLHIuTElORUFSX01JUE1BUF9ORUFSRVNUKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NQUdfRklMVEVSLHIuTElORUFSKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Msci5DTEFNUF9UT19FREdFKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Qsci5DTEFNUF9UT19FREdFKSxyLnRleEltYWdlMkQoci5URVhUVVJFXzJELDAsci5SR0JBLHIuUkdCQSxyLlVOU0lHTkVEX0JZVEUsaSksZS50ZXh0dXJlLnNpemU9aS53aWR0aCksci5nZW5lcmF0ZU1pcG1hcChyLlRFWFRVUkVfMkQpLGUudGltZUFkZGVkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMubWFwLmFuaW1hdGlvbkxvb3Auc2V0KHRoaXMuc3R5bGUucmFzdGVyRmFkZUR1cmF0aW9uKSxlLnNvdXJjZT10aGlzLGUubG9hZGVkPSEwLHRoaXMuZmlyZShcInRpbGUubG9hZFwiLHt0aWxlOmV9KX19dmFyIGk9bm9ybWFsaXplVVJMKGUuY29vcmQudXJsKHRoaXMudGlsZXMpLHRoaXMudXJsKTtlLnJlcXVlc3Q9YWpheC5nZXRJbWFnZShpLHQuYmluZCh0aGlzKSl9LF9hYm9ydFRpbGU6ZnVuY3Rpb24oZSl7ZS5hYm9ydGVkPSEwLGUucmVxdWVzdCYmKGUucmVxdWVzdC5hYm9ydCgpLGRlbGV0ZSBlLnJlcXVlc3QpfSxfYWRkVGlsZTpmdW5jdGlvbihlKXt0aGlzLmZpcmUoXCJ0aWxlLmFkZFwiLHt0aWxlOmV9KX0sX3JlbW92ZVRpbGU6ZnVuY3Rpb24oZSl7dGhpcy5maXJlKFwidGlsZS5yZW1vdmVcIix7dGlsZTplfSl9LF91bmxvYWRUaWxlOmZ1bmN0aW9uKGUpe2UudGV4dHVyZSYmdGhpcy5tYXAucGFpbnRlci5zYXZlVGV4dHVyZShlLnRleHR1cmUpfSxmZWF0dXJlc0F0OmZ1bmN0aW9uKGUsdCxpKXtpKG51bGwsW10pfSxmZWF0dXJlc0luOmZ1bmN0aW9uKGUsdCxpKXtpKG51bGwsW10pfX0pO1xufSx7XCIuLi91dGlsL2FqYXhcIjo5NCxcIi4uL3V0aWwvZXZlbnRlZFwiOjEwMCxcIi4uL3V0aWwvbWFwYm94XCI6MTAzLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9zb3VyY2VcIjo0M31dLDQzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksYWpheD1yZXF1aXJlKFwiLi4vdXRpbC9hamF4XCIpLGJyb3dzZXI9cmVxdWlyZShcIi4uL3V0aWwvYnJvd3NlclwiKSxUaWxlUHlyYW1pZD1yZXF1aXJlKFwiLi90aWxlX3B5cmFtaWRcIiksVGlsZUNvb3JkPXJlcXVpcmUoXCIuL3RpbGVfY29vcmRcIiksbm9ybWFsaXplVVJMPXJlcXVpcmUoXCIuLi91dGlsL21hcGJveFwiKS5ub3JtYWxpemVTb3VyY2VVUkw7ZXhwb3J0cy5fbG9hZFRpbGVKU09OPWZ1bmN0aW9uKGkpe3ZhciBlPWZ1bmN0aW9uKGkpe3RoaXMuX3B5cmFtaWQ9bmV3IFRpbGVQeXJhbWlkKHtpbmRleDppLHRpbGVTaXplOnRoaXMudGlsZVNpemUsY2FjaGVTaXplOjIwLG1pbnpvb206dGhpcy5taW56b29tLG1heHpvb206dGhpcy5tYXh6b29tLHJvdW5kWm9vbTp0aGlzLnJvdW5kWm9vbSxyZXBhcnNlT3ZlcnNjYWxlZDp0aGlzLnJlcGFyc2VPdmVyc2NhbGVkLGxvYWQ6dGhpcy5fbG9hZFRpbGUuYmluZCh0aGlzKSxhYm9ydDp0aGlzLl9hYm9ydFRpbGUuYmluZCh0aGlzKSx1bmxvYWQ6dGhpcy5fdW5sb2FkVGlsZS5iaW5kKHRoaXMpLGFkZDp0aGlzLl9hZGRUaWxlLmJpbmQodGhpcykscmVtb3ZlOnRoaXMuX3JlbW92ZVRpbGUuYmluZCh0aGlzKSxyZWRvUGxhY2VtZW50OnRoaXMuX3JlZG9UaWxlUGxhY2VtZW50P3RoaXMuX3JlZG9UaWxlUGxhY2VtZW50LmJpbmQodGhpcyk6dm9pZCAwfSl9LmJpbmQodGhpcykscj1mdW5jdGlvbihpLHIpe3JldHVybiBpP3ZvaWQgdGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6aX0pOih1dGlsLmV4dGVuZCh0aGlzLHV0aWwucGljayhyLFtcInRpbGVzXCIsXCJtaW56b29tXCIsXCJtYXh6b29tXCIsXCJhdHRyaWJ1dGlvblwiXSkpLHZvaWQoci5pbmRleD9hamF4LmdldEpTT04obm9ybWFsaXplVVJMKHIuaW5kZXgpLGZ1bmN0aW9uKGkscil7cmV0dXJuIGk/dm9pZCB0aGlzLmZpcmUoXCJlcnJvclwiLHtlcnJvcjppfSk6KGUoci5pbmRleCksdm9pZCB0aGlzLmZpcmUoXCJsb2FkXCIpKX0uYmluZCh0aGlzKSk6KGUoKSx0aGlzLmZpcmUoXCJsb2FkXCIpKSkpfS5iaW5kKHRoaXMpO2kudXJsP2FqYXguZ2V0SlNPTihub3JtYWxpemVVUkwoaS51cmwpLHIpOmJyb3dzZXIuZnJhbWUoci5iaW5kKHRoaXMsbnVsbCxpKSl9LGV4cG9ydHMuX3JlbmRlclRpbGVzPWZ1bmN0aW9uKGksZSl7aWYodGhpcy5fcHlyYW1pZClmb3IodmFyIHI9dGhpcy5fcHlyYW1pZC5yZW5kZXJlZElEcygpLHQ9MDt0PHIubGVuZ3RoO3QrKyl7dmFyIG89dGhpcy5fcHlyYW1pZC5nZXRUaWxlKHJbdF0pLG49VGlsZUNvb3JkLmZyb21JRChyW3RdKSxhPW4ueixzPW4ueCxsPW4ueSxkPW4udzthPU1hdGgubWluKGEsdGhpcy5tYXh6b29tKSwoby50aWxlRXh0ZW50PjQwOTZ8fG8ucGFyZW50SWQpJiYoby50aWxlRXh0ZW50PTQwOTYpLHMrPWQqKDE8PGEpLG8uY2FsY3VsYXRlTWF0cmljZXMoYSxzLGwsZS50cmFuc2Zvcm0sZSksZS5kcmF3VGlsZShvLGkpfX0sZXhwb3J0cy5fdmVjdG9yRmVhdHVyZXNBdD1mdW5jdGlvbihpLGUscil7aWYoIXRoaXMuX3B5cmFtaWQpcmV0dXJuIHIobnVsbCxbXSk7dmFyIHQ9dGhpcy5fcHlyYW1pZC50aWxlQXQoaSk7cmV0dXJuIHQ/dm9pZCB0aGlzLmRpc3BhdGNoZXIuc2VuZChcInF1ZXJ5IGZlYXR1cmVzXCIse3VpZDp0LnRpbGUudWlkLHg6dC54LHk6dC55LHRpbGVFeHRlbnQ6dC50aWxlLnRpbGVFeHRlbnQsc2NhbGU6dC5zY2FsZSxzb3VyY2U6dGhpcy5pZCxwYXJhbXM6ZX0scix0LnRpbGUud29ya2VySUQpOnIobnVsbCxbXSl9LGV4cG9ydHMuX3ZlY3RvckZlYXR1cmVzSW49ZnVuY3Rpb24oaSxlLHIpe2lmKCF0aGlzLl9weXJhbWlkKXJldHVybiByKG51bGwsW10pO3ZhciB0PXRoaXMuX3B5cmFtaWQudGlsZXNJbihpKTtyZXR1cm4gdD92b2lkIHV0aWwuYXN5bmNBbGwodCxmdW5jdGlvbihpLHIpe3RoaXMuZGlzcGF0Y2hlci5zZW5kKFwicXVlcnkgZmVhdHVyZXNcIix7dWlkOmkudGlsZS51aWQsc291cmNlOnRoaXMuaWQsbWluWDppLm1pblgsbWF4WDppLm1heFgsbWluWTppLm1pblksbWF4WTppLm1heFkscGFyYW1zOmV9LHIsaS50aWxlLndvcmtlcklEKX0uYmluZCh0aGlzKSxmdW5jdGlvbihpLGUpe3IoaSxBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGUpKX0pOnIobnVsbCxbXSl9LGV4cG9ydHMuY3JlYXRlPWZ1bmN0aW9uKGkpe3ZhciBlPXt2ZWN0b3I6cmVxdWlyZShcIi4vdmVjdG9yX3RpbGVfc291cmNlXCIpLHJhc3RlcjpyZXF1aXJlKFwiLi9yYXN0ZXJfdGlsZV9zb3VyY2VcIiksZ2VvanNvbjpyZXF1aXJlKFwiLi9nZW9qc29uX3NvdXJjZVwiKSx2aWRlbzpyZXF1aXJlKFwiLi92aWRlb19zb3VyY2VcIiksaW1hZ2U6cmVxdWlyZShcIi4vaW1hZ2Vfc291cmNlXCIpfTtmb3IodmFyIHIgaW4gZSlpZihpIGluc3RhbmNlb2YgZVtyXSlyZXR1cm4gaTtyZXR1cm4gbmV3IGVbaS50eXBlXShpKX07XG59LHtcIi4uL3V0aWwvYWpheFwiOjk0LFwiLi4vdXRpbC9icm93c2VyXCI6OTUsXCIuLi91dGlsL21hcGJveFwiOjEwMyxcIi4uL3V0aWwvdXRpbFwiOjEwNixcIi4vZ2VvanNvbl9zb3VyY2VcIjozOSxcIi4vaW1hZ2Vfc291cmNlXCI6NDEsXCIuL3Jhc3Rlcl90aWxlX3NvdXJjZVwiOjQyLFwiLi90aWxlX2Nvb3JkXCI6NDUsXCIuL3RpbGVfcHlyYW1pZFwiOjQ2LFwiLi92ZWN0b3JfdGlsZV9zb3VyY2VcIjo0NyxcIi4vdmlkZW9fc291cmNlXCI6NDh9XSw0NDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBUaWxlKHQsZSl7dGhpcy5jb29yZD10LHRoaXMudWlkPXV0aWwudW5pcXVlSWQoKSx0aGlzLmxvYWRlZD0hMSx0aGlzLnVzZXM9MCx0aGlzLnRpbGVTaXplPWV9dmFyIGdsbWF0cml4PXJlcXVpcmUoXCJnbC1tYXRyaXhcIiksbWF0Mj1nbG1hdHJpeC5tYXQyLG1hdDQ9Z2xtYXRyaXgubWF0NCx1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksQnVmZmVyU2V0PXJlcXVpcmUoXCIuLi9kYXRhL2J1ZmZlci9idWZmZXJfc2V0XCIpO21vZHVsZS5leHBvcnRzPVRpbGUsVGlsZS5wcm90b3R5cGU9e3RpbGVFeHRlbnQ6NDA5NixjYWxjdWxhdGVNYXRyaWNlczpmdW5jdGlvbih0LGUsaSxyKXt2YXIgcz1NYXRoLnBvdygyLHQpLG89ci53b3JsZFNpemUvczt0aGlzLnNjYWxlPW8sdGhpcy5wb3NNYXRyaXg9bmV3IEZsb2F0NjRBcnJheSgxNiksbWF0NC5pZGVudGl0eSh0aGlzLnBvc01hdHJpeCksbWF0NC50cmFuc2xhdGUodGhpcy5wb3NNYXRyaXgsdGhpcy5wb3NNYXRyaXgsW2UqbyxpKm8sMF0pLG1hdDQuc2NhbGUodGhpcy5wb3NNYXRyaXgsdGhpcy5wb3NNYXRyaXgsW28vdGhpcy50aWxlRXh0ZW50LG8vdGhpcy50aWxlRXh0ZW50LDFdKSxtYXQ0Lm11bHRpcGx5KHRoaXMucG9zTWF0cml4LHIuZ2V0UHJvak1hdHJpeCgpLHRoaXMucG9zTWF0cml4KSx0aGlzLmV4TWF0cml4PW1hdDQuY3JlYXRlKCksbWF0NC5vcnRobyh0aGlzLmV4TWF0cml4LDAsci53aWR0aCxyLmhlaWdodCwwLDAsLTEpLHRoaXMucm90YXRpb25NYXRyaXg9bWF0Mi5jcmVhdGUoKSxtYXQyLnJvdGF0ZSh0aGlzLnJvdGF0aW9uTWF0cml4LHRoaXMucm90YXRpb25NYXRyaXgsci5hbmdsZSksdGhpcy5wb3NNYXRyaXg9bmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvc01hdHJpeCl9LHBvc2l0aW9uQXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD10Lnpvb21UbyhNYXRoLm1pbih0aGlzLmNvb3JkLnosZSkpLHt4Oih0LmNvbHVtbi10aGlzLmNvb3JkLngpKnRoaXMudGlsZUV4dGVudCx5Oih0LnJvdy10aGlzLmNvb3JkLnkpKnRoaXMudGlsZUV4dGVudCxzY2FsZTp0aGlzLnNjYWxlfX0sbG9hZFZlY3RvckRhdGE6ZnVuY3Rpb24odCl7dGhpcy5sb2FkZWQ9ITAsdCYmKHRoaXMuYnVmZmVycz1uZXcgQnVmZmVyU2V0KHQuYnVmZmVycyksdGhpcy5lbGVtZW50R3JvdXBzPXQuZWxlbWVudEdyb3Vwcyx0aGlzLnRpbGVFeHRlbnQ9dC5leHRlbnQpfSxyZWxvYWRTeW1ib2xEYXRhOmZ1bmN0aW9uKHQsZSl7aWYodGhpcy5idWZmZXJzKXt0aGlzLmJ1ZmZlcnMuZ2x5cGhWZXJ0ZXguZGVzdHJveShlLmdsKSx0aGlzLmJ1ZmZlcnMuZ2x5cGhFbGVtZW50LmRlc3Ryb3koZS5nbCksdGhpcy5idWZmZXJzLmljb25WZXJ0ZXguZGVzdHJveShlLmdsKSx0aGlzLmJ1ZmZlcnMuaWNvbkVsZW1lbnQuZGVzdHJveShlLmdsKSx0aGlzLmJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4LmRlc3Ryb3koZS5nbCk7dmFyIGk9bmV3IEJ1ZmZlclNldCh0LmJ1ZmZlcnMpO3RoaXMuYnVmZmVycy5nbHlwaFZlcnRleD1pLmdseXBoVmVydGV4LHRoaXMuYnVmZmVycy5nbHlwaEVsZW1lbnQ9aS5nbHlwaEVsZW1lbnQsdGhpcy5idWZmZXJzLmljb25WZXJ0ZXg9aS5pY29uVmVydGV4LHRoaXMuYnVmZmVycy5pY29uRWxlbWVudD1pLmljb25FbGVtZW50LHRoaXMuYnVmZmVycy5jb2xsaXNpb25Cb3hWZXJ0ZXg9aS5jb2xsaXNpb25Cb3hWZXJ0ZXg7Zm9yKHZhciByIGluIHQuZWxlbWVudEdyb3Vwcyl0aGlzLmVsZW1lbnRHcm91cHNbcl09dC5lbGVtZW50R3JvdXBzW3JdfX0sdW5sb2FkVmVjdG9yRGF0YTpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcy5idWZmZXJzKXRoaXMuYnVmZmVyc1tlXS5kZXN0cm95KHQuZ2wpO3RoaXMuYnVmZmVycz1udWxsfX07XG59LHtcIi4uL2RhdGEvYnVmZmVyL2J1ZmZlcl9zZXRcIjoyLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiZ2wtbWF0cml4XCI6MTE2fV0sNDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gVGlsZUNvb3JkKHQsaSxvLHIpe2lzTmFOKHIpJiYocj0wKSx0aGlzLno9K3QsdGhpcy54PStpLHRoaXMueT0rbyx0aGlzLnc9K3Iscio9MiwwPnImJihyPS0xKnItMSk7dmFyIGU9MTw8dGhpcy56O3RoaXMuaWQ9MzIqKGUqZSpyK2UqdGhpcy55K3RoaXMueCkrdGhpcy56fWZ1bmN0aW9uIGVkZ2UodCxpKXtpZih0LnJvdz5pLnJvdyl7dmFyIG89dDt0PWksaT1vfXJldHVybnt4MDp0LmNvbHVtbix5MDp0LnJvdyx4MTppLmNvbHVtbix5MTppLnJvdyxkeDppLmNvbHVtbi10LmNvbHVtbixkeTppLnJvdy10LnJvd319ZnVuY3Rpb24gc2NhblNwYW5zKHQsaSxvLHIsZSl7dmFyIG49TWF0aC5tYXgobyxNYXRoLmZsb29yKGkueTApKSxoPU1hdGgubWluKHIsTWF0aC5jZWlsKGkueTEpKTtpZih0LngwPT09aS54MCYmdC55MD09PWkueTA/dC54MCtpLmR5L3QuZHkqdC5keDxpLngxOnQueDEtaS5keS90LmR5KnQuZHg8aS54MCl7dmFyIHM9dDt0PWksaT1zfWZvcih2YXIgZD10LmR4L3QuZHksYT1pLmR4L2kuZHksbD10LmR4PjAseT1pLmR4PDAseD1uO2g+eDt4Kyspe3ZhciBjPWQqTWF0aC5tYXgoMCxNYXRoLm1pbih0LmR5LHgrbC10LnkwKSkrdC54MCx1PWEqTWF0aC5tYXgoMCxNYXRoLm1pbihpLmR5LHgreS1pLnkwKSkraS54MDtlKE1hdGguZmxvb3IodSksTWF0aC5jZWlsKGMpLHgpfX1mdW5jdGlvbiBzY2FuVHJpYW5nbGUodCxpLG8scixlLG4pe3ZhciBoLHM9ZWRnZSh0LGkpLGQ9ZWRnZShpLG8pLGE9ZWRnZShvLHQpO3MuZHk+ZC5keSYmKGg9cyxzPWQsZD1oKSxzLmR5PmEuZHkmJihoPXMscz1hLGE9aCksZC5keT5hLmR5JiYoaD1kLGQ9YSxhPWgpLHMuZHkmJnNjYW5TcGFucyhhLHMscixlLG4pLGQuZHkmJnNjYW5TcGFucyhhLGQscixlLG4pfW1vZHVsZS5leHBvcnRzPVRpbGVDb29yZCxUaWxlQ29vcmQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueitcIi9cIit0aGlzLngrXCIvXCIrdGhpcy55fSxUaWxlQ29vcmQuZnJvbUlEPWZ1bmN0aW9uKHQpe3ZhciBpPXQlMzIsbz0xPDxpLHI9KHQtaSkvMzIsZT1yJW8sbj0oci1lKS9vJW8saD1NYXRoLmZsb29yKHIvKG8qbykpO3JldHVybiBoJTIhPT0wJiYoaD0tMSpoLTEpLGgvPTIsbmV3IFRpbGVDb29yZChpLGUsbixoKX0sVGlsZUNvb3JkLnByb3RvdHlwZS51cmw9ZnVuY3Rpb24odCxpKXtyZXR1cm4gdFsodGhpcy54K3RoaXMueSkldC5sZW5ndGhdLnJlcGxhY2UoXCJ7cHJlZml4fVwiLCh0aGlzLnglMTYpLnRvU3RyaW5nKDE2KSsodGhpcy55JTE2KS50b1N0cmluZygxNikpLnJlcGxhY2UoXCJ7en1cIixNYXRoLm1pbih0aGlzLnosaXx8dGhpcy56KSkucmVwbGFjZShcInt4fVwiLHRoaXMueCkucmVwbGFjZShcInt5fVwiLHRoaXMueSl9LFRpbGVDb29yZC5wcm90b3R5cGUucGFyZW50PWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy56P251bGw6dGhpcy56PnQ/bmV3IFRpbGVDb29yZCh0aGlzLnotMSx0aGlzLngsdGhpcy55LHRoaXMudyk6bmV3IFRpbGVDb29yZCh0aGlzLnotMSxNYXRoLmZsb29yKHRoaXMueC8yKSxNYXRoLmZsb29yKHRoaXMueS8yKSx0aGlzLncpfSxUaWxlQ29vcmQucHJvdG90eXBlLndyYXBwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFRpbGVDb29yZCh0aGlzLnosdGhpcy54LHRoaXMueSwwKX0sVGlsZUNvb3JkLnByb3RvdHlwZS5jaGlsZHJlbj1mdW5jdGlvbih0KXtpZih0aGlzLno+PXQpcmV0dXJuW25ldyBUaWxlQ29vcmQodGhpcy56KzEsdGhpcy54LHRoaXMueSx0aGlzLncpXTt2YXIgaT10aGlzLnorMSxvPTIqdGhpcy54LHI9Mip0aGlzLnk7cmV0dXJuW25ldyBUaWxlQ29vcmQoaSxvLHIsdGhpcy53KSxuZXcgVGlsZUNvb3JkKGksbysxLHIsdGhpcy53KSxuZXcgVGlsZUNvb3JkKGksbyxyKzEsdGhpcy53KSxuZXcgVGlsZUNvb3JkKGksbysxLHIrMSx0aGlzLncpXX0sVGlsZUNvb3JkLmNvdmVyPWZ1bmN0aW9uKHQsaSxvKXtmdW5jdGlvbiByKHQsaSxyKXt2YXIgaCxzLGQ7aWYocj49MCYmZT49cilmb3IoaD10O2k+aDtoKyspcz0oaCVlK2UpJWUsZD1uZXcgVGlsZUNvb3JkKG8scyxyLE1hdGguZmxvb3IoaC9lKSksbltkLmlkXT1kfXZhciBlPTE8PHQsbj17fTtyZXR1cm4gc2NhblRyaWFuZ2xlKGlbMF0saVsxXSxpWzJdLDAsZSxyKSxzY2FuVHJpYW5nbGUoaVsyXSxpWzNdLGlbMF0sMCxlLHIpLE9iamVjdC5rZXlzKG4pLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gblt0XX0pfTtcbn0se31dLDQ2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFRpbGVQeXJhbWlkKGkpe3RoaXMudGlsZVNpemU9aS50aWxlU2l6ZSx0aGlzLm1pbnpvb209aS5taW56b29tLHRoaXMubWF4em9vbT1pLm1heHpvb20sdGhpcy5yb3VuZFpvb209aS5yb3VuZFpvb20sdGhpcy5yZXBhcnNlT3ZlcnNjYWxlZD1pLnJlcGFyc2VPdmVyc2NhbGVkLHRoaXMuaW5kZXg9aS5pbmRleCx0aGlzLl9sb2FkPWkubG9hZCx0aGlzLl9hYm9ydD1pLmFib3J0LHRoaXMuX3VubG9hZD1pLnVubG9hZCx0aGlzLl9hZGQ9aS5hZGQsdGhpcy5fcmVtb3ZlPWkucmVtb3ZlLHRoaXMuX3JlZG9QbGFjZW1lbnQ9aS5yZWRvUGxhY2VtZW50LHRoaXMuX3RpbGVzPXt9LHRoaXMuX2NhY2hlPW5ldyBDYWNoZShpLmNhY2hlU2l6ZSxmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5fdW5sb2FkKGkpfS5iaW5kKHRoaXMpKX12YXIgVGlsZT1yZXF1aXJlKFwiLi90aWxlXCIpLFRpbGVDb29yZD1yZXF1aXJlKFwiLi90aWxlX2Nvb3JkXCIpLFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKSxDYWNoZT1yZXF1aXJlKFwiLi4vdXRpbC9tcnVfY2FjaGVcIiksdXRpbD1yZXF1aXJlKFwiLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPVRpbGVQeXJhbWlkLFRpbGVQeXJhbWlkLnByb3RvdHlwZT17bG9hZGVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBpIGluIHRoaXMuX3RpbGVzKWlmKCF0aGlzLl90aWxlc1tpXS5sb2FkZWQpcmV0dXJuITE7cmV0dXJuITB9LG9yZGVyZWRJRHM6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5fdGlsZXMpLnNvcnQoZnVuY3Rpb24oaSxlKXtyZXR1cm4gZSUzMi1pJTMyfSkubWFwKGZ1bmN0aW9uKGkpe3JldHVybitpfSl9LHJlbmRlcmVkSURzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3JkZXJlZElEcygpLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5fdGlsZXNbaV0ubG9hZGVkJiYhdGhpcy5fY292ZXJlZFRpbGVzW2ldfS5iaW5kKHRoaXMpKX0scmVsb2FkOmZ1bmN0aW9uKCl7dGhpcy5fY2FjaGUucmVzZXQoKTtmb3IodmFyIGkgaW4gdGhpcy5fdGlsZXMpdGhpcy5fbG9hZCh0aGlzLl90aWxlc1tpXSl9LGdldFRpbGU6ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXMuX3RpbGVzW2ldfSxnZXRab29tOmZ1bmN0aW9uKGkpe3JldHVybiBpLnpvb20rTWF0aC5sb2coaS50aWxlU2l6ZS90aGlzLnRpbGVTaXplKS9NYXRoLkxOMn0sY292ZXJpbmdab29tTGV2ZWw6ZnVuY3Rpb24oaSl7cmV0dXJuKHRoaXMucm91bmRab29tP01hdGgucm91bmQ6TWF0aC5mbG9vcikodGhpcy5nZXRab29tKGkpKX0sY292ZXJpbmdUaWxlczpmdW5jdGlvbihpKXt2YXIgZT10aGlzLmNvdmVyaW5nWm9vbUxldmVsKGkpLHQ9ZTtpZihlPHRoaXMubWluem9vbSlyZXR1cm5bXTtlPnRoaXMubWF4em9vbSYmKGU9dGhpcy5tYXh6b29tKTt2YXIgbz1pLHI9by5sb2NhdGlvbkNvb3JkaW5hdGUoby5jZW50ZXIpLl96b29tVG8oZSksbj1uZXcgUG9pbnQoci5jb2x1bW4tLjUsci5yb3ctLjUpO3JldHVybiBUaWxlQ29vcmQuY292ZXIoZSxbby5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KDAsMCkpLl96b29tVG8oZSksby5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KG8ud2lkdGgsMCkpLl96b29tVG8oZSksby5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KG8ud2lkdGgsby5oZWlnaHQpKS5fem9vbVRvKGUpLG8ucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCgwLG8uaGVpZ2h0KSkuX3pvb21UbyhlKV0sdGhpcy5yZXBhcnNlT3ZlcnNjYWxlZD90OmUpLnNvcnQoZnVuY3Rpb24oaSxlKXtyZXR1cm4gbi5kaXN0KGkpLW4uZGlzdChlKX0pfSxmaW5kTG9hZGVkQ2hpbGRyZW46ZnVuY3Rpb24oaSxlLHQpe2Zvcih2YXIgbz0hMCxyPWkueixuPWkuY2hpbGRyZW4odGhpcy5tYXh6b29tKSxzPTA7czxuLmxlbmd0aDtzKyspe3ZhciBkPW5bc10uaWQ7dGhpcy5fdGlsZXNbZF0mJnRoaXMuX3RpbGVzW2RdLmxvYWRlZD90W2RdPSEwOihvPSExLGU+ciYmdGhpcy5maW5kTG9hZGVkQ2hpbGRyZW4obltzXSxlLHQpKX1yZXR1cm4gb30sZmluZExvYWRlZFBhcmVudDpmdW5jdGlvbihpLGUsdCl7Zm9yKHZhciBvPWkuei0xO28+PWU7by0tKXtpPWkucGFyZW50KHRoaXMubWF4em9vbSk7dmFyIHI9dGhpcy5fdGlsZXNbaS5pZF07aWYociYmci5sb2FkZWQpcmV0dXJuIHRbaS5pZF09ITAscn19LHVwZGF0ZTpmdW5jdGlvbihpLGUsdCl7dmFyIG8scixuLHM9KHRoaXMucm91bmRab29tP01hdGgucm91bmQ6TWF0aC5mbG9vcikodGhpcy5nZXRab29tKGUpKSxkPXV0aWwuY2xhbXAocy0xMCx0aGlzLm1pbnpvb20sdGhpcy5tYXh6b29tKSxoPXV0aWwuY2xhbXAocysxLHRoaXMubWluem9vbSx0aGlzLm1heHpvb20pLGE9e30sbD0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLl9jb3ZlcmVkVGlsZXM9e307dmFyIG09aT90aGlzLmNvdmVyaW5nVGlsZXMoZSk6W107Zm9yKG89MDtvPG0ubGVuZ3RoO28rKylyPW1bb10sbj10aGlzLmFkZFRpbGUociksYVtyLmlkXT0hMCxuLmxvYWRlZHx8dGhpcy5maW5kTG9hZGVkQ2hpbGRyZW4ocixoLGEpfHx0aGlzLmZpbmRMb2FkZWRQYXJlbnQocixkLGEpO2Zvcih2YXIgdSBpbiBhKXI9VGlsZUNvb3JkLmZyb21JRCh1KSxuPXRoaXMuX3RpbGVzW3VdLG4mJm4udGltZUFkZGVkPmwtKHR8fDApJiYodGhpcy5maW5kTG9hZGVkQ2hpbGRyZW4ocixoLGEpPyh0aGlzLl9jb3ZlcmVkVGlsZXNbdV09ITAsYVt1XT0hMCk6dGhpcy5maW5kTG9hZGVkUGFyZW50KHIsZCxhKSk7dmFyIGM9dXRpbC5rZXlzRGlmZmVyZW5jZSh0aGlzLl90aWxlcyxhKTtmb3Iobz0wO288Yy5sZW5ndGg7bysrKXRoaXMucmVtb3ZlVGlsZSgrY1tvXSl9LGFkZFRpbGU6ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcy5fdGlsZXNbaS5pZF07aWYoZSlyZXR1cm4gZTt2YXIgdD1pLndyYXBwZWQoKTtpZihlPXRoaXMuX3RpbGVzW3QuaWRdLGV8fChlPXRoaXMuX2NhY2hlLmdldCh0LmlkKSxlJiZ0aGlzLl9yZWRvUGxhY2VtZW50JiZ0aGlzLl9yZWRvUGxhY2VtZW50KGUpKSwhZSl7dmFyIG89aS56LHI9bz50aGlzLm1heHpvb20/TWF0aC5wb3coMixvLXRoaXMubWF4em9vbSk6MTtlPW5ldyBUaWxlKHQsdGhpcy50aWxlU2l6ZSpyKSx0aGlzLmluZGV4JiYoZS5wYXJlbnRJZD10aGlzLmluZGV4U2VhcmNoKGkuaWQpKSx0aGlzLl9sb2FkKGUpfXJldHVybiBlLnVzZXMrKyx0aGlzLl90aWxlc1tpLmlkXT1lLHRoaXMuX2FkZChlLGkpLGV9LHJlbW92ZVRpbGU6ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcy5fdGlsZXNbaV07ZSYmKGUudXNlcy0tLGRlbGV0ZSB0aGlzLl90aWxlc1tpXSx0aGlzLl9yZW1vdmUoZSksZS51c2VzPjB8fChlLmxvYWRlZD90aGlzLl9jYWNoZS5hZGQoZS5jb29yZC53cmFwcGVkKCkuaWQsZSk6KHRoaXMuX2Fib3J0KGUpLHRoaXMuX3VubG9hZChlKSkpKX0sY2xlYXJUaWxlczpmdW5jdGlvbigpe2Zvcih2YXIgaSBpbiB0aGlzLl90aWxlcyl0aGlzLnJlbW92ZVRpbGUoaSk7dGhpcy5fY2FjaGUucmVzZXQoKX0sdGlsZUF0OmZ1bmN0aW9uKGkpe2Zvcih2YXIgZT10aGlzLm9yZGVyZWRJRHMoKSx0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBvPXRoaXMuX3RpbGVzW2VbdF1dLHI9by5wb3NpdGlvbkF0KGksdGhpcy5tYXh6b29tKTtpZihyJiZyLng+PTAmJnIueDxvLnRpbGVFeHRlbnQmJnIueT49MCYmci55PG8udGlsZUV4dGVudClyZXR1cm57dGlsZTpvLHg6ci54LHk6ci55LHNjYWxlOnIuc2NhbGV9fX0sdGlsZXNJbjpmdW5jdGlvbihpKXtmb3IodmFyIGU9W10sdD10aGlzLm9yZGVyZWRJRHMoKSxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciByPXRoaXMuX3RpbGVzW3Rbb11dLG49W3IucG9zaXRpb25BdChpWzBdLHRoaXMubWF4em9vbSksci5wb3NpdGlvbkF0KGlbMV0sdGhpcy5tYXh6b29tKV07blswXS54PHIudGlsZUV4dGVudCYmblswXS55PHIudGlsZUV4dGVudCYmblsxXS54Pj0wJiZuWzFdLnk+PTAmJmUucHVzaCh7dGlsZTpyLG1pblg6blswXS54LG1heFg6blsxXS54LG1pblk6blswXS55LG1heFk6blsxXS55fSl9cmV0dXJuIGV9LGluZGV4U2VhcmNoOmZ1bmN0aW9uKGkpe2Zvcih2YXIgZT1UaWxlQ29vcmQuZnJvbUlEKGkpLHQ9W2ldLG89ZTswIT09by56OylvPW8ucGFyZW50KCksdC5wdXNoKG8uaWQpO2Zvcih2YXIgcixuPXRoaXMuaW5kZXgscz10LnBvcCgpLGQ9ZnVuY3Rpb24oaSl7cmV0dXJuIGkuaWR9O3QubGVuZ3RoOylpZihpPXQucG9wKCksZT1UaWxlQ29vcmQuZnJvbUlEKHMpLHI9ZS5jaGlsZHJlbih0aGlzLm1heHpvb20pLm1hcChkKS5pbmRleE9mKGkpLG4pe2lmKDA9PT1uW3JdKXtzPWk7YnJlYWt9aWYoMT09PW5bcl0pe3M9aTticmVha31zPWksbj1uW3JdfXJldHVybiAwPT09dC5sZW5ndGg/bnVsbDpzfX07XG59LHtcIi4uL3V0aWwvbXJ1X2NhY2hlXCI6MTA0LFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi90aWxlXCI6NDQsXCIuL3RpbGVfY29vcmRcIjo0NSxcInBvaW50LWdlb21ldHJ5XCI6MTM3fV0sNDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gVmVjdG9yVGlsZVNvdXJjZShlKXtpZih1dGlsLmV4dGVuZCh0aGlzLHV0aWwucGljayhlLFtcInVybFwiLFwidGlsZVNpemVcIl0pKSw1MTIhPT10aGlzLnRpbGVTaXplKXRocm93IG5ldyBFcnJvcihcInZlY3RvciB0aWxlIHNvdXJjZXMgbXVzdCBoYXZlIGEgdGlsZVNpemUgb2YgNTEyXCIpO1NvdXJjZS5fbG9hZFRpbGVKU09OLmNhbGwodGhpcyxlKX12YXIgdXRpbD1yZXF1aXJlKFwiLi4vdXRpbC91dGlsXCIpLEV2ZW50ZWQ9cmVxdWlyZShcIi4uL3V0aWwvZXZlbnRlZFwiKSxTb3VyY2U9cmVxdWlyZShcIi4vc291cmNlXCIpLFRpbGVDb29yZD1yZXF1aXJlKFwiLi90aWxlX2Nvb3JkXCIpO21vZHVsZS5leHBvcnRzPVZlY3RvclRpbGVTb3VyY2UsVmVjdG9yVGlsZVNvdXJjZS5wcm90b3R5cGU9dXRpbC5pbmhlcml0KEV2ZW50ZWQse21pbnpvb206MCxtYXh6b29tOjIyLHRpbGVTaXplOjUxMixyZXBhcnNlT3ZlcnNjYWxlZDohMCxfbG9hZGVkOiExLG9uQWRkOmZ1bmN0aW9uKGUpe3RoaXMubWFwPWV9LGxvYWRlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9weXJhbWlkJiZ0aGlzLl9weXJhbWlkLmxvYWRlZCgpfSx1cGRhdGU6ZnVuY3Rpb24oZSl7dGhpcy5fcHlyYW1pZCYmdGhpcy5fcHlyYW1pZC51cGRhdGUodGhpcy51c2VkLGUpfSxyZWxvYWQ6ZnVuY3Rpb24oKXt0aGlzLl9weXJhbWlkJiZ0aGlzLl9weXJhbWlkLnJlbG9hZCgpfSxyZWRvUGxhY2VtZW50OmZ1bmN0aW9uKCl7aWYodGhpcy5fcHlyYW1pZClmb3IodmFyIGU9dGhpcy5fcHlyYW1pZC5vcmRlcmVkSURzKCksaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgdD10aGlzLl9weXJhbWlkLmdldFRpbGUoZVtpXSk7dGhpcy5fcmVkb1RpbGVQbGFjZW1lbnQodCl9fSxyZW5kZXI6U291cmNlLl9yZW5kZXJUaWxlcyxmZWF0dXJlc0F0OlNvdXJjZS5fdmVjdG9yRmVhdHVyZXNBdCxmZWF0dXJlc0luOlNvdXJjZS5fdmVjdG9yRmVhdHVyZXNJbixfbG9hZFRpbGU6ZnVuY3Rpb24oZSl7dmFyIGk9ZS5jb29yZC56PnRoaXMubWF4em9vbT9NYXRoLnBvdygyLGUuY29vcmQuei10aGlzLm1heHpvb20pOjEsdD17dXJsOmUuY29vcmQudXJsKHRoaXMudGlsZXMsdGhpcy5tYXh6b29tKSx1aWQ6ZS51aWQsY29vcmQ6ZS5jb29yZCx6b29tOmUuY29vcmQueixtYXhab29tOnRoaXMubWF4em9vbSx0aWxlU2l6ZTp0aGlzLnRpbGVTaXplKmksc291cmNlOnRoaXMuaWQsb3ZlcnNjYWxpbmc6aSxhbmdsZTp0aGlzLm1hcC50cmFuc2Zvcm0uYW5nbGUscGl0Y2g6dGhpcy5tYXAudHJhbnNmb3JtLnBpdGNoLGNvbGxpc2lvbkRlYnVnOnRoaXMubWFwLmNvbGxpc2lvbkRlYnVnLHBhcmVudElkOmUucGFyZW50SWR9O2UucGFyZW50SWQmJih0LnVybD1UaWxlQ29vcmQuZnJvbUlEKGUucGFyZW50SWQpLnVybCh0aGlzLnRpbGVzLHRoaXMubWF4em9vbSkpLGUud29ya2VySUQ/dGhpcy5kaXNwYXRjaGVyLnNlbmQoXCJyZWxvYWQgdGlsZVwiLHQsdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsZSksZS53b3JrZXJJRCk6ZS53b3JrZXJJRD10aGlzLmRpc3BhdGNoZXIuc2VuZChcImxvYWQgdGlsZVwiLHQsdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsZSkpfSxfdGlsZUxvYWRlZDpmdW5jdGlvbihlLGksdCl7aWYoIWUuYWJvcnRlZCl7aWYoaSlyZXR1cm4gdm9pZCB0aGlzLmZpcmUoXCJ0aWxlLmVycm9yXCIse3RpbGU6ZX0pO2UubG9hZFZlY3RvckRhdGEodCksZS5yZWRvV2hlbkRvbmUmJihlLnJlZG9XaGVuRG9uZT0hMSx0aGlzLl9yZWRvVGlsZVBsYWNlbWVudChlKSksdGhpcy5maXJlKFwidGlsZS5sb2FkXCIse3RpbGU6ZX0pLHRoaXMuZmlyZShcInRpbGUuc3RhdHNcIix0LmJ1Y2tldFN0YXRzKX19LF9hYm9ydFRpbGU6ZnVuY3Rpb24oZSl7ZS5hYm9ydGVkPSEwLHRoaXMuZGlzcGF0Y2hlci5zZW5kKFwiYWJvcnQgdGlsZVwiLHt1aWQ6ZS51aWQsc291cmNlOnRoaXMuaWR9LG51bGwsZS53b3JrZXJJRCl9LF9hZGRUaWxlOmZ1bmN0aW9uKGUpe3RoaXMuZmlyZShcInRpbGUuYWRkXCIse3RpbGU6ZX0pfSxfcmVtb3ZlVGlsZTpmdW5jdGlvbihlKXt0aGlzLmZpcmUoXCJ0aWxlLnJlbW92ZVwiLHt0aWxlOmV9KX0sX3VubG9hZFRpbGU6ZnVuY3Rpb24oZSl7ZS51bmxvYWRWZWN0b3JEYXRhKHRoaXMubWFwLnBhaW50ZXIpLHRoaXMuZ2x5cGhBdGxhcy5yZW1vdmVHbHlwaHMoZS51aWQpLHRoaXMuZGlzcGF0Y2hlci5zZW5kKFwicmVtb3ZlIHRpbGVcIix7dWlkOmUudWlkLHNvdXJjZTp0aGlzLmlkfSxudWxsLGUud29ya2VySUQpfSxfcmVkb1RpbGVQbGFjZW1lbnQ6ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gaShpLHQpe2UucmVsb2FkU3ltYm9sRGF0YSh0LHRoaXMubWFwLnBhaW50ZXIpLHRoaXMuZmlyZShcInRpbGUubG9hZFwiLHt0aWxlOmV9KSxlLnJlZG9pbmdQbGFjZW1lbnQ9ITEsZS5yZWRvV2hlbkRvbmUmJih0aGlzLl9yZWRvVGlsZVBsYWNlbWVudChlKSxlLnJlZG9XaGVuRG9uZT0hMSl9cmV0dXJuIWUubG9hZGVkfHxlLnJlZG9pbmdQbGFjZW1lbnQ/dm9pZChlLnJlZG9XaGVuRG9uZT0hMCk6KGUucmVkb2luZ1BsYWNlbWVudD0hMCx2b2lkIHRoaXMuZGlzcGF0Y2hlci5zZW5kKFwicmVkbyBwbGFjZW1lbnRcIix7dWlkOmUudWlkLHNvdXJjZTp0aGlzLmlkLGFuZ2xlOnRoaXMubWFwLnRyYW5zZm9ybS5hbmdsZSxwaXRjaDp0aGlzLm1hcC50cmFuc2Zvcm0ucGl0Y2gsY29sbGlzaW9uRGVidWc6dGhpcy5tYXAuY29sbGlzaW9uRGVidWd9LGkuYmluZCh0aGlzKSxlLndvcmtlcklEKSl9fSk7XG59LHtcIi4uL3V0aWwvZXZlbnRlZFwiOjEwMCxcIi4uL3V0aWwvdXRpbFwiOjEwNixcIi4vc291cmNlXCI6NDMsXCIuL3RpbGVfY29vcmRcIjo0NX1dLDQ4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFZpZGVvU291cmNlKGUpe3RoaXMuY29vcmRpbmF0ZXM9ZS5jb29yZGluYXRlcyxhamF4LmdldFZpZGVvKGUudXJscyxmdW5jdGlvbihlLHQpe2lmKCFlKXt0aGlzLnZpZGVvPXQsdGhpcy52aWRlby5sb29wPSEwO3ZhciBpO3RoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihcInBsYXlpbmdcIixmdW5jdGlvbigpe2k9dGhpcy5tYXAuc3R5bGUuYW5pbWF0aW9uTG9vcC5zZXQoMS8wKSx0aGlzLm1hcC5fcmVyZW5kZXIoKX0uYmluZCh0aGlzKSksdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKFwicGF1c2VcIixmdW5jdGlvbigpe3RoaXMubWFwLnN0eWxlLmFuaW1hdGlvbkxvb3AuY2FuY2VsKGkpfS5iaW5kKHRoaXMpKSx0aGlzLl9sb2FkZWQ9ITAsdGhpcy5tYXAmJih0aGlzLnZpZGVvLnBsYXkoKSx0aGlzLmNyZWF0ZVRpbGUoKSx0aGlzLmZpcmUoXCJjaGFuZ2VcIikpfX0uYmluZCh0aGlzKSl9dmFyIHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKSxUaWxlPXJlcXVpcmUoXCIuL3RpbGVcIiksTG5nTGF0PXJlcXVpcmUoXCIuLi9nZW8vbG5nX2xhdFwiKSxQb2ludD1yZXF1aXJlKFwicG9pbnQtZ2VvbWV0cnlcIiksRXZlbnRlZD1yZXF1aXJlKFwiLi4vdXRpbC9ldmVudGVkXCIpLGFqYXg9cmVxdWlyZShcIi4uL3V0aWwvYWpheFwiKTttb2R1bGUuZXhwb3J0cz1WaWRlb1NvdXJjZSxWaWRlb1NvdXJjZS5wcm90b3R5cGU9dXRpbC5pbmhlcml0KEV2ZW50ZWQse3JvdW5kWm9vbTohMCxnZXRWaWRlbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvfSxvbkFkZDpmdW5jdGlvbihlKXt0aGlzLm1hcD1lLHRoaXMudmlkZW8mJih0aGlzLnZpZGVvLnBsYXkoKSx0aGlzLmNyZWF0ZVRpbGUoKSl9LGNyZWF0ZVRpbGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm1hcCx0PXRoaXMuY29vcmRpbmF0ZXMubWFwKGZ1bmN0aW9uKHQpe3ZhciBpPUxuZ0xhdC5jb252ZXJ0KHQpO3JldHVybiBlLnRyYW5zZm9ybS5sb2NhdGlvbkNvb3JkaW5hdGUoaSkuem9vbVRvKDApfSksaT11dGlsLmdldENvb3JkaW5hdGVzQ2VudGVyKHQpLHI9NDA5NixvPXQubWFwKGZ1bmN0aW9uKGUpe3ZhciB0PWUuem9vbVRvKGkuem9vbSk7cmV0dXJuIG5ldyBQb2ludChNYXRoLnJvdW5kKCh0LmNvbHVtbi1pLmNvbHVtbikqciksTWF0aC5yb3VuZCgodC5yb3ctaS5yb3cpKnIpKX0pLG49ZS5wYWludGVyLmdsLGE9MzI3NjcsdT1uZXcgSW50MTZBcnJheShbb1swXS54LG9bMF0ueSwwLDAsb1sxXS54LG9bMV0ueSxhLDAsb1szXS54LG9bM10ueSwwLGEsb1syXS54LG9bMl0ueSxhLGFdKTt0aGlzLnRpbGU9bmV3IFRpbGUsdGhpcy50aWxlLmJ1Y2tldHM9e30sdGhpcy50aWxlLmJvdW5kc0J1ZmZlcj1uLmNyZWF0ZUJ1ZmZlcigpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUix0aGlzLnRpbGUuYm91bmRzQnVmZmVyKSxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsdSxuLlNUQVRJQ19EUkFXKSx0aGlzLmNlbnRlcj1pfSxsb2FkZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlbyYmdGhpcy52aWRlby5yZWFkeVN0YXRlPj0yfSx1cGRhdGU6ZnVuY3Rpb24oKXt9LHJlbG9hZDpmdW5jdGlvbigpe30scmVuZGVyOmZ1bmN0aW9uKGUsdCl7aWYodGhpcy5fbG9hZGVkJiYhKHRoaXMudmlkZW8ucmVhZHlTdGF0ZTwyKSl7dmFyIGk9dGhpcy5jZW50ZXI7dGhpcy50aWxlLmNhbGN1bGF0ZU1hdHJpY2VzKGkuem9vbSxpLmNvbHVtbixpLnJvdyx0aGlzLm1hcC50cmFuc2Zvcm0sdCk7dmFyIHI9dC5nbDt0aGlzLnRpbGUudGV4dHVyZT8oci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsdGhpcy50aWxlLnRleHR1cmUpLHIudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfMkQsMCwwLDAsci5SR0JBLHIuVU5TSUdORURfQllURSx0aGlzLnZpZGVvKSk6KHRoaXMudGlsZS50ZXh0dXJlPXIuY3JlYXRlVGV4dHVyZSgpLHIuYmluZFRleHR1cmUoci5URVhUVVJFXzJELHRoaXMudGlsZS50ZXh0dXJlKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Msci5DTEFNUF9UT19FREdFKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Qsci5DTEFNUF9UT19FREdFKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NSU5fRklMVEVSLHIuTElORUFSKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NQUdfRklMVEVSLHIuTElORUFSKSxyLnRleEltYWdlMkQoci5URVhUVVJFXzJELDAsci5SR0JBLHIuUkdCQSxyLlVOU0lHTkVEX0JZVEUsdGhpcy52aWRlbykpLHQuZHJhd0xheWVycyhlLHRoaXMudGlsZS5wb3NNYXRyaXgsdGhpcy50aWxlKX19LGZlYXR1cmVzQXQ6ZnVuY3Rpb24oZSx0LGkpe3JldHVybiBpKG51bGwsW10pfSxmZWF0dXJlc0luOmZ1bmN0aW9uKGUsdCxpKXtyZXR1cm4gaShudWxsLFtdKX19KTtcbn0se1wiLi4vZ2VvL2xuZ19sYXRcIjoyMCxcIi4uL3V0aWwvYWpheFwiOjk0LFwiLi4vdXRpbC9ldmVudGVkXCI6MTAwLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi90aWxlXCI6NDQsXCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDQ5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFdvcmtlcihlKXt0aGlzLnNlbGY9ZSx0aGlzLmFjdG9yPW5ldyBBY3RvcihlLHRoaXMpLHRoaXMubG9hZGluZz17fSx0aGlzLmxvYWRlZD17fSx0aGlzLmxheWVycz1bXSx0aGlzLmdlb0pTT05JbmRleGVzPXt9fXZhciBBY3Rvcj1yZXF1aXJlKFwiLi4vdXRpbC9hY3RvclwiKSxXb3JrZXJUaWxlPXJlcXVpcmUoXCIuL3dvcmtlcl90aWxlXCIpLHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKSxhamF4PXJlcXVpcmUoXCIuLi91dGlsL2FqYXhcIiksdnQ9cmVxdWlyZShcInZlY3Rvci10aWxlXCIpLFByb3RvYnVmPXJlcXVpcmUoXCJwYmZcIiksVGlsZUNvb3JkPXJlcXVpcmUoXCIuL3RpbGVfY29vcmRcIiksZ2VvanNvbnZ0PXJlcXVpcmUoXCJnZW9qc29uLXZ0XCIpLEdlb0pTT05XcmFwcGVyPXJlcXVpcmUoXCIuL2dlb2pzb25fd3JhcHBlclwiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFdvcmtlcihlKX0sdXRpbC5leHRlbmQoV29ya2VyLnByb3RvdHlwZSx7XCJzZXQgbGF5ZXJzXCI6ZnVuY3Rpb24oZSl7dGhpcy5sYXllcnM9ZX0sXCJsb2FkIHRpbGVcIjpmdW5jdGlvbihlLHIpe2Z1bmN0aW9uIHQodCxzKXtpZihkZWxldGUgdGhpcy5sb2FkaW5nW29dW2ldLHQpcmV0dXJuIHIodCk7aWYoYS5kYXRhPW5ldyB2dC5WZWN0b3JUaWxlKG5ldyBQcm90b2J1ZihuZXcgVWludDhBcnJheShzKSkpLGUucGFyZW50SWQmJmEuZGF0YS5sYXllcnMpe3ZhciBsPXRoaXMuZ2V0Q2hpbGRQb3NpdGlvbihlLmNvb3JkLmlkLGUucGFyZW50SWQpO2EucGFyc2UoYS5kYXRhLHRoaXMubGF5ZXJzLHRoaXMuYWN0b3IscixsLmR6LGwueFBvcyxsLnlQb3MpfWVsc2UgYS5wYXJzZShhLmRhdGEsdGhpcy5sYXllcnMsdGhpcy5hY3RvcixyKTt0aGlzLmxvYWRlZFtvXT10aGlzLmxvYWRlZFtvXXx8e30sdGhpcy5sb2FkZWRbb11baV09YX12YXIgbz1lLnNvdXJjZSxpPWUudWlkO3RoaXMubG9hZGluZ1tvXXx8KHRoaXMubG9hZGluZ1tvXT17fSk7dmFyIGE9dGhpcy5sb2FkaW5nW29dW2ldPW5ldyBXb3JrZXJUaWxlKGUpO2EueGhyPWFqYXguZ2V0QXJyYXlCdWZmZXIoZS51cmwsdC5iaW5kKHRoaXMpKX0sXCJyZWxvYWQgdGlsZVwiOmZ1bmN0aW9uKGUscil7dmFyIHQ9dGhpcy5sb2FkZWRbZS5zb3VyY2VdLG89ZS51aWQ7aWYodCYmdFtvXSl7dmFyIGk9dFtvXTtpLnBhcnNlKGkuZGF0YSx0aGlzLmxheWVycyx0aGlzLmFjdG9yLHIpfX0sXCJhYm9ydCB0aWxlXCI6ZnVuY3Rpb24oZSl7dmFyIHI9dGhpcy5sb2FkaW5nW2Uuc291cmNlXSx0PWUudWlkO3ImJnJbdF0mJihyW3RdLnhoci5hYm9ydCgpLGRlbGV0ZSByW3RdKX0sXCJyZW1vdmUgdGlsZVwiOmZ1bmN0aW9uKGUpe3ZhciByPXRoaXMubG9hZGVkW2Uuc291cmNlXSx0PWUudWlkO3ImJnJbdF0mJmRlbGV0ZSByW3RdfSxcInJlZG8gcGxhY2VtZW50XCI6ZnVuY3Rpb24oZSxyKXt2YXIgdD10aGlzLmxvYWRlZFtlLnNvdXJjZV0sbz10aGlzLmxvYWRpbmdbZS5zb3VyY2VdLGk9ZS51aWQ7aWYodCYmdFtpXSl7dmFyIGE9dFtpXSxzPWEucmVkb1BsYWNlbWVudChlLmFuZ2xlLGUucGl0Y2gsZS5jb2xsaXNpb25EZWJ1Zyk7cy5yZXN1bHQmJnIobnVsbCxzLnJlc3VsdCxzLnRyYW5zZmVyYWJsZXMpfWVsc2UgbyYmb1tpXSYmKG9baV0uYW5nbGU9ZS5hbmdsZSl9LFwicGFyc2UgZ2VvanNvblwiOmZ1bmN0aW9uKGUscil7dmFyIHQ9ZnVuY3Rpb24odCxvKXtyZXR1cm4gdD9yKHQpOih0aGlzLmdlb0pTT05JbmRleGVzW2Uuc291cmNlXT1nZW9qc29udnQobyxlLmdlb2pzb25WdE9wdGlvbnMpLHZvaWQgcihudWxsKSl9LmJpbmQodGhpcyk7XCJzdHJpbmdcIj09dHlwZW9mIGUuZGF0YT9hamF4LmdldEpTT04oZS5kYXRhLHQpOnQobnVsbCxlLmRhdGEpfSxcImxvYWQgZ2VvanNvbiB0aWxlXCI6ZnVuY3Rpb24oZSxyKXt2YXIgdD1lLnNvdXJjZSxvPWUuY29vcmQsaT10aGlzLmdlb0pTT05JbmRleGVzW3RdLmdldFRpbGUoby56LG8ueCxvLnkpO2lmKCFpKXJldHVybiByKG51bGwsbnVsbCk7dmFyIGE9bmV3IFdvcmtlclRpbGUoZSk7YS5wYXJzZShuZXcgR2VvSlNPTldyYXBwZXIoaS5mZWF0dXJlcyksdGhpcy5sYXllcnMsdGhpcy5hY3RvcixyKSx0aGlzLmxvYWRlZFt0XT10aGlzLmxvYWRlZFt0XXx8e30sdGhpcy5sb2FkZWRbdF1bZS51aWRdPWF9LFwicXVlcnkgZmVhdHVyZXNcIjpmdW5jdGlvbihlLHIpe3ZhciB0PXRoaXMubG9hZGVkW2Uuc291cmNlXSYmdGhpcy5sb2FkZWRbZS5zb3VyY2VdW2UudWlkXTt0P3QuZmVhdHVyZVRyZWUucXVlcnkoZSxyKTpyKG51bGwsW10pfSxnZXRDaGlsZFBvc2l0aW9uOmZ1bmN0aW9uKGUscil7dmFyIHQ9VGlsZUNvb3JkLmZyb21JRChlKSxvPVRpbGVDb29yZC5mcm9tSUQociksaT10Lnotby56LGE9dC54JigxPDxpKS0xLHM9dC55JigxPDxpKS0xO3JldHVybntkejppLHhQb3M6YSx5UG9zOnN9fX0pO1xufSx7XCIuLi91dGlsL2FjdG9yXCI6OTMsXCIuLi91dGlsL2FqYXhcIjo5NCxcIi4uL3V0aWwvdXRpbFwiOjEwNixcIi4vZ2VvanNvbl93cmFwcGVyXCI6NDAsXCIuL3RpbGVfY29vcmRcIjo0NSxcIi4vd29ya2VyX3RpbGVcIjo1MCxcImdlb2pzb24tdnRcIjoxMTEsXCJwYmZcIjoxMzYsXCJ2ZWN0b3ItdGlsZVwiOjE0NH1dLDUwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFdvcmtlclRpbGUoZSl7dGhpcy5jb29yZD1lLmNvb3JkLHRoaXMudWlkPWUudWlkLHRoaXMuem9vbT1lLnpvb20sdGhpcy5tYXhab29tPWUubWF4Wm9vbSx0aGlzLnRpbGVTaXplPWUudGlsZVNpemUsdGhpcy5zb3VyY2U9ZS5zb3VyY2UsdGhpcy5vdmVyc2NhbGluZz1lLm92ZXJzY2FsaW5nLHRoaXMuYW5nbGU9ZS5hbmdsZSx0aGlzLnBpdGNoPWUucGl0Y2gsdGhpcy5jb2xsaXNpb25EZWJ1Zz1lLmNvbGxpc2lvbkRlYnVnLHRoaXMuc3RhY2tzPXt9fXZhciBGZWF0dXJlVHJlZT1yZXF1aXJlKFwiLi4vZGF0YS9mZWF0dXJlX3RyZWVcIiksQ29sbGlzaW9uVGlsZT1yZXF1aXJlKFwiLi4vc3ltYm9sL2NvbGxpc2lvbl90aWxlXCIpLEJ1ZmZlclNldD1yZXF1aXJlKFwiLi4vZGF0YS9idWZmZXIvYnVmZmVyX3NldFwiKSxjcmVhdGVCdWNrZXQ9cmVxdWlyZShcIi4uL2RhdGEvY3JlYXRlX2J1Y2tldFwiKTttb2R1bGUuZXhwb3J0cz1Xb3JrZXJUaWxlLFdvcmtlclRpbGUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGUsdCxyLGkscyxvLG4pe2Z1bmN0aW9uIGEoZSx0LHIsaSxzKXtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl7dmFyIG49ZS5mZWF0dXJlKG8pO24uZHo9cixuLnhQb3M9aSxuLnlQb3M9cztmb3IodmFyIGEgaW4gdCl7dmFyIGw9dFthXTtsLmZpbHRlcihuKSYmbC5mZWF0dXJlcy5wdXNoKG4pfX19ZnVuY3Rpb24gbChlKXtyZXR1cm4gZnVuY3Rpb24odCl7ZS5kZXBlbmRlbmNpZXNMb2FkZWQ9ITAsdSh2LGUsdCl9fWZ1bmN0aW9uIHUoZSx0LHIpe2lmKCghdC5nZXREZXBlbmRlbmNpZXN8fHQuZGVwZW5kZW5jaWVzTG9hZGVkKSYmKCF0Lm5lZWRzUGxhY2VtZW50fHx0LnByZXZpb3VzUGxhY2VkKSl7aWYoIXIpe3ZhciBpPURhdGUubm93KCk7dC5mZWF0dXJlcy5sZW5ndGgmJnQuYWRkRmVhdHVyZXMoZyk7dmFyIHM9RGF0ZS5ub3coKS1pO2lmKHQuaW50ZXJhY3RpdmUpZm9yKHZhciBvPTA7bzx0LmZlYXR1cmVzLmxlbmd0aDtvKyspe3ZhciBuPXQuZmVhdHVyZXNbb107ZS5mZWF0dXJlVHJlZS5pbnNlcnQobi5iYm94KCksdC5sYXllcnMsbil9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGYmJihzZWxmLmJ1Y2tldFN0YXRzPXNlbGYuYnVja2V0U3RhdHN8fHtfdG90YWw6MH0sc2VsZi5idWNrZXRTdGF0cy5fdG90YWwrPXMsc2VsZi5idWNrZXRTdGF0c1t0LmlkXT0oc2VsZi5idWNrZXRTdGF0c1t0LmlkXXx8MCkrcyksdC5mZWF0dXJlcz1udWxsfXJldHVybiB3LS0sdz92b2lkKHQubmV4dCYmKHQubmV4dC5wcmV2aW91c1BsYWNlZD0hMCx1KGUsdC5uZXh0KSkpOnZvaWQgZigpfX1mdW5jdGlvbiBmKCl7aWYodi5zdGF0dXM9XCJkb25lXCIsdi5yZWRvUGxhY2VtZW50QWZ0ZXJEb25lKXt2YXIgZT12LnJlZG9QbGFjZW1lbnQodi5hbmdsZSx2LnBpdGNoKS5yZXN1bHQ7bS5nbHlwaFZlcnRleD1lLmJ1ZmZlcnMuZ2x5cGhWZXJ0ZXgsbS5pY29uVmVydGV4PWUuYnVmZmVycy5pY29uVmVydGV4LG0uY29sbGlzaW9uQm94VmVydGV4PWUuYnVmZmVycy5jb2xsaXNpb25Cb3hWZXJ0ZXh9dmFyIHQ9W10scj17fTtmb3IoZCBpbiBtKXQucHVzaChtW2RdLmFycmF5KTtmb3IoZCBpbiBiKXJbZF09YltkXS5lbGVtZW50R3JvdXBzO2kobnVsbCx7ZWxlbWVudEdyb3VwczpyLGJ1ZmZlcnM6bSxleHRlbnQ6VCxidWNrZXRTdGF0czpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmLmJ1Y2tldFN0YXRzOm51bGx9LHQpfXRoaXMuc3RhdHVzPVwicGFyc2luZ1wiLHRoaXMuZmVhdHVyZVRyZWU9bmV3IEZlYXR1cmVUcmVlKHRoaXMuY29vcmQsdGhpcy5vdmVyc2NhbGluZyk7dmFyIGMsZCxoLHAsdj10aGlzLG09bmV3IEJ1ZmZlclNldCxnPW5ldyBDb2xsaXNpb25UaWxlKHRoaXMuYW5nbGUsdGhpcy5waXRjaCksYj17fSx4PXRoaXMuYnVja2V0c0luT3JkZXI9W10seT17fTtmb3IoYz0wO2M8dC5sZW5ndGg7YysrKWlmKGg9dFtjXSxoLnNvdXJjZT09PXRoaXMuc291cmNlJiYhaC5yZWYpe3ZhciBrPWgubWluem9vbTtpZighKGsmJnRoaXMuem9vbTxrJiZrPHRoaXMubWF4Wm9vbSkpe3ZhciBQPWgubWF4em9vbTtpZighKFAmJnRoaXMuem9vbT49UCkpe3ZhciBTPWgubGF5b3V0LnZpc2liaWxpdHk7aWYoXCJub25lXCIhPT1TKWlmKHA9Y3JlYXRlQnVja2V0KGgsbSx0aGlzLnpvb20sdGhpcy5vdmVyc2NhbGluZyx0aGlzLmNvbGxpc2lvbkRlYnVnKSxwLmxheWVycz1baC5pZF0sYltwLmlkXT1wLHgucHVzaChwKSxlLmxheWVycyl7dmFyIEQ9aFtcInNvdXJjZS1sYXllclwiXTt5W0RdfHwoeVtEXT17fSkseVtEXVtwLmlkXT1wfWVsc2UgeVtwLmlkXT1wfX19Zm9yKGM9MDtjPHQubGVuZ3RoO2MrKyloPXRbY10saC5zb3VyY2U9PT10aGlzLnNvdXJjZSYmaC5yZWYmJihwPWJbaC5yZWZdLHAmJnAubGF5ZXJzLnB1c2goaC5pZCkpO3ZhciBUPTQwOTY7aWYoZS5sYXllcnMpZm9yKGQgaW4geSloPWUubGF5ZXJzW2RdLGgmJihoLmV4dGVudCYmKFQ9aC5leHRlbnQpLGEoaCx5W2RdLHMsbyxuKSk7ZWxzZSBhKGUseSk7dmFyIHosdz14Lmxlbmd0aDtmb3IoYz14Lmxlbmd0aC0xO2M+PTA7Yy0tKXA9eFtjXSxwLm5lZWRzUGxhY2VtZW50JiYoej96Lm5leHQ9cDpwLnByZXZpb3VzUGxhY2VkPSEwLHo9cCkscC5nZXREZXBlbmRlbmNpZXMmJnAuZ2V0RGVwZW5kZW5jaWVzKHRoaXMscixsKHApKSxwLm5lZWRzUGxhY2VtZW50fHxwLmdldERlcGVuZGVuY2llc3x8dSh2LHApfSxXb3JrZXJUaWxlLnByb3RvdHlwZS5yZWRvUGxhY2VtZW50PWZ1bmN0aW9uKGUsdCxyKXtpZihcImRvbmVcIiE9PXRoaXMuc3RhdHVzKXJldHVybiB0aGlzLnJlZG9QbGFjZW1lbnRBZnRlckRvbmU9ITAsdGhpcy5hbmdsZT1lLHt9O2Zvcih2YXIgaT1uZXcgQnVmZmVyU2V0LHM9W10sbz17fSxuPW5ldyBDb2xsaXNpb25UaWxlKGUsdCksYT10aGlzLmJ1Y2tldHNJbk9yZGVyLGw9YS5sZW5ndGgtMTtsPj0wO2wtLSl7dmFyIHU9YVtsXTtcInN5bWJvbFwiPT09dS50eXBlJiYodS5wbGFjZUZlYXR1cmVzKG4saSxyKSxvW3UuaWRdPXUuZWxlbWVudEdyb3Vwcyl9Zm9yKHZhciBmIGluIGkpcy5wdXNoKGlbZl0uYXJyYXkpO3JldHVybntyZXN1bHQ6e2VsZW1lbnRHcm91cHM6byxidWZmZXJzOml9LHRyYW5zZmVyYWJsZXM6c319O1xufSx7XCIuLi9kYXRhL2J1ZmZlci9idWZmZXJfc2V0XCI6MixcIi4uL2RhdGEvY3JlYXRlX2J1Y2tldFwiOjEzLFwiLi4vZGF0YS9mZWF0dXJlX3RyZWVcIjoxNSxcIi4uL3N5bWJvbC9jb2xsaXNpb25fdGlsZVwiOjY4fV0sNTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQW5pbWF0aW9uTG9vcCgpe3RoaXMubj0wLHRoaXMudGltZXM9W119bW9kdWxlLmV4cG9ydHM9QW5pbWF0aW9uTG9vcCxBbmltYXRpb25Mb29wLnByb3RvdHlwZS5zdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZXM9dGhpcy50aW1lcy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQudGltZT49KG5ldyBEYXRlKS5nZXRUaW1lKCl9KSwhdGhpcy50aW1lcy5sZW5ndGh9LEFuaW1hdGlvbkxvb3AucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lcy5wdXNoKHtpZDp0aGlzLm4sdGltZTp0KyhuZXcgRGF0ZSkuZ2V0VGltZSgpfSksdGhpcy5uKyt9LEFuaW1hdGlvbkxvb3AucHJvdG90eXBlLmNhbmNlbD1mdW5jdGlvbih0KXt0aGlzLnRpbWVzPXRoaXMudGltZXMuZmlsdGVyKGZ1bmN0aW9uKGkpe3JldHVybiBpLmlkIT09dH0pfTtcbn0se31dLDUyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEltYWdlU3ByaXRlKHQpe3RoaXMuYmFzZT10LHRoaXMucmV0aW5hPWJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbz4xO3ZhciBpPXRoaXMucmV0aW5hP1wiQDJ4XCI6XCJcIjthamF4LmdldEpTT04obm9ybWFsaXplVVJMKHQsaSxcIi5qc29uXCIpLGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQ/dm9pZCB0aGlzLmZpcmUoXCJlcnJvclwiLHtlcnJvcjp0fSk6KHRoaXMuZGF0YT1pLHZvaWQodGhpcy5pbWcmJnRoaXMuZmlyZShcImxvYWRcIikpKX0uYmluZCh0aGlzKSksYWpheC5nZXRJbWFnZShub3JtYWxpemVVUkwodCxpLFwiLnBuZ1wiKSxmdW5jdGlvbih0LGkpe2lmKHQpcmV0dXJuIHZvaWQgdGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6dH0pO2Zvcih2YXIgZT1pLmdldERhdGEoKSxyPWkuZGF0YT1uZXcgVWludDhBcnJheShlLmxlbmd0aCksYT0wO2E8ZS5sZW5ndGg7YSs9NCl7dmFyIG89ZVthKzNdLzI1NTtyW2ErMF09ZVthKzBdKm8sclthKzFdPWVbYSsxXSpvLHJbYSsyXT1lW2ErMl0qbyxyW2ErM109ZVthKzNdfXRoaXMuaW1nPWksdGhpcy5kYXRhJiZ0aGlzLmZpcmUoXCJsb2FkXCIpfS5iaW5kKHRoaXMpKX1mdW5jdGlvbiBTcHJpdGVQb3NpdGlvbigpe312YXIgRXZlbnRlZD1yZXF1aXJlKFwiLi4vdXRpbC9ldmVudGVkXCIpLGFqYXg9cmVxdWlyZShcIi4uL3V0aWwvYWpheFwiKSxicm93c2VyPXJlcXVpcmUoXCIuLi91dGlsL2Jyb3dzZXJcIiksbm9ybWFsaXplVVJMPXJlcXVpcmUoXCIuLi91dGlsL21hcGJveFwiKS5ub3JtYWxpemVTcHJpdGVVUkw7bW9kdWxlLmV4cG9ydHM9SW1hZ2VTcHJpdGUsSW1hZ2VTcHJpdGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXZlbnRlZCksSW1hZ2VTcHJpdGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJhc2V9LEltYWdlU3ByaXRlLnByb3RvdHlwZS5sb2FkZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hKCF0aGlzLmRhdGF8fCF0aGlzLmltZyl9LEltYWdlU3ByaXRlLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXtpZihicm93c2VyLmRldmljZVBpeGVsUmF0aW8+MSE9PXRoaXMucmV0aW5hKXt2YXIgdD1uZXcgSW1hZ2VTcHJpdGUodGhpcy5iYXNlKTt0Lm9uKFwibG9hZFwiLGZ1bmN0aW9uKCl7dGhpcy5pbWc9dC5pbWcsdGhpcy5kYXRhPXQuZGF0YSx0aGlzLnJldGluYT10LnJldGluYX0uYmluZCh0aGlzKSl9fSxTcHJpdGVQb3NpdGlvbi5wcm90b3R5cGU9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MCxwaXhlbFJhdGlvOjEsc2RmOiExfSxJbWFnZVNwcml0ZS5wcm90b3R5cGUuZ2V0U3ByaXRlUG9zaXRpb249ZnVuY3Rpb24odCl7aWYoIXRoaXMubG9hZGVkKCkpcmV0dXJuIG5ldyBTcHJpdGVQb3NpdGlvbjt2YXIgaT10aGlzLmRhdGEmJnRoaXMuZGF0YVt0XTtyZXR1cm4gaSYmdGhpcy5pbWc/aTpuZXcgU3ByaXRlUG9zaXRpb259O1xufSx7XCIuLi91dGlsL2FqYXhcIjo5NCxcIi4uL3V0aWwvYnJvd3NlclwiOjk1LFwiLi4vdXRpbC9ldmVudGVkXCI6MTAwLFwiLi4vdXRpbC9tYXBib3hcIjoxMDN9XSw1MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgcmVmZXJlbmNlPXJlcXVpcmUoXCIuL3JlZmVyZW5jZVwiKTttb2R1bGUuZXhwb3J0cz17fSxyZWZlcmVuY2UubGF5b3V0LmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9ZnVuY3Rpb24oZSl7Zm9yKHZhciByIGluIGUpdGhpc1tyXT1lW3JdfSxvPXJlZmVyZW5jZVtlXTtmb3IodmFyIHQgaW4gbyl2b2lkIDAhPT1vW3RdW1wiZGVmYXVsdFwiXSYmKHIucHJvdG90eXBlW3RdPW9bdF1bXCJkZWZhdWx0XCJdKTttb2R1bGUuZXhwb3J0c1tlLnJlcGxhY2UoXCJsYXlvdXRfXCIsXCJcIildPXJ9KTtcbn0se1wiLi9yZWZlcmVuY2VcIjo1NX1dLDU0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciByZWZlcmVuY2U9cmVxdWlyZShcIi4vcmVmZXJlbmNlXCIpLHBhcnNlQ1NTQ29sb3I9cmVxdWlyZShcImNzc2NvbG9ycGFyc2VyXCIpLnBhcnNlQ1NTQ29sb3I7bW9kdWxlLmV4cG9ydHM9e30scmVmZXJlbmNlLnBhaW50LmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9ZnVuY3Rpb24oKXt9LG89cmVmZXJlbmNlW2VdO2Zvcih2YXIgcCBpbiBvKXt2YXIgdD1vW3BdLGE9dFtcImRlZmF1bHRcIl07dm9pZCAwIT09YSYmKFwiY29sb3JcIj09PXQudHlwZSYmKGE9cGFyc2VDU1NDb2xvcihhKSksci5wcm90b3R5cGVbcF09YSl9ci5wcm90b3R5cGUuaGlkZGVuPSExLG1vZHVsZS5leHBvcnRzW2UucmVwbGFjZShcInBhaW50X1wiLFwiXCIpXT1yfSk7XG59LHtcIi4vcmVmZXJlbmNlXCI6NTUsXCJjc3Njb2xvcnBhcnNlclwiOjEwN31dLDU1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO21vZHVsZS5leHBvcnRzPXJlcXVpcmUoXCJtYXBib3gtZ2wtc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0XCIpO1xufSx7XCJtYXBib3gtZ2wtc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0XCI6MTMxfV0sNTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3R5bGUoZSx0KXt0aGlzLmFuaW1hdGlvbkxvb3A9dHx8bmV3IEFuaW1hdGlvbkxvb3AsdGhpcy5kaXNwYXRjaGVyPW5ldyBEaXNwYXRjaGVyKE1hdGgubWF4KGJyb3dzZXIuaGFyZHdhcmVDb25jdXJyZW5jeS0xLDEpLHRoaXMpLHRoaXMuZ2x5cGhBdGxhcz1uZXcgR2x5cGhBdGxhcygxMDI0LDEwMjQpLHRoaXMuc3ByaXRlQXRsYXM9bmV3IFNwcml0ZUF0bGFzKDUxMiw1MTIpLHRoaXMuc3ByaXRlQXRsYXMucmVzaXplKGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyksdGhpcy5saW5lQXRsYXM9bmV3IExpbmVBdGxhcygyNTYsNTEyKSx0aGlzLl9sYXllcnM9e30sdGhpcy5fb3JkZXI9W10sdGhpcy5fZ3JvdXBzPVtdLHRoaXMuc291cmNlcz17fSx0aGlzLnpvb21IaXN0b3J5PXt9LHV0aWwuYmluZEFsbChbXCJfZm9yd2FyZFNvdXJjZUV2ZW50XCIsXCJfZm9yd2FyZFRpbGVFdmVudFwiLFwiX3JlZG9QbGFjZW1lbnRcIl0sdGhpcyk7dmFyIHI9ZnVuY3Rpb24oZSx0KXtpZihlKXJldHVybiB2b2lkIHRoaXMuZmlyZShcImVycm9yXCIse2Vycm9yOmV9KTt2YXIgcj12YWxpZGF0ZSh0KTtpZihyLmxlbmd0aClmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKyl0aGlzLmZpcmUoXCJlcnJvclwiLHtlcnJvcjpuZXcgRXJyb3IocltpXS5tZXNzYWdlKX0pO2Vsc2V7dGhpcy5fbG9hZGVkPSEwLHRoaXMuc3R5bGVzaGVldD10O3ZhciBzPXQuc291cmNlcztmb3IodmFyIG8gaW4gcyl0aGlzLmFkZFNvdXJjZShvLHNbb10pO3Quc3ByaXRlJiYodGhpcy5zcHJpdGU9bmV3IEltYWdlU3ByaXRlKHQuc3ByaXRlKSx0aGlzLnNwcml0ZS5vbihcImxvYWRcIix0aGlzLmZpcmUuYmluZCh0aGlzLFwiY2hhbmdlXCIpKSksdGhpcy5nbHlwaFNvdXJjZT1uZXcgR2x5cGhTb3VyY2UodC5nbHlwaHMsdGhpcy5nbHlwaEF0bGFzKSx0aGlzLl9yZXNvbHZlKCksdGhpcy5maXJlKFwibG9hZFwiKX19LmJpbmQodGhpcyk7XCJzdHJpbmdcIj09dHlwZW9mIGU/YWpheC5nZXRKU09OKG5vcm1hbGl6ZVVSTChlKSxyKTpicm93c2VyLmZyYW1lKHIuYmluZCh0aGlzLG51bGwsZSkpfXZhciBFdmVudGVkPXJlcXVpcmUoXCIuLi91dGlsL2V2ZW50ZWRcIiksc3R5bGVCYXRjaD1yZXF1aXJlKFwiLi9zdHlsZV9iYXRjaFwiKSxTdHlsZUxheWVyPXJlcXVpcmUoXCIuL3N0eWxlX2xheWVyXCIpLEltYWdlU3ByaXRlPXJlcXVpcmUoXCIuL2ltYWdlX3Nwcml0ZVwiKSxHbHlwaFNvdXJjZT1yZXF1aXJlKFwiLi4vc3ltYm9sL2dseXBoX3NvdXJjZVwiKSxHbHlwaEF0bGFzPXJlcXVpcmUoXCIuLi9zeW1ib2wvZ2x5cGhfYXRsYXNcIiksU3ByaXRlQXRsYXM9cmVxdWlyZShcIi4uL3N5bWJvbC9zcHJpdGVfYXRsYXNcIiksTGluZUF0bGFzPXJlcXVpcmUoXCIuLi9yZW5kZXIvbGluZV9hdGxhc1wiKSx1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksYWpheD1yZXF1aXJlKFwiLi4vdXRpbC9hamF4XCIpLG5vcm1hbGl6ZVVSTD1yZXF1aXJlKFwiLi4vdXRpbC9tYXBib3hcIikubm9ybWFsaXplU3R5bGVVUkwsYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpLERpc3BhdGNoZXI9cmVxdWlyZShcIi4uL3V0aWwvZGlzcGF0Y2hlclwiKSxBbmltYXRpb25Mb29wPXJlcXVpcmUoXCIuL2FuaW1hdGlvbl9sb29wXCIpLHZhbGlkYXRlPXJlcXVpcmUoXCJtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGUvbGF0ZXN0XCIpO21vZHVsZS5leHBvcnRzPVN0eWxlLFN0eWxlLnByb3RvdHlwZT11dGlsLmluaGVyaXQoRXZlbnRlZCx7X2xvYWRlZDohMSxsb2FkZWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5fbG9hZGVkKXJldHVybiExO2Zvcih2YXIgZSBpbiB0aGlzLnNvdXJjZXMpaWYoIXRoaXMuc291cmNlc1tlXS5sb2FkZWQoKSlyZXR1cm4hMTtyZXR1cm4gdGhpcy5zcHJpdGUmJiF0aGlzLnNwcml0ZS5sb2FkZWQoKT8hMTohMH0sX3Jlc29sdmU6ZnVuY3Rpb24oKXt2YXIgZSx0O3RoaXMuX2xheWVycz17fSx0aGlzLl9vcmRlcj1bXTtmb3IodmFyIHI9MDtyPHRoaXMuc3R5bGVzaGVldC5sYXllcnMubGVuZ3RoO3IrKyl0PW5ldyBTdHlsZUxheWVyKHRoaXMuc3R5bGVzaGVldC5sYXllcnNbcl0pLHRoaXMuX2xheWVyc1t0LmlkXT10LHRoaXMuX29yZGVyLnB1c2godC5pZCk7Zm9yKGUgaW4gdGhpcy5fbGF5ZXJzKXRoaXMuX2xheWVyc1tlXS5yZXNvbHZlTGF5b3V0KCk7Zm9yKGUgaW4gdGhpcy5fbGF5ZXJzKXRoaXMuX2xheWVyc1tlXS5yZXNvbHZlUmVmZXJlbmNlKHRoaXMuX2xheWVycyksdGhpcy5fbGF5ZXJzW2VdLnJlc29sdmVQYWludCgpO3RoaXMuX2dyb3VwTGF5ZXJzKCksdGhpcy5fYnJvYWRjYXN0TGF5ZXJzKCl9LF9ncm91cExheWVyczpmdW5jdGlvbigpe3ZhciBlO3RoaXMuX2dyb3Vwcz1bXTtmb3IodmFyIHQ9MDt0PHRoaXMuX29yZGVyLmxlbmd0aDsrK3Qpe3ZhciByPXRoaXMuX2xheWVyc1t0aGlzLl9vcmRlclt0XV07ZSYmci5zb3VyY2U9PT1lLnNvdXJjZXx8KGU9W10sZS5zb3VyY2U9ci5zb3VyY2UsdGhpcy5fZ3JvdXBzLnB1c2goZSkpLGUucHVzaChyKX19LF9icm9hZGNhc3RMYXllcnM6ZnVuY3Rpb24oKXt2YXIgZT1bXTtmb3IodmFyIHQgaW4gdGhpcy5fbGF5ZXJzKWUucHVzaCh0aGlzLl9sYXllcnNbdF0uanNvbigpKTt0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KFwic2V0IGxheWVyc1wiLGUpfSxfY2FzY2FkZTpmdW5jdGlvbihlLHQpe2lmKHRoaXMuX2xvYWRlZCl7dD10fHx7dHJhbnNpdGlvbjohMH07Zm9yKHZhciByIGluIHRoaXMuX2xheWVycyl0aGlzLl9sYXllcnNbcl0uY2FzY2FkZShlLHQsdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb258fHt9LHRoaXMuYW5pbWF0aW9uTG9vcCk7dGhpcy5maXJlKFwiY2hhbmdlXCIpfX0sX3JlY2FsY3VsYXRlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiB0aGlzLnNvdXJjZXMpdGhpcy5zb3VyY2VzW3RdLnVzZWQ9ITE7dGhpcy5fdXBkYXRlWm9vbUhpc3RvcnkoZSksdGhpcy5yYXN0ZXJGYWRlRHVyYXRpb249MzAwO2Zvcih0IGluIHRoaXMuX2xheWVycyl7dmFyIHI9dGhpcy5fbGF5ZXJzW3RdO3IucmVjYWxjdWxhdGUoZSx0aGlzLnpvb21IaXN0b3J5KSYmci5zb3VyY2UmJih0aGlzLnNvdXJjZXNbci5zb3VyY2VdLnVzZWQ9ITApfXZhciBpPTMwMDtNYXRoLmZsb29yKHRoaXMueikhPT1NYXRoLmZsb29yKGUpJiZ0aGlzLmFuaW1hdGlvbkxvb3Auc2V0KGkpLHRoaXMuej1lLHRoaXMuZmlyZShcInpvb21cIil9LF91cGRhdGVab29tSGlzdG9yeTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnpvb21IaXN0b3J5O3ZvaWQgMD09PXQubGFzdEludGVnZXJab29tJiYodC5sYXN0SW50ZWdlclpvb209TWF0aC5mbG9vcihlKSx0Lmxhc3RJbnRlZ2VyWm9vbVRpbWU9MCx0Lmxhc3Rab29tPWUpLE1hdGguZmxvb3IodC5sYXN0Wm9vbSk8TWF0aC5mbG9vcihlKT8odC5sYXN0SW50ZWdlclpvb209TWF0aC5mbG9vcihlKSx0Lmxhc3RJbnRlZ2VyWm9vbVRpbWU9RGF0ZS5ub3coKSk6TWF0aC5mbG9vcih0Lmxhc3Rab29tKT5NYXRoLmZsb29yKGUpJiYodC5sYXN0SW50ZWdlclpvb209TWF0aC5mbG9vcihlKzEpLHQubGFzdEludGVnZXJab29tVGltZT1EYXRlLm5vdygpKSx0Lmxhc3Rab29tPWV9LGJhdGNoOmZ1bmN0aW9uKGUpe3N0eWxlQmF0Y2godGhpcyxlKX0sYWRkU291cmNlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYmF0Y2goZnVuY3Rpb24ocil7ci5hZGRTb3VyY2UoZSx0KX0pLHRoaXN9LHJlbW92ZVNvdXJjZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5iYXRjaChmdW5jdGlvbih0KXt0LnJlbW92ZVNvdXJjZShlKX0pLHRoaXN9LGdldFNvdXJjZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zb3VyY2VzW2VdfSxhZGRMYXllcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmJhdGNoKGZ1bmN0aW9uKHIpe3IuYWRkTGF5ZXIoZSx0KX0pLHRoaXN9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJhdGNoKGZ1bmN0aW9uKHQpe3QucmVtb3ZlTGF5ZXIoZSl9KSx0aGlzfSxnZXRMYXllcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbGF5ZXJzW2VdfSxnZXRSZWZlcmVudExheWVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0TGF5ZXIoZSk7cmV0dXJuIHQucmVmJiYodD10aGlzLmdldExheWVyKHQucmVmKSksdH0sc2V0RmlsdGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYmF0Y2goZnVuY3Rpb24ocil7ci5zZXRGaWx0ZXIoZSx0KX0pLHRoaXN9LHNldExheWVyWm9vbVJhbmdlOmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdGhpcy5iYXRjaChmdW5jdGlvbihpKXtpLnNldExheWVyWm9vbVJhbmdlKGUsdCxyKX0pLHRoaXN9LGdldEZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRSZWZlcmVudExheWVyKGUpLmZpbHRlcn0sZ2V0TGF5b3V0UHJvcGVydHk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5nZXRSZWZlcmVudExheWVyKGUpLmdldExheW91dFByb3BlcnR5KHQpfSxnZXRQYWludFByb3BlcnR5OmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdGhpcy5nZXRMYXllcihlKS5nZXRQYWludFByb3BlcnR5KHQscil9LGZlYXR1cmVzQXQ6ZnVuY3Rpb24oZSx0LHIpe3ZhciBpPVtdLHM9bnVsbDt0LmxheWVyJiYodC5sYXllcklkcz1BcnJheS5pc0FycmF5KHQubGF5ZXIpP3QubGF5ZXI6W3QubGF5ZXJdKSx1dGlsLmFzeW5jRWFjaChPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpLGZ1bmN0aW9uKHIsbyl7dmFyIGE9dGhpcy5zb3VyY2VzW3JdO2EuZmVhdHVyZXNBdChlLHQsZnVuY3Rpb24oZSx0KXt0JiYoaT1pLmNvbmNhdCh0KSksZSYmKHM9ZSksbygpfSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXtyZXR1cm4gcz9yKHMpOnZvaWQgcihudWxsLGkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT10aGlzLl9sYXllcnNbZS5sYXllcl19LmJpbmQodGhpcykpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5sYXllcj10aGlzLl9sYXllcnNbZS5sYXllcl0uanNvbigpLGV9LmJpbmQodGhpcykpKX0uYmluZCh0aGlzKSl9LGZlYXR1cmVzSW46ZnVuY3Rpb24oZSx0LHIpe3ZhciBpPVtdLHM9bnVsbDt0LmxheWVyJiYodC5sYXllcj17aWQ6dC5sYXllcn0pLHV0aWwuYXN5bmNFYWNoKE9iamVjdC5rZXlzKHRoaXMuc291cmNlcyksZnVuY3Rpb24ocixvKXt2YXIgYT10aGlzLnNvdXJjZXNbcl07YS5mZWF0dXJlc0luKGUsdCxmdW5jdGlvbihlLHQpe3QmJihpPWkuY29uY2F0KHQpKSxlJiYocz1lKSxvKCl9KX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3JldHVybiBzP3Iocyk6dm9pZCByKG51bGwsaS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX2xheWVyc1tlLmxheWVyXX0uYmluZCh0aGlzKSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmxheWVyPXRoaXMuX2xheWVyc1tlLmxheWVyXS5qc29uKCksZX0uYmluZCh0aGlzKSkpfS5iaW5kKHRoaXMpKX0sX3JlbW92ZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hlci5yZW1vdmUoKX0sX3JlbG9hZFNvdXJjZTpmdW5jdGlvbihlKXt0aGlzLnNvdXJjZXNbZV0ucmVsb2FkKCl9LF91cGRhdGVTb3VyY2VzOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiB0aGlzLnNvdXJjZXMpdGhpcy5zb3VyY2VzW3RdLnVwZGF0ZShlKX0sX3JlZG9QbGFjZW1lbnQ6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5zb3VyY2VzKXRoaXMuc291cmNlc1tlXS5yZWRvUGxhY2VtZW50JiZ0aGlzLnNvdXJjZXNbZV0ucmVkb1BsYWNlbWVudCgpfSxfZm9yd2FyZFNvdXJjZUV2ZW50OmZ1bmN0aW9uKGUpe3RoaXMuZmlyZShcInNvdXJjZS5cIitlLnR5cGUsdXRpbC5leHRlbmQoe3NvdXJjZTplLnRhcmdldH0sZSkpfSxfZm9yd2FyZFRpbGVFdmVudDpmdW5jdGlvbihlKXt0aGlzLmZpcmUoZS50eXBlLHV0aWwuZXh0ZW5kKHtzb3VyY2U6ZS50YXJnZXR9LGUpKX0sXCJnZXQgc3ByaXRlIGpzb25cIjpmdW5jdGlvbihlLHQpe3ZhciByPXRoaXMuc3ByaXRlO3IubG9hZGVkKCk/dChudWxsLHtzcHJpdGU6ci5kYXRhLHJldGluYTpyLnJldGluYX0pOnIub24oXCJsb2FkXCIsZnVuY3Rpb24oKXt0KG51bGwse3Nwcml0ZTpyLmRhdGEscmV0aW5hOnIucmV0aW5hfSl9KX0sXCJnZXQgaWNvbnNcIjpmdW5jdGlvbihlLHQpe3ZhciByPXRoaXMuc3ByaXRlLGk9dGhpcy5zcHJpdGVBdGxhcztyLmxvYWRlZCgpPyhpLnNldFNwcml0ZShyKSxpLmFkZEljb25zKGUuaWNvbnMsdCkpOnIub24oXCJsb2FkXCIsZnVuY3Rpb24oKXtpLnNldFNwcml0ZShyKSxpLmFkZEljb25zKGUuaWNvbnMsdCl9KX0sXCJnZXQgZ2x5cGhzXCI6ZnVuY3Rpb24oZSx0KXt0aGlzLmdseXBoU291cmNlLmdldFNpbXBsZUdseXBocyhlLmZvbnRzdGFjayxlLmNvZGVwb2ludHMsZS51aWQsdCl9fSk7XG59LHtcIi4uL3JlbmRlci9saW5lX2F0bGFzXCI6MzYsXCIuLi9zeW1ib2wvZ2x5cGhfYXRsYXNcIjo3MCxcIi4uL3N5bWJvbC9nbHlwaF9zb3VyY2VcIjo3MSxcIi4uL3N5bWJvbC9zcHJpdGVfYXRsYXNcIjo3NyxcIi4uL3V0aWwvYWpheFwiOjk0LFwiLi4vdXRpbC9icm93c2VyXCI6OTUsXCIuLi91dGlsL2Rpc3BhdGNoZXJcIjo5NyxcIi4uL3V0aWwvZXZlbnRlZFwiOjEwMCxcIi4uL3V0aWwvbWFwYm94XCI6MTAzLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9hbmltYXRpb25fbG9vcFwiOjUxLFwiLi9pbWFnZV9zcHJpdGVcIjo1MixcIi4vc3R5bGVfYmF0Y2hcIjo1NyxcIi4vc3R5bGVfbGF5ZXJcIjo2MCxcIm1hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZS9sYXRlc3RcIjoxMjl9XSw1NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBzdHlsZUJhdGNoKGUsdCl7aWYoIWUuX2xvYWRlZCl0aHJvdyBuZXcgRXJyb3IoXCJTdHlsZSBpcyBub3QgZG9uZSBsb2FkaW5nXCIpO3ZhciByPU9iamVjdC5jcmVhdGUoc3R5bGVCYXRjaC5wcm90b3R5cGUpO3IuX3N0eWxlPWUsci5fZ3JvdXBMYXllcnM9ITEsci5fYnJvYWRjYXN0TGF5ZXJzPSExLHIuX3JlbG9hZFNvdXJjZXM9e30sci5fZXZlbnRzPVtdLHIuX2NoYW5nZT0hMSx0KHIpLHIuX2dyb3VwTGF5ZXJzJiZyLl9zdHlsZS5fZ3JvdXBMYXllcnMoKSxyLl9icm9hZGNhc3RMYXllcnMmJnIuX3N0eWxlLl9icm9hZGNhc3RMYXllcnMoKSxPYmplY3Qua2V5cyhyLl9yZWxvYWRTb3VyY2VzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IuX3N0eWxlLl9yZWxvYWRTb3VyY2UoZSl9KSxyLl9ldmVudHMuZm9yRWFjaChmdW5jdGlvbihlKXtyLl9zdHlsZS5maXJlLmFwcGx5KHIuX3N0eWxlLGUpfSksci5fY2hhbmdlJiZyLl9zdHlsZS5maXJlKFwiY2hhbmdlXCIpfXZhciBTb3VyY2U9cmVxdWlyZShcIi4uL3NvdXJjZS9zb3VyY2VcIiksU3R5bGVMYXllcj1yZXF1aXJlKFwiLi9zdHlsZV9sYXllclwiKTtzdHlsZUJhdGNoLnByb3RvdHlwZT17YWRkTGF5ZXI6ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDAhPT10aGlzLl9zdHlsZS5fbGF5ZXJzW2UuaWRdKXRocm93IG5ldyBFcnJvcihcIlRoZXJlIGlzIGFscmVhZHkgYSBsYXllciB3aXRoIHRoaXMgSURcIik7cmV0dXJuIGUgaW5zdGFuY2VvZiBTdHlsZUxheWVyfHwoZT1uZXcgU3R5bGVMYXllcihlKSksdGhpcy5fc3R5bGUuX2xheWVyc1tlLmlkXT1lLHRoaXMuX3N0eWxlLl9vcmRlci5zcGxpY2UodD90aGlzLl9zdHlsZS5fb3JkZXIuaW5kZXhPZih0KToxLzAsMCxlLmlkKSxlLnJlc29sdmVMYXlvdXQoKSxlLnJlc29sdmVSZWZlcmVuY2UodGhpcy5fc3R5bGUuX2xheWVycyksZS5yZXNvbHZlUGFpbnQoKSx0aGlzLl9ncm91cExheWVycz0hMCx0aGlzLl9icm9hZGNhc3RMYXllcnM9ITAsZS5zb3VyY2UmJih0aGlzLl9yZWxvYWRTb3VyY2VzW2Uuc291cmNlXT0hMCksdGhpcy5fZXZlbnRzLnB1c2goW1wibGF5ZXIuYWRkXCIse2xheWVyOmV9XSksdGhpcy5fY2hhbmdlPSEwLHRoaXN9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3N0eWxlLl9sYXllcnNbZV07aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBsYXllciB3aXRoIHRoaXMgSURcIik7Zm9yKHZhciByIGluIHRoaXMuX3N0eWxlLl9sYXllcnMpdGhpcy5fc3R5bGUuX2xheWVyc1tyXS5yZWY9PT1lJiZ0aGlzLnJlbW92ZUxheWVyKHIpO3JldHVybiBkZWxldGUgdGhpcy5fc3R5bGUuX2xheWVyc1tlXSx0aGlzLl9zdHlsZS5fb3JkZXIuc3BsaWNlKHRoaXMuX3N0eWxlLl9vcmRlci5pbmRleE9mKGUpLDEpLHRoaXMuX2dyb3VwTGF5ZXJzPSEwLHRoaXMuX2Jyb2FkY2FzdExheWVycz0hMCx0aGlzLl9ldmVudHMucHVzaChbXCJsYXllci5yZW1vdmVcIix7bGF5ZXI6dH1dKSx0aGlzLl9jaGFuZ2U9ITAsdGhpc30sc2V0UGFpbnRQcm9wZXJ0eTpmdW5jdGlvbihlLHQscixzKXtyZXR1cm4gdGhpcy5fc3R5bGUuZ2V0TGF5ZXIoZSkuc2V0UGFpbnRQcm9wZXJ0eSh0LHIscyksdGhpcy5fY2hhbmdlPSEwLHRoaXN9LHNldExheW91dFByb3BlcnR5OmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT10aGlzLl9zdHlsZS5nZXRSZWZlcmVudExheWVyKGUpLGUuc2V0TGF5b3V0UHJvcGVydHkodCxyKSx0aGlzLl9icm9hZGNhc3RMYXllcnM9ITAsZS5zb3VyY2UmJih0aGlzLl9yZWxvYWRTb3VyY2VzW2Uuc291cmNlXT0hMCksdGhpcy5fY2hhbmdlPSEwLHRoaXN9LHNldEZpbHRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBlPXRoaXMuX3N0eWxlLmdldFJlZmVyZW50TGF5ZXIoZSksZS5maWx0ZXI9dCx0aGlzLl9icm9hZGNhc3RMYXllcnM9ITAsZS5zb3VyY2UmJih0aGlzLl9yZWxvYWRTb3VyY2VzW2Uuc291cmNlXT0hMCksdGhpcy5fY2hhbmdlPSEwLHRoaXN9LHNldExheWVyWm9vbVJhbmdlOmZ1bmN0aW9uKGUsdCxyKXt2YXIgcz10aGlzLl9zdHlsZS5nZXRSZWZlcmVudExheWVyKGUpO3JldHVybiBudWxsIT10JiYocy5taW56b29tPXQpLG51bGwhPXImJihzLm1heHpvb209ciksdGhpcy5fYnJvYWRjYXN0TGF5ZXJzPSEwLHMuc291cmNlJiYodGhpcy5fcmVsb2FkU291cmNlc1tzLnNvdXJjZV09ITApLHRoaXMuX2NoYW5nZT0hMCx0aGlzfSxhZGRTb3VyY2U6ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5fc3R5bGUuX2xvYWRlZCl0aHJvdyBuZXcgRXJyb3IoXCJTdHlsZSBpcyBub3QgZG9uZSBsb2FkaW5nXCIpO2lmKHZvaWQgMCE9PXRoaXMuX3N0eWxlLnNvdXJjZXNbZV0pdGhyb3cgbmV3IEVycm9yKFwiVGhlcmUgaXMgYWxyZWFkeSBhIHNvdXJjZSB3aXRoIHRoaXMgSURcIik7cmV0dXJuIHQ9U291cmNlLmNyZWF0ZSh0KSx0aGlzLl9zdHlsZS5zb3VyY2VzW2VdPXQsdC5pZD1lLHQuc3R5bGU9dGhpcy5fc3R5bGUsdC5kaXNwYXRjaGVyPXRoaXMuX3N0eWxlLmRpc3BhdGNoZXIsdC5nbHlwaEF0bGFzPXRoaXMuX3N0eWxlLmdseXBoQXRsYXMsdC5vbihcImxvYWRcIix0aGlzLl9zdHlsZS5fZm9yd2FyZFNvdXJjZUV2ZW50KS5vbihcImVycm9yXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudCkub24oXCJjaGFuZ2VcIix0aGlzLl9zdHlsZS5fZm9yd2FyZFNvdXJjZUV2ZW50KS5vbihcInRpbGUuYWRkXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpLm9uKFwidGlsZS5sb2FkXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpLm9uKFwidGlsZS5lcnJvclwiLHRoaXMuX3N0eWxlLl9mb3J3YXJkVGlsZUV2ZW50KS5vbihcInRpbGUucmVtb3ZlXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpLm9uKFwidGlsZS5zdGF0c1wiLHRoaXMuX3N0eWxlLl9mb3J3YXJkVGlsZUV2ZW50KSx0aGlzLl9ldmVudHMucHVzaChbXCJzb3VyY2UuYWRkXCIse3NvdXJjZTp0fV0pLHRoaXMuX2NoYW5nZT0hMCx0aGlzfSxyZW1vdmVTb3VyY2U6ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09dGhpcy5fc3R5bGUuc291cmNlc1tlXSl0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBzb3VyY2Ugd2l0aCB0aGlzIElEXCIpO3ZhciB0PXRoaXMuX3N0eWxlLnNvdXJjZXNbZV07cmV0dXJuIGRlbGV0ZSB0aGlzLl9zdHlsZS5zb3VyY2VzW2VdLHQub2ZmKFwibG9hZFwiLHRoaXMuX3N0eWxlLl9mb3J3YXJkU291cmNlRXZlbnQpLm9mZihcImVycm9yXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudCkub2ZmKFwiY2hhbmdlXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudCkub2ZmKFwidGlsZS5hZGRcIix0aGlzLl9zdHlsZS5fZm9yd2FyZFRpbGVFdmVudCkub2ZmKFwidGlsZS5sb2FkXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpLm9mZihcInRpbGUuZXJyb3JcIix0aGlzLl9zdHlsZS5fZm9yd2FyZFRpbGVFdmVudCkub2ZmKFwidGlsZS5yZW1vdmVcIix0aGlzLl9zdHlsZS5fZm9yd2FyZFRpbGVFdmVudCkub2ZmKFwidGlsZS5zdGF0c1wiLHRoaXMuX3N0eWxlLl9mb3J3YXJkVGlsZUV2ZW50KSx0aGlzLl9ldmVudHMucHVzaChbXCJzb3VyY2UucmVtb3ZlXCIse3NvdXJjZTp0fV0pLHRoaXMuX2NoYW5nZT0hMCx0aGlzfX0sbW9kdWxlLmV4cG9ydHM9c3R5bGVCYXRjaDtcbn0se1wiLi4vc291cmNlL3NvdXJjZVwiOjQzLFwiLi9zdHlsZV9sYXllclwiOjYwfV0sNTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3R5bGVEZWNsYXJhdGlvbih0LHIpe3RoaXMudHlwZT10LnR5cGUsdGhpcy50cmFuc2l0aW9uYWJsZT10LnRyYW5zaXRpb24sbnVsbD09ciYmKHI9dFtcImRlZmF1bHRcIl0pLHRoaXMuanNvbj1KU09OLnN0cmluZ2lmeShyKSxcImNvbG9yXCI9PT10aGlzLnR5cGU/dGhpcy52YWx1ZT1wYXJzZUNvbG9yKHIpOnRoaXMudmFsdWU9cixcImludGVycG9sYXRlZFwiPT09dFtcImZ1bmN0aW9uXCJdP3RoaXMuY2FsY3VsYXRlPU1hcGJveEdMRnVuY3Rpb24uaW50ZXJwb2xhdGVkKHRoaXMudmFsdWUpOih0aGlzLmNhbGN1bGF0ZT1NYXBib3hHTEZ1bmN0aW9uW1wicGllY2V3aXNlLWNvbnN0YW50XCJdKHRoaXMudmFsdWUpLHQudHJhbnNpdGlvbiYmKHRoaXMuY2FsY3VsYXRlPXRyYW5zaXRpb25lZCh0aGlzLmNhbGN1bGF0ZSkpKX1mdW5jdGlvbiB0cmFuc2l0aW9uZWQodCl7cmV0dXJuIGZ1bmN0aW9uKHIsbyxlKXt2YXIgbixpLGEsbD1yJTEscz1NYXRoLm1pbigoRGF0ZS5ub3coKS1vLmxhc3RJbnRlZ2VyWm9vbVRpbWUpL2UsMSksYz0xLHU9MTtyZXR1cm4gcj5vLmxhc3RJbnRlZ2VyWm9vbT8obj1sKygxLWwpKnMsYyo9MixpPXQoci0xKSxhPXQocikpOihuPTEtKDEtcykqbCxhPXQociksaT10KHIrMSksYy89Mikse2Zyb206aSxmcm9tU2NhbGU6Yyx0bzphLHRvU2NhbGU6dSx0Om59fX1mdW5jdGlvbiBwYXJzZUNvbG9yKHQpe2lmKGNvbG9yQ2FjaGVbdF0pcmV0dXJuIGNvbG9yQ2FjaGVbdF07aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdDtpZih0LnN0b3BzKXJldHVybiB1dGlsLmV4dGVuZCh7fSx0LHtzdG9wczp0LnN0b3BzLm1hcChmdW5jdGlvbih0KXtyZXR1cm5bdFswXSxwYXJzZUNvbG9yKHRbMV0pXX0pfSk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe3ZhciByPWNvbG9yRG93bmdyYWRlKHBhcnNlQ1NTQ29sb3IodCkpO3JldHVybiBjb2xvckNhY2hlW3RdPXIscn10aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbG9yIFwiK3QpfWZ1bmN0aW9uIGNvbG9yRG93bmdyYWRlKHQpe3JldHVyblt0WzBdLzI1NSx0WzFdLzI1NSx0WzJdLzI1NSx0WzNdLzFdfXZhciBwYXJzZUNTU0NvbG9yPXJlcXVpcmUoXCJjc3Njb2xvcnBhcnNlclwiKS5wYXJzZUNTU0NvbG9yLE1hcGJveEdMRnVuY3Rpb249cmVxdWlyZShcIm1hcGJveC1nbC1mdW5jdGlvblwiKSx1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIik7bW9kdWxlLmV4cG9ydHM9U3R5bGVEZWNsYXJhdGlvbjt2YXIgY29sb3JDYWNoZT17fTtcbn0se1wiLi4vdXRpbC91dGlsXCI6MTA2LFwiY3NzY29sb3JwYXJzZXJcIjoxMDcsXCJtYXBib3gtZ2wtZnVuY3Rpb25cIjoxMjh9XSw1OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBtYWtlQ29uc3RydWN0b3IodCl7ZnVuY3Rpb24gZSh0KXt0aGlzLl92YWx1ZXM9e30sdGhpcy5fdHJhbnNpdGlvbnM9e307Zm9yKHZhciBlIGluIHQpdGhpc1tlXT10W2VdfXJldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciByPXRbbl07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLG4se3NldDpmdW5jdGlvbih0KXt0aGlzLl92YWx1ZXNbbl09bmV3IFN0eWxlRGVjbGFyYXRpb24ocix0KX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZhbHVlc1tuXS52YWx1ZX19KSxyLnRyYW5zaXRpb24mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxuK1wiLXRyYW5zaXRpb25cIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3RyYW5zaXRpb25zW25dPXR9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90cmFuc2l0aW9uc1tuXX19KX0pLGUucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl92YWx1ZXN9LGUucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl90cmFuc2l0aW9uc1t0XXx8e307cmV0dXJue2R1cmF0aW9uOnV0aWwuY29hbGVzY2Uobi5kdXJhdGlvbixlLmR1cmF0aW9uLDMwMCksZGVsYXk6dXRpbC5jb2FsZXNjZShuLmRlbGF5LGUuZGVsYXksMCl9fSxlLnByb3RvdHlwZS5qc29uPWZ1bmN0aW9uKCl7dmFyIHQ9e307Zm9yKHZhciBlIGluIHRoaXMuX3ZhbHVlcyl0W2VdPXRoaXMuX3ZhbHVlc1tlXS52YWx1ZTtmb3IodmFyIG4gaW4gdGhpcy5fdHJhbnNpdGlvbnMpdFtuK1wiLXRyYW5zaXRpb25cIl09dGhpcy5fdHJhbnNpdGlvbnNbZV07cmV0dXJuIHR9LGV9dmFyIHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKSxyZWZlcmVuY2U9cmVxdWlyZShcIi4vcmVmZXJlbmNlXCIpLFN0eWxlRGVjbGFyYXRpb249cmVxdWlyZShcIi4vc3R5bGVfZGVjbGFyYXRpb25cIiksbG9va3VwPXtwYWludDp7fSxsYXlvdXQ6e319O3JlZmVyZW5jZS5sYXllci50eXBlLnZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe2xvb2t1cC5wYWludFt0XT1tYWtlQ29uc3RydWN0b3IocmVmZXJlbmNlW1wicGFpbnRfXCIrdF0pLGxvb2t1cC5sYXlvdXRbdF09bWFrZUNvbnN0cnVjdG9yKHJlZmVyZW5jZVtcImxheW91dF9cIit0XSl9KSxtb2R1bGUuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5ldyBsb29rdXBbdF1bZV0obil9O1xufSx7XCIuLi91dGlsL3V0aWxcIjoxMDYsXCIuL3JlZmVyZW5jZVwiOjU1LFwiLi9zdHlsZV9kZWNsYXJhdGlvblwiOjU4fV0sNjA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3R5bGVMYXllcih0KXt0aGlzLl9sYXllcj10LHRoaXMuaWQ9dC5pZCx0aGlzLnJlZj10LnJlZix0aGlzLl9yZXNvbHZlZD17fSx0aGlzLl9jYXNjYWRlZD17fSx0aGlzLmFzc2lnbih0KX1mdW5jdGlvbiBwcmVtdWx0aXBseUxheWVyKHQsaSl7dmFyIGU9aStcIi1jb2xvclwiLGE9aStcIi1oYWxvLWNvbG9yXCIsbz1pK1wiLW91dGxpbmUtY29sb3JcIixyPXRbZV0scz10W2FdLG49dFtvXSxsPXRbaStcIi1vcGFjaXR5XCJdLHk9ciYmbCpyWzNdLHU9cyYmbCpzWzNdLGg9biYmbCpuWzNdO3ZvaWQgMCE9PXkmJjE+eSYmKHRbZV09dXRpbC5wcmVtdWx0aXBseShbclswXSxyWzFdLHJbMl0seV0pKSx2b2lkIDAhPT11JiYxPnUmJih0W2FdPXV0aWwucHJlbXVsdGlwbHkoW3NbMF0sc1sxXSxzWzJdLHVdKSksdm9pZCAwIT09aCYmMT5oJiYodFtvXT11dGlsLnByZW11bHRpcGx5KFtuWzBdLG5bMV0sblsyXSxoXSkpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksU3R5bGVUcmFuc2l0aW9uPXJlcXVpcmUoXCIuL3N0eWxlX3RyYW5zaXRpb25cIiksU3R5bGVEZWNsYXJhdGlvblNldD1yZXF1aXJlKFwiLi9zdHlsZV9kZWNsYXJhdGlvbl9zZXRcIiksTGF5b3V0UHJvcGVydGllcz1yZXF1aXJlKFwiLi9sYXlvdXRfcHJvcGVydGllc1wiKSxQYWludFByb3BlcnRpZXM9cmVxdWlyZShcIi4vcGFpbnRfcHJvcGVydGllc1wiKTttb2R1bGUuZXhwb3J0cz1TdHlsZUxheWVyLFN0eWxlTGF5ZXIucHJvdG90eXBlPXtyZXNvbHZlTGF5b3V0OmZ1bmN0aW9uKCl7dGhpcy5yZWZ8fCh0aGlzLmxheW91dD1uZXcgTGF5b3V0UHJvcGVydGllc1t0aGlzLnR5cGVdKHRoaXMuX2xheWVyLmxheW91dCksXCJsaW5lXCI9PT10aGlzLmxheW91dFtcInN5bWJvbC1wbGFjZW1lbnRcIl0mJih0aGlzLmxheW91dC5oYXNPd25Qcm9wZXJ0eShcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCIpfHwodGhpcy5sYXlvdXRbXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiXT1cIm1hcFwiKSx0aGlzLmxheW91dC5oYXNPd25Qcm9wZXJ0eShcImljb24tcm90YXRpb24tYWxpZ25tZW50XCIpfHwodGhpcy5sYXlvdXRbXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiXT1cIm1hcFwiKSx0aGlzLmxheW91dFtcInN5bWJvbC1hdm9pZC1lZGdlc1wiXT0hMCkpfSxzZXRMYXlvdXRQcm9wZXJ0eTpmdW5jdGlvbih0LGkpe251bGw9PWk/ZGVsZXRlIHRoaXMubGF5b3V0W3RdOnRoaXMubGF5b3V0W3RdPWl9LGdldExheW91dFByb3BlcnR5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxheW91dFt0XX0scmVzb2x2ZVJlZmVyZW5jZTpmdW5jdGlvbih0KXt0aGlzLnJlZiYmdGhpcy5hc3NpZ24odFt0aGlzLnJlZl0pfSxyZXNvbHZlUGFpbnQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fbGF5ZXIpe3ZhciBpPXQubWF0Y2goL15wYWludCg/OlxcLiguKikpPyQvKTtpJiYodGhpcy5fcmVzb2x2ZWRbaVsxXXx8XCJcIl09bmV3IFN0eWxlRGVjbGFyYXRpb25TZXQoXCJwYWludFwiLHRoaXMudHlwZSx0aGlzLl9sYXllclt0XSkpfX0sc2V0UGFpbnRQcm9wZXJ0eTpmdW5jdGlvbih0LGksZSl7dmFyIGE9dGhpcy5fcmVzb2x2ZWRbZXx8XCJcIl07YXx8KGE9dGhpcy5fcmVzb2x2ZWRbZXx8XCJcIl09bmV3IFN0eWxlRGVjbGFyYXRpb25TZXQoXCJwYWludFwiLHRoaXMudHlwZSx7fSkpLGFbdF09aX0sZ2V0UGFpbnRQcm9wZXJ0eTpmdW5jdGlvbih0LGkpe3ZhciBlPXRoaXMuX3Jlc29sdmVkW2l8fFwiXCJdO2lmKGUpcmV0dXJuIGVbdF19LGNhc2NhZGU6ZnVuY3Rpb24odCxpLGUsYSl7Zm9yKHZhciBvIGluIHRoaXMuX3Jlc29sdmVkKWlmKFwiXCI9PT1vfHx0W29dKXt2YXIgcj10aGlzLl9yZXNvbHZlZFtvXSxzPXIudmFsdWVzKCk7Zm9yKHZhciBuIGluIHMpe3ZhciBsPXNbbl0seT1pLnRyYW5zaXRpb24/dGhpcy5fY2FzY2FkZWRbbl06dm9pZCAwO2lmKCF5fHx5LmRlY2xhcmF0aW9uLmpzb24hPT1sLmpzb24pe3ZhciB1PXIudHJhbnNpdGlvbihuLGUpLGg9dGhpcy5fY2FzY2FkZWRbbl09bmV3IFN0eWxlVHJhbnNpdGlvbihsLHksdSk7aC5pbnN0YW50KCl8fChoLmxvb3BJRD1hLnNldChoLmVuZFRpbWUtKG5ldyBEYXRlKS5nZXRUaW1lKCkpKSx5JiZhLmNhbmNlbCh5Lmxvb3BJRCl9fX1pZihcInN5bWJvbFwiPT09dGhpcy50eXBlKXt2YXIgYz1uZXcgU3R5bGVEZWNsYXJhdGlvblNldChcImxheW91dFwiLHRoaXMudHlwZSx0aGlzLmxheW91dCk7dGhpcy5fY2FzY2FkZWRbXCJ0ZXh0LXNpemVcIl09bmV3IFN0eWxlVHJhbnNpdGlvbihjLnZhbHVlcygpW1widGV4dC1zaXplXCJdLHZvaWQgMCxlKSx0aGlzLl9jYXNjYWRlZFtcImljb24tc2l6ZVwiXT1uZXcgU3R5bGVUcmFuc2l0aW9uKGMudmFsdWVzKClbXCJpY29uLXNpemVcIl0sdm9pZCAwLGUpfX0scmVjYWxjdWxhdGU6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLnR5cGUsYT10aGlzLnBhaW50PW5ldyBQYWludFByb3BlcnRpZXNbZV07Zm9yKHZhciBvIGluIHRoaXMuX2Nhc2NhZGVkKWFbb109dGhpcy5fY2FzY2FkZWRbb10uYXQodCxpKTtpZih0aGlzLmhpZGRlbj10aGlzLm1pbnpvb20mJnQ8dGhpcy5taW56b29tfHx0aGlzLm1heHpvb20mJnQ+PXRoaXMubWF4em9vbXx8XCJub25lXCI9PT10aGlzLmxheW91dC52aXNpYmlsaXR5LFwic3ltYm9sXCI9PT1lPzAhPT1hW1widGV4dC1vcGFjaXR5XCJdJiZ0aGlzLmxheW91dFtcInRleHQtZmllbGRcIl18fDAhPT1hW1wiaWNvbi1vcGFjaXR5XCJdJiZ0aGlzLmxheW91dFtcImljb24taW1hZ2VcIl0/KHByZW11bHRpcGx5TGF5ZXIoYSxcInRleHRcIikscHJlbXVsdGlwbHlMYXllcihhLFwiaWNvblwiKSk6dGhpcy5oaWRkZW49ITA6MD09PWFbZStcIi1vcGFjaXR5XCJdP3RoaXMuaGlkZGVuPSEwOnByZW11bHRpcGx5TGF5ZXIoYSxlKSx0aGlzLl9jYXNjYWRlZFtcImxpbmUtZGFzaGFycmF5XCJdKXt2YXIgcj1hW1wibGluZS1kYXNoYXJyYXlcIl0scz10aGlzLl9jYXNjYWRlZFtcImxpbmUtd2lkdGhcIl0/dGhpcy5fY2FzY2FkZWRbXCJsaW5lLXdpZHRoXCJdLmF0KE1hdGguZmxvb3IodCksMS8wKTphW1wibGluZS13aWR0aFwiXTtyLmZyb21TY2FsZSo9cyxyLnRvU2NhbGUqPXN9cmV0dXJuIXRoaXMuaGlkZGVufSxhc3NpZ246ZnVuY3Rpb24odCl7dXRpbC5leHRlbmQodGhpcyx1dGlsLnBpY2sodCxbXCJ0eXBlXCIsXCJzb3VyY2VcIixcInNvdXJjZS1sYXllclwiLFwibWluem9vbVwiLFwibWF4em9vbVwiLFwiZmlsdGVyXCIsXCJsYXlvdXRcIl0pKX0sanNvbjpmdW5jdGlvbigpe3JldHVybiB1dGlsLmV4dGVuZCh7fSx0aGlzLl9sYXllcix1dGlsLnBpY2sodGhpcyxbXCJ0eXBlXCIsXCJzb3VyY2VcIixcInNvdXJjZS1sYXllclwiLFwibWluem9vbVwiLFwibWF4em9vbVwiLFwiZmlsdGVyXCIsXCJsYXlvdXRcIixcInBhaW50XCJdKSl9fTtcbn0se1wiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9sYXlvdXRfcHJvcGVydGllc1wiOjUzLFwiLi9wYWludF9wcm9wZXJ0aWVzXCI6NTQsXCIuL3N0eWxlX2RlY2xhcmF0aW9uX3NldFwiOjU5LFwiLi9zdHlsZV90cmFuc2l0aW9uXCI6NjF9XSw2MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBTdHlsZVRyYW5zaXRpb24odCxpLGUpe3RoaXMuZGVjbGFyYXRpb249dCx0aGlzLnN0YXJ0VGltZT10aGlzLmVuZFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7dmFyIG49dC50eXBlO1wic3RyaW5nXCIhPT1uJiZcImFycmF5XCIhPT1ufHwhdC50cmFuc2l0aW9uYWJsZT90aGlzLmludGVycD1pbnRlcnBvbGF0ZVtuXTp0aGlzLmludGVycD1pbnRlcnBab29tVHJhbnNpdGlvbmVkLHRoaXMub2xkVHJhbnNpdGlvbj1pLHRoaXMuZHVyYXRpb249ZS5kdXJhdGlvbnx8MCx0aGlzLmRlbGF5PWUuZGVsYXl8fDAsdGhpcy5pbnN0YW50KCl8fCh0aGlzLmVuZFRpbWU9dGhpcy5zdGFydFRpbWUrdGhpcy5kdXJhdGlvbit0aGlzLmRlbGF5LHRoaXMuZWFzZT11dGlsLmVhc2VDdWJpY0luT3V0KSxpJiZpLmVuZFRpbWU8PXRoaXMuc3RhcnRUaW1lJiZkZWxldGUgaS5vbGRUcmFuc2l0aW9ufWZ1bmN0aW9uIGludGVycFpvb21UcmFuc2l0aW9uZWQodCxpLGUpe3JldHVybntmcm9tOnQudG8sZnJvbVNjYWxlOnQudG9TY2FsZSx0bzppLnRvLHRvU2NhbGU6aS50b1NjYWxlLHQ6ZX19dmFyIHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKSxpbnRlcnBvbGF0ZT1yZXF1aXJlKFwiLi4vdXRpbC9pbnRlcnBvbGF0ZVwiKTttb2R1bGUuZXhwb3J0cz1TdHlsZVRyYW5zaXRpb24sU3R5bGVUcmFuc2l0aW9uLnByb3RvdHlwZS5pbnN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMub2xkVHJhbnNpdGlvbnx8IXRoaXMuaW50ZXJwfHwwPT09dGhpcy5kdXJhdGlvbiYmMD09PXRoaXMuZGVsYXl9LFN0eWxlVHJhbnNpdGlvbi5wcm90b3R5cGUuYXQ9ZnVuY3Rpb24odCxpLGUpe3ZhciBuPXRoaXMuZGVjbGFyYXRpb24uY2FsY3VsYXRlKHQsaSx0aGlzLmR1cmF0aW9uKTtpZih0aGlzLmluc3RhbnQoKSlyZXR1cm4gbjtpZihlPWV8fERhdGUubm93KCksZTx0aGlzLmVuZFRpbWUpe3ZhciByPXRoaXMub2xkVHJhbnNpdGlvbi5hdCh0LGksdGhpcy5zdGFydFRpbWUpLGE9dGhpcy5lYXNlKChlLXRoaXMuc3RhcnRUaW1lLXRoaXMuZGVsYXkpL3RoaXMuZHVyYXRpb24pO249dGhpcy5pbnRlcnAocixuLGEpfXJldHVybiBufTtcbn0se1wiLi4vdXRpbC9pbnRlcnBvbGF0ZVwiOjEwMixcIi4uL3V0aWwvdXRpbFwiOjEwNn1dLDYyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEFuY2hvcih0LGUsbyxuKXt0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLmFuZ2xlPW8sdm9pZCAwIT09biYmKHRoaXMuc2VnbWVudD1uKX12YXIgUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpO21vZHVsZS5leHBvcnRzPUFuY2hvcixBbmNob3IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUG9pbnQucHJvdG90eXBlKSxBbmNob3IucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBbmNob3IodGhpcy54LHRoaXMueSx0aGlzLmFuZ2xlLHRoaXMuc2VnbWVudCl9O1xufSx7XCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDYzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEJpblBhY2soZSxoKXt0aGlzLndpZHRoPWUsdGhpcy5oZWlnaHQ9aCx0aGlzLmZyZWU9W3t4OjAseTowLHc6ZSxoOmh9XX1tb2R1bGUuZXhwb3J0cz1CaW5QYWNrLEJpblBhY2sucHJvdG90eXBlLnJlbGVhc2U9ZnVuY3Rpb24oZSl7Zm9yKHZhciBoPTA7aDx0aGlzLmZyZWUubGVuZ3RoO2grKyl7dmFyIGk9dGhpcy5mcmVlW2hdO2lmKGkueT09PWUueSYmaS5oPT09ZS5oJiZpLngraS53PT09ZS54KWkudys9ZS53O2Vsc2UgaWYoaS54PT09ZS54JiZpLnc9PT1lLncmJmkueStpLmg9PT1lLnkpaS5oKz1lLmg7ZWxzZSBpZihlLnk9PT1pLnkmJmUuaD09PWkuaCYmZS54K2Uudz09PWkueClpLng9ZS54LGkudys9ZS53O2Vsc2V7aWYoZS54IT09aS54fHxlLnchPT1pLnd8fGUueStlLmghPT1pLnkpY29udGludWU7aS55PWUueSxpLmgrPWUuaH1yZXR1cm4gdGhpcy5mcmVlLnNwbGljZShoLDEpLHZvaWQgdGhpcy5yZWxlYXNlKGkpfXRoaXMuZnJlZS5wdXNoKGUpfSxCaW5QYWNrLnByb3RvdHlwZS5hbGxvY2F0ZT1mdW5jdGlvbihlLGgpe2Zvcih2YXIgaT17eDoxLzAseToxLzAsdzoxLzAsaDoxLzB9LHQ9LTEscz0wO3M8dGhpcy5mcmVlLmxlbmd0aDtzKyspe3ZhciByPXRoaXMuZnJlZVtzXTtlPD1yLncmJmg8PXIuaCYmci55PD1pLnkmJnIueDw9aS54JiYoaT1yLHQ9cyl9cmV0dXJuIDA+dD97eDotMSx5Oi0xfToodGhpcy5mcmVlLnNwbGljZSh0LDEpLGkudzxpLmg/KGkudz5lJiZ0aGlzLmZyZWUucHVzaCh7eDppLngrZSx5OmkueSx3Omkudy1lLGg6aH0pLGkuaD5oJiZ0aGlzLmZyZWUucHVzaCh7eDppLngseTppLnkraCx3OmkudyxoOmkuaC1ofSkpOihpLnc+ZSYmdGhpcy5mcmVlLnB1c2goe3g6aS54K2UseTppLnksdzppLnctZSxoOmkuaH0pLGkuaD5oJiZ0aGlzLmZyZWUucHVzaCh7eDppLngseTppLnkraCx3OmUsaDppLmgtaH0pKSx7eDppLngseTppLnksdzplLGg6aH0pfTtcbn0se31dLDY0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNoZWNrTWF4QW5nbGUoZSx0LGEscixuKXtpZih2b2lkIDA9PT10LnNlZ21lbnQpcmV0dXJuITA7Zm9yKHZhciBpPXQscz10LnNlZ21lbnQrMSxmPTA7Zj4tYS8yOyl7aWYocy0tLDA+cylyZXR1cm4hMTtmLT1lW3NdLmRpc3QoaSksaT1lW3NdfWYrPWVbc10uZGlzdChlW3MrMV0pLHMrKztmb3IodmFyIGw9W10sbz0wO2EvMj5mOyl7dmFyIHU9ZVtzLTFdLGM9ZVtzXSxnPWVbcysxXTtpZighZylyZXR1cm4hMTt2YXIgaD11LmFuZ2xlVG8oYyktYy5hbmdsZVRvKGcpO2ZvcihoPShoKzMqTWF0aC5QSSklKDIqTWF0aC5QSSktTWF0aC5QSSxsLnB1c2goe2Rpc3RhbmNlOmYsYW5nbGVEZWx0YTpofSksbys9aDtmLWxbMF0uZGlzdGFuY2U+cjspby09bC5zaGlmdCgpLmFuZ2xlRGVsdGE7aWYoTWF0aC5hYnMobyk+bilyZXR1cm4hMTtzKyssZis9Yy5kaXN0KGcpfXJldHVybiEwfW1vZHVsZS5leHBvcnRzPWNoZWNrTWF4QW5nbGU7XG59LHt9XSw2NTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBjbGlwTGluZSh4LHksbixlLHQpe2Zvcih2YXIgaT1bXSxvPTA7bzx4Lmxlbmd0aDtvKyspZm9yKHZhciByLFA9eFtvXSx1PTA7dTxQLmxlbmd0aC0xO3UrKyl7dmFyIHc9UFt1XSxsPVBbdSsxXTt3Lng8eSYmbC54PHl8fCh3Lng8eT93PW5ldyBQb2ludCh5LHcueSsobC55LXcueSkqKCh5LXcueCkvKGwueC13LngpKSk6bC54PHkmJihsPW5ldyBQb2ludCh5LHcueSsobC55LXcueSkqKCh5LXcueCkvKGwueC13LngpKSkpLHcueTxuJiZsLnk8bnx8KHcueTxuP3c9bmV3IFBvaW50KHcueCsobC54LXcueCkqKChuLXcueSkvKGwueS13LnkpKSxuKTpsLnk8biYmKGw9bmV3IFBvaW50KHcueCsobC54LXcueCkqKChuLXcueSkvKGwueS13LnkpKSxuKSksdy54Pj1lJiZsLng+PWV8fCh3Lng+PWU/dz1uZXcgUG9pbnQoZSx3LnkrKGwueS13LnkpKigoZS13LngpLyhsLngtdy54KSkpOmwueD49ZSYmKGw9bmV3IFBvaW50KGUsdy55KyhsLnktdy55KSooKGUtdy54KS8obC54LXcueCkpKSksdy55Pj10JiZsLnk+PXR8fCh3Lnk+PXQ/dz1uZXcgUG9pbnQody54KyhsLngtdy54KSooKHQtdy55KS8obC55LXcueSkpLHQpOmwueT49dCYmKGw9bmV3IFBvaW50KHcueCsobC54LXcueCkqKCh0LXcueSkvKGwueS13LnkpKSx0KSksciYmdy5lcXVhbHMocltyLmxlbmd0aC0xXSl8fChyPVt3XSxpLnB1c2gocikpLHIucHVzaChsKSkpKSl9cmV0dXJuIGl9dmFyIFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKTttb2R1bGUuZXhwb3J0cz1jbGlwTGluZTtcbn0se1wicG9pbnQtZ2VvbWV0cnlcIjoxMzd9XSw2NjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBDb2xsaXNpb25Cb3goaSx0LHMsaCxvLGwpe3RoaXMuYW5jaG9yUG9pbnQ9aSx0aGlzLngxPXQsdGhpcy55MT1zLHRoaXMueDI9aCx0aGlzLnkyPW8sdGhpcy5tYXhTY2FsZT1sLHRoaXMucGxhY2VtZW50U2NhbGU9MCx0aGlzWzBdPXRoaXNbMV09dGhpc1syXT10aGlzWzNdPTB9bW9kdWxlLmV4cG9ydHM9Q29sbGlzaW9uQm94O1xufSx7fV0sNjc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQ29sbGlzaW9uRmVhdHVyZShvLGksdCxlLHIscyl7dmFyIG49dC50b3AqZS1yLGw9dC5ib3R0b20qZStyLGE9dC5sZWZ0KmUtcix1PXQucmlnaHQqZStyO2lmKHRoaXMuYm94ZXM9W10scyl7dmFyIGg9bC1uLHg9dS1hO2lmKDA+PWgpcmV0dXJuO2g9TWF0aC5tYXgoMTAqZSxoKSx0aGlzLl9hZGRMaW5lQ29sbGlzaW9uQm94ZXMobyxpLHgsaCl9ZWxzZSB0aGlzLmJveGVzLnB1c2gobmV3IENvbGxpc2lvbkJveChuZXcgUG9pbnQoaS54LGkueSksYSxuLHUsbCwxLzApKX12YXIgQ29sbGlzaW9uQm94PXJlcXVpcmUoXCIuL2NvbGxpc2lvbl9ib3hcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpO21vZHVsZS5leHBvcnRzPUNvbGxpc2lvbkZlYXR1cmUsQ29sbGlzaW9uRmVhdHVyZS5wcm90b3R5cGUuX2FkZExpbmVDb2xsaXNpb25Cb3hlcz1mdW5jdGlvbihvLGksdCxlKXt2YXIgcj1lLzIscz1NYXRoLmZsb29yKHQvciksbj0tZS8yLGw9dGhpcy5ib3hlcyxhPWksdT1pLnNlZ21lbnQrMSxoPW47ZG97aWYodS0tLDA+dSlyZXR1cm4gbDtoLT1vW3VdLmRpc3QoYSksYT1vW3VdfXdoaWxlKGg+LXQvMik7Zm9yKHZhciB4PW9bdV0uZGlzdChvW3UrMV0pLGQ9MDtzPmQ7ZCsrKXtmb3IodmFyIGY9LXQvMitkKnI7Zj5oK3g7KXtpZihoKz14LHUrKyx1KzE+PW8ubGVuZ3RoKXJldHVybiBsO3g9b1t1XS5kaXN0KG9bdSsxXSl9dmFyIEM9Zi1oLGI9b1t1XSxtPW9bdSsxXSxwPW0uc3ViKGIpLl91bml0KCkuX211bHQoQykuX2FkZChiKSx2PU1hdGgubWF4KE1hdGguYWJzKGYtbiktci8yLDApLF89dC8yL3Y7bC5wdXNoKG5ldyBDb2xsaXNpb25Cb3gocCwtZS8yLC1lLzIsZS8yLGUvMixfKSl9cmV0dXJuIGx9O1xufSx7XCIuL2NvbGxpc2lvbl9ib3hcIjo2NixcInBvaW50LWdlb21ldHJ5XCI6MTM3fV0sNjg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQ29sbGlzaW9uVGlsZSh0LGEpe3RoaXMudHJlZT1yYnVzaCgpLHRoaXMuYW5nbGU9dDt2YXIgZT1NYXRoLnNpbih0KSxpPU1hdGguY29zKHQpO3RoaXMucm90YXRpb25NYXRyaXg9W2ksLWUsZSxpXSx0aGlzLnlTdHJldGNoPTEvTWF0aC5jb3MoYS8xODAqTWF0aC5QSSksdGhpcy55U3RyZXRjaD1NYXRoLnBvdyh0aGlzLnlTdHJldGNoLDEuMyl9dmFyIHJidXNoPXJlcXVpcmUoXCJyYnVzaFwiKTttb2R1bGUuZXhwb3J0cz1Db2xsaXNpb25UaWxlLENvbGxpc2lvblRpbGUucHJvdG90eXBlLm1pblNjYWxlPS4yNSxDb2xsaXNpb25UaWxlLnByb3RvdHlwZS5tYXhTY2FsZT0yLENvbGxpc2lvblRpbGUucHJvdG90eXBlLnBsYWNlQ29sbGlzaW9uRmVhdHVyZT1mdW5jdGlvbih0KXtmb3IodmFyIGE9dGhpcy5taW5TY2FsZSxlPXRoaXMucm90YXRpb25NYXRyaXgsaT10aGlzLnlTdHJldGNoLG89MDtvPHQuYm94ZXMubGVuZ3RoO28rKyl7dmFyIGw9dC5ib3hlc1tvXSxyPWwuYW5jaG9yUG9pbnQubWF0TXVsdChlKSxzPXIueCxoPXIueTtsWzBdPXMrbC54MSxsWzFdPWgrbC55MSppLGxbMl09cytsLngyLGxbM109aCtsLnkyKmk7Zm9yKHZhciBuPXRoaXMudHJlZS5zZWFyY2gobCksYz0wO2M8bi5sZW5ndGg7YysrKXt2YXIgeD1uW2NdLG09eC5hbmNob3JQb2ludC5tYXRNdWx0KGUpLHk9KHgueDEtbC54MikvKHMtbS54KSx1PSh4LngyLWwueDEpLyhzLW0ueCksUz0oeC55MS1sLnkyKSppLyhoLW0ueSkscD0oeC55Mi1sLnkxKSppLyhoLW0ueSk7KGlzTmFOKHkpfHxpc05hTih1KSkmJih5PXU9MSksKGlzTmFOKFMpfHxpc05hTihwKSkmJihTPXA9MSk7dmFyIE09TWF0aC5taW4oTWF0aC5tYXgoeSx1KSxNYXRoLm1heChTLHApKTtpZihNPngubWF4U2NhbGUmJihNPXgubWF4U2NhbGUpLE0+bC5tYXhTY2FsZSYmKE09bC5tYXhTY2FsZSksTT5hJiZNPj14LnBsYWNlbWVudFNjYWxlJiYoYT1NKSxhPj10aGlzLm1heFNjYWxlKXJldHVybiBhfX1yZXR1cm4gYX0sQ29sbGlzaW9uVGlsZS5wcm90b3R5cGUuaW5zZXJ0Q29sbGlzaW9uRmVhdHVyZT1mdW5jdGlvbih0LGEpe2Zvcih2YXIgZT10LmJveGVzLGk9MDtpPGUubGVuZ3RoO2krKyllW2ldLnBsYWNlbWVudFNjYWxlPWE7YTx0aGlzLm1heFNjYWxlJiZ0aGlzLnRyZWUubG9hZChlKX07XG59LHtcInJidXNoXCI6MTM5fV0sNjk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZ2V0QW5jaG9ycyhlLHIsdCxhLG4sbyxsLGgpe3ZhciBpPWE/LjYqbypsOjAsYz1NYXRoLm1heChhP2EucmlnaHQtYS5sZWZ0OjAsbj9uLnJpZ2h0LW4ubGVmdDowKTtpZigwPT09ZVswXS54fHw0MDk2PT09ZVswXS54fHwwPT09ZVswXS55fHw0MDk2PT09ZVswXS55KXZhciB1PSEwO3IvND5yLWMqbCYmKHI9YypsK3IvNCk7dmFyIHM9MipvLGc9dT9yLzIqaCVyOihjLzIrcykqbCpoJXI7cmV0dXJuIHJlc2FtcGxlKGUsZyxyLGksdCxjKmwsdSwhMSl9ZnVuY3Rpb24gcmVzYW1wbGUoZSxyLHQsYSxuLG8sbCxoKXtmb3IodmFyIGk9MCxjPXItdCx1PVtdLHM9MDtzPGUubGVuZ3RoLTE7cysrKXtmb3IodmFyIGc9ZVtzXSxwPWVbcysxXSx4PWcuZGlzdChwKSxmPXAuYW5nbGVUbyhnKTtpK3g+Yyt0Oyl7Yys9dDt2YXIgdj0oYy1pKS94LG09aW50ZXJwb2xhdGUoZy54LHAueCx2KSxBPWludGVycG9sYXRlKGcueSxwLnksdik7aWYobT49MCYmNDA5Nj5tJiZBPj0wJiY0MDk2PkEpe209TWF0aC5yb3VuZChtKSxBPU1hdGgucm91bmQoQSk7dmFyIHk9bmV3IEFuY2hvcihtLEEsZixzKTsoIWF8fGNoZWNrTWF4QW5nbGUoZSx5LG8sYSxuKSkmJnUucHVzaCh5KX19aSs9eH1yZXR1cm4gaHx8dS5sZW5ndGh8fGx8fCh1PXJlc2FtcGxlKGUsaS8yLHQsYSxuLG8sbCwhMCkpLHV9dmFyIGludGVycG9sYXRlPXJlcXVpcmUoXCIuLi91dGlsL2ludGVycG9sYXRlXCIpLEFuY2hvcj1yZXF1aXJlKFwiLi4vc3ltYm9sL2FuY2hvclwiKSxjaGVja01heEFuZ2xlPXJlcXVpcmUoXCIuL2NoZWNrX21heF9hbmdsZVwiKTttb2R1bGUuZXhwb3J0cz1nZXRBbmNob3JzO1xufSx7XCIuLi9zeW1ib2wvYW5jaG9yXCI6NjIsXCIuLi91dGlsL2ludGVycG9sYXRlXCI6MTAyLFwiLi9jaGVja19tYXhfYW5nbGVcIjo2NH1dLDcwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEdseXBoQXRsYXModCxpKXt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9aSx0aGlzLmJpbj1uZXcgQmluUGFjayh0LGkpLHRoaXMuaW5kZXg9e30sdGhpcy5pZHM9e30sdGhpcy5kYXRhPW5ldyBVaW50OEFycmF5KHQqaSl9dmFyIEJpblBhY2s9cmVxdWlyZShcIi4vYmluX3BhY2tcIik7bW9kdWxlLmV4cG9ydHM9R2x5cGhBdGxhcyxHbHlwaEF0bGFzLnByb3RvdHlwZT17Z2V0IGRlYnVnKCl7cmV0dXJuXCJjYW52YXNcImluIHRoaXN9LHNldCBkZWJ1Zyh0KXt0JiYhdGhpcy5jYW52YXM/KHRoaXMuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiksdGhpcy5jYW52YXMud2lkdGg9dGhpcy53aWR0aCx0aGlzLmNhbnZhcy5oZWlnaHQ9dGhpcy5oZWlnaHQsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyksdGhpcy5jdHg9dGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpKTohdCYmdGhpcy5jYW52YXMmJih0aGlzLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY2FudmFzKSxkZWxldGUgdGhpcy5jdHgsZGVsZXRlIHRoaXMuY2FudmFzKX19LEdseXBoQXRsYXMucHJvdG90eXBlLmdldEdseXBocz1mdW5jdGlvbigpe3ZhciB0LGksZSxzPXt9O2Zvcih2YXIgaCBpbiB0aGlzLmlkcyl0PWguc3BsaXQoXCIjXCIpLGk9dFswXSxlPXRbMV0sc1tpXXx8KHNbaV09W10pLHNbaV0ucHVzaChlKTtyZXR1cm4gc30sR2x5cGhBdGxhcy5wcm90b3R5cGUuZ2V0UmVjdHM9ZnVuY3Rpb24oKXt2YXIgdCxpLGUscz17fTtmb3IodmFyIGggaW4gdGhpcy5pZHMpdD1oLnNwbGl0KFwiI1wiKSxpPXRbMF0sZT10WzFdLHNbaV18fChzW2ldPXt9KSxzW2ldW2VdPXRoaXMuaW5kZXhbaF07cmV0dXJuIHN9LEdseXBoQXRsYXMucHJvdG90eXBlLnJlbW92ZUdseXBocz1mdW5jdGlvbih0KXtmb3IodmFyIGkgaW4gdGhpcy5pZHMpe3ZhciBlPXRoaXMuaWRzW2ldLHM9ZS5pbmRleE9mKHQpO2lmKHM+PTAmJmUuc3BsaWNlKHMsMSksdGhpcy5pZHNbaV09ZSwhZS5sZW5ndGgpe2Zvcih2YXIgaD10aGlzLmluZGV4W2ldLGE9dGhpcy5kYXRhLHI9MDtyPGguaDtyKyspZm9yKHZhciBuPXRoaXMud2lkdGgqKGgueStyKStoLngsZD0wO2Q8aC53O2QrKylhW24rZF09MDt0aGlzLmRpcnR5PSEwLHRoaXMuYmluLnJlbGVhc2UoaCksZGVsZXRlIHRoaXMuaW5kZXhbaV0sZGVsZXRlIHRoaXMuaWRzW2ldfX10aGlzLnVwZGF0ZVRleHR1cmUodGhpcy5nbCl9LEdseXBoQXRsYXMucHJvdG90eXBlLmFkZEdseXBoPWZ1bmN0aW9uKHQsaSxlLHMpe2lmKCFlKXJldHVybiBudWxsO3ZhciBoPWkrXCIjXCIrZS5pZDtpZih0aGlzLmluZGV4W2hdKXJldHVybiB0aGlzLmlkc1toXS5pbmRleE9mKHQpPDAmJnRoaXMuaWRzW2hdLnB1c2godCksdGhpcy5pbmRleFtoXTtpZighZS5iaXRtYXApcmV0dXJuIG51bGw7dmFyIGE9ZS53aWR0aCsyKnMscj1lLmhlaWdodCsyKnMsbj0xLGQ9YSsyKm4sbD1yKzIqbjtkKz00LWQlNCxsKz00LWwlNDt2YXIgbz10aGlzLmJpbi5hbGxvY2F0ZShkLGwpO2lmKG8ueDwwKXJldHVybiBjb25zb2xlLndhcm4oXCJnbHlwaCBiaXRtYXAgb3ZlcmZsb3dcIikse2dseXBoOmUscmVjdDpudWxsfTt0aGlzLmluZGV4W2hdPW8sdGhpcy5pZHNbaF09W3RdO2Zvcih2YXIgYz10aGlzLmRhdGEscD1lLmJpdG1hcCx1PTA7cj51O3UrKylmb3IodmFyIHg9dGhpcy53aWR0aCooby55K3Urbikrby54K24sRT1hKnUsVD0wO2E+VDtUKyspY1t4K1RdPXBbRStUXTtyZXR1cm4gdGhpcy5kaXJ0eT0hMCxvfSxHbHlwaEF0bGFzLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKHQpe3RoaXMuZ2w9dCx0aGlzLnRleHR1cmU/dC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKToodGhpcy50ZXh0dXJlPXQuY3JlYXRlVGV4dHVyZSgpLHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELHRoaXMudGV4dHVyZSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUFHX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUlOX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9TLHQuQ0xBTVBfVE9fRURHRSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9ULHQuQ0xBTVBfVE9fRURHRSksdC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLHQuQUxQSEEsdGhpcy53aWR0aCx0aGlzLmhlaWdodCwwLHQuQUxQSEEsdC5VTlNJR05FRF9CWVRFLG51bGwpKX0sR2x5cGhBdGxhcy5wcm90b3R5cGUudXBkYXRlVGV4dHVyZT1mdW5jdGlvbih0KXtpZih0aGlzLmJpbmQodCksdGhpcy5kaXJ0eSl7aWYodC50ZXhTdWJJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LHQuQUxQSEEsdC5VTlNJR05FRF9CWVRFLHRoaXMuZGF0YSksdGhpcy5jdHgpe2Zvcih2YXIgaT10aGlzLmN0eC5nZXRJbWFnZURhdGEoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLGU9MCxzPTA7ZTx0aGlzLmRhdGEubGVuZ3RoO2UrKyxzKz00KWkuZGF0YVtzXT10aGlzLmRhdGFbZV0saS5kYXRhW3MrMV09dGhpcy5kYXRhW2VdLGkuZGF0YVtzKzJdPXRoaXMuZGF0YVtlXSxpLmRhdGFbcyszXT0yNTU7dGhpcy5jdHgucHV0SW1hZ2VEYXRhKGksMCwwKSx0aGlzLmN0eC5zdHJva2VTdHlsZT1cInJlZFwiO2Zvcih2YXIgaD0wO2g8dGhpcy5iaW4uZnJlZS5sZW5ndGg7aCsrKXt2YXIgYT10aGlzLmJpbi5mcmVlW2hdO3RoaXMuY3R4LnN0cm9rZVJlY3QoYS54LGEueSxhLncsYS5oKX19dGhpcy5kaXJ0eT0hMX19O1xufSx7XCIuL2Jpbl9wYWNrXCI6NjN9XSw3MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBHbHlwaFNvdXJjZSh0LGUpe3RoaXMudXJsPXQmJm5vcm1hbGl6ZVVSTCh0KSx0aGlzLmdseXBoQXRsYXM9ZSx0aGlzLnN0YWNrcz1bXSx0aGlzLmxvYWRpbmc9e319ZnVuY3Rpb24gU2ltcGxlR2x5cGgodCxlLHIpe3ZhciBpPTE7dGhpcy5hZHZhbmNlPXQuYWR2YW5jZSx0aGlzLmxlZnQ9dC5sZWZ0LXItaSx0aGlzLnRvcD10LnRvcCtyK2ksdGhpcy5yZWN0PWV9ZnVuY3Rpb24gZ2x5cGhVcmwodCxlLHIsaSl7cmV0dXJuIGk9aXx8XCJhYmNcIixyLnJlcGxhY2UoXCJ7c31cIixpW3QubGVuZ3RoJWkubGVuZ3RoXSkucmVwbGFjZShcIntmb250c3RhY2t9XCIsdCkucmVwbGFjZShcIntyYW5nZX1cIixlKX12YXIgbm9ybWFsaXplVVJMPXJlcXVpcmUoXCIuLi91dGlsL21hcGJveFwiKS5ub3JtYWxpemVHbHlwaHNVUkwsZ2V0QXJyYXlCdWZmZXI9cmVxdWlyZShcIi4uL3V0aWwvYWpheFwiKS5nZXRBcnJheUJ1ZmZlcixHbHlwaHM9cmVxdWlyZShcIi4uL3V0aWwvZ2x5cGhzXCIpLFByb3RvYnVmPXJlcXVpcmUoXCJwYmZcIik7bW9kdWxlLmV4cG9ydHM9R2x5cGhTb3VyY2UsR2x5cGhTb3VyY2UucHJvdG90eXBlLmdldFNpbXBsZUdseXBocz1mdW5jdGlvbih0LGUscixpKXt2b2lkIDA9PT10aGlzLnN0YWNrc1t0XSYmKHRoaXMuc3RhY2tzW3RdPXt9KTtmb3IodmFyIGwsYT17fSxzPXRoaXMuc3RhY2tzW3RdLGg9dGhpcy5nbHlwaEF0bGFzLG89MyxuPXt9LHA9MCx1PTA7dTxlLmxlbmd0aDt1Kyspe3ZhciBmPWVbdV07aWYobD1NYXRoLmZsb29yKGYvMjU2KSxzW2xdKXt2YXIgeT1zW2xdLmdseXBoc1tmXSxjPWguYWRkR2x5cGgocix0LHksbyk7eSYmKGFbZl09bmV3IFNpbXBsZUdseXBoKHksYyxvKSl9ZWxzZSB2b2lkIDA9PT1uW2xdJiYobltsXT1bXSxwKyspLG5bbF0ucHVzaChmKX1wfHxpKHZvaWQgMCxhKTt2YXIgZz1mdW5jdGlvbihlLGwscyl7aWYoIWUpZm9yKHZhciB1PXRoaXMuc3RhY2tzW3RdW2xdPXMuc3RhY2tzWzBdLGY9MDtmPG5bbF0ubGVuZ3RoO2YrKyl7dmFyIHk9bltsXVtmXSxjPXUuZ2x5cGhzW3ldLGc9aC5hZGRHbHlwaChyLHQsYyxvKTtjJiYoYVt5XT1uZXcgU2ltcGxlR2x5cGgoYyxnLG8pKX1wLS0scHx8aSh2b2lkIDAsYSl9LmJpbmQodGhpcyk7Zm9yKHZhciBkIGluIG4pdGhpcy5sb2FkUmFuZ2UodCxkLGcpfSxHbHlwaFNvdXJjZS5wcm90b3R5cGUubG9hZFJhbmdlPWZ1bmN0aW9uKHQsZSxyKXtpZigyNTYqZT42NTUzNSlyZXR1cm4gcihcImd5cGhzID4gNjU1MzUgbm90IHN1cHBvcnRlZFwiKTt2b2lkIDA9PT10aGlzLmxvYWRpbmdbdF0mJih0aGlzLmxvYWRpbmdbdF09e30pO3ZhciBpPXRoaXMubG9hZGluZ1t0XTtpZihpW2VdKWlbZV0ucHVzaChyKTtlbHNle2lbZV09W3JdO3ZhciBsPTI1NiplK1wiLVwiKygyNTYqZSsyNTUpLGE9Z2x5cGhVcmwodCxsLHRoaXMudXJsKTtnZXRBcnJheUJ1ZmZlcihhLGZ1bmN0aW9uKHQscil7Zm9yKHZhciBsPSF0JiZuZXcgR2x5cGhzKG5ldyBQcm90b2J1ZihuZXcgVWludDhBcnJheShyKSkpLGE9MDthPGlbZV0ubGVuZ3RoO2ErKylpW2VdW2FdKHQsZSxsKTtkZWxldGUgaVtlXX0pfX07XG59LHtcIi4uL3V0aWwvYWpheFwiOjk0LFwiLi4vdXRpbC9nbHlwaHNcIjoxMDEsXCIuLi91dGlsL21hcGJveFwiOjEwMyxcInBiZlwiOjEzNn1dLDcyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKHIpe2wucHVzaChlW3JdKSxjLnB1c2gobltyXSksdi5wdXNoKHRbcl0pLGgrK31mdW5jdGlvbiB1KGUsdCxuKXt2YXIgcj1mW2VdO3JldHVybiBkZWxldGUgZltlXSxmW3RdPXIsY1tyXVswXS5wb3AoKSxjW3JdWzBdPWNbcl1bMF0uY29uY2F0KG5bMF0pLHJ9ZnVuY3Rpb24gaShlLHQsbil7dmFyIHI9YVt0XTtyZXR1cm4gZGVsZXRlIGFbdF0sYVtlXT1yLGNbcl1bMF0uc2hpZnQoKSxjW3JdWzBdPW5bMF0uY29uY2F0KGNbcl1bMF0pLHJ9ZnVuY3Rpb24gbyhlLHQsbil7dmFyIHI9bj90WzBdW3RbMF0ubGVuZ3RoLTFdOnRbMF1bMF07cmV0dXJuIGUrXCI6XCIrci54K1wiOlwiK3IueX12YXIgcyxhPXt9LGY9e30sbD1bXSxjPVtdLHY9W10saD0wO2ZvcihzPTA7czxlLmxlbmd0aDtzKyspe3ZhciBwPW5bc10sZD10W3NdO2lmKHApaWYoZCl7dmFyIGc9byhkLHApLHg9byhkLHAsITApO2lmKGcgaW4gZiYmeCBpbiBhJiZmW2ddIT09YVt4XSl7dmFyIG09aShnLHgscCkseT11KGcseCxjW21dKTtkZWxldGUgYVtnXSxkZWxldGUgZlt4XSxmW28oZCxjW3ldLCEwKV09eSxjW21dPW51bGx9ZWxzZSBnIGluIGY/dShnLHgscCk6eCBpbiBhP2koZyx4LHApOihyKHMpLGFbZ109aC0xLGZbeF09aC0xKX1lbHNlIHIocyl9cmV0dXJue2ZlYXR1cmVzOmwsdGV4dEZlYXR1cmVzOnYsZ2VvbWV0cmllczpjfX07XG59LHt9XSw3MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBTeW1ib2xRdWFkKHQsYSxlLG4saSxvLHIsaCxsKXt0aGlzLmFuY2hvclBvaW50PXQsdGhpcy50bD1hLHRoaXMudHI9ZSx0aGlzLmJsPW4sdGhpcy5icj1pLHRoaXMudGV4PW8sdGhpcy5hbmdsZT1yLHRoaXMubWluU2NhbGU9aCx0aGlzLm1heFNjYWxlPWx9ZnVuY3Rpb24gZ2V0SWNvblF1YWRzKHQsYSxlLG4saSxvKXt2YXIgcj1hLmltYWdlLnJlY3QsaD0xLGw9YS5sZWZ0LWgscz1sK3IudyxtPWEudG9wLWgsdT1tK3IuaCxjPW5ldyBQb2ludChsLG0pLGc9bmV3IFBvaW50KHMsbSksTT1uZXcgUG9pbnQocyx1KSxQPW5ldyBQb2ludChsLHUpLGY9aVtcImljb24tcm90YXRlXCJdKk1hdGguUEkvMTgwO2lmKG8pe3ZhciB5PW5bdC5zZWdtZW50XTtmKz1NYXRoLmF0YW4yKHQueS15LnksdC54LXkueCl9aWYoZil7dmFyIFM9TWF0aC5zaW4oZiksdj1NYXRoLmNvcyhmKSx4PVt2LC1TLFMsdl07Yz1jLm1hdE11bHQoeCksZz1nLm1hdE11bHQoeCksUD1QLm1hdE11bHQoeCksTT1NLm1hdE11bHQoeCl9cmV0dXJuW25ldyBTeW1ib2xRdWFkKG5ldyBQb2ludCh0LngsdC55KSxjLGcsUCxNLGEuaW1hZ2UucmVjdCwwLG1pblNjYWxlLDEvMCldfWZ1bmN0aW9uIGdldEdseXBoUXVhZHModCxhLGUsbixpLG8pe2Zvcih2YXIgcj1pW1widGV4dC1yb3RhdGVcIl0qTWF0aC5QSS8xODAsaD1pW1widGV4dC1rZWVwLXVwcmlnaHRcIl0sbD1hLnBvc2l0aW9uZWRHbHlwaHMscz1bXSxtPTA7bTxsLmxlbmd0aDttKyspe3ZhciB1PWxbbV0sYz11LmdseXBoLGc9Yy5yZWN0O2lmKGcpe3ZhciBNLFA9KHUueCtjLmFkdmFuY2UvMikqZSxmPW1pblNjYWxlO28/KE09W10sZj1nZXRTZWdtZW50R2x5cGhzKE0sdCxQLG4sdC5zZWdtZW50LCEwKSxoJiYoZj1NYXRoLm1pbihmLGdldFNlZ21lbnRHbHlwaHMoTSx0LFAsbix0LnNlZ21lbnQsITEpKSkpOk09W3thbmNob3JQb2ludDpuZXcgUG9pbnQodC54LHQueSksb2Zmc2V0OjAsYW5nbGU6MCxtYXhTY2FsZToxLzAsbWluU2NhbGU6bWluU2NhbGV9XTtmb3IodmFyIHk9dS54K2MubGVmdCxTPXUueS1jLnRvcCx2PXkrZy53LHg9UytnLmgscD1uZXcgUG9pbnQoeSxTKSx3PW5ldyBQb2ludCh2LFMpLGQ9bmV3IFBvaW50KHkseCksST1uZXcgUG9pbnQodix4KSxiPTA7YjxNLmxlbmd0aDtiKyspe3ZhciBRPU1bYl0sRz1wLGs9dyxxPWQsXz1JLGo9US5hbmdsZStyO2lmKGope3ZhciB6PU1hdGguc2luKGopLEE9TWF0aC5jb3MoaiksQj1bQSwteix6LEFdO0c9Ry5tYXRNdWx0KEIpLGs9ay5tYXRNdWx0KEIpLHE9cS5tYXRNdWx0KEIpLF89Xy5tYXRNdWx0KEIpfXZhciBDPU1hdGgubWF4KFEubWluU2NhbGUsZiksRD0odC5hbmdsZStyK1Eub2Zmc2V0KzIqTWF0aC5QSSklKDIqTWF0aC5QSSk7cy5wdXNoKG5ldyBTeW1ib2xRdWFkKFEuYW5jaG9yUG9pbnQsRyxrLHEsXyxnLEQsQyxRLm1heFNjYWxlKSl9fX1yZXR1cm4gc31mdW5jdGlvbiBnZXRTZWdtZW50R2x5cGhzKHQsYSxlLG4saSxvKXt2YXIgcj0hbzswPmUmJihvPSFvKSxvJiZpKys7dmFyIGg9bmV3IFBvaW50KGEueCxhLnkpLGw9bltpXSxzPTEvMDtlPU1hdGguYWJzKGUpO2Zvcih2YXIgbT1taW5TY2FsZTs7KXt2YXIgdT1oLmRpc3QobCksYz1lL3UsZz1NYXRoLmF0YW4yKGwueS1oLnksbC54LWgueCk7aWYob3x8KGcrPU1hdGguUEkpLHImJihnKz1NYXRoLlBJKSx0LnB1c2goe2FuY2hvclBvaW50Omgsb2Zmc2V0OnI/TWF0aC5QSTowLG1pblNjYWxlOmMsbWF4U2NhbGU6cyxhbmdsZTooZysyKk1hdGguUEkpJSgyKk1hdGguUEkpfSksbT49YylicmVhaztmb3IoaD1sO2guZXF1YWxzKGwpOylpZihpKz1vPzE6LTEsbD1uW2ldLCFsKXJldHVybiBjO3ZhciBNPWwuc3ViKGgpLl91bml0KCk7aD1oLnN1YihNLl9tdWx0KHUpKSxzPWN9cmV0dXJuIG19dmFyIFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKTttb2R1bGUuZXhwb3J0cz17Z2V0SWNvblF1YWRzOmdldEljb25RdWFkcyxnZXRHbHlwaFF1YWRzOmdldEdseXBoUXVhZHN9O3ZhciBtaW5TY2FsZT0uNTtcbn0se1wicG9pbnQtZ2VvbWV0cnlcIjoxMzd9XSw3NDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByZXNvbHZlSWNvbnMoZSxyKXtmb3IodmFyIG89W10scz0wLG49ZS5sZW5ndGg7bj5zO3MrKyl7dmFyIHQ9cmVzb2x2ZVRva2VucyhlW3NdLnByb3BlcnRpZXMscltcImljb24taW1hZ2VcIl0pO3QmJm8uaW5kZXhPZih0KTwwJiZvLnB1c2godCl9cmV0dXJuIG99dmFyIHJlc29sdmVUb2tlbnM9cmVxdWlyZShcIi4uL3V0aWwvdG9rZW5cIik7bW9kdWxlLmV4cG9ydHM9cmVzb2x2ZUljb25zO1xufSx7XCIuLi91dGlsL3Rva2VuXCI6MTA1fV0sNzU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gcmVzb2x2ZVRleHQoZSxyLHQpe2Zvcih2YXIgbz1bXSxzPVtdLG49MCx1PWUubGVuZ3RoO3U+bjtuKyspe3ZhciBhPXJlc29sdmVUb2tlbnMoZVtuXS5wcm9wZXJ0aWVzLHJbXCJ0ZXh0LWZpZWxkXCJdKTtpZihhKXthPWEudG9TdHJpbmcoKTt2YXIgbD1yW1widGV4dC10cmFuc2Zvcm1cIl07XCJ1cHBlcmNhc2VcIj09PWw/YT1hLnRvTG9jYWxlVXBwZXJDYXNlKCk6XCJsb3dlcmNhc2VcIj09PWwmJihhPWEudG9Mb2NhbGVMb3dlckNhc2UoKSk7Zm9yKHZhciBpPTAsdj1hLmxlbmd0aDt2Pmk7aSsrKXMucHVzaChhLmNoYXJDb2RlQXQoaSkpO29bbl09YX1lbHNlIG9bbl09bnVsbH1yZXR1cm4gcz11bmlxKHMsdCkse3RleHRGZWF0dXJlczpvLGNvZGVwb2ludHM6c319ZnVuY3Rpb24gdW5pcShlLHIpe3ZhciB0LG89W107ZS5zb3J0KHNvcnROdW1iZXJzKTtmb3IodmFyIHM9MDtzPGUubGVuZ3RoO3MrKyllW3NdIT09dCYmKHQ9ZVtzXSxyW3RdfHxvLnB1c2goZVtzXSkpO3JldHVybiBvfWZ1bmN0aW9uIHNvcnROdW1iZXJzKGUscil7cmV0dXJuIGUtcn12YXIgcmVzb2x2ZVRva2Vucz1yZXF1aXJlKFwiLi4vdXRpbC90b2tlblwiKTttb2R1bGUuZXhwb3J0cz1yZXNvbHZlVGV4dDtcbn0se1wiLi4vdXRpbC90b2tlblwiOjEwNX1dLDc2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFBvc2l0aW9uZWRHbHlwaCh0LGksbixlKXt0aGlzLmNvZGVQb2ludD10LHRoaXMueD1pLHRoaXMueT1uLHRoaXMuZ2x5cGg9ZX1mdW5jdGlvbiBTaGFwaW5nKHQsaSxuLGUsbyxoKXt0aGlzLnBvc2l0aW9uZWRHbHlwaHM9dCx0aGlzLnRleHQ9aSx0aGlzLnRvcD1uLHRoaXMuYm90dG9tPWUsdGhpcy5sZWZ0PW8sdGhpcy5yaWdodD1ofWZ1bmN0aW9uIHNoYXBlVGV4dCh0LGksbixlLG8saCxhLHMscil7Zm9yKHZhciBsPVtdLGY9bmV3IFNoYXBpbmcobCx0LHJbMV0sclsxXSxyWzBdLHJbMF0pLGM9LTE3LHA9clswXSx1PXJbMV0rYyxkPTA7ZDx0Lmxlbmd0aDtkKyspe3ZhciBnPXQuY2hhckNvZGVBdChkKSx2PWlbZ107diYmKGwucHVzaChuZXcgUG9zaXRpb25lZEdseXBoKGcscCx1LHYpKSxwKz12LmFkdmFuY2Urcyl9cmV0dXJuIGwubGVuZ3RoPyhsaW5ld3JhcChmLGksZSxuLG8saCxhKSxmKTohMX1mdW5jdGlvbiBsaW5ld3JhcCh0LGksbixlLG8saCxhKXt2YXIgcz1udWxsLHI9MCxsPTAsZj0wLGM9MCxwPXQucG9zaXRpb25lZEdseXBocztpZihlKWZvcih2YXIgdT0wO3U8cC5sZW5ndGg7dSsrKXt2YXIgZD1wW3VdO2lmKGQueC09cixkLnkrPW4qZixkLng+ZSYmbnVsbCE9PXMpe3ZhciBnPXBbcysxXS54O2M9TWF0aC5tYXgoZyxjKTtmb3IodmFyIHY9cysxO3U+PXY7disrKXBbdl0ueSs9bixwW3ZdLngtPWc7YSYmanVzdGlmeUxpbmUocCxpLGwscy0xLGEpLGw9cysxLHM9bnVsbCxyKz1nLGYrK31icmVha2FibGVbZC5jb2RlUG9pbnRdJiYocz11KX12YXIgeD1wW3AubGVuZ3RoLTFdLHk9eC54K2lbeC5jb2RlUG9pbnRdLmFkdmFuY2U7Yz1NYXRoLm1heChjLHkpO3ZhciBQPShmKzEpKm47anVzdGlmeUxpbmUocCxpLGwscC5sZW5ndGgtMSxhKSxhbGlnbihwLGEsbyxoLGMsbixmKSx0LnRvcCs9LWgqUCx0LmJvdHRvbT10LnRvcCtQLHQubGVmdCs9LW8qYyx0LnJpZ2h0PXQubGVmdCtjfWZ1bmN0aW9uIGp1c3RpZnlMaW5lKHQsaSxuLGUsbyl7Zm9yKHZhciBoPWlbdFtlXS5jb2RlUG9pbnRdLmFkdmFuY2UsYT0odFtlXS54K2gpKm8scz1uO2U+PXM7cysrKXRbc10ueC09YX1mdW5jdGlvbiBhbGlnbih0LGksbixlLG8saCxhKXtmb3IodmFyIHM9KGktbikqbyxyPSgtZSooYSsxKSsuNSkqaCxsPTA7bDx0Lmxlbmd0aDtsKyspdFtsXS54Kz1zLHRbbF0ueSs9cn1mdW5jdGlvbiBzaGFwZUljb24odCxpKXtpZighdHx8IXQucmVjdClyZXR1cm4gbnVsbDt2YXIgbj1pW1wiaWNvbi1vZmZzZXRcIl1bMF0sZT1pW1wiaWNvbi1vZmZzZXRcIl1bMV0sbz1uLXQud2lkdGgvMixoPW8rdC53aWR0aCxhPWUtdC5oZWlnaHQvMixzPWErdC5oZWlnaHQ7cmV0dXJuIG5ldyBQb3NpdGlvbmVkSWNvbih0LGEscyxvLGgpfWZ1bmN0aW9uIFBvc2l0aW9uZWRJY29uKHQsaSxuLGUsbyl7dGhpcy5pbWFnZT10LHRoaXMudG9wPWksdGhpcy5ib3R0b209bix0aGlzLmxlZnQ9ZSx0aGlzLnJpZ2h0PW99bW9kdWxlLmV4cG9ydHM9e3NoYXBlVGV4dDpzaGFwZVRleHQsc2hhcGVJY29uOnNoYXBlSWNvbn07dmFyIGJyZWFrYWJsZT17MzI6ITB9O1xufSx7fV0sNzc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3ByaXRlQXRsYXModCxpKXt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9aSx0aGlzLmJpbj1uZXcgQmluUGFjayh0LGkpLHRoaXMuaW1hZ2VzPXt9LHRoaXMuZGF0YT0hMSx0aGlzLnRleHR1cmU9MCx0aGlzLmZpbHRlcj0wLHRoaXMucGl4ZWxSYXRpbz0xLHRoaXMuZGlydHk9ITB9ZnVuY3Rpb24gY29weUJpdG1hcCh0LGksZSxoLGEscyxyLG8sbixsLHApe3ZhciBkLGMseD1oKmkrZSxmPW8qcytyO2lmKHApZm9yKGYtPXMsYz0tMTtsPj1jO2MrKyx4PSgoYytsKSVsK2gpKmkrZSxmKz1zKWZvcihkPS0xO24+PWQ7ZCsrKWFbZitkXT10W3grKGQrbiklbl07ZWxzZSBmb3IoYz0wO2w+YztjKysseCs9aSxmKz1zKWZvcihkPTA7bj5kO2QrKylhW2YrZF09dFt4K2RdfWZ1bmN0aW9uIEF0bGFzSW1hZ2UodCxpLGUsaCl7dGhpcy5yZWN0PXQsdGhpcy53aWR0aD1pLHRoaXMuaGVpZ2h0PWUsdGhpcy5zZGY9aH12YXIgQmluUGFjaz1yZXF1aXJlKFwiLi9iaW5fcGFja1wiKTttb2R1bGUuZXhwb3J0cz1TcHJpdGVBdGxhcyxTcHJpdGVBdGxhcy5wcm90b3R5cGU9e2dldCBkZWJ1Zygpe3JldHVyblwiY2FudmFzXCJpbiB0aGlzfSxzZXQgZGVidWcodCl7dCYmIXRoaXMuY2FudmFzPyh0aGlzLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHRoaXMuY2FudmFzLndpZHRoPXRoaXMud2lkdGgqdGhpcy5waXhlbFJhdGlvLHRoaXMuY2FudmFzLmhlaWdodD10aGlzLmhlaWdodCp0aGlzLnBpeGVsUmF0aW8sdGhpcy5jYW52YXMuc3R5bGUud2lkdGg9dGhpcy53aWR0aCtcInB4XCIsdGhpcy5jYW52YXMuc3R5bGUud2lkdGg9dGhpcy53aWR0aCtcInB4XCIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyksdGhpcy5jdHg9dGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpKTohdCYmdGhpcy5jYW52YXMmJih0aGlzLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY2FudmFzKSxkZWxldGUgdGhpcy5jdHgsZGVsZXRlIHRoaXMuY2FudmFzKX19LFNwcml0ZUF0bGFzLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24odCl7aWYodGhpcy5waXhlbFJhdGlvPT09dClyZXR1cm4hMTt2YXIgaT10aGlzLnBpeGVsUmF0aW87aWYodGhpcy5waXhlbFJhdGlvPXQsdGhpcy5jYW52YXMmJih0aGlzLmNhbnZhcy53aWR0aD10aGlzLndpZHRoKnRoaXMucGl4ZWxSYXRpbyx0aGlzLmNhbnZhcy5oZWlnaHQ9dGhpcy5oZWlnaHQqdGhpcy5waXhlbFJhdGlvKSx0aGlzLmRhdGEpe3ZhciBlPXRoaXMuZGF0YTt0aGlzLmRhdGE9ITEsdGhpcy5hbGxvY2F0ZSgpLHRoaXMudGV4dHVyZT0hMTtmb3IodmFyIGg9dGhpcy53aWR0aCppLGE9dGhpcy5oZWlnaHQqaSxzPXRoaXMud2lkdGgqdCxyPXRoaXMuaGVpZ2h0KnQsbz10aGlzLmRhdGEsbj1lLGw9MDtyPmw7bCsrKWZvcih2YXIgcD1NYXRoLmZsb29yKGwqYS9yKSpoLGQ9bCpzLGM9MDtzPmM7YysrKXt2YXIgeD1NYXRoLmZsb29yKGMqaC9zKTtvW2QrY109bltwK3hdfWU9bnVsbCx0aGlzLmRpcnR5PSEwfXJldHVybiB0aGlzLmRpcnR5fSxTcHJpdGVBdGxhcy5wcm90b3R5cGUuYWxsb2NhdGVJbWFnZT1mdW5jdGlvbih0LGkpe3ZhciBlPTIsaD10K2UrKDQtKHQrZSklNCksYT1pK2UrKDQtKGkrZSklNCkscz10aGlzLmJpbi5hbGxvY2F0ZShoLGEpO3JldHVybiAwPT09cy53P3M6KHMub3JpZ2luYWxXaWR0aD10LHMub3JpZ2luYWxIZWlnaHQ9aSxzKX0sU3ByaXRlQXRsYXMucHJvdG90eXBlLmdldEltYWdlPWZ1bmN0aW9uKHQsaSl7aWYodGhpcy5pbWFnZXNbdF0pcmV0dXJuIHRoaXMuaW1hZ2VzW3RdO2lmKCF0aGlzLnNwcml0ZSlyZXR1cm4gbnVsbDt2YXIgZT10aGlzLnNwcml0ZS5nZXRTcHJpdGVQb3NpdGlvbih0KTtpZighZS53aWR0aHx8IWUuaGVpZ2h0KXJldHVybiBudWxsO3ZhciBoPWUud2lkdGgvZS5waXhlbFJhdGlvLGE9ZS5oZWlnaHQvZS5waXhlbFJhdGlvLHM9dGhpcy5hbGxvY2F0ZUltYWdlKGgsYSk7aWYoMD09PXMudylyZXR1cm4gczt2YXIgcj1uZXcgQXRsYXNJbWFnZShzLGgsYSxlLnNkZik7cmV0dXJuIHRoaXMuaW1hZ2VzW3RdPXIsdGhpcy5jb3B5KHMsZSxpKSxyfSxTcHJpdGVBdGxhcy5wcm90b3R5cGUuZ2V0UG9zaXRpb249ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLmdldEltYWdlKHQsaSksaD1lJiZlLnJlY3Q7aWYoIWgpcmV0dXJuIG51bGw7dmFyIGE9aT9lLndpZHRoOmgudyxzPWk/ZS5oZWlnaHQ6aC5oLHI9MTtyZXR1cm57c2l6ZTpbYSxzXSx0bDpbKGgueCtyKS90aGlzLndpZHRoLChoLnkrcikvdGhpcy5oZWlnaHRdLGJyOlsoaC54K3IrYSkvdGhpcy53aWR0aCwoaC55K3IrcykvdGhpcy5oZWlnaHRdfX0sU3ByaXRlQXRsYXMucHJvdG90eXBlLmFsbG9jYXRlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuZGF0YSl7dmFyIHQ9TWF0aC5mbG9vcih0aGlzLndpZHRoKnRoaXMucGl4ZWxSYXRpbyksaT1NYXRoLmZsb29yKHRoaXMuaGVpZ2h0KnRoaXMucGl4ZWxSYXRpbyk7dGhpcy5kYXRhPW5ldyBVaW50MzJBcnJheSh0KmkpO2Zvcih2YXIgZT0wO2U8dGhpcy5kYXRhLmxlbmd0aDtlKyspdGhpcy5kYXRhW2VdPTB9fSxTcHJpdGVBdGxhcy5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGksZSl7aWYodGhpcy5zcHJpdGUuaW1nLmRhdGEpe3ZhciBoPW5ldyBVaW50MzJBcnJheSh0aGlzLnNwcml0ZS5pbWcuZGF0YS5idWZmZXIpO3RoaXMuYWxsb2NhdGUoKTt2YXIgYT10aGlzLmRhdGEscz0xO2NvcHlCaXRtYXAoaCx0aGlzLnNwcml0ZS5pbWcud2lkdGgsaS54LGkueSxhLHRoaXMud2lkdGgqdGhpcy5waXhlbFJhdGlvLCh0LngrcykqdGhpcy5waXhlbFJhdGlvLCh0LnkrcykqdGhpcy5waXhlbFJhdGlvLGkud2lkdGgsaS5oZWlnaHQsZSksdGhpcy5kaXJ0eT0hMH19LFNwcml0ZUF0bGFzLnByb3RvdHlwZS5zZXRTcHJpdGU9ZnVuY3Rpb24odCl7dGhpcy5zcHJpdGU9dH0sU3ByaXRlQXRsYXMucHJvdG90eXBlLmFkZEljb25zPWZ1bmN0aW9uKHQsaSl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspdGhpcy5nZXRJbWFnZSh0W2VdKTtpKG51bGwsdGhpcy5pbWFnZXMpfSxTcHJpdGVBdGxhcy5wcm90b3R5cGUuYmluZD1mdW5jdGlvbih0LGkpe3ZhciBlPSExO3RoaXMudGV4dHVyZT90LmJpbmRUZXh0dXJlKHQuVEVYVFVSRV8yRCx0aGlzLnRleHR1cmUpOih0aGlzLnRleHR1cmU9dC5jcmVhdGVUZXh0dXJlKCksdC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9XUkFQX1MsdC5DTEFNUF9UT19FREdFKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9XUkFQX1QsdC5DTEFNUF9UT19FREdFKSxlPSEwKTt2YXIgaD1pP3QuTElORUFSOnQuTkVBUkVTVDtpZihoIT09dGhpcy5maWx0ZXImJih0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9NSU5fRklMVEVSLGgpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX01BR19GSUxURVIsaCksdGhpcy5maWx0ZXI9aCksdGhpcy5kaXJ0eSYmKHRoaXMuYWxsb2NhdGUoKSxlP3QudGV4SW1hZ2UyRCh0LlRFWFRVUkVfMkQsMCx0LlJHQkEsdGhpcy53aWR0aCp0aGlzLnBpeGVsUmF0aW8sdGhpcy5oZWlnaHQqdGhpcy5waXhlbFJhdGlvLDAsdC5SR0JBLHQuVU5TSUdORURfQllURSxuZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSk6dC50ZXhTdWJJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLDAsMCx0aGlzLndpZHRoKnRoaXMucGl4ZWxSYXRpbyx0aGlzLmhlaWdodCp0aGlzLnBpeGVsUmF0aW8sdC5SR0JBLHQuVU5TSUdORURfQllURSxuZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSksdGhpcy5kaXJ0eT0hMSx0aGlzLmN0eCkpe3ZhciBhPXRoaXMuY3R4LmdldEltYWdlRGF0YSgwLDAsdGhpcy53aWR0aCp0aGlzLnBpeGVsUmF0aW8sdGhpcy5oZWlnaHQqdGhpcy5waXhlbFJhdGlvKTthLmRhdGEuc2V0KG5ldyBVaW50OENsYW1wZWRBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSksdGhpcy5jdHgucHV0SW1hZ2VEYXRhKGEsMCwwKSx0aGlzLmN0eC5zdHJva2VTdHlsZT1cInJlZFwiO2Zvcih2YXIgcz0wO3M8dGhpcy5iaW4uZnJlZS5sZW5ndGg7cysrKXt2YXIgcj10aGlzLmJpbi5mcmVlW3NdO3RoaXMuY3R4LnN0cm9rZVJlY3Qoci54KnRoaXMucGl4ZWxSYXRpbyxyLnkqdGhpcy5waXhlbFJhdGlvLHIudyp0aGlzLnBpeGVsUmF0aW8sci5oKnRoaXMucGl4ZWxSYXRpbyl9fX07XG59LHtcIi4vYmluX3BhY2tcIjo2M31dLDc4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksaW50ZXJwb2xhdGU9cmVxdWlyZShcIi4uL3V0aWwvaW50ZXJwb2xhdGVcIiksYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpLExuZ0xhdD1yZXF1aXJlKFwiLi4vZ2VvL2xuZ19sYXRcIiksTG5nTGF0Qm91bmRzPXJlcXVpcmUoXCIuLi9nZW8vbG5nX2xhdF9ib3VuZHNcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpLENhbWVyYT1tb2R1bGUuZXhwb3J0cz1mdW5jdGlvbigpe307dXRpbC5leHRlbmQoQ2FtZXJhLnByb3RvdHlwZSx7Z2V0Q2VudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtLmNlbnRlcn0sc2V0Q2VudGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmp1bXBUbyh7Y2VudGVyOnR9KSx0aGlzfSxwYW5CeTpmdW5jdGlvbih0LGkpe3JldHVybiB0aGlzLnBhblRvKHRoaXMudHJhbnNmb3JtLmNlbnRlcix1dGlsLmV4dGVuZCh7b2Zmc2V0OlBvaW50LmNvbnZlcnQodCkubXVsdCgtMSl9LGkpKSx0aGlzfSxwYW5UbzpmdW5jdGlvbih0LGkpe3RoaXMuc3RvcCgpLHQ9TG5nTGF0LmNvbnZlcnQodCksaT11dGlsLmV4dGVuZCh7ZHVyYXRpb246NTAwLGVhc2luZzp1dGlsLmVhc2Usb2Zmc2V0OlswLDBdfSxpKTt2YXIgZT10aGlzLnRyYW5zZm9ybSxuPVBvaW50LmNvbnZlcnQoaS5vZmZzZXQpLnJvdGF0ZSgtZS5hbmdsZSksbz1lLnBvaW50LHI9ZS5wcm9qZWN0KHQpLnN1YihuKTtyZXR1cm4gaS5ub01vdmVTdGFydHx8dGhpcy5maXJlKFwibW92ZXN0YXJ0XCIpLHRoaXMuX2Vhc2UoZnVuY3Rpb24odCl7ZS5jZW50ZXI9ZS51bnByb2plY3Qoby5hZGQoci5zdWIobykubXVsdCh0KSkpLHRoaXMuZmlyZShcIm1vdmVcIil9LGZ1bmN0aW9uKCl7dGhpcy5maXJlKFwibW92ZWVuZFwiKX0saSksdGhpc30sZ2V0Wm9vbTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRyYW5zZm9ybS56b29tfSxzZXRab29tOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmp1bXBUbyh7em9vbTp0fSksdGhpc30sem9vbVRvOmZ1bmN0aW9uKHQsaSl7dGhpcy5zdG9wKCksaT11dGlsLmV4dGVuZCh7ZHVyYXRpb246NTAwfSxpKSxpLmVhc2luZz10aGlzLl91cGRhdGVFYXNpbmcoaS5kdXJhdGlvbix0LGkuZWFzaW5nKTt2YXIgZT10aGlzLnRyYW5zZm9ybSxuPWUuY2VudGVyLG89ZS56b29tO3JldHVybiBpLmFyb3VuZD9uPUxuZ0xhdC5jb252ZXJ0KGkuYXJvdW5kKTppLm9mZnNldCYmKG49ZS5wb2ludExvY2F0aW9uKGUuY2VudGVyUG9pbnQuYWRkKFBvaW50LmNvbnZlcnQoaS5vZmZzZXQpKSkpLGkuYW5pbWF0ZT09PSExJiYoaS5kdXJhdGlvbj0wKSx0aGlzLnpvb21pbmd8fCh0aGlzLnpvb21pbmc9ITAsdGhpcy5maXJlKFwibW92ZXN0YXJ0XCIpKSx0aGlzLl9lYXNlKGZ1bmN0aW9uKGkpe2Uuc2V0Wm9vbUFyb3VuZChpbnRlcnBvbGF0ZShvLHQsaSksbiksdGhpcy5maXJlKFwibW92ZVwiKS5maXJlKFwiem9vbVwiKX0sZnVuY3Rpb24oKXt0aGlzLmVhc2U9bnVsbCxpLmR1cmF0aW9uPj0yMDAmJih0aGlzLnpvb21pbmc9ITEsdGhpcy5maXJlKFwibW92ZWVuZFwiKSl9LGkpLGkuZHVyYXRpb248MjAwJiYoY2xlYXJUaW1lb3V0KHRoaXMuX29uWm9vbUVuZCksdGhpcy5fb25ab29tRW5kPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpvb21pbmc9ITEsdGhpcy5maXJlKFwibW92ZWVuZFwiKX0uYmluZCh0aGlzKSwyMDApKSx0aGlzfSx6b29tSW46ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpKzEsdCksdGhpc30sem9vbU91dDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy56b29tVG8odGhpcy5nZXRab29tKCktMSx0KSx0aGlzfSxnZXRCZWFyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtLmJlYXJpbmd9LHNldEJlYXJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuanVtcFRvKHtiZWFyaW5nOnR9KSx0aGlzfSxyb3RhdGVUbzpmdW5jdGlvbih0LGkpe3RoaXMuc3RvcCgpLGk9dXRpbC5leHRlbmQoe2R1cmF0aW9uOjUwMCxlYXNpbmc6dXRpbC5lYXNlfSxpKTt2YXIgZT10aGlzLnRyYW5zZm9ybSxuPXRoaXMuZ2V0QmVhcmluZygpLG89ZS5jZW50ZXI7cmV0dXJuIGkuYXJvdW5kP289TG5nTGF0LmNvbnZlcnQoaS5hcm91bmQpOmkub2Zmc2V0JiYobz1lLnBvaW50TG9jYXRpb24oZS5jZW50ZXJQb2ludC5hZGQoUG9pbnQuY29udmVydChpLm9mZnNldCkpKSksdD10aGlzLl9ub3JtYWxpemVCZWFyaW5nKHQsbiksdGhpcy5yb3RhdGluZz0hMCx0aGlzLmZpcmUoXCJtb3Zlc3RhcnRcIiksdGhpcy5fZWFzZShmdW5jdGlvbihpKXtlLnNldEJlYXJpbmdBcm91bmQoaW50ZXJwb2xhdGUobix0LGkpLG8pLHRoaXMuZmlyZShcIm1vdmVcIikuZmlyZShcInJvdGF0ZVwiKX0sZnVuY3Rpb24oKXt0aGlzLnJvdGF0aW5nPSExLHRoaXMuZmlyZShcIm1vdmVlbmRcIil9LGkpLHRoaXN9LHJlc2V0Tm9ydGg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucm90YXRlVG8oMCx1dGlsLmV4dGVuZCh7ZHVyYXRpb246MWUzfSx0KSksdGhpc30sc25hcFRvTm9ydGg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMuZ2V0QmVhcmluZygpKTx0aGlzLm9wdGlvbnMuYmVhcmluZ1NuYXA/dGhpcy5yZXNldE5vcnRoKHQpOnRoaXN9LGdldFBpdGNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtLnBpdGNofSxzZXRQaXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5qdW1wVG8oe3BpdGNoOnR9KSx0aGlzfSxmaXRCb3VuZHM6ZnVuY3Rpb24odCxpKXtpPXV0aWwuZXh0ZW5kKHtwYWRkaW5nOjAsb2Zmc2V0OlswLDBdLG1heFpvb206MS8wfSxpKSx0PUxuZ0xhdEJvdW5kcy5jb252ZXJ0KHQpO3ZhciBlPVBvaW50LmNvbnZlcnQoaS5vZmZzZXQpLG49dGhpcy50cmFuc2Zvcm0sbz1uLnByb2plY3QodC5nZXROb3J0aFdlc3QoKSkscj1uLnByb2plY3QodC5nZXRTb3V0aEVhc3QoKSkscz1yLnN1YihvKSxhPShuLndpZHRoLTIqaS5wYWRkaW5nLTIqTWF0aC5hYnMoZS54KSkvcy54LGg9KG4uaGVpZ2h0LTIqaS5wYWRkaW5nLTIqTWF0aC5hYnMoZS55KSkvcy55O3JldHVybiBpLmNlbnRlcj1uLnVucHJvamVjdChvLmFkZChyKS5kaXYoMikpLGkuem9vbT1NYXRoLm1pbihuLnNjYWxlWm9vbShuLnNjYWxlKk1hdGgubWluKGEsaCkpLGkubWF4Wm9vbSksaS5iZWFyaW5nPTAsaS5saW5lYXI/dGhpcy5lYXNlVG8oaSk6dGhpcy5mbHlUbyhpKX0sanVtcFRvOmZ1bmN0aW9uKHQpe3RoaXMuc3RvcCgpO3ZhciBpPXRoaXMudHJhbnNmb3JtLGU9ITEsbj0hMSxvPSExO3JldHVyblwiY2VudGVyXCJpbiB0JiYoaS5jZW50ZXI9TG5nTGF0LmNvbnZlcnQodC5jZW50ZXIpKSxcInpvb21cImluIHQmJmkuem9vbSE9PSt0Lnpvb20mJihlPSEwLGkuem9vbT0rdC56b29tKSxcImJlYXJpbmdcImluIHQmJmkuYmVhcmluZyE9PSt0LmJlYXJpbmcmJihuPSEwLGkuYmVhcmluZz0rdC5iZWFyaW5nKSxcInBpdGNoXCJpbiB0JiZpLnBpdGNoIT09K3QucGl0Y2gmJihvPSEwLGkucGl0Y2g9K3QucGl0Y2gpLHRoaXMuZmlyZShcIm1vdmVzdGFydFwiKS5maXJlKFwibW92ZVwiKSxlJiZ0aGlzLmZpcmUoXCJ6b29tXCIpLG4mJnRoaXMuZmlyZShcInJvdGF0ZVwiKSxvJiZ0aGlzLmZpcmUoXCJwaXRjaFwiKSx0aGlzLmZpcmUoXCJtb3ZlZW5kXCIpfSxlYXNlVG86ZnVuY3Rpb24odCl7dGhpcy5zdG9wKCksdD11dGlsLmV4dGVuZCh7b2Zmc2V0OlswLDBdLGR1cmF0aW9uOjUwMCxlYXNpbmc6dXRpbC5lYXNlfSx0KTt2YXIgaT10aGlzLnRyYW5zZm9ybSxlPVBvaW50LmNvbnZlcnQodC5vZmZzZXQpLnJvdGF0ZSgtaS5hbmdsZSksbj1pLnBvaW50LG89dGhpcy5nZXRab29tKCkscj10aGlzLmdldEJlYXJpbmcoKSxzPXRoaXMuZ2V0UGl0Y2goKSxhPVwiem9vbVwiaW4gdD8rdC56b29tOm8saD1cImJlYXJpbmdcImluIHQ/dGhpcy5fbm9ybWFsaXplQmVhcmluZyh0LmJlYXJpbmcscik6cix1PVwicGl0Y2hcImluIHQ/K3QucGl0Y2g6cyxmPWkuem9vbVNjYWxlKGEtbyksYz1cImNlbnRlclwiaW4gdD9pLnByb2plY3QoTG5nTGF0LmNvbnZlcnQodC5jZW50ZXIpKS5zdWIoZS5kaXYoZikpOm4sbT1MbmdMYXQuY29udmVydCh0LmFyb3VuZCk7cmV0dXJuIGEhPT1vJiYodGhpcy56b29taW5nPSEwKSxyIT09aCYmKHRoaXMucm90YXRpbmc9ITApLHRoaXMuem9vbWluZyYmIW0mJihtPWkucG9pbnRMb2NhdGlvbihpLmNlbnRlclBvaW50LmFkZChjLnN1YihuKS5kaXYoMS0xL2YpKSkpLHRoaXMuZmlyZShcIm1vdmVzdGFydFwiKSx0aGlzLl9lYXNlKGZ1bmN0aW9uKHQpe3RoaXMuem9vbWluZz9pLnNldFpvb21Bcm91bmQoaW50ZXJwb2xhdGUobyxhLHQpLG0pOmkuY2VudGVyPWkudW5wcm9qZWN0KG4uYWRkKGMuc3ViKG4pLm11bHQodCkpKSx0aGlzLnJvdGF0aW5nJiYoaS5iZWFyaW5nPWludGVycG9sYXRlKHIsaCx0KSksdSE9PXMmJihpLnBpdGNoPWludGVycG9sYXRlKHMsdSx0KSksdGhpcy5maXJlKFwibW92ZVwiKSx0aGlzLnpvb21pbmcmJnRoaXMuZmlyZShcInpvb21cIiksdGhpcy5yb3RhdGluZyYmdGhpcy5maXJlKFwicm90YXRlXCIpfSxmdW5jdGlvbigpe3RoaXMuem9vbWluZz0hMSx0aGlzLnJvdGF0aW5nPSExLHRoaXMuZmlyZShcIm1vdmVlbmRcIil9LHQpLHRoaXN9LGZseVRvOmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGkodCl7dmFyIGk9KHoqei1iKmIrKHQ/LTE6MSkqTSpNKl8qXykvKDIqKHQ/ejpiKSpNKl8pO3JldHVybiBNYXRoLmxvZyhNYXRoLnNxcnQoaSppKzEpLWkpfWZ1bmN0aW9uIGUodCl7cmV0dXJuKE1hdGguZXhwKHQpLU1hdGguZXhwKC10KSkvMn1mdW5jdGlvbiBuKHQpe3JldHVybihNYXRoLmV4cCh0KStNYXRoLmV4cCgtdCkpLzJ9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gZSh0KS9uKHQpfXRoaXMuc3RvcCgpLHQ9dXRpbC5leHRlbmQoe29mZnNldDpbMCwwXSxzcGVlZDoxLjIsY3VydmU6MS40MixlYXNpbmc6dXRpbC5lYXNlfSx0KTt2YXIgcj10aGlzLnRyYW5zZm9ybSxzPVBvaW50LmNvbnZlcnQodC5vZmZzZXQpLGE9dGhpcy5nZXRab29tKCksaD10aGlzLmdldEJlYXJpbmcoKSx1PVwiY2VudGVyXCJpbiB0P0xuZ0xhdC5jb252ZXJ0KHQuY2VudGVyKTp0aGlzLmdldENlbnRlcigpLGY9XCJ6b29tXCJpbiB0Pyt0Lnpvb206YSxjPVwiYmVhcmluZ1wiaW4gdD90aGlzLl9ub3JtYWxpemVCZWFyaW5nKHQuYmVhcmluZyxoKTpoLG09ci56b29tU2NhbGUoZi1hKSxnPXIucG9pbnQsZD1yLnByb2plY3QodSkuc3ViKHMuZGl2KG0pKSxwPXIud29ybGRTaXplLGw9dC5jdXJ2ZSx2PXQuc3BlZWQsYj1NYXRoLm1heChyLndpZHRoLHIuaGVpZ2h0KSx6PWIvbSxfPWQuc3ViKGcpLm1hZygpLE09bCpsLEw9aSgwKSx4PWZ1bmN0aW9uKHQpe3JldHVybiBuKEwpL24oTCtsKnQpfSxUPWZ1bmN0aW9uKHQpe3JldHVybiBiKigobihMKSpvKEwrbCp0KS1lKEwpKS9NKS9ffSxCPShpKDEpLUwpL2w7aWYoTWF0aC5hYnMoXyk8MWUtNil7aWYoTWF0aC5hYnMoYi16KTwxZS02KXJldHVybiB0aGlzO3ZhciBqPWI+ej8tMToxO0I9TWF0aC5hYnMoTWF0aC5sb2coei9iKSkvbCxUPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LHg9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguZXhwKGoqbCp0KX19cmV0dXJuIHQuZHVyYXRpb249MWUzKkIvdix0aGlzLnpvb21pbmc9ITAsaCE9PWMmJih0aGlzLnJvdGF0aW5nPSEwKSx0aGlzLmZpcmUoXCJtb3Zlc3RhcnRcIiksdGhpcy5fZWFzZShmdW5jdGlvbih0KXt2YXIgaT10KkIsZT1UKGkpO3Iuem9vbT1hK3Iuc2NhbGVab29tKDEveChpKSksci5jZW50ZXI9ci51bnByb2plY3QoZy5hZGQoZC5zdWIoZykubXVsdChlKSkscCksYyE9PWgmJihyLmJlYXJpbmc9aW50ZXJwb2xhdGUoaCxjLHQpKSx0aGlzLmZpcmUoXCJtb3ZlXCIpLmZpcmUoXCJ6b29tXCIpLGMhPT1oJiZ0aGlzLmZpcmUoXCJyb3RhdGVcIil9LGZ1bmN0aW9uKCl7dGhpcy56b29taW5nPSExLHRoaXMucm90YXRpbmc9ITEsdGhpcy5maXJlKFwibW92ZWVuZFwiKX0sdCksdGhpc30saXNFYXNpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX2Fib3J0Rm59LHN0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWJvcnRGbiYmKHRoaXMuX2Fib3J0Rm4oKSx0aGlzLl9maW5pc2hFYXNlKCkpLHRoaXN9LF9lYXNlOmZ1bmN0aW9uKHQsaSxlKXt0aGlzLl9maW5pc2hGbj1pLHRoaXMuX2Fib3J0Rm49YnJvd3Nlci50aW1lZChmdW5jdGlvbihpKXt0LmNhbGwodGhpcyxlLmVhc2luZyhpKSksMT09PWkmJnRoaXMuX2ZpbmlzaEVhc2UoKX0sZS5hbmltYXRlPT09ITE/MDplLmR1cmF0aW9uLHRoaXMpfSxfZmluaXNoRWFzZTpmdW5jdGlvbigpe2RlbGV0ZSB0aGlzLl9hYm9ydEZuO3ZhciB0PXRoaXMuX2ZpbmlzaEZuO2RlbGV0ZSB0aGlzLl9maW5pc2hGbix0LmNhbGwodGhpcyl9LF9ub3JtYWxpemVCZWFyaW5nOmZ1bmN0aW9uKHQsaSl7dD11dGlsLndyYXAodCwtMTgwLDE4MCk7dmFyIGU9TWF0aC5hYnModC1pKTtyZXR1cm4gTWF0aC5hYnModC0zNjAtaSk8ZSYmKHQtPTM2MCksTWF0aC5hYnModCszNjAtaSk8ZSYmKHQrPTM2MCksdH0sX3VwZGF0ZUVhc2luZzpmdW5jdGlvbih0LGksZSl7dmFyIG47aWYodGhpcy5lYXNlKXt2YXIgbz10aGlzLmVhc2Uscj0oRGF0ZS5ub3coKS1vLnN0YXJ0KS9vLmR1cmF0aW9uLHM9by5lYXNpbmcocisuMDEpLW8uZWFzaW5nKHIpLGE9LjI3L01hdGguc3FydChzKnMrMWUtNCkqLjAxLGg9TWF0aC5zcXJ0KC4wNzI5LWEqYSk7bj11dGlsLmJlemllcihhLGgsLjI1LDEpfWVsc2Ugbj1lP3V0aWwuYmV6aWVyLmFwcGx5KHV0aWwsZSk6dXRpbC5lYXNlO3JldHVybiB0aGlzLmVhc2U9e3N0YXJ0OihuZXcgRGF0ZSkuZ2V0VGltZSgpLHRvOk1hdGgucG93KDIsaSksZHVyYXRpb246dCxlYXNpbmc6bn0sbn19KTtcbn0se1wiLi4vZ2VvL2xuZ19sYXRcIjoyMCxcIi4uL2dlby9sbmdfbGF0X2JvdW5kc1wiOjIxLFwiLi4vdXRpbC9icm93c2VyXCI6OTUsXCIuLi91dGlsL2ludGVycG9sYXRlXCI6MTAyLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwicG9pbnQtZ2VvbWV0cnlcIjoxMzd9XSw3OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBBdHRyaWJ1dGlvbigpe312YXIgQ29udHJvbD1yZXF1aXJlKFwiLi9jb250cm9sXCIpLERPTT1yZXF1aXJlKFwiLi4vLi4vdXRpbC9kb21cIiksdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPUF0dHJpYnV0aW9uLEF0dHJpYnV0aW9uLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQ29udHJvbCx7b3B0aW9uczp7cG9zaXRpb246XCJib3R0b20tcmlnaHRcIn0sb25BZGQ6ZnVuY3Rpb24odCl7dmFyIGk9XCJtYXBib3hnbC1jdHJsLWF0dHJpYlwiLGU9dGhpcy5fY29udGFpbmVyPURPTS5jcmVhdGUoXCJkaXZcIixpLHQuZ2V0Q29udGFpbmVyKCkpO3JldHVybiB0aGlzLl91cGRhdGUoKSx0Lm9uKFwic291cmNlLmxvYWRcIix0aGlzLl91cGRhdGUuYmluZCh0aGlzKSksdC5vbihcInNvdXJjZS5jaGFuZ2VcIix0aGlzLl91cGRhdGUuYmluZCh0aGlzKSksdC5vbihcInNvdXJjZS5yZW1vdmVcIix0aGlzLl91cGRhdGUuYmluZCh0aGlzKSksdC5vbihcIm1vdmVlbmRcIix0aGlzLl91cGRhdGVFZGl0TGluay5iaW5kKHRoaXMpKSxlfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5fbWFwLnN0eWxlKWZvcih2YXIgaSBpbiB0aGlzLl9tYXAuc3R5bGUuc291cmNlcyl7dmFyIGU9dGhpcy5fbWFwLnN0eWxlLnNvdXJjZXNbaV07ZS5hdHRyaWJ1dGlvbiYmdC5pbmRleE9mKGUuYXR0cmlidXRpb24pPDAmJnQucHVzaChlLmF0dHJpYnV0aW9uKX10aGlzLl9jb250YWluZXIuaW5uZXJIVE1MPXQuam9pbihcIiB8IFwiKSx0aGlzLl9lZGl0TGluaz10aGlzLl9jb250YWluZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcIm1hcGJveC1pbXByb3ZlLW1hcFwiKVswXSx0aGlzLl91cGRhdGVFZGl0TGluaygpfSxfdXBkYXRlRWRpdExpbms6ZnVuY3Rpb24oKXtpZih0aGlzLl9lZGl0TGluayl7dmFyIHQ9dGhpcy5fbWFwLmdldENlbnRlcigpO3RoaXMuX2VkaXRMaW5rLmhyZWY9XCJodHRwczovL3d3dy5tYXBib3guY29tL21hcC1mZWVkYmFjay8jL1wiK3QubG5nK1wiL1wiK3QubGF0K1wiL1wiK01hdGgucm91bmQodGhpcy5fbWFwLmdldFpvb20oKSsxKX19fSk7XG59LHtcIi4uLy4uL3V0aWwvZG9tXCI6OTgsXCIuLi8uLi91dGlsL3V0aWxcIjoxMDYsXCIuL2NvbnRyb2xcIjo4MH1dLDgwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIENvbnRyb2woKXt9bW9kdWxlLmV4cG9ydHM9Q29udHJvbCxDb250cm9sLnByb3RvdHlwZT17YWRkVG86ZnVuY3Rpb24obyl7dGhpcy5fbWFwPW87dmFyIHQ9dGhpcy5fY29udGFpbmVyPXRoaXMub25BZGQobyk7aWYodGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMucG9zaXRpb24pe3ZhciBpPXRoaXMub3B0aW9ucy5wb3NpdGlvbixuPW8uX2NvbnRyb2xDb3JuZXJzW2ldO3QuY2xhc3NOYW1lKz1cIiBtYXBib3hnbC1jdHJsXCIsLTEhPT1pLmluZGV4T2YoXCJib3R0b21cIik/bi5pbnNlcnRCZWZvcmUodCxuLmZpcnN0Q2hpbGQpOm4uYXBwZW5kQ2hpbGQodCl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpLHRoaXMub25SZW1vdmUmJnRoaXMub25SZW1vdmUodGhpcy5fbWFwKSx0aGlzLl9tYXA9bnVsbCx0aGlzfX07XG59LHt9XSw4MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBOYXZpZ2F0aW9uKHQpe3V0aWwuc2V0T3B0aW9ucyh0aGlzLHQpfXZhciBDb250cm9sPXJlcXVpcmUoXCIuL2NvbnRyb2xcIiksRE9NPXJlcXVpcmUoXCIuLi8uLi91dGlsL2RvbVwiKSx1dGlsPXJlcXVpcmUoXCIuLi8uLi91dGlsL3V0aWxcIik7bW9kdWxlLmV4cG9ydHM9TmF2aWdhdGlvbixOYXZpZ2F0aW9uLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQ29udHJvbCx7b3B0aW9uczp7cG9zaXRpb246XCJ0b3AtcmlnaHRcIn0sb25BZGQ6ZnVuY3Rpb24odCl7dmFyIG89XCJtYXBib3hnbC1jdHJsXCIscz10aGlzLl9jb250YWluZXI9RE9NLmNyZWF0ZShcImRpdlwiLG8rXCItZ3JvdXBcIix0LmdldENvbnRhaW5lcigpKTt0aGlzLl96b29tSW5CdXR0b249dGhpcy5fY3JlYXRlQnV0dG9uKG8rXCItaWNvbiBcIitvK1wiLXpvb20taW5cIix0Lnpvb21Jbi5iaW5kKHQpKSx0aGlzLl96b29tT3V0QnV0dG9uPXRoaXMuX2NyZWF0ZUJ1dHRvbihvK1wiLWljb24gXCIrbytcIi16b29tLW91dFwiLHQuem9vbU91dC5iaW5kKHQpKSx0aGlzLl9jb21wYXNzPXRoaXMuX2NyZWF0ZUJ1dHRvbihvK1wiLWNvbXBhc3NcIix0LnJlc2V0Tm9ydGguYmluZCh0KSk7dmFyIGU9dGhpcy5fY29tcGFzc0NhbnZhcz1ET00uY3JlYXRlKFwiY2FudmFzXCIsbytcIi1jb21wYXNzLWNhbnZhc1wiLHRoaXMuX2NvbXBhc3MpO3JldHVybiBlLnN0eWxlLmNzc1RleHQ9XCJ3aWR0aDozMHB4OyBoZWlnaHQ6MzBweDtcIixlLndpZHRoPTUyLGUuaGVpZ2h0PTUyLHRoaXMuX2NvbXBhc3MuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLHRoaXMuX29uQ29tcGFzc0Rvd24uYmluZCh0aGlzKSksdGhpcy5fb25Db21wYXNzTW92ZT10aGlzLl9vbkNvbXBhc3NNb3ZlLmJpbmQodGhpcyksdGhpcy5fb25Db21wYXNzVXA9dGhpcy5fb25Db21wYXNzVXAuYmluZCh0aGlzKSx0aGlzLl9jb21wYXNzQ3R4PWUuZ2V0Q29udGV4dChcIjJkXCIpLHQub24oXCJyb3RhdGVcIix0aGlzLl9kcmF3Tm9ydGguYmluZCh0aGlzKSksdGhpcy5fZHJhd05vcnRoKCksc30sX29uQ29tcGFzc0Rvd246ZnVuY3Rpb24odCl7RE9NLmRpc2FibGVEcmFnKCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuX29uQ29tcGFzc01vdmUpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fb25Db21wYXNzVXApLHRoaXMuX3ByZXZYPXQuc2NyZWVuWCx0LnN0b3BQcm9wYWdhdGlvbigpfSxfb25Db21wYXNzTW92ZTpmdW5jdGlvbih0KXt2YXIgbz10LnNjcmVlblgscz0yPm8/LTU6bz53aW5kb3cuc2NyZWVuLndpZHRoLTI/NTooby10aGlzLl9wcmV2WCkvNDt0aGlzLl9tYXAuc2V0QmVhcmluZyh0aGlzLl9tYXAuZ2V0QmVhcmluZygpLXMpLHRoaXMuX3ByZXZYPXQuc2NyZWVuWCx0aGlzLl9tb3ZlZD0hMCx0LnByZXZlbnREZWZhdWx0KCl9LF9vbkNvbXBhc3NVcDpmdW5jdGlvbigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbkNvbXBhc3NNb3ZlKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uQ29tcGFzc1VwKSxET00uZW5hYmxlRHJhZygpLHRoaXMuX21vdmVkJiYodGhpcy5fbW92ZWQ9ITEsRE9NLnN1cHByZXNzQ2xpY2soKSksdGhpcy5fbWFwLnNuYXBUb05vcnRoKCl9LF9jcmVhdGVCdXR0b246ZnVuY3Rpb24odCxvKXt2YXIgcz1ET00uY3JlYXRlKFwiYnV0dG9uXCIsdCx0aGlzLl9jb250YWluZXIpO3JldHVybiBzLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGZ1bmN0aW9uKCl7bygpfSksc30sX2RyYXdOb3J0aDpmdW5jdGlvbigpe3ZhciB0PTIwLG89OCxzPTI2LGU9dGhpcy5fbWFwLnRyYW5zZm9ybS5hbmdsZStNYXRoLlBJLzIsaT10aGlzLl9jb21wYXNzQ3R4O3RoaXMuX2NvbXBhc3NDYW52YXMud2lkdGg9dGhpcy5fY29tcGFzc0NhbnZhcy53aWR0aCxpLnRyYW5zbGF0ZShzLHMpLGkucm90YXRlKGUpLGkuYmVnaW5QYXRoKCksaS5maWxsU3R5bGU9XCIjMDAwXCIsaS5saW5lVG8oMCwtbyksaS5saW5lVG8oLXQsMCksaS5saW5lVG8oMCxvKSxpLmZpbGwoKSxpLmJlZ2luUGF0aCgpLGkuZmlsbFN0eWxlPVwiI2JiYlwiLGkubW92ZVRvKDAsMCksaS5saW5lVG8oMCxvKSxpLmxpbmVUbyh0LDApLGkubGluZVRvKDAsLW8pLGkuZmlsbCgpLGkuYmVnaW5QYXRoKCksaS5zdHJva2VTdHlsZT1cIiNmZmZcIixpLmxpbmVXaWR0aD00LGkubW92ZVRvKDAsLW8pLGkubGluZVRvKDAsbyksaS5zdHJva2UoKX19KTtcbn0se1wiLi4vLi4vdXRpbC9kb21cIjo5OCxcIi4uLy4uL3V0aWwvdXRpbFwiOjEwNixcIi4vY29udHJvbFwiOjgwfV0sODI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQm94Wm9vbShvKXt0aGlzLl9tYXA9byx0aGlzLl9lbD1vLmdldENhbnZhc0NvbnRhaW5lcigpLHRoaXMuX2NvbnRhaW5lcj1vLmdldENvbnRhaW5lcigpLHV0aWwuYmluZEhhbmRsZXJzKHRoaXMpfXZhciBET009cmVxdWlyZShcIi4uLy4uL3V0aWwvZG9tXCIpLExuZ0xhdEJvdW5kcz1yZXF1aXJlKFwiLi4vLi4vZ2VvL2xuZ19sYXRfYm91bmRzXCIpLHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKTttb2R1bGUuZXhwb3J0cz1Cb3hab29tLEJveFpvb20ucHJvdG90eXBlPXtlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsdGhpcy5fb25Nb3VzZURvd24sITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLHRoaXMuX29uTW91c2VEb3duKX0sX29uTW91c2VEb3duOmZ1bmN0aW9uKG8peyhvLnNoaWZ0S2V5fHwxPT09by53aGljaCYmMT09PW8uYnV0dG9uKSYmKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdXNlTW92ZSwhMSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIix0aGlzLl9vbktleURvd24sITEpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fb25Nb3VzZVVwLCExKSx0aGlzLl9zdGFydFBvcz1ET00ubW91c2VQb3ModGhpcy5fZWwsbyksdGhpcy5hY3RpdmU9ITApfSxfb25Nb3VzZU1vdmU6ZnVuY3Rpb24obyl7dmFyIGU9dGhpcy5fc3RhcnRQb3MsdD1ET00ubW91c2VQb3ModGhpcy5fZWwsbyk7dGhpcy5fYm94fHwodGhpcy5fYm94PURPTS5jcmVhdGUoXCJkaXZcIixcIm1hcGJveGdsLWJveHpvb21cIix0aGlzLl9jb250YWluZXIpLHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtY3Jvc3NoYWlyXCIpLERPTS5kaXNhYmxlRHJhZygpLHRoaXMuX21hcC5maXJlKFwiYm94em9vbXN0YXJ0XCIpKTt2YXIgcz1NYXRoLm1pbihlLngsdC54KSxuPU1hdGgubWF4KGUueCx0LngpLGk9TWF0aC5taW4oZS55LHQueSksYT1NYXRoLm1heChlLnksdC55KTtET00uc2V0VHJhbnNmb3JtKHRoaXMuX2JveCxcInRyYW5zbGF0ZShcIitzK1wicHgsXCIraStcInB4KVwiKSx0aGlzLl9ib3guc3R5bGUud2lkdGg9bi1zK1wicHhcIix0aGlzLl9ib3guc3R5bGUuaGVpZ2h0PWEtaStcInB4XCJ9LF9vbk1vdXNlVXA6ZnVuY3Rpb24obyl7dmFyIGU9dGhpcy5fc3RhcnRQb3MsdD1ET00ubW91c2VQb3ModGhpcy5fZWwsbykscz1uZXcgTG5nTGF0Qm91bmRzKHRoaXMuX21hcC51bnByb2plY3QoZSksdGhpcy5fbWFwLnVucHJvamVjdCh0KSk7dGhpcy5fZmluaXNoKCksdGhpcy5fbWFwLmZpdEJvdW5kcyhzLHtsaW5lYXI6ITB9KS5maXJlKFwiYm94em9vbWVuZFwiLHtib3hab29tQm91bmRzOnN9KX0sX29uS2V5RG93bjpmdW5jdGlvbihvKXsyNz09PW8ua2V5Q29kZSYmKHRoaXMuX2ZpbmlzaCgpLHRoaXMuX21hcC5maXJlKFwiYm94em9vbWNhbmNlbFwiKSl9LF9maW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl9ib3gmJih0aGlzLmFjdGl2ZT0hMSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5fb25Nb3VzZU1vdmUsITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsdGhpcy5fb25LZXlEb3duLCExKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCwhMSksdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBib3hnbC1jcm9zc2hhaXJcIiksdGhpcy5fYm94LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fYm94KSx0aGlzLl9ib3g9bnVsbCxET00uZW5hYmxlRHJhZygpKX19O1xufSx7XCIuLi8uLi9nZW8vbG5nX2xhdF9ib3VuZHNcIjoyMSxcIi4uLy4uL3V0aWwvZG9tXCI6OTgsXCIuLi8uLi91dGlsL3V0aWxcIjoxMDZ9XSw4MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBEb3VibGVDbGlja1pvb20obyl7dGhpcy5fbWFwPW8sdGhpcy5fb25EYmxDbGljaz10aGlzLl9vbkRibENsaWNrLmJpbmQodGhpcyl9bW9kdWxlLmV4cG9ydHM9RG91YmxlQ2xpY2tab29tLERvdWJsZUNsaWNrWm9vbS5wcm90b3R5cGU9e2VuYWJsZTpmdW5jdGlvbigpe3RoaXMuX21hcC5vbihcImRibGNsaWNrXCIsdGhpcy5fb25EYmxDbGljayl9LGRpc2FibGU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAub2ZmKFwiZGJsY2xpY2tcIix0aGlzLl9vbkRibENsaWNrKX0sX29uRGJsQ2xpY2s6ZnVuY3Rpb24obyl7dGhpcy5fbWFwLnpvb21UbyhNYXRoLnJvdW5kKHRoaXMuX21hcC5nZXRab29tKCkpKzEse2Fyb3VuZDpvLmxuZ0xhdH0pfX07XG59LHt9XSw4NDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBEcmFnUGFuKGUpe3RoaXMuX21hcD1lLHRoaXMuX2VsPWUuZ2V0Q2FudmFzQ29udGFpbmVyKCksdXRpbC5iaW5kSGFuZGxlcnModGhpcyl9dmFyIERPTT1yZXF1aXJlKFwiLi4vLi4vdXRpbC9kb21cIiksdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPURyYWdQYW47dmFyIGluZXJ0aWFMaW5lYXJpdHk9LjI1LGluZXJ0aWFFYXNpbmc9dXRpbC5iZXppZXIoMCwwLGluZXJ0aWFMaW5lYXJpdHksMSksaW5lcnRpYU1heFNwZWVkPTNlMyxpbmVydGlhRGVjZWxlcmF0aW9uPTRlMztEcmFnUGFuLnByb3RvdHlwZT17ZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLHRoaXMuX29uRG93biwhMSksdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIix0aGlzLl9vbkRvd24sITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLHRoaXMuX29uRG93biksdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIix0aGlzLl9vbkRvd24pfSxfb25Eb3duOmZ1bmN0aW9uKGUpe3RoaXMuX3N0YXJ0UG9zPXRoaXMuX3Bvcz1ET00ubW91c2VQb3ModGhpcy5fZWwsZSksdGhpcy5faW5lcnRpYT1bW0RhdGUubm93KCksdGhpcy5fcG9zXV0sZS50b3VjaGVzPzE9PT1lLnRvdWNoZXMubGVuZ3RoJiYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuX29uTW92ZSwhMSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5fb25Ub3VjaEVuZCwhMSkpOihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5fb25Nb3ZlLCExKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCwhMSkpfSxfb25Nb3ZlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX21hcDtpZighKHQuYm94Wm9vbS5hY3RpdmV8fHQuZHJhZ1JvdGF0ZS5hY3RpdmV8fGUudG91Y2hlcyYmZS50b3VjaGVzLmxlbmd0aD4xKSl7dGhpcy5hY3RpdmU9ITA7dmFyIG49RE9NLm1vdXNlUG9zKHRoaXMuX2VsLGUpLGk9dGhpcy5faW5lcnRpYSxvPURhdGUubm93KCk7Zm9yKGkucHVzaChbbyxuXSk7aS5sZW5ndGg+MiYmby1pWzBdWzBdPjUwOylpLnNoaWZ0KCk7dC5zdG9wKCksdC50cmFuc2Zvcm0uc2V0TG9jYXRpb25BdFBvaW50KHQudHJhbnNmb3JtLnBvaW50TG9jYXRpb24odGhpcy5fcG9zKSxuKSx0LmZpcmUoXCJtb3ZlXCIpLHRoaXMuX3Bvcz1uLGUucHJldmVudERlZmF1bHQoKX19LF9vblVwOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5faW5lcnRpYTtpZihlLmxlbmd0aDwyKXJldHVybiB2b2lkIHRoaXMuX21hcC5maXJlKFwibW92ZWVuZFwiKTt2YXIgdD1lW2UubGVuZ3RoLTFdLG49ZVswXSxpPXRbMV0uc3ViKG5bMV0pLG89KHRbMF0tblswXSkvMWUzLHM9aS5tdWx0KGluZXJ0aWFMaW5lYXJpdHkvbyksYT1zLm1hZygpO2E+aW5lcnRpYU1heFNwZWVkJiYoYT1pbmVydGlhTWF4U3BlZWQscy5fdW5pdCgpLl9tdWx0KGEpKTt2YXIgcj1hLyhpbmVydGlhRGVjZWxlcmF0aW9uKmluZXJ0aWFMaW5lYXJpdHkpLHU9cy5tdWx0KC1yLzIpO3RoaXMuX21hcC5wYW5CeSh1LHtkdXJhdGlvbjoxZTMqcixlYXNpbmc6aW5lcnRpYUVhc2luZyxub01vdmVTdGFydDohMH0pLHRoaXMuYWN0aXZlPSExfSxfb25Nb3VzZVVwOmZ1bmN0aW9uKCl7dGhpcy5fb25VcCgpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdmUsITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fb25Nb3VzZVVwLCExKX0sX29uVG91Y2hFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9vblVwKCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuX29uTW92ZSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5fb25Ub3VjaEVuZCl9fTtcbn0se1wiLi4vLi4vdXRpbC9kb21cIjo5OCxcIi4uLy4uL3V0aWwvdXRpbFwiOjEwNn1dLDg1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIERyYWdSb3RhdGUodCl7dGhpcy5fbWFwPXQsdGhpcy5fZWw9dC5nZXRDYW52YXNDb250YWluZXIoKSx1dGlsLmJpbmRIYW5kbGVycyh0aGlzKX12YXIgRE9NPXJlcXVpcmUoXCIuLi8uLi91dGlsL2RvbVwiKSxQb2ludD1yZXF1aXJlKFwicG9pbnQtZ2VvbWV0cnlcIiksdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPURyYWdSb3RhdGUsRHJhZ1JvdGF0ZS5wcm90b3R5cGU9e2VuYWJsZTpmdW5jdGlvbigpe3RoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLHRoaXMuX29uQ29udGV4dE1lbnUsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsdGhpcy5fb25Db250ZXh0TWVudSl9LF9vbkNvbnRleHRNZW51OmZ1bmN0aW9uKHQpe3RoaXMuX21hcC5zdG9wKCksdGhpcy5fc3RhcnRQb3M9dGhpcy5fcG9zPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5fb25Nb3VzZU1vdmUsITEpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fb25Nb3VzZVVwLCExKSx0LnByZXZlbnREZWZhdWx0KCl9LF9vbk1vdXNlTW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zdGFydFBvcyxvPXRoaXMuX3BvcyxuPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0KSxpPXRoaXMuX21hcCxzPWkudHJhbnNmb3JtLmNlbnRlclBvaW50LHI9ZS5zdWIocyksdT1yLm1hZygpO3RoaXMuYWN0aXZlPSEwLGkucm90YXRpbmd8fChpLmZpcmUoXCJtb3Zlc3RhcnRcIiksaS5yb3RhdGluZz0hMCksMjAwPnUmJihzPWUuYWRkKG5ldyBQb2ludCgtMjAwLDApLl9yb3RhdGUoci5hbmdsZSgpKSkpO3ZhciBhPW8uc3ViKHMpLmFuZ2xlV2l0aChuLnN1YihzKSkvTWF0aC5QSSoxODA7aS50cmFuc2Zvcm0uYmVhcmluZz1pLmdldEJlYXJpbmcoKS1hLGkuZmlyZShcIm1vdmVcIikuZmlyZShcInJvdGF0ZVwiKSxjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCksdGhpcy5fdGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX29uVGltZW91dCwyMDApLHRoaXMuX3Bvcz1ufSxfb25UaW1lb3V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwO3Qucm90YXRpbmc9ITEsdC5zbmFwVG9Ob3J0aCgpLHQucm90YXRpbmd8fCh0Ll9yZXJlbmRlcigpLHQuZmlyZShcIm1vdmVlbmRcIikpfSxfb25Nb3VzZVVwOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmU9ITEsZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuX29uTW91c2VNb3ZlLCExKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCwhMSl9fTtcbn0se1wiLi4vLi4vdXRpbC9kb21cIjo5OCxcIi4uLy4uL3V0aWwvdXRpbFwiOjEwNixcInBvaW50LWdlb21ldHJ5XCI6MTM3fV0sODY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gS2V5Ym9hcmQoZSl7dGhpcy5fbWFwPWUsdGhpcy5fZWw9ZS5nZXRDYW52YXNDb250YWluZXIoKSx0aGlzLl9vbktleURvd249dGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyl9bW9kdWxlLmV4cG9ydHM9S2V5Ym9hcmQ7dmFyIHBhbkRlbHRhPTgwLHJvdGF0ZURlbHRhPTI7S2V5Ym9hcmQucHJvdG90eXBlPXtlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLHRoaXMuX29uS2V5RG93biwhMSl9LGRpc2FibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLHRoaXMuX29uS2V5RG93bil9LF9vbktleURvd246ZnVuY3Rpb24oZSl7aWYoIShlLmFsdEtleXx8ZS5jdHJsS2V5fHxlLm1ldGFLZXkpKXt2YXIgYT10aGlzLl9tYXA7c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSA2MTpjYXNlIDEwNzpjYXNlIDE3MTpjYXNlIDE4NzphLnpvb21UbyhNYXRoLnJvdW5kKGEuZ2V0Wm9vbSgpKSsoZS5zaGlmdEtleT8yOjEpKTticmVhaztjYXNlIDE4OTpjYXNlIDEwOTpjYXNlIDE3MzphLnpvb21UbyhNYXRoLnJvdW5kKGEuZ2V0Wm9vbSgpKS0oZS5zaGlmdEtleT8yOjEpKTticmVhaztjYXNlIDM3OmUuc2hpZnRLZXk/YS5zZXRCZWFyaW5nKGEuZ2V0QmVhcmluZygpLXJvdGF0ZURlbHRhKTphLnBhbkJ5KFstcGFuRGVsdGEsMF0pO2JyZWFrO2Nhc2UgMzk6ZS5zaGlmdEtleT9hLnNldEJlYXJpbmcoYS5nZXRCZWFyaW5nKCkrcm90YXRlRGVsdGEpOmEucGFuQnkoW3BhbkRlbHRhLDBdKTticmVhaztjYXNlIDM4OmEucGFuQnkoWzAsLXBhbkRlbHRhXSk7YnJlYWs7Y2FzZSA0MDphLnBhbkJ5KFswLHBhbkRlbHRhXSl9fX19O1xufSx7fV0sODc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gUGluY2godCl7dGhpcy5fbWFwPXQsdGhpcy5fZWw9dC5nZXRDYW52YXNDb250YWluZXIoKSx1dGlsLmJpbmRIYW5kbGVycyh0aGlzKX12YXIgRE9NPXJlcXVpcmUoXCIuLi8uLi91dGlsL2RvbVwiKSx1dGlsPXJlcXVpcmUoXCIuLi8uLi91dGlsL3V0aWxcIik7bW9kdWxlLmV4cG9ydHM9UGluY2gsUGluY2gucHJvdG90eXBlPXtlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLHRoaXMuX29uU3RhcnQsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIix0aGlzLl9vblN0YXJ0KX0sX29uU3RhcnQ6ZnVuY3Rpb24odCl7aWYoMj09PXQudG91Y2hlcy5sZW5ndGgpe3ZhciBlPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0LnRvdWNoZXNbMF0pLHM9RE9NLm1vdXNlUG9zKHRoaXMuX2VsLHQudG91Y2hlc1sxXSk7dGhpcy5fc3RhcnRWZWM9ZS5zdWIocyksdGhpcy5fc3RhcnRTY2FsZT10aGlzLl9tYXAudHJhbnNmb3JtLnNjYWxlLHRoaXMuX3N0YXJ0QmVhcmluZz10aGlzLl9tYXAudHJhbnNmb3JtLmJlYXJpbmcsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuX29uTW92ZSwhMSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5fb25FbmQsITEpfX0sX29uTW92ZTpmdW5jdGlvbih0KXtpZigyPT09dC50b3VjaGVzLmxlbmd0aCl7dmFyIGU9RE9NLm1vdXNlUG9zKHRoaXMuX2VsLHQudG91Y2hlc1swXSkscz1ET00ubW91c2VQb3ModGhpcy5fZWwsdC50b3VjaGVzWzFdKSxuPWUuYWRkKHMpLmRpdigyKSxvPWUuc3ViKHMpLGk9by5tYWcoKS90aGlzLl9zdGFydFZlYy5tYWcoKSxhPTE4MCpvLmFuZ2xlV2l0aCh0aGlzLl9zdGFydFZlYykvTWF0aC5QSSxyPXRoaXMuX21hcDtyLmVhc2VUbyh7em9vbTpyLnRyYW5zZm9ybS5zY2FsZVpvb20odGhpcy5fc3RhcnRTY2FsZSppKSxiZWFyaW5nOnRoaXMuX3N0YXJ0QmVhcmluZythLGR1cmF0aW9uOjAsYXJvdW5kOnIudW5wcm9qZWN0KG4pfSksdC5wcmV2ZW50RGVmYXVsdCgpfX0sX29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLnNuYXBUb05vcnRoKCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuX29uTW92ZSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5fb25FbmQpfX07XG59LHtcIi4uLy4uL3V0aWwvZG9tXCI6OTgsXCIuLi8uLi91dGlsL3V0aWxcIjoxMDZ9XSw4ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBTY3JvbGxab29tKGUpe3RoaXMuX21hcD1lLHRoaXMuX2VsPWUuZ2V0Q2FudmFzQ29udGFpbmVyKCksdXRpbC5iaW5kSGFuZGxlcnModGhpcyl9dmFyIERPTT1yZXF1aXJlKFwiLi4vLi4vdXRpbC9kb21cIiksYnJvd3Nlcj1yZXF1aXJlKFwiLi4vLi4vdXRpbC9icm93c2VyXCIpLHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKTttb2R1bGUuZXhwb3J0cz1TY3JvbGxab29tO3ZhciB1YT1cInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yP25hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTpcIlwiLGZpcmVmb3g9LTEhPT11YS5pbmRleE9mKFwiZmlyZWZveFwiKSxzYWZhcmk9LTEhPT11YS5pbmRleE9mKFwic2FmYXJpXCIpJiYtMT09PXVhLmluZGV4T2YoXCJjaHJvbVwiKTtTY3JvbGxab29tLnByb3RvdHlwZT17ZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsdGhpcy5fb25XaGVlbCwhMSksdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNld2hlZWxcIix0aGlzLl9vbldoZWVsLCExKX0sZGlzYWJsZTpmdW5jdGlvbigpe3RoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLHRoaXMuX29uV2hlZWwpLHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXdoZWVsXCIsdGhpcy5fb25XaGVlbCl9LF9vbldoZWVsOmZ1bmN0aW9uKGUpe3ZhciB0O1wid2hlZWxcIj09PWUudHlwZT8odD1lLmRlbHRhWSxmaXJlZm94JiZlLmRlbHRhTW9kZT09PXdpbmRvdy5XaGVlbEV2ZW50LkRPTV9ERUxUQV9QSVhFTCYmKHQvPWJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyksZS5kZWx0YU1vZGU9PT13aW5kb3cuV2hlZWxFdmVudC5ET01fREVMVEFfTElORSYmKHQqPTQwKSk6XCJtb3VzZXdoZWVsXCI9PT1lLnR5cGUmJih0PS1lLndoZWVsRGVsdGFZLHNhZmFyaSYmKHQvPTMpKTt2YXIgaT0od2luZG93LnBlcmZvcm1hbmNlfHxEYXRlKS5ub3coKSxvPWktKHRoaXMuX3RpbWV8fDApO3RoaXMuX3Bvcz1ET00ubW91c2VQb3ModGhpcy5fZWwsZSksdGhpcy5fdGltZT1pLDAhPT10JiZ0JTQuMDAwMjQ0MTQwNjI1PT09MD8odGhpcy5fdHlwZT1cIndoZWVsXCIsdD1NYXRoLmZsb29yKHQvNCkpOjAhPT10JiZNYXRoLmFicyh0KTw0P3RoaXMuX3R5cGU9XCJ0cmFja3BhZFwiOm8+NDAwPyh0aGlzLl90eXBlPW51bGwsdGhpcy5fbGFzdFZhbHVlPXQsdGhpcy5fdGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX29uVGltZW91dCw0MCkpOnRoaXMuX3R5cGV8fCh0aGlzLl90eXBlPU1hdGguYWJzKG8qdCk8MjAwP1widHJhY2twYWRcIjpcIndoZWVsXCIsdGhpcy5fdGltZW91dCYmKGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KSx0aGlzLl90aW1lb3V0PW51bGwsdCs9dGhpcy5fbGFzdFZhbHVlKSksZS5zaGlmdEtleSYmdCYmKHQvPTQpLHRoaXMuX3R5cGUmJnRoaXMuX3pvb20oLXQpLGUucHJldmVudERlZmF1bHQoKX0sX29uVGltZW91dDpmdW5jdGlvbigpe3RoaXMuX3R5cGU9XCJ3aGVlbFwiLHRoaXMuX3pvb20oLXRoaXMuX2xhc3RWYWx1ZSl9LF96b29tOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX21hcCxpPTIvKDErTWF0aC5leHAoLU1hdGguYWJzKGUvMTAwKSkpOzA+ZSYmMCE9PWkmJihpPTEvaSk7dmFyIG89dC5lYXNlP3QuZWFzZS50bzp0LnRyYW5zZm9ybS5zY2FsZSxzPXQudHJhbnNmb3JtLnNjYWxlWm9vbShvKmkpO3Quem9vbVRvKHMse2R1cmF0aW9uOjAsYXJvdW5kOnQudW5wcm9qZWN0KHRoaXMuX3Bvcyl9KX19O1xufSx7XCIuLi8uLi91dGlsL2Jyb3dzZXJcIjo5NSxcIi4uLy4uL3V0aWwvZG9tXCI6OTgsXCIuLi8uLi91dGlsL3V0aWxcIjoxMDZ9XSw4OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBIYXNoKCl7dXRpbC5iaW5kQWxsKFtcIl9vbkhhc2hDaGFuZ2VcIixcIl91cGRhdGVIYXNoXCJdLHRoaXMpfW1vZHVsZS5leHBvcnRzPUhhc2g7dmFyIHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKTtIYXNoLnByb3RvdHlwZT17YWRkVG86ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21hcD10LHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiaGFzaGNoYW5nZVwiLHRoaXMuX29uSGFzaENoYW5nZSwhMSksdGhpcy5fbWFwLm9uKFwibW92ZWVuZFwiLHRoaXMuX3VwZGF0ZUhhc2gpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImhhc2hjaGFuZ2VcIix0aGlzLl9vbkhhc2hDaGFuZ2UsITEpLHRoaXMuX21hcC5vZmYoXCJtb3ZlZW5kXCIsdGhpcy5fdXBkYXRlSGFzaCksZGVsZXRlIHRoaXMuX21hcCx0aGlzfSxfb25IYXNoQ2hhbmdlOmZ1bmN0aW9uKCl7dmFyIHQ9bG9jYXRpb24uaGFzaC5yZXBsYWNlKFwiI1wiLFwiXCIpLnNwbGl0KFwiL1wiKTtyZXR1cm4gdC5sZW5ndGg+PTM/KHRoaXMuX21hcC5qdW1wVG8oe2NlbnRlcjpbK3RbMl0sK3RbMV1dLHpvb206K3RbMF0sYmVhcmluZzorKHRbM118fDApfSksITApOiExfSxfdXBkYXRlSGFzaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5nZXRDZW50ZXIoKSxlPXRoaXMuX21hcC5nZXRab29tKCksYT10aGlzLl9tYXAuZ2V0QmVhcmluZygpLGg9TWF0aC5tYXgoMCxNYXRoLmNlaWwoTWF0aC5sb2coZSkvTWF0aC5MTjIpKSxuPVwiI1wiK01hdGgucm91bmQoMTAwKmUpLzEwMCtcIi9cIit0LmxhdC50b0ZpeGVkKGgpK1wiL1wiK3QubG5nLnRvRml4ZWQoaCkrKGE/XCIvXCIrTWF0aC5yb3VuZCgxMCphKS8xMDpcIlwiKTt3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoXCJcIixcIlwiLG4pfX07XG59LHtcIi4uL3V0aWwvdXRpbFwiOjEwNn1dLDkwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEludGVyYWN0aW9uKGUpe3RoaXMuX21hcD1lLHRoaXMuX2VsPWUuZ2V0Q2FudmFzQ29udGFpbmVyKCk7Zm9yKHZhciB0IGluIGhhbmRsZXJzKWVbdF09bmV3IGhhbmRsZXJzW3RdKGUpO3V0aWwuYmluZEhhbmRsZXJzKHRoaXMpfXZhciBoYW5kbGVycz17c2Nyb2xsWm9vbTpyZXF1aXJlKFwiLi9oYW5kbGVyL3Njcm9sbF96b29tXCIpLGJveFpvb206cmVxdWlyZShcIi4vaGFuZGxlci9ib3hfem9vbVwiKSxkcmFnUm90YXRlOnJlcXVpcmUoXCIuL2hhbmRsZXIvZHJhZ19yb3RhdGVcIiksZHJhZ1BhbjpyZXF1aXJlKFwiLi9oYW5kbGVyL2RyYWdfcGFuXCIpLGtleWJvYXJkOnJlcXVpcmUoXCIuL2hhbmRsZXIva2V5Ym9hcmRcIiksZG91YmxlQ2xpY2tab29tOnJlcXVpcmUoXCIuL2hhbmRsZXIvZGJsY2xpY2tfem9vbVwiKSxwaW5jaDpyZXF1aXJlKFwiLi9oYW5kbGVyL3BpbmNoXCIpfSxET009cmVxdWlyZShcIi4uL3V0aWwvZG9tXCIpLHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKTttb2R1bGUuZXhwb3J0cz1JbnRlcmFjdGlvbixJbnRlcmFjdGlvbi5wcm90b3R5cGU9e2VuYWJsZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX21hcC5vcHRpb25zLHQ9dGhpcy5fZWw7Zm9yKHZhciBuIGluIGhhbmRsZXJzKWVbbl0mJnRoaXMuX21hcFtuXS5lbmFibGUoKTt0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIix0aGlzLl9vbk1vdXNlRG93biwhMSksdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCwhMSksdC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLHRoaXMuX29uVG91Y2hTdGFydCwhMSksdC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0aGlzLl9vbkNsaWNrLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdXNlTW92ZSwhMSksdC5hZGRFdmVudExpc3RlbmVyKFwiZGJsY2xpY2tcIix0aGlzLl9vbkRibENsaWNrLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLHRoaXMuX29uQ29udGV4dE1lbnUsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fbWFwLm9wdGlvbnMsdD10aGlzLl9lbDtmb3IodmFyIG4gaW4gaGFuZGxlcnMpZVtuXSYmdGhpcy5fbWFwW25dLmRpc2FibGUoKTt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIix0aGlzLl9vbk1vdXNlRG93biksdC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCksdC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLHRoaXMuX29uVG91Y2hTdGFydCksdC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0aGlzLl9vbkNsaWNrKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdXNlTW92ZSksdC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZGJsY2xpY2tcIix0aGlzLl9vbkRibENsaWNrKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLHRoaXMuX29uQ29udGV4dE1lbnUpfSxfb25Nb3VzZURvd246ZnVuY3Rpb24oZSl7dGhpcy5fc3RhcnRQb3M9RE9NLm1vdXNlUG9zKHRoaXMuX2VsLGUpfSxfb25Nb3VzZVVwOmZ1bmN0aW9uKGUpeyF0aGlzLl9jb250ZXh0TWVudUZpcmVkfHx0aGlzLl9tYXAuZHJhZ1JvdGF0ZS5hY3RpdmV8fHRoaXMuX21hcC5kcmFnUGFuLmFjdGl2ZXx8dGhpcy5fZmlyZUV2ZW50KFwiY29udGV4dG1lbnVcIixlKSx0aGlzLl9jb250ZXh0TWVudUZpcmVkPW51bGx9LF9vblRvdWNoU3RhcnQ6ZnVuY3Rpb24oZSl7IWUudG91Y2hlc3x8ZS50b3VjaGVzLmxlbmd0aD4xfHwodGhpcy5fdGFwcGVkPyhjbGVhclRpbWVvdXQodGhpcy5fdGFwcGVkKSx0aGlzLl90YXBwZWQ9bnVsbCx0aGlzLl9maXJlRXZlbnQoXCJkYmxjbGlja1wiLGUpKTp0aGlzLl90YXBwZWQ9c2V0VGltZW91dCh0aGlzLl9vblRpbWVvdXQsMzAwKSl9LF9vblRpbWVvdXQ6ZnVuY3Rpb24oKXt0aGlzLl90YXBwZWQ9bnVsbH0sX29uTW91c2VNb3ZlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX21hcCxuPXRoaXMuX2VsO2lmKCF0LmRyYWdQYW4uYWN0aXZlJiYhdC5kcmFnUm90YXRlLmFjdGl2ZSl7Zm9yKHZhciBvPWUudG9FbGVtZW50fHxlLnRhcmdldDtvJiZvIT09bjspbz1vLnBhcmVudE5vZGU7bz09PW4mJnRoaXMuX2ZpcmVFdmVudChcIm1vdXNlbW92ZVwiLGUpfX0sX29uQ2xpY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9RE9NLm1vdXNlUG9zKHRoaXMuX2VsLGUpO3QuZXF1YWxzKHRoaXMuX3N0YXJ0UG9zKSYmdGhpcy5fZmlyZUV2ZW50KFwiY2xpY2tcIixlKX0sX29uRGJsQ2xpY2s6ZnVuY3Rpb24oZSl7dGhpcy5fZmlyZUV2ZW50KFwiZGJsY2xpY2tcIixlKSxlLnByZXZlbnREZWZhdWx0KCl9LF9vbkNvbnRleHRNZW51OmZ1bmN0aW9uKCl7dGhpcy5fY29udGV4dE1lbnVGaXJlZD0hMH0sX2ZpcmVFdmVudDpmdW5jdGlvbihlLHQpe3ZhciBuPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0KTt0aGlzLl9tYXAuZmlyZShlLHtsbmdMYXQ6dGhpcy5fbWFwLnVucHJvamVjdChuKSxwb2ludDpuLG9yaWdpbmFsRXZlbnQ6dH0pfX07XG59LHtcIi4uL3V0aWwvZG9tXCI6OTgsXCIuLi91dGlsL3V0aWxcIjoxMDYsXCIuL2hhbmRsZXIvYm94X3pvb21cIjo4MixcIi4vaGFuZGxlci9kYmxjbGlja196b29tXCI6ODMsXCIuL2hhbmRsZXIvZHJhZ19wYW5cIjo4NCxcIi4vaGFuZGxlci9kcmFnX3JvdGF0ZVwiOjg1LFwiLi9oYW5kbGVyL2tleWJvYXJkXCI6ODYsXCIuL2hhbmRsZXIvcGluY2hcIjo4NyxcIi4vaGFuZGxlci9zY3JvbGxfem9vbVwiOjg4fV0sOTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIENhbnZhcz1yZXF1aXJlKFwiLi4vdXRpbC9jYW52YXNcIiksdXRpbD1yZXF1aXJlKFwiLi4vdXRpbC91dGlsXCIpLGJyb3dzZXI9cmVxdWlyZShcIi4uL3V0aWwvYnJvd3NlclwiKSxFdmVudGVkPXJlcXVpcmUoXCIuLi91dGlsL2V2ZW50ZWRcIiksRE9NPXJlcXVpcmUoXCIuLi91dGlsL2RvbVwiKSxTdHlsZT1yZXF1aXJlKFwiLi4vc3R5bGUvc3R5bGVcIiksQW5pbWF0aW9uTG9vcD1yZXF1aXJlKFwiLi4vc3R5bGUvYW5pbWF0aW9uX2xvb3BcIiksUGFpbnRlcj1yZXF1aXJlKFwiLi4vcmVuZGVyL3BhaW50ZXJcIiksVHJhbnNmb3JtPXJlcXVpcmUoXCIuLi9nZW8vdHJhbnNmb3JtXCIpLEhhc2g9cmVxdWlyZShcIi4vaGFzaFwiKSxJbnRlcmFjdGlvbj1yZXF1aXJlKFwiLi9pbnRlcmFjdGlvblwiKSxDYW1lcmE9cmVxdWlyZShcIi4vY2FtZXJhXCIpLExuZ0xhdD1yZXF1aXJlKFwiLi4vZ2VvL2xuZ19sYXRcIiksTG5nTGF0Qm91bmRzPXJlcXVpcmUoXCIuLi9nZW8vbG5nX2xhdF9ib3VuZHNcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpLEF0dHJpYnV0aW9uPXJlcXVpcmUoXCIuL2NvbnRyb2wvYXR0cmlidXRpb25cIiksTWFwPW1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHQ9dGhpcy5vcHRpb25zPXV0aWwuaW5oZXJpdCh0aGlzLm9wdGlvbnMsdCksdGhpcy5hbmltYXRpb25Mb29wPW5ldyBBbmltYXRpb25Mb29wLHRoaXMudHJhbnNmb3JtPW5ldyBUcmFuc2Zvcm0odC5taW5ab29tLHQubWF4Wm9vbSksdC5tYXhCb3VuZHMpe3ZhciBlPUxuZ0xhdEJvdW5kcy5jb252ZXJ0KHQubWF4Qm91bmRzKTt0aGlzLnRyYW5zZm9ybS5sbmdSYW5nZT1bZS5nZXRXZXN0KCksZS5nZXRFYXN0KCldLHRoaXMudHJhbnNmb3JtLmxhdFJhbmdlPVtlLmdldFNvdXRoKCksZS5nZXROb3J0aCgpXX11dGlsLmJpbmRBbGwoW1wiX2ZvcndhcmRTdHlsZUV2ZW50XCIsXCJfZm9yd2FyZFNvdXJjZUV2ZW50XCIsXCJfZm9yd2FyZExheWVyRXZlbnRcIixcIl9mb3J3YXJkVGlsZUV2ZW50XCIsXCJfb25TdHlsZUxvYWRcIixcIl9vblN0eWxlQ2hhbmdlXCIsXCJfb25Tb3VyY2VBZGRcIixcIl9vblNvdXJjZVJlbW92ZVwiLFwiX29uU291cmNlVXBkYXRlXCIsXCJfb25XaW5kb3dSZXNpemVcIixcIm9uRXJyb3JcIixcInVwZGF0ZVwiLFwicmVuZGVyXCJdLHRoaXMpLHRoaXMuX3NldHVwQ29udGFpbmVyKCksdGhpcy5fc2V0dXBQYWludGVyKCksdGhpcy5vbihcIm1vdmVcIix0aGlzLnVwZGF0ZSksdGhpcy5vbihcInpvb21cIix0aGlzLnVwZGF0ZS5iaW5kKHRoaXMsITApKSx0aGlzLm9uKFwibW92ZWVuZFwiLGZ1bmN0aW9uKCl7dGhpcy5hbmltYXRpb25Mb29wLnNldCgzMDApLHRoaXMuX3JlcmVuZGVyKCl9LmJpbmQodGhpcykpLFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsdGhpcy5fb25XaW5kb3dSZXNpemUsITEpLHRoaXMuaW50ZXJhY3Rpb249bmV3IEludGVyYWN0aW9uKHRoaXMpLHQuaW50ZXJhY3RpdmUmJnRoaXMuaW50ZXJhY3Rpb24uZW5hYmxlKCksdGhpcy5faGFzaD10Lmhhc2gmJihuZXcgSGFzaCkuYWRkVG8odGhpcyksdGhpcy5faGFzaCYmdGhpcy5faGFzaC5fb25IYXNoQ2hhbmdlKCl8fHRoaXMuanVtcFRvKHQpLHRoaXMuc291cmNlcz17fSx0aGlzLnN0YWNrcz17fSx0aGlzLl9jbGFzc2VzPXt9LHRoaXMucmVzaXplKCksdC5jbGFzc2VzJiZ0aGlzLnNldENsYXNzZXModC5jbGFzc2VzKSx0LnN0eWxlJiZ0aGlzLnNldFN0eWxlKHQuc3R5bGUpLHQuYXR0cmlidXRpb25Db250cm9sJiZ0aGlzLmFkZENvbnRyb2wobmV3IEF0dHJpYnV0aW9uKSx0aGlzLm9uKFwic3R5bGUuZXJyb3JcIix0aGlzLm9uRXJyb3IpLHRoaXMub24oXCJzb3VyY2UuZXJyb3JcIix0aGlzLm9uRXJyb3IpLHRoaXMub24oXCJ0aWxlLmVycm9yXCIsdGhpcy5vbkVycm9yKX07dXRpbC5leHRlbmQoTWFwLnByb3RvdHlwZSxFdmVudGVkKSx1dGlsLmV4dGVuZChNYXAucHJvdG90eXBlLENhbWVyYS5wcm90b3R5cGUpLHV0aWwuZXh0ZW5kKE1hcC5wcm90b3R5cGUse29wdGlvbnM6e2NlbnRlcjpbMCwwXSx6b29tOjAsYmVhcmluZzowLHBpdGNoOjAsbWluWm9vbTowLG1heFpvb206MjAsaW50ZXJhY3RpdmU6ITAsc2Nyb2xsWm9vbTohMCxib3hab29tOiEwLGRyYWdSb3RhdGU6ITAsZHJhZ1BhbjohMCxrZXlib2FyZDohMCxkb3VibGVDbGlja1pvb206ITAscGluY2g6ITAsYmVhcmluZ1NuYXA6NyxoYXNoOiExLGF0dHJpYnV0aW9uQ29udHJvbDohMCxmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiExLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjohMX0sYWRkQ29udHJvbDpmdW5jdGlvbih0KXtyZXR1cm4gdC5hZGRUbyh0aGlzKSx0aGlzfSxhZGRDbGFzczpmdW5jdGlvbih0LGUpe3RoaXMuX2NsYXNzZXNbdF18fCh0aGlzLl9jbGFzc2VzW3RdPSEwLHRoaXMuc3R5bGUmJnRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3NlcyxlKSl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQsZSl7dGhpcy5fY2xhc3Nlc1t0XSYmKGRlbGV0ZSB0aGlzLl9jbGFzc2VzW3RdLHRoaXMuc3R5bGUmJnRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3NlcyxlKSl9LHNldENsYXNzZXM6ZnVuY3Rpb24odCxlKXt0aGlzLl9jbGFzc2VzPXt9O2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXRoaXMuX2NsYXNzZXNbdFtpXV09ITA7dGhpcy5zdHlsZSYmdGhpcy5zdHlsZS5fY2FzY2FkZSh0aGlzLl9jbGFzc2VzLGUpfSxoYXNDbGFzczpmdW5jdGlvbih0KXtyZXR1cm4hIXRoaXMuX2NsYXNzZXNbdF19LGdldENsYXNzZXM6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5fY2xhc3Nlcyl9LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTAsZT0wO3JldHVybiB0aGlzLl9jb250YWluZXImJih0PXRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aHx8NDAwLGU9dGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodHx8MzAwKSx0aGlzLl9jYW52YXMucmVzaXplKHQsZSksdGhpcy50cmFuc2Zvcm0ud2lkdGg9dCx0aGlzLnRyYW5zZm9ybS5oZWlnaHQ9ZSx0aGlzLnRyYW5zZm9ybS5fY29uc3RyYWluKCksdGhpcy5wYWludGVyLnJlc2l6ZSh0LGUpLHRoaXMuZmlyZShcIm1vdmVzdGFydFwiKS5maXJlKFwibW92ZVwiKS5maXJlKFwicmVzaXplXCIpLmZpcmUoXCJtb3ZlZW5kXCIpfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IExuZ0xhdEJvdW5kcyh0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKG5ldyBQb2ludCgwLDApKSx0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKHRoaXMudHJhbnNmb3JtLnNpemUpKX0scHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0ubG9jYXRpb25Qb2ludChMbmdMYXQuY29udmVydCh0KSl9LHVucHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihQb2ludC5jb252ZXJ0KHQpKX0sZmVhdHVyZXNBdDpmdW5jdGlvbih0LGUsaSl7dmFyIHI9dGhpcy51bnByb2plY3QodCkud3JhcCgpLHM9dGhpcy50cmFuc2Zvcm0ubG9jYXRpb25Db29yZGluYXRlKHIpO3JldHVybiB0aGlzLnN0eWxlLmZlYXR1cmVzQXQocyxlLGkpLHRoaXN9LGZlYXR1cmVzSW46ZnVuY3Rpb24odCxlLGkpe3JldHVyblwidW5kZWZpbmVkXCI9PXR5cGVvZiBpJiYoaT1lLGU9dCx0PVtQb2ludC5jb252ZXJ0KFswLDBdKSxQb2ludC5jb252ZXJ0KFt0aGlzLnRyYW5zZm9ybS53aWR0aCx0aGlzLnRyYW5zZm9ybS5oZWlnaHRdKV0pLHQ9dC5tYXAoUG9pbnQuY29udmVydC5iaW5kKFBvaW50KSksdD1bbmV3IFBvaW50KE1hdGgubWluKHRbMF0ueCx0WzFdLngpLE1hdGgubWluKHRbMF0ueSx0WzFdLnkpKSxuZXcgUG9pbnQoTWF0aC5tYXgodFswXS54LHRbMV0ueCksTWF0aC5tYXgodFswXS55LHRbMV0ueSkpXS5tYXAodGhpcy50cmFuc2Zvcm0ucG9pbnRDb29yZGluYXRlLmJpbmQodGhpcy50cmFuc2Zvcm0pKSx0aGlzLnN0eWxlLmZlYXR1cmVzSW4odCxlLGkpLHRoaXN9LGJhdGNoOmZ1bmN0aW9uKHQpe3RoaXMuc3R5bGUuYmF0Y2godCksdGhpcy5zdHlsZS5fY2FzY2FkZSh0aGlzLl9jbGFzc2VzKSx0aGlzLnVwZGF0ZSghMCl9LHNldFN0eWxlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0eWxlJiYodGhpcy5zdHlsZS5vZmYoXCJsb2FkXCIsdGhpcy5fb25TdHlsZUxvYWQpLm9mZihcImVycm9yXCIsdGhpcy5fZm9yd2FyZFN0eWxlRXZlbnQpLm9mZihcImNoYW5nZVwiLHRoaXMuX29uU3R5bGVDaGFuZ2UpLm9mZihcInNvdXJjZS5hZGRcIix0aGlzLl9vblNvdXJjZUFkZCkub2ZmKFwic291cmNlLnJlbW92ZVwiLHRoaXMuX29uU291cmNlUmVtb3ZlKS5vZmYoXCJzb3VyY2UubG9hZFwiLHRoaXMuX29uU291cmNlVXBkYXRlKS5vZmYoXCJzb3VyY2UuZXJyb3JcIix0aGlzLl9mb3J3YXJkU291cmNlRXZlbnQpLm9mZihcInNvdXJjZS5jaGFuZ2VcIix0aGlzLl9vblNvdXJjZVVwZGF0ZSkub2ZmKFwibGF5ZXIuYWRkXCIsdGhpcy5fZm9yd2FyZExheWVyRXZlbnQpLm9mZihcImxheWVyLnJlbW92ZVwiLHRoaXMuX2ZvcndhcmRMYXllckV2ZW50KS5vZmYoXCJ0aWxlLmFkZFwiLHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpLm9mZihcInRpbGUucmVtb3ZlXCIsdGhpcy5fZm9yd2FyZFRpbGVFdmVudCkub2ZmKFwidGlsZS5sb2FkXCIsdGhpcy51cGRhdGUpLm9mZihcInRpbGUuZXJyb3JcIix0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KS5vZmYoXCJ0aWxlLnN0YXRzXCIsdGhpcy5fZm9yd2FyZFRpbGVFdmVudCkuX3JlbW92ZSgpLHRoaXMub2ZmKFwicm90YXRlXCIsdGhpcy5zdHlsZS5fcmVkb1BsYWNlbWVudCksdGhpcy5vZmYoXCJwaXRjaFwiLHRoaXMuc3R5bGUuX3JlZG9QbGFjZW1lbnQpKSx0Pyh0IGluc3RhbmNlb2YgU3R5bGU/dGhpcy5zdHlsZT10OnRoaXMuc3R5bGU9bmV3IFN0eWxlKHQsdGhpcy5hbmltYXRpb25Mb29wKSx0aGlzLnN0eWxlLm9uKFwibG9hZFwiLHRoaXMuX29uU3R5bGVMb2FkKS5vbihcImVycm9yXCIsdGhpcy5fZm9yd2FyZFN0eWxlRXZlbnQpLm9uKFwiY2hhbmdlXCIsdGhpcy5fb25TdHlsZUNoYW5nZSkub24oXCJzb3VyY2UuYWRkXCIsdGhpcy5fb25Tb3VyY2VBZGQpLm9uKFwic291cmNlLnJlbW92ZVwiLHRoaXMuX29uU291cmNlUmVtb3ZlKS5vbihcInNvdXJjZS5sb2FkXCIsdGhpcy5fb25Tb3VyY2VVcGRhdGUpLm9uKFwic291cmNlLmVycm9yXCIsdGhpcy5fZm9yd2FyZFNvdXJjZUV2ZW50KS5vbihcInNvdXJjZS5jaGFuZ2VcIix0aGlzLl9vblNvdXJjZVVwZGF0ZSkub24oXCJsYXllci5hZGRcIix0aGlzLl9mb3J3YXJkTGF5ZXJFdmVudCkub24oXCJsYXllci5yZW1vdmVcIix0aGlzLl9mb3J3YXJkTGF5ZXJFdmVudCkub24oXCJ0aWxlLmFkZFwiLHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpLm9uKFwidGlsZS5yZW1vdmVcIix0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KS5vbihcInRpbGUubG9hZFwiLHRoaXMudXBkYXRlKS5vbihcInRpbGUuZXJyb3JcIix0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KS5vbihcInRpbGUuc3RhdHNcIix0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KSx0aGlzLm9uKFwicm90YXRlXCIsdGhpcy5zdHlsZS5fcmVkb1BsYWNlbWVudCksdGhpcy5vbihcInBpdGNoXCIsdGhpcy5zdHlsZS5fcmVkb1BsYWNlbWVudCksdGhpcyk6KHRoaXMuc3R5bGU9bnVsbCx0aGlzKX0sYWRkU291cmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc3R5bGUuYWRkU291cmNlKHQsZSksdGhpc30scmVtb3ZlU291cmNlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0eWxlLnJlbW92ZVNvdXJjZSh0KSx0aGlzfSxnZXRTb3VyY2U6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc3R5bGUuZ2V0U291cmNlKHQpfSxhZGRMYXllcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnN0eWxlLmFkZExheWVyKHQsZSksdGhpcy5zdHlsZS5fY2FzY2FkZSh0aGlzLl9jbGFzc2VzKSx0aGlzfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdHlsZS5yZW1vdmVMYXllcih0KSx0aGlzLnN0eWxlLl9jYXNjYWRlKHRoaXMuX2NsYXNzZXMpLHRoaXN9LHNldEZpbHRlcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnN0eWxlLnNldEZpbHRlcih0LGUpLHRoaXN9LHNldExheWVyWm9vbVJhbmdlOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5zdHlsZS5zZXRMYXllclpvb21SYW5nZSh0LGUsaSksdGhpc30sZ2V0RmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0eWxlLmdldEZpbHRlcih0KX0sc2V0UGFpbnRQcm9wZXJ0eTpmdW5jdGlvbih0LGUsaSxyKXtyZXR1cm4gdGhpcy5iYXRjaChmdW5jdGlvbihzKXtzLnNldFBhaW50UHJvcGVydHkodCxlLGkscil9KSx0aGlzfSxnZXRQYWludFByb3BlcnR5OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5zdHlsZS5nZXRQYWludFByb3BlcnR5KHQsZSxpKX0sc2V0TGF5b3V0UHJvcGVydHk6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmJhdGNoKGZ1bmN0aW9uKHIpe3Iuc2V0TGF5b3V0UHJvcGVydHkodCxlLGkpfSksdGhpc30sZ2V0TGF5b3V0UHJvcGVydHk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5zdHlsZS5nZXRMYXlvdXRQcm9wZXJ0eSh0LGUpfSxnZXRDb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyfSxnZXRDYW52YXNDb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2FudmFzQ29udGFpbmVyfSxnZXRDYW52YXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2FudmFzLmdldEVsZW1lbnQoKX0sX3NldHVwQ29udGFpbmVyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLmNvbnRhaW5lcixlPXRoaXMuX2NvbnRhaW5lcj1cInN0cmluZ1wiPT10eXBlb2YgdD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTp0O2UuY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLW1hcFwiKTt2YXIgaT10aGlzLl9jYW52YXNDb250YWluZXI9RE9NLmNyZWF0ZShcImRpdlwiLFwibWFwYm94Z2wtY2FudmFzLWNvbnRhaW5lclwiLGUpO3RoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZSYmaS5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtaW50ZXJhY3RpdmVcIiksdGhpcy5fY2FudmFzPW5ldyBDYW52YXModGhpcyxpKTt2YXIgcj1ET00uY3JlYXRlKFwiZGl2XCIsXCJtYXBib3hnbC1jb250cm9sLWNvbnRhaW5lclwiLGUpLHM9dGhpcy5fY29udHJvbENvcm5lcnM9e307W1widG9wLWxlZnRcIixcInRvcC1yaWdodFwiLFwiYm90dG9tLWxlZnRcIixcImJvdHRvbS1yaWdodFwiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3NbdF09RE9NLmNyZWF0ZShcImRpdlwiLFwibWFwYm94Z2wtY3RybC1cIit0LHIpfSl9LF9zZXR1cFBhaW50ZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jYW52YXMuZ2V0V2ViR0xDb250ZXh0KHtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OnRoaXMub3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0LHByZXNlcnZlRHJhd2luZ0J1ZmZlcjp0aGlzLm9wdGlvbnMucHJlc2VydmVEcmF3aW5nQnVmZmVyfSk7cmV0dXJuIHQ/dm9pZCh0aGlzLnBhaW50ZXI9bmV3IFBhaW50ZXIodCx0aGlzLnRyYW5zZm9ybSkpOnZvaWQgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIFdlYkdMXCIpfSxfY29udGV4dExvc3Q6ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZyYW1lSWQmJmJyb3dzZXIuY2FuY2VsRnJhbWUodGhpcy5fZnJhbWVJZCl9LF9jb250ZXh0UmVzdG9yZWQ6ZnVuY3Rpb24oKXt0aGlzLl9zZXR1cFBhaW50ZXIoKSx0aGlzLnJlc2l6ZSgpLHRoaXMudXBkYXRlKCl9LGxvYWRlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdHlsZURpcnR5fHx0aGlzLl9zb3VyY2VzRGlydHk/ITE6dGhpcy5zdHlsZSYmIXRoaXMuc3R5bGUubG9hZGVkKCk/ITE6ITB9LHVwZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdHlsZT8odGhpcy5fc3R5bGVEaXJ0eT10aGlzLl9zdHlsZURpcnR5fHx0LHRoaXMuX3NvdXJjZXNEaXJ0eT0hMCx0aGlzLl9yZXJlbmRlcigpLHRoaXMpOnRoaXN9LHJlbmRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0eWxlJiZ0aGlzLl9zdHlsZURpcnR5JiYodGhpcy5fc3R5bGVEaXJ0eT0hMSx0aGlzLnN0eWxlLl9yZWNhbGN1bGF0ZSh0aGlzLnRyYW5zZm9ybS56b29tKSksdGhpcy5zdHlsZSYmdGhpcy5fc291cmNlc0RpcnR5JiYhdGhpcy5fc291cmNlc0RpcnR5VGltZW91dCYmKHRoaXMuX3NvdXJjZXNEaXJ0eT0hMSx0aGlzLl9zb3VyY2VzRGlydHlUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl9zb3VyY2VzRGlydHlUaW1lb3V0PW51bGx9LmJpbmQodGhpcyksNTApLHRoaXMuc3R5bGUuX3VwZGF0ZVNvdXJjZXModGhpcy50cmFuc2Zvcm0pKSx0aGlzLnBhaW50ZXIucmVuZGVyKHRoaXMuc3R5bGUse2RlYnVnOnRoaXMuZGVidWcsdmVydGljZXM6dGhpcy52ZXJ0aWNlcyxyb3RhdGluZzp0aGlzLnJvdGF0aW5nLHpvb21pbmc6dGhpcy56b29taW5nfSksdGhpcy5maXJlKFwicmVuZGVyXCIpLHRoaXMubG9hZGVkKCkmJiF0aGlzLl9sb2FkZWQmJih0aGlzLl9sb2FkZWQ9ITAsdGhpcy5maXJlKFwibG9hZFwiKSksdGhpcy5fZnJhbWVJZD1udWxsLHRoaXMuYW5pbWF0aW9uTG9vcC5zdG9wcGVkKCl8fCh0aGlzLl9zdHlsZURpcnR5PSEwKSwodGhpcy5fc291cmNlc0RpcnR5fHx0aGlzLl9yZXBhaW50fHwhdGhpcy5hbmltYXRpb25Mb29wLnN0b3BwZWQoKSkmJnRoaXMuX3JlcmVuZGVyKCksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc2gmJnRoaXMuX2hhc2gucmVtb3ZlKCksYnJvd3Nlci5jYW5jZWxGcmFtZSh0aGlzLl9mcmFtZUlkKSxjbGVhclRpbWVvdXQodGhpcy5fc291cmNlc0RpcnR5VGltZW91dCksdGhpcy5zZXRTdHlsZShudWxsKSxcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHRoaXMuX29uV2luZG93UmVzaXplLCExKSx0aGlzfSxvbkVycm9yOmZ1bmN0aW9uKHQpe2NvbnNvbGUuZXJyb3IodC5lcnJvcil9LF9yZXJlbmRlcjpmdW5jdGlvbigpe3RoaXMuc3R5bGUmJiF0aGlzLl9mcmFtZUlkJiYodGhpcy5fZnJhbWVJZD1icm93c2VyLmZyYW1lKHRoaXMucmVuZGVyKSl9LF9mb3J3YXJkU3R5bGVFdmVudDpmdW5jdGlvbih0KXt0aGlzLmZpcmUoXCJzdHlsZS5cIit0LnR5cGUsdXRpbC5leHRlbmQoe3N0eWxlOnQudGFyZ2V0fSx0KSl9LF9mb3J3YXJkU291cmNlRXZlbnQ6ZnVuY3Rpb24odCl7dGhpcy5maXJlKHQudHlwZSx1dGlsLmV4dGVuZCh7c3R5bGU6dC50YXJnZXR9LHQpKX0sX2ZvcndhcmRMYXllckV2ZW50OmZ1bmN0aW9uKHQpe3RoaXMuZmlyZSh0LnR5cGUsdXRpbC5leHRlbmQoe3N0eWxlOnQudGFyZ2V0fSx0KSl9LF9mb3J3YXJkVGlsZUV2ZW50OmZ1bmN0aW9uKHQpe3RoaXMuZmlyZSh0LnR5cGUsdXRpbC5leHRlbmQoe3N0eWxlOnQudGFyZ2V0fSx0KSl9LF9vblN0eWxlTG9hZDpmdW5jdGlvbih0KXt2YXIgZT1uZXcgVHJhbnNmb3JtLGk9dGhpcy50cmFuc2Zvcm07aS5jZW50ZXIubG5nPT09ZS5jZW50ZXIubG5nJiZpLmNlbnRlci5sYXQ9PT1lLmNlbnRlci5sYXQmJmkuem9vbT09PWUuem9vbSYmaS5iZWFyaW5nPT09ZS5iZWFyaW5nJiZpLnBpdGNoPT09ZS5waXRjaCYmdGhpcy5qdW1wVG8odGhpcy5zdHlsZS5zdHlsZXNoZWV0KSx0aGlzLnN0eWxlLl9jYXNjYWRlKHRoaXMuX2NsYXNzZXMse3RyYW5zaXRpb246ITF9KSx0aGlzLl9mb3J3YXJkU3R5bGVFdmVudCh0KX0sX29uU3R5bGVDaGFuZ2U6ZnVuY3Rpb24odCl7dGhpcy51cGRhdGUoITApLHRoaXMuX2ZvcndhcmRTdHlsZUV2ZW50KHQpfSxfb25Tb3VyY2VBZGQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5zb3VyY2U7ZS5vbkFkZCYmZS5vbkFkZCh0aGlzKSx0aGlzLl9mb3J3YXJkU291cmNlRXZlbnQodCl9LF9vblNvdXJjZVJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10LnNvdXJjZTtlLm9uUmVtb3ZlJiZlLm9uUmVtb3ZlKHRoaXMpLHRoaXMuX2ZvcndhcmRTb3VyY2VFdmVudCh0KX0sX29uU291cmNlVXBkYXRlOmZ1bmN0aW9uKHQpe3RoaXMudXBkYXRlKCksdGhpcy5fZm9yd2FyZFNvdXJjZUV2ZW50KHQpfSxfb25XaW5kb3dSZXNpemU6ZnVuY3Rpb24oKXt0aGlzLnN0b3AoKS5yZXNpemUoKS51cGRhdGUoKX19KSx1dGlsLmV4dGVuZEFsbChNYXAucHJvdG90eXBlLHtfZGVidWc6ITEsZ2V0IGRlYnVnKCl7cmV0dXJuIHRoaXMuX2RlYnVnfSxzZXQgZGVidWcodCl7dGhpcy5fZGVidWc9dCx0aGlzLnVwZGF0ZSgpfSxfY29sbGlzaW9uRGVidWc6ITEsZ2V0IGNvbGxpc2lvbkRlYnVnKCl7cmV0dXJuIHRoaXMuX2NvbGxpc2lvbkRlYnVnfSxzZXQgY29sbGlzaW9uRGVidWcodCl7dGhpcy5fY29sbGlzaW9uRGVidWc9dCx0aGlzLnN0eWxlLl9yZWRvUGxhY2VtZW50KCl9LF9yZXBhaW50OiExLGdldCByZXBhaW50KCl7cmV0dXJuIHRoaXMuX3JlcGFpbnR9LHNldCByZXBhaW50KHQpe3RoaXMuX3JlcGFpbnQ9dCx0aGlzLnVwZGF0ZSgpfSxfdmVydGljZXM6ITEsZ2V0IHZlcnRpY2VzKCl7cmV0dXJuIHRoaXMuX3ZlcnRpY2VzfSxzZXQgdmVydGljZXModCl7dGhpcy5fdmVydGljZXM9dCx0aGlzLnVwZGF0ZSgpfX0pO1xufSx7XCIuLi9nZW8vbG5nX2xhdFwiOjIwLFwiLi4vZ2VvL2xuZ19sYXRfYm91bmRzXCI6MjEsXCIuLi9nZW8vdHJhbnNmb3JtXCI6MjIsXCIuLi9yZW5kZXIvcGFpbnRlclwiOjM3LFwiLi4vc3R5bGUvYW5pbWF0aW9uX2xvb3BcIjo1MSxcIi4uL3N0eWxlL3N0eWxlXCI6NTYsXCIuLi91dGlsL2Jyb3dzZXJcIjo5NSxcIi4uL3V0aWwvY2FudmFzXCI6OTYsXCIuLi91dGlsL2RvbVwiOjk4LFwiLi4vdXRpbC9ldmVudGVkXCI6MTAwLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9jYW1lcmFcIjo3OCxcIi4vY29udHJvbC9hdHRyaWJ1dGlvblwiOjc5LFwiLi9oYXNoXCI6ODksXCIuL2ludGVyYWN0aW9uXCI6OTAsXCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDkyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFBvcHVwKHQpe3V0aWwuc2V0T3B0aW9ucyh0aGlzLHQpLHV0aWwuYmluZEFsbChbXCJfdXBkYXRlUG9zaXRpb25cIixcIl9vbkNsaWNrQ2xvc2VcIl0sdGhpcyl9bW9kdWxlLmV4cG9ydHM9UG9wdXA7dmFyIHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKSxFdmVudGVkPXJlcXVpcmUoXCIuLi91dGlsL2V2ZW50ZWRcIiksRE9NPXJlcXVpcmUoXCIuLi91dGlsL2RvbVwiKSxMbmdMYXQ9cmVxdWlyZShcIi4uL2dlby9sbmdfbGF0XCIpO1BvcHVwLnByb3RvdHlwZT11dGlsLmluaGVyaXQoRXZlbnRlZCx7b3B0aW9uczp7Y2xvc2VCdXR0b246ITAsY2xvc2VPbkNsaWNrOiEwfSxhZGRUbzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwPXQsdGhpcy5fbWFwLm9uKFwibW92ZVwiLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKSx0aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrJiZ0aGlzLl9tYXAub24oXCJjbGlja1wiLHRoaXMuX29uQ2xpY2tDbG9zZSksdGhpcy5fdXBkYXRlKCksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRhaW5lciYmdGhpcy5fY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fY29udGFpbmVyKSx0aGlzLl9tYXAmJih0aGlzLl9tYXAub2ZmKFwibW92ZVwiLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKSx0aGlzLl9tYXAub2ZmKFwiY2xpY2tcIix0aGlzLl9vbkNsaWNrQ2xvc2UpLGRlbGV0ZSB0aGlzLl9tYXApLHRoaXN9LGdldExuZ0xhdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sbmdMYXR9LHNldExuZ0xhdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbG5nTGF0PUxuZ0xhdC5jb252ZXJ0KHQpLHRoaXMuX3VwZGF0ZSgpLHRoaXN9LHNldFRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NvbnRlbnQ9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodCksdGhpcy5fdXBkYXRlQ29udGVudCgpLHRoaXN9LHNldEhUTUw6ZnVuY3Rpb24odCl7dGhpcy5fY29udGVudD1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7dmFyIGksZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYm9keVwiKTtmb3IoZS5pbm5lckhUTUw9dDs7KXtpZihpPWUuZmlyc3RDaGlsZCwhaSlicmVhazt0aGlzLl9jb250ZW50LmFwcGVuZENoaWxkKGkpfXJldHVybiB0aGlzLl91cGRhdGVDb250ZW50KCksdGhpc30sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX21hcCYmKHRoaXMuX2NvbnRhaW5lcnx8KHRoaXMuX2NvbnRhaW5lcj1ET00uY3JlYXRlKFwiZGl2XCIsXCJtYXBib3hnbC1wb3B1cFwiLHRoaXMuX21hcC5nZXRDb250YWluZXIoKSksdGhpcy5fdGlwPURPTS5jcmVhdGUoXCJkaXZcIixcIm1hcGJveGdsLXBvcHVwLXRpcFwiLHRoaXMuX2NvbnRhaW5lciksdGhpcy5fd3JhcHBlcj1ET00uY3JlYXRlKFwiZGl2XCIsXCJtYXBib3hnbC1wb3B1cC1jb250ZW50XCIsdGhpcy5fY29udGFpbmVyKSx0aGlzLm9wdGlvbnMuY2xvc2VCdXR0b24mJih0aGlzLl9jbG9zZUJ1dHRvbj1ET00uY3JlYXRlKFwiYnV0dG9uXCIsXCJtYXBib3hnbC1wb3B1cC1jbG9zZS1idXR0b25cIix0aGlzLl93cmFwcGVyKSx0aGlzLl9jbG9zZUJ1dHRvbi5pbm5lckhUTUw9XCImIzIxNTtcIix0aGlzLl9jbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0aGlzLl9vbkNsaWNrQ2xvc2UpKSksdGhpcy5fdXBkYXRlQ29udGVudCgpLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCkpfSxfdXBkYXRlQ29udGVudDpmdW5jdGlvbigpe2lmKHRoaXMuX2NvbnRlbnQmJnRoaXMuX2NvbnRhaW5lcil7Zm9yKHZhciB0PXRoaXMuX3dyYXBwZXI7dC5oYXNDaGlsZE5vZGVzKCk7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTt0aGlzLm9wdGlvbnMuY2xvc2VCdXR0b24mJnQuYXBwZW5kQ2hpbGQodGhpcy5fY2xvc2VCdXR0b24pLHQuYXBwZW5kQ2hpbGQodGhpcy5fY29udGVudCl9fSxfdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzLl9sbmdMYXQmJnRoaXMuX2NvbnRhaW5lcil7dmFyIHQ9dGhpcy5fbWFwLnByb2plY3QodGhpcy5fbG5nTGF0KS5yb3VuZCgpLGk9dGhpcy5vcHRpb25zLmFuY2hvcjtpZighaSl7dmFyIGU9dGhpcy5fY29udGFpbmVyLm9mZnNldFdpZHRoLG89dGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodDtpPXQueTxvP1tcInRvcFwiXTp0Lnk+dGhpcy5fbWFwLnRyYW5zZm9ybS5oZWlnaHQtbz9bXCJib3R0b21cIl06W10sdC54PGUvMj9pLnB1c2goXCJsZWZ0XCIpOnQueD50aGlzLl9tYXAudHJhbnNmb3JtLndpZHRoLWUvMiYmaS5wdXNoKFwicmlnaHRcIiksaT0wPT09aS5sZW5ndGg/XCJib3R0b21cIjppLmpvaW4oXCItXCIpLHRoaXMub3B0aW9ucy5hbmNob3I9aX12YXIgbj17dG9wOlwidHJhbnNsYXRlKC01MCUsMClcIixcInRvcC1sZWZ0XCI6XCJ0cmFuc2xhdGUoMCwwKVwiLFwidG9wLXJpZ2h0XCI6XCJ0cmFuc2xhdGUoLTEwMCUsMClcIixib3R0b206XCJ0cmFuc2xhdGUoLTUwJSwtMTAwJSlcIixcImJvdHRvbS1sZWZ0XCI6XCJ0cmFuc2xhdGUoMCwtMTAwJSlcIixcImJvdHRvbS1yaWdodFwiOlwidHJhbnNsYXRlKC0xMDAlLC0xMDAlKVwiLGxlZnQ6XCJ0cmFuc2xhdGUoMCwtNTAlKVwiLHJpZ2h0OlwidHJhbnNsYXRlKC0xMDAlLC01MCUpXCJ9LHM9dGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdDtmb3IodmFyIGEgaW4gbilzLnJlbW92ZShcIm1hcGJveGdsLXBvcHVwLWFuY2hvci1cIithKTtzLmFkZChcIm1hcGJveGdsLXBvcHVwLWFuY2hvci1cIitpKSxET00uc2V0VHJhbnNmb3JtKHRoaXMuX2NvbnRhaW5lcixuW2ldK1wiIHRyYW5zbGF0ZShcIit0LngrXCJweCxcIit0LnkrXCJweClcIil9fSxfb25DbGlja0Nsb3NlOmZ1bmN0aW9uKCl7dGhpcy5yZW1vdmUoKX19KTtcbn0se1wiLi4vZ2VvL2xuZ19sYXRcIjoyMCxcIi4uL3V0aWwvZG9tXCI6OTgsXCIuLi91dGlsL2V2ZW50ZWRcIjoxMDAsXCIuLi91dGlsL3V0aWxcIjoxMDZ9XSw5MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBBY3Rvcih0LGUpe3RoaXMudGFyZ2V0PXQsdGhpcy5wYXJlbnQ9ZSx0aGlzLmNhbGxiYWNrcz17fSx0aGlzLmNhbGxiYWNrSUQ9MCx0aGlzLnJlY2VpdmU9dGhpcy5yZWNlaXZlLmJpbmQodGhpcyksdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIix0aGlzLnJlY2VpdmUsITEpfW1vZHVsZS5leHBvcnRzPUFjdG9yLEFjdG9yLnByb3RvdHlwZS5yZWNlaXZlPWZ1bmN0aW9uKHQpe3ZhciBlLHM9dC5kYXRhO2lmKFwiPHJlc3BvbnNlPlwiPT09cy50eXBlKWU9dGhpcy5jYWxsYmFja3Nbcy5pZF0sZGVsZXRlIHRoaXMuY2FsbGJhY2tzW3MuaWRdLGUocy5lcnJvcnx8bnVsbCxzLmRhdGEpO2Vsc2UgaWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHMuaWQpe3ZhciBpPXMuaWQ7dGhpcy5wYXJlbnRbcy50eXBlXShzLmRhdGEsZnVuY3Rpb24odCxlLHMpe3RoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6XCI8cmVzcG9uc2U+XCIsaWQ6U3RyaW5nKGkpLGVycm9yOnQ/U3RyaW5nKHQpOm51bGwsZGF0YTplfSxzKX0uYmluZCh0aGlzKSl9ZWxzZSB0aGlzLnBhcmVudFtzLnR5cGVdKHMuZGF0YSl9LEFjdG9yLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKHQsZSxzLGkpe3ZhciBhPW51bGw7cyYmKHRoaXMuY2FsbGJhY2tzW2E9dGhpcy5jYWxsYmFja0lEKytdPXMpLHRoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6dCxpZDpTdHJpbmcoYSksZGF0YTplfSxpKX0sQWN0b3IucHJvdG90eXBlLnBvc3RNZXNzYWdlPWZ1bmN0aW9uKHQsZSl7dHJ5e3RoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKHQsZSl9Y2F0Y2gocyl7dGhpcy50YXJnZXQucG9zdE1lc3NhZ2UodCl9fTtcbn0se31dLDk0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHNhbWVPcmlnaW4oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7cmV0dXJuIHQuaHJlZj1lLHQucHJvdG9jb2w9PT1kb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCYmdC5ob3N0PT09ZG9jdW1lbnQubG9jYXRpb24uaG9zdH1leHBvcnRzLmdldEpTT049ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIG4ub3BlbihcIkdFVFwiLGUsITApLG4uc2V0UmVxdWVzdEhlYWRlcihcIkFjY2VwdFwiLFwiYXBwbGljYXRpb24vanNvblwiKSxuLm9uZXJyb3I9ZnVuY3Rpb24oZSl7dChlKX0sbi5vbmxvYWQ9ZnVuY3Rpb24oKXtpZihuLnN0YXR1cz49MjAwJiZuLnN0YXR1czwzMDAmJm4ucmVzcG9uc2Upe3ZhciBlO3RyeXtlPUpTT04ucGFyc2Uobi5yZXNwb25zZSl9Y2F0Y2gocil7cmV0dXJuIHQocil9dChudWxsLGUpfWVsc2UgdChuZXcgRXJyb3Iobi5zdGF0dXNUZXh0KSl9LG4uc2VuZCgpLG59LGV4cG9ydHMuZ2V0QXJyYXlCdWZmZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIG4ub3BlbihcIkdFVFwiLGUsITApLG4ucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIixuLm9uZXJyb3I9ZnVuY3Rpb24oZSl7dChlKX0sbi5vbmxvYWQ9ZnVuY3Rpb24oKXtuLnN0YXR1cz49MjAwJiZuLnN0YXR1czwzMDAmJm4ucmVzcG9uc2U/dChudWxsLG4ucmVzcG9uc2UpOnQobmV3IEVycm9yKG4uc3RhdHVzVGV4dCkpfSxuLnNlbmQoKSxufSxleHBvcnRzLmdldEltYWdlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGV4cG9ydHMuZ2V0QXJyYXlCdWZmZXIoZSxmdW5jdGlvbihlLG4pe2UmJnQoZSk7dmFyIHI9bmV3IEltYWdlO3Iub25sb2FkPWZ1bmN0aW9uKCl7dChudWxsLHIpLCh3aW5kb3cuVVJMfHx3aW5kb3cud2Via2l0VVJMKS5yZXZva2VPYmplY3RVUkwoci5zcmMpfTt2YXIgbz1uZXcgQmxvYihbbmV3IFVpbnQ4QXJyYXkobildLHt0eXBlOlwiaW1hZ2UvcG5nXCJ9KTtyZXR1cm4gci5zcmM9KHdpbmRvdy5VUkx8fHdpbmRvdy53ZWJraXRVUkwpLmNyZWF0ZU9iamVjdFVSTChvKSxyLmdldERhdGE9ZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHQ9ZS5nZXRDb250ZXh0KFwiMmRcIik7cmV0dXJuIGUud2lkdGg9ci53aWR0aCxlLmhlaWdodD1yLmhlaWdodCx0LmRyYXdJbWFnZShyLDAsMCksdC5nZXRJbWFnZURhdGEoMCwwLHIud2lkdGgsci5oZWlnaHQpLmRhdGF9LHJ9KX0sZXhwb3J0cy5nZXRWaWRlbz1mdW5jdGlvbihlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ2aWRlb1wiKTtuLm9ubG9hZHN0YXJ0PWZ1bmN0aW9uKCl7dChudWxsLG4pfTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNvdXJjZVwiKTtzYW1lT3JpZ2luKGVbcl0pfHwobi5jcm9zc09yaWdpbj1cIkFub255bW91c1wiKSxvLnNyYz1lW3JdLG4uYXBwZW5kQ2hpbGQobyl9cmV0dXJuIG4uZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiBufSxufTtcbn0se31dLDk1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBDYW52YXM9cmVxdWlyZShcIi4vY2FudmFzXCIpLGZyYW1lPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZTtleHBvcnRzLmZyYW1lPWZ1bmN0aW9uKGUpe3JldHVybiBmcmFtZShlKX07dmFyIGNhbmNlbD13aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNDYW5jZWxBbmltYXRpb25GcmFtZTtleHBvcnRzLmNhbmNlbEZyYW1lPWZ1bmN0aW9uKGUpe2NhbmNlbChlKX0sZXhwb3J0cy50aW1lZD1mdW5jdGlvbihlLHIsdCl7ZnVuY3Rpb24gbihhKXtvfHwod2luZG93LnBlcmZvcm1hbmNlfHwoYT1EYXRlLm5vdygpKSxhPj1pK3I/ZS5jYWxsKHQsMSk6KGUuY2FsbCh0LChhLWkpL3IpLGV4cG9ydHMuZnJhbWUobikpKX1pZighcilyZXR1cm4gZS5jYWxsKHQsMSksbnVsbDt2YXIgbz0hMSxpPXdpbmRvdy5wZXJmb3JtYW5jZT93aW5kb3cucGVyZm9ybWFuY2Uubm93KCk6RGF0ZS5ub3coKTtyZXR1cm4gZXhwb3J0cy5mcmFtZShuKSxmdW5jdGlvbigpe289ITB9fSxleHBvcnRzLnN1cHBvcnRlZD1mdW5jdGlvbihlKXtmb3IodmFyIHI9KFtmdW5jdGlvbigpe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3d9LGZ1bmN0aW9uKCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGRvY3VtZW50fSxmdW5jdGlvbigpe3JldHVybiEhKEFycmF5LnByb3RvdHlwZSYmQXJyYXkucHJvdG90eXBlLmV2ZXJ5JiZBcnJheS5wcm90b3R5cGUuZmlsdGVyJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaCYmQXJyYXkucHJvdG90eXBlLmluZGV4T2YmJkFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZiYmQXJyYXkucHJvdG90eXBlLm1hcCYmQXJyYXkucHJvdG90eXBlLnNvbWUmJkFycmF5LnByb3RvdHlwZS5yZWR1Y2UmJkFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodCYmQXJyYXkuaXNBcnJheSl9LGZ1bmN0aW9uKCl7cmV0dXJuISghRnVuY3Rpb24ucHJvdG90eXBlfHwhRnVuY3Rpb24ucHJvdG90eXBlLmJpbmR8fCEoT2JqZWN0LmtleXMmJk9iamVjdC5jcmVhdGUmJk9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMmJk9iamVjdC5pc1NlYWxlZCYmT2JqZWN0LmlzRnJvemVuJiZPYmplY3QuaXNFeHRlbnNpYmxlJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJiZPYmplY3QuZGVmaW5lUHJvcGVydHkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzJiZPYmplY3Quc2VhbCYmT2JqZWN0LmZyZWV6ZSYmT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKSl9LGZ1bmN0aW9uKCl7cmV0dXJuXCJKU09OXCJpbiB3aW5kb3cmJlwicGFyc2VcImluIEpTT04mJlwic3RyaW5naWZ5XCJpbiBKU09OfSxmdW5jdGlvbigpe3JldHVybihuZXcgQ2FudmFzKS5zdXBwb3J0c1dlYkdMQ29udGV4dChlJiZlLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXR8fCExKX0sZnVuY3Rpb24oKXtyZXR1cm5cIldvcmtlclwiaW4gd2luZG93fV0pLHQ9MDt0PHIubGVuZ3RoO3QrKylpZighclt0XSgpKXJldHVybiExO3JldHVybiEwfSxleHBvcnRzLmhhcmR3YXJlQ29uY3VycmVuY3k9bmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3l8fDgsT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsXCJkZXZpY2VQaXhlbFJhdGlvXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb319KTtcbn0se1wiLi9jYW52YXNcIjo5Nn1dLDk2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIENhbnZhcyh0LGUpe3RoaXMuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiksdCYmZSYmKHRoaXMuY2FudmFzLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIix0aGlzLmNhbnZhcy5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtY2FudmFzXCIpLHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJ3ZWJnbGNvbnRleHRsb3N0XCIsdC5fY29udGV4dExvc3QuYmluZCh0KSwhMSksdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmdsY29udGV4dHJlc3RvcmVkXCIsdC5fY29udGV4dFJlc3RvcmVkLmJpbmQodCksITEpLHRoaXMuY2FudmFzLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsMCksZS5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcykpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsXCIpO21vZHVsZS5leHBvcnRzPUNhbnZhcyxDYW52YXMucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUpe3ZhciBhPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxO3RoaXMuY2FudmFzLndpZHRoPWEqdCx0aGlzLmNhbnZhcy5oZWlnaHQ9YSplLHRoaXMuY2FudmFzLnN0eWxlLndpZHRoPXQrXCJweFwiLHRoaXMuY2FudmFzLnN0eWxlLmhlaWdodD1lK1wicHhcIn07dmFyIHJlcXVpcmVkQ29udGV4dEF0dHJpYnV0ZXM9e2FudGlhbGlhczohMSxhbHBoYTohMCxzdGVuY2lsOiEwLGRlcHRoOiExfTtDYW52YXMucHJvdG90eXBlLmdldFdlYkdMQ29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gdD11dGlsLmV4dGVuZCh7fSx0LHJlcXVpcmVkQ29udGV4dEF0dHJpYnV0ZXMpLHRoaXMuY2FudmFzLmdldENvbnRleHQoXCJ3ZWJnbFwiLHQpfHx0aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiZXhwZXJpbWVudGFsLXdlYmdsXCIsdCl9LENhbnZhcy5wcm90b3R5cGUuc3VwcG9ydHNXZWJHTENvbnRleHQ9ZnVuY3Rpb24odCl7dmFyIGU9dXRpbC5leHRlbmQoe2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6dH0scmVxdWlyZWRDb250ZXh0QXR0cmlidXRlcyk7cmV0dXJuXCJwcm9iYWJseVN1cHBvcnRzQ29udGV4dFwiaW4gdGhpcy5jYW52YXM/dGhpcy5jYW52YXMucHJvYmFibHlTdXBwb3J0c0NvbnRleHQoXCJ3ZWJnbFwiLGUpfHx0aGlzLmNhbnZhcy5wcm9iYWJseVN1cHBvcnRzQ29udGV4dChcImV4cGVyaW1lbnRhbC13ZWJnbFwiLGUpOlwic3VwcG9ydHNDb250ZXh0XCJpbiB0aGlzLmNhbnZhcz90aGlzLmNhbnZhcy5zdXBwb3J0c0NvbnRleHQoXCJ3ZWJnbFwiLGUpfHx0aGlzLmNhbnZhcy5zdXBwb3J0c0NvbnRleHQoXCJleHBlcmltZW50YWwtd2ViZ2xcIixlKTohIXdpbmRvdy5XZWJHTFJlbmRlcmluZ0NvbnRleHQmJiEhdGhpcy5nZXRXZWJHTENvbnRleHQodCl9LENhbnZhcy5wcm90b3R5cGUuZ2V0RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbnZhc307XG59LHtcIi4uL3V0aWxcIjoxMDZ9XSw5NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBEaXNwYXRjaGVyKHIsdCl7dGhpcy5hY3RvcnM9W10sdGhpcy5jdXJyZW50QWN0b3I9MDtmb3IodmFyIGU9MDtyPmU7ZSsrKXt2YXIgbz1uZXcgV2ViV29ya2lmeShyZXF1aXJlKFwiLi4vLi4vc291cmNlL3dvcmtlclwiKSkscz1uZXcgQWN0b3Iobyx0KTtzLm5hbWU9XCJXb3JrZXIgXCIrZSx0aGlzLmFjdG9ycy5wdXNoKHMpfX12YXIgQWN0b3I9cmVxdWlyZShcIi4uL2FjdG9yXCIpLFdlYldvcmtpZnk9cmVxdWlyZShcIndlYndvcmtpZnlcIik7bW9kdWxlLmV4cG9ydHM9RGlzcGF0Y2hlcixEaXNwYXRjaGVyLnByb3RvdHlwZT17YnJvYWRjYXN0OmZ1bmN0aW9uKHIsdCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmFjdG9ycy5sZW5ndGg7ZSsrKXRoaXMuYWN0b3JzW2VdLnNlbmQocix0KX0sc2VuZDpmdW5jdGlvbihyLHQsZSxvLHMpe3JldHVybihcIm51bWJlclwiIT10eXBlb2Ygb3x8aXNOYU4obykpJiYobz10aGlzLmN1cnJlbnRBY3Rvcj0odGhpcy5jdXJyZW50QWN0b3IrMSkldGhpcy5hY3RvcnMubGVuZ3RoKSx0aGlzLmFjdG9yc1tvXS5zZW5kKHIsdCxlLHMpLG99LHJlbW92ZTpmdW5jdGlvbigpe2Zvcih2YXIgcj0wO3I8dGhpcy5hY3RvcnMubGVuZ3RoO3IrKyl0aGlzLmFjdG9yc1tyXS50YXJnZXQudGVybWluYXRlKCk7dGhpcy5hY3RvcnM9W119fTtcbn0se1wiLi4vLi4vc291cmNlL3dvcmtlclwiOjQ5LFwiLi4vYWN0b3JcIjo5MyxcIndlYndvcmtpZnlcIjoxNDl9XSw5ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0ZXN0UHJvcChlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZihlW3RdaW4gZG9jU3R5bGUpcmV0dXJuIGVbdF19ZnVuY3Rpb24gc3VwcHJlc3NDbGljayhlKXtlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsc3VwcHJlc3NDbGljaywhMCl9dmFyIFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKTtleHBvcnRzLmNyZWF0ZT1mdW5jdGlvbihlLHQscil7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlKTtyZXR1cm4gdCYmKG8uY2xhc3NOYW1lPXQpLHImJnIuYXBwZW5kQ2hpbGQobyksb307dmFyIGRvY1N0eWxlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxzZWxlY3RQcm9wPXRlc3RQcm9wKFtcInVzZXJTZWxlY3RcIixcIk1velVzZXJTZWxlY3RcIixcIldlYmtpdFVzZXJTZWxlY3RcIixcIm1zVXNlclNlbGVjdFwiXSksdXNlclNlbGVjdDtleHBvcnRzLmRpc2FibGVEcmFnPWZ1bmN0aW9uKCl7c2VsZWN0UHJvcCYmKHVzZXJTZWxlY3Q9ZG9jU3R5bGVbc2VsZWN0UHJvcF0sZG9jU3R5bGVbc2VsZWN0UHJvcF09XCJub25lXCIpfSxleHBvcnRzLmVuYWJsZURyYWc9ZnVuY3Rpb24oKXtzZWxlY3RQcm9wJiYoZG9jU3R5bGVbc2VsZWN0UHJvcF09dXNlclNlbGVjdCl9O3ZhciB0cmFuc2Zvcm1Qcm9wPXRlc3RQcm9wKFtcInRyYW5zZm9ybVwiLFwiV2Via2l0VHJhbnNmb3JtXCJdKTtleHBvcnRzLnNldFRyYW5zZm9ybT1mdW5jdGlvbihlLHQpe2Uuc3R5bGVbdHJhbnNmb3JtUHJvcF09dH0sZXhwb3J0cy5zdXBwcmVzc0NsaWNrPWZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLHN1cHByZXNzQ2xpY2ssITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLHN1cHByZXNzQ2xpY2ssITApfSwwKX0sZXhwb3J0cy5tb3VzZVBvcz1mdW5jdGlvbihlLHQpe3ZhciByPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHQ9dC50b3VjaGVzP3QudG91Y2hlc1swXTp0LG5ldyBQb2ludCh0LmNsaWVudFgtci5sZWZ0LWUuY2xpZW50TGVmdCx0LmNsaWVudFktci50b3AtZS5jbGllbnRUb3ApfTtcbn0se1wicG9pbnQtZ2VvbWV0cnlcIjoxMzd9XSw5OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjttb2R1bGUuZXhwb3J0cz17QVBJX1VSTDpcImh0dHBzOi8vYXBpLm1hcGJveC5jb21cIixSRVFVSVJFX0FDQ0VTU19UT0tFTjohMH07XG59LHt9XSwxMDA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIHV0aWw9cmVxdWlyZShcIi4vdXRpbFwiKSxFdmVudGVkPXtvbjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9ldmVudHM9dGhpcy5fZXZlbnRzfHx7fSx0aGlzLl9ldmVudHNbdF09dGhpcy5fZXZlbnRzW3RdfHxbXSx0aGlzLl9ldmVudHNbdF0ucHVzaChlKSx0aGlzfSxvZmY6ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm4gZGVsZXRlIHRoaXMuX2V2ZW50cyx0aGlzO2lmKCF0aGlzLmxpc3RlbnModCkpcmV0dXJuIHRoaXM7aWYoZSl7dmFyIHM9dGhpcy5fZXZlbnRzW3RdLmluZGV4T2YoZSk7cz49MCYmdGhpcy5fZXZlbnRzW3RdLnNwbGljZShzLDEpLHRoaXMuX2V2ZW50c1t0XS5sZW5ndGh8fGRlbGV0ZSB0aGlzLl9ldmVudHNbdF19ZWxzZSBkZWxldGUgdGhpcy5fZXZlbnRzW3RdO3JldHVybiB0aGlzfSxvbmNlOmZ1bmN0aW9uKHQsZSl7dmFyIHM9ZnVuY3Rpb24oaSl7dGhpcy5vZmYodCxzKSxlLmNhbGwodGhpcyxpKX0uYmluZCh0aGlzKTtyZXR1cm4gdGhpcy5vbih0LHMpLHRoaXN9LGZpcmU6ZnVuY3Rpb24odCxlKXtpZighdGhpcy5saXN0ZW5zKHQpKXJldHVybiB0aGlzO2U9dXRpbC5leHRlbmQoe30sZSksdXRpbC5leHRlbmQoZSx7dHlwZTp0LHRhcmdldDp0aGlzfSk7Zm9yKHZhciBzPXRoaXMuX2V2ZW50c1t0XS5zbGljZSgpLGk9MDtpPHMubGVuZ3RoO2krKylzW2ldLmNhbGwodGhpcyxlKTtyZXR1cm4gdGhpc30sbGlzdGVuczpmdW5jdGlvbih0KXtyZXR1cm4hKCF0aGlzLl9ldmVudHN8fCF0aGlzLl9ldmVudHNbdF0pfX07bW9kdWxlLmV4cG9ydHM9RXZlbnRlZDtcbn0se1wiLi91dGlsXCI6MTA2fV0sMTAxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEdseXBocyhhLGUpe3RoaXMuc3RhY2tzPWEucmVhZEZpZWxkcyhyZWFkRm9udHN0YWNrcyxbXSxlKX1mdW5jdGlvbiByZWFkRm9udHN0YWNrcyhhLGUscil7aWYoMT09PWEpe3ZhciB0PXIucmVhZE1lc3NhZ2UocmVhZEZvbnRzdGFjayx7Z2x5cGhzOnt9fSk7ZS5wdXNoKHQpfX1mdW5jdGlvbiByZWFkRm9udHN0YWNrKGEsZSxyKXtpZigxPT09YSllLm5hbWU9ci5yZWFkU3RyaW5nKCk7ZWxzZSBpZigyPT09YSllLnJhbmdlPXIucmVhZFN0cmluZygpO2Vsc2UgaWYoMz09PWEpe3ZhciB0PXIucmVhZE1lc3NhZ2UocmVhZEdseXBoLHt9KTtlLmdseXBoc1t0LmlkXT10fX1mdW5jdGlvbiByZWFkR2x5cGgoYSxlLHIpezE9PT1hP2UuaWQ9ci5yZWFkVmFyaW50KCk6Mj09PWE/ZS5iaXRtYXA9ci5yZWFkQnl0ZXMoKTozPT09YT9lLndpZHRoPXIucmVhZFZhcmludCgpOjQ9PT1hP2UuaGVpZ2h0PXIucmVhZFZhcmludCgpOjU9PT1hP2UubGVmdD1yLnJlYWRTVmFyaW50KCk6Nj09PWE/ZS50b3A9ci5yZWFkU1ZhcmludCgpOjc9PT1hJiYoZS5hZHZhbmNlPXIucmVhZFZhcmludCgpKX1tb2R1bGUuZXhwb3J0cz1HbHlwaHM7XG59LHt9XSwxMDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaW50ZXJwb2xhdGUodCxlLG4pe3JldHVybiB0KigxLW4pK2Uqbn1tb2R1bGUuZXhwb3J0cz1pbnRlcnBvbGF0ZSxpbnRlcnBvbGF0ZS5udW1iZXI9aW50ZXJwb2xhdGUsaW50ZXJwb2xhdGUudmVjMj1mdW5jdGlvbih0LGUsbil7cmV0dXJuW2ludGVycG9sYXRlKHRbMF0sZVswXSxuKSxpbnRlcnBvbGF0ZSh0WzFdLGVbMV0sbildfSxpbnRlcnBvbGF0ZS5jb2xvcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuW2ludGVycG9sYXRlKHRbMF0sZVswXSxuKSxpbnRlcnBvbGF0ZSh0WzFdLGVbMV0sbiksaW50ZXJwb2xhdGUodFsyXSxlWzJdLG4pLGludGVycG9sYXRlKHRbM10sZVszXSxuKV19LGludGVycG9sYXRlLmFycmF5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCxyKXtyZXR1cm4gaW50ZXJwb2xhdGUodCxlW3JdLG4pfSl9O1xufSx7fV0sMTAzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIG5vcm1hbGl6ZVVSTChlLHIsbyl7aWYobz1vfHxjb25maWcuQUNDRVNTX1RPS0VOLCFvJiZjb25maWcuUkVRVUlSRV9BQ0NFU1NfVE9LRU4pdGhyb3cgbmV3IEVycm9yKFwiQW4gQVBJIGFjY2VzcyB0b2tlbiBpcyByZXF1aXJlZCB0byB1c2UgTWFwYm94IEdMLiBTZWUgaHR0cHM6Ly93d3cubWFwYm94LmNvbS9kZXZlbG9wZXJzL2FwaS8jYWNjZXNzLXRva2Vuc1wiKTtpZihlPWUucmVwbGFjZSgvXm1hcGJveDpcXC9cXC8vLGNvbmZpZy5BUElfVVJMK3IpLGUrPS0xIT09ZS5pbmRleE9mKFwiP1wiKT9cIiZhY2Nlc3NfdG9rZW49XCI6XCI/YWNjZXNzX3Rva2VuPVwiLGNvbmZpZy5SRVFVSVJFX0FDQ0VTU19UT0tFTil7aWYoXCJzXCI9PT1vWzBdKXRocm93IG5ldyBFcnJvcihcIlVzZSBhIHB1YmxpYyBhY2Nlc3MgdG9rZW4gKHBrLiopIHdpdGggTWFwYm94IEdMIEpTLCBub3QgYSBzZWNyZXQgYWNjZXNzIHRva2VuIChzay4qKS4gU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vZGV2ZWxvcGVycy9hcGkvI2FjY2Vzcy10b2tlbnNcIik7ZSs9b31yZXR1cm4gZX12YXIgY29uZmlnPXJlcXVpcmUoXCIuL2NvbmZpZ1wiKSxicm93c2VyPXJlcXVpcmUoXCIuL2Jyb3dzZXJcIik7bW9kdWxlLmV4cG9ydHMubm9ybWFsaXplU3R5bGVVUkw9ZnVuY3Rpb24oZSxyKXtpZighZS5tYXRjaCgvXm1hcGJveDpcXC9cXC9zdHlsZXNcXC8vKSlyZXR1cm4gZTt2YXIgbz1lLnNwbGl0KFwiL1wiKSx0PW9bM10sbj1vWzRdLHM9b1s1XT9cIi9kcmFmdFwiOlwiXCI7cmV0dXJuIG5vcm1hbGl6ZVVSTChcIm1hcGJveDovL1wiK3QrXCIvXCIrbitzLFwiL3N0eWxlcy92MS9cIixyKX0sbW9kdWxlLmV4cG9ydHMubm9ybWFsaXplU291cmNlVVJMPWZ1bmN0aW9uKGUscil7cmV0dXJuIGUubWF0Y2goL15tYXBib3g6XFwvXFwvLyk/bm9ybWFsaXplVVJMKGUrXCIuanNvblwiLFwiL3Y0L1wiLHIpK1wiJnNlY3VyZVwiOmV9LG1vZHVsZS5leHBvcnRzLm5vcm1hbGl6ZUdseXBoc1VSTD1mdW5jdGlvbihlLHIpe2lmKCFlLm1hdGNoKC9ebWFwYm94OlxcL1xcLy8pKXJldHVybiBlO3ZhciBvPWUuc3BsaXQoXCIvXCIpWzNdO3JldHVybiBub3JtYWxpemVVUkwoXCJtYXBib3g6Ly9cIitvK1wiL3tmb250c3RhY2t9L3tyYW5nZX0ucGJmXCIsXCIvZm9udHMvdjEvXCIscil9LG1vZHVsZS5leHBvcnRzLm5vcm1hbGl6ZVNwcml0ZVVSTD1mdW5jdGlvbihlLHIsbyx0KXtpZighZS5tYXRjaCgvXm1hcGJveDpcXC9cXC9zcHJpdGVzXFwvLykpcmV0dXJuIGUrcitvO3ZhciBuPWUuc3BsaXQoXCIvXCIpLHM9blszXSxhPW5bNF0saT1uWzVdP1wiL2RyYWZ0XCI6XCJcIjtyZXR1cm4gbm9ybWFsaXplVVJMKFwibWFwYm94Oi8vXCIrcytcIi9cIithK2krXCIvc3ByaXRlXCIrcitvLFwiL3N0eWxlcy92MS9cIix0KX0sbW9kdWxlLmV4cG9ydHMubm9ybWFsaXplVGlsZVVSTD1mdW5jdGlvbihlLHIpe3JldHVybiByJiZyLm1hdGNoKC9ebWFwYm94OlxcL1xcLy8pP2UucmVwbGFjZSgvXFwuKCg/OnBuZ3xqcGcpXFxkKikoPz0kfFxcPykvLGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbz49Mj9cIkAyeC4kMVwiOlwiLiQxXCIpOmV9O1xufSx7XCIuL2Jyb3dzZXJcIjo5NSxcIi4vY29uZmlnXCI6OTl9XSwxMDQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gTVJVQ2FjaGUodCxlKXt0aGlzLm1heD10LHRoaXMub25SZW1vdmU9ZSx0aGlzLnJlc2V0KCl9bW9kdWxlLmV4cG9ydHM9TVJVQ2FjaGUsTVJVQ2FjaGUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMubGlzdCl0aGlzLm9uUmVtb3ZlKHRoaXMubGlzdFt0XSk7cmV0dXJuIHRoaXMubGlzdD17fSx0aGlzLm9yZGVyPVtdLHRoaXN9LE1SVUNhY2hlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlKXtpZih0aGlzLmxpc3RbdF09ZSx0aGlzLm9yZGVyLnB1c2godCksdGhpcy5vcmRlci5sZW5ndGg+dGhpcy5tYXgpe3ZhciBpPXRoaXMuZ2V0KHRoaXMub3JkZXJbMF0pO2kmJnRoaXMub25SZW1vdmUoaSl9cmV0dXJuIHRoaXN9LE1SVUNhY2hlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW4gdGhpcy5saXN0fSxNUlVDYWNoZS5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9yZGVyfSxNUlVDYWNoZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe2lmKCF0aGlzLmhhcyh0KSlyZXR1cm4gbnVsbDt2YXIgZT10aGlzLmxpc3RbdF07cmV0dXJuIGRlbGV0ZSB0aGlzLmxpc3RbdF0sdGhpcy5vcmRlci5zcGxpY2UodGhpcy5vcmRlci5pbmRleE9mKHQpLDEpLGV9O1xufSx7fV0sMTA1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHJlc29sdmVUb2tlbnMoZSxuKXtyZXR1cm4gbi5yZXBsYWNlKC97KFtee30oKVxcW1xcXTw+JD06Oy4sXl0rKX0vZyxmdW5jdGlvbihuLHIpe3JldHVybiByIGluIGU/ZVtyXTpcIlwifSl9bW9kdWxlLmV4cG9ydHM9cmVzb2x2ZVRva2Vucztcbn0se31dLDEwNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgVW5pdEJlemllcj1yZXF1aXJlKFwidW5pdGJlemllclwiKSxDb29yZGluYXRlPXJlcXVpcmUoXCIuLi9nZW8vY29vcmRpbmF0ZVwiKTtleHBvcnRzLmVhc2VDdWJpY0luT3V0PWZ1bmN0aW9uKG4pe2lmKDA+PW4pcmV0dXJuIDA7aWYobj49MSlyZXR1cm4gMTt2YXIgdD1uKm4scj10Km47cmV0dXJuIDQqKC41Pm4/cjozKihuLXQpK3ItLjc1KX0sZXhwb3J0cy5iZXppZXI9ZnVuY3Rpb24obix0LHIsZSl7dmFyIG89bmV3IFVuaXRCZXppZXIobix0LHIsZSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBvLnNvbHZlKG4pfX0sZXhwb3J0cy5lYXNlPWV4cG9ydHMuYmV6aWVyKC4yNSwuMSwuMjUsMSksZXhwb3J0cy5wcmVtdWx0aXBseT1mdW5jdGlvbihuKXtyZXR1cm4gblswXSo9blszXSxuWzFdKj1uWzNdLG5bMl0qPW5bM10sbn0sZXhwb3J0cy5jbGFtcD1mdW5jdGlvbihuLHQscil7cmV0dXJuIE1hdGgubWluKHIsTWF0aC5tYXgodCxuKSl9LGV4cG9ydHMud3JhcD1mdW5jdGlvbihuLHQscil7dmFyIGU9ci10LG89KChuLXQpJWUrZSklZSt0O3JldHVybiBvPT09dD9yOm99LGV4cG9ydHMuY29hbGVzY2U9ZnVuY3Rpb24oKXtmb3IodmFyIG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXt2YXIgdD1hcmd1bWVudHNbbl07aWYobnVsbCE9PXQmJnZvaWQgMCE9PXQpcmV0dXJuIHR9fSxleHBvcnRzLmFzeW5jRWFjaD1mdW5jdGlvbihuLHQscil7ZnVuY3Rpb24gZSgpezA9PT0tLW8mJnIoKX12YXIgbz1uLmxlbmd0aDtpZigwPT09bylyZXR1cm4gcigpO2Zvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXQobltpXSxlKX0sZXhwb3J0cy5hc3luY0FsbD1mdW5jdGlvbihuLHQscil7dmFyIGU9bi5sZW5ndGgsbz1uZXcgQXJyYXkobi5sZW5ndGgpLGk9bnVsbDtuLmZvckVhY2goZnVuY3Rpb24obix1KXt0KG4sZnVuY3Rpb24obix0KXtuJiYoaT1uKSxvW3VdPXQsMD09PS0tZSYmcihpLG8pfSl9KX0sZXhwb3J0cy5rZXlzRGlmZmVyZW5jZT1mdW5jdGlvbihuLHQpe3ZhciByPVtdO2Zvcih2YXIgZSBpbiBuKWUgaW4gdHx8ci5wdXNoKGUpO3JldHVybiByfSxleHBvcnRzLmV4dGVuZD1mdW5jdGlvbihuKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgcj1hcmd1bWVudHNbdF07Zm9yKHZhciBlIGluIHIpbltlXT1yW2VdfXJldHVybiBufSxleHBvcnRzLmV4dGVuZEFsbD1mdW5jdGlvbihuLHQpe2Zvcih2YXIgciBpbiB0KU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHIsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LHIpKTtyZXR1cm4gbn0sZXhwb3J0cy5pbmhlcml0PWZ1bmN0aW9uKG4sdCl7dmFyIHI9XCJmdW5jdGlvblwiPT10eXBlb2Ygbj9uLnByb3RvdHlwZTpuLGU9T2JqZWN0LmNyZWF0ZShyKTtyZXR1cm4gZXhwb3J0cy5leHRlbmRBbGwoZSx0KSxlfSxleHBvcnRzLnBpY2s9ZnVuY3Rpb24obix0KXtmb3IodmFyIHI9e30sZT0wO2U8dC5sZW5ndGg7ZSsrKXt2YXIgbz10W2VdO28gaW4gbiYmKHJbb109bltvXSl9cmV0dXJuIHJ9O3ZhciBpZD0xO2V4cG9ydHMudW5pcXVlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gaWQrK30sZXhwb3J0cy50aHJvdHRsZT1mdW5jdGlvbihuLHQscil7dmFyIGUsbyxpLHU7cmV0dXJuIHU9ZnVuY3Rpb24oKXtlPSExLG8mJihpLmFwcGx5KHIsbyksbz0hMSl9LGk9ZnVuY3Rpb24oKXtlP289YXJndW1lbnRzOihuLmFwcGx5KHIsYXJndW1lbnRzKSxzZXRUaW1lb3V0KHUsdCksZT0hMCl9fSxleHBvcnRzLmRlYm91bmNlPWZ1bmN0aW9uKG4sdCl7dmFyIHIsZTtyZXR1cm4gZnVuY3Rpb24oKXtlPWFyZ3VtZW50cyxjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5hcHBseShudWxsLGUpfSx0KX19LGV4cG9ydHMuYmluZEFsbD1mdW5jdGlvbihuLHQpe24uZm9yRWFjaChmdW5jdGlvbihuKXt0W25dPXRbbl0uYmluZCh0KX0pfSxleHBvcnRzLmJpbmRIYW5kbGVycz1mdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gbilcImZ1bmN0aW9uXCI9PXR5cGVvZiBuW3RdJiYwPT09dC5pbmRleE9mKFwiX29uXCIpJiYoblt0XT1uW3RdLmJpbmQobikpfSxleHBvcnRzLnNldE9wdGlvbnM9ZnVuY3Rpb24obix0KXtuLmhhc093blByb3BlcnR5KFwib3B0aW9uc1wiKXx8KG4ub3B0aW9ucz1uLm9wdGlvbnM/T2JqZWN0LmNyZWF0ZShuLm9wdGlvbnMpOnt9KTtmb3IodmFyIHIgaW4gdCluLm9wdGlvbnNbcl09dFtyXTtyZXR1cm4gbi5vcHRpb25zfSxleHBvcnRzLmdldENvb3JkaW5hdGVzQ2VudGVyPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdD0xLzAscj0xLzAsZT0tKDEvMCksbz0tKDEvMCksaT0wO2k8bi5sZW5ndGg7aSsrKXQ9TWF0aC5taW4odCxuW2ldLmNvbHVtbikscj1NYXRoLm1pbihyLG5baV0ucm93KSxlPU1hdGgubWF4KGUsbltpXS5jb2x1bW4pLG89TWF0aC5tYXgobyxuW2ldLnJvdyk7dmFyIHU9ZS10LGE9by1yLGM9TWF0aC5tYXgodSxhKTtyZXR1cm4gbmV3IENvb3JkaW5hdGUoKHQrZSkvMiwocitvKS8yLDApLnpvb21UbyhNYXRoLmZsb29yKC1NYXRoLmxvZyhjKS9NYXRoLkxOMikpfTtcbn0se1wiLi4vZ2VvL2Nvb3JkaW5hdGVcIjoxOSxcInVuaXRiZXppZXJcIjoxNDF9XSwxMDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuZnVuY3Rpb24gY2xhbXBfY3NzX2J5dGUoZSl7cmV0dXJuIGU9TWF0aC5yb3VuZChlKSwwPmU/MDplPjI1NT8yNTU6ZX1mdW5jdGlvbiBjbGFtcF9jc3NfZmxvYXQoZSl7cmV0dXJuIDA+ZT8wOmU+MT8xOmV9ZnVuY3Rpb24gcGFyc2VfY3NzX2ludChlKXtyZXR1cm4gY2xhbXBfY3NzX2J5dGUoXCIlXCI9PT1lW2UubGVuZ3RoLTFdP3BhcnNlRmxvYXQoZSkvMTAwKjI1NTpwYXJzZUludChlKSl9ZnVuY3Rpb24gcGFyc2VfY3NzX2Zsb2F0KGUpe3JldHVybiBjbGFtcF9jc3NfZmxvYXQoXCIlXCI9PT1lW2UubGVuZ3RoLTFdP3BhcnNlRmxvYXQoZSkvMTAwOnBhcnNlRmxvYXQoZSkpfWZ1bmN0aW9uIGNzc19odWVfdG9fcmdiKGUscixsKXtyZXR1cm4gMD5sP2wrPTE6bD4xJiYobC09MSksMT42Kmw/ZSsoci1lKSpsKjY6MT4yKmw/cjoyPjMqbD9lKyhyLWUpKigyLzMtbCkqNjplfWZ1bmN0aW9uIHBhcnNlQ1NTQ29sb3IoZSl7dmFyIHI9ZS5yZXBsYWNlKC8gL2csXCJcIikudG9Mb3dlckNhc2UoKTtpZihyIGluIGtDU1NDb2xvclRhYmxlKXJldHVybiBrQ1NTQ29sb3JUYWJsZVtyXS5zbGljZSgpO2lmKFwiI1wiPT09clswXSl7aWYoND09PXIubGVuZ3RoKXt2YXIgbD1wYXJzZUludChyLnN1YnN0cigxKSwxNik7cmV0dXJuIGw+PTAmJjQwOTU+PWw/WygzODQwJmwpPj40fCgzODQwJmwpPj44LDI0MCZsfCgyNDAmbCk+PjQsMTUmbHwoMTUmbCk8PDQsMV06bnVsbH1pZig3PT09ci5sZW5ndGgpe3ZhciBsPXBhcnNlSW50KHIuc3Vic3RyKDEpLDE2KTtyZXR1cm4gbD49MCYmMTY3NzcyMTU+PWw/WygxNjcxMTY4MCZsKT4+MTYsKDY1MjgwJmwpPj44LDI1NSZsLDFdOm51bGx9cmV0dXJuIG51bGx9dmFyIGE9ci5pbmRleE9mKFwiKFwiKSx0PXIuaW5kZXhPZihcIilcIik7aWYoLTEhPT1hJiZ0KzE9PT1yLmxlbmd0aCl7dmFyIG49ci5zdWJzdHIoMCxhKSxzPXIuc3Vic3RyKGErMSx0LShhKzEpKS5zcGxpdChcIixcIiksbz0xO3N3aXRjaChuKXtjYXNlXCJyZ2JhXCI6aWYoNCE9PXMubGVuZ3RoKXJldHVybiBudWxsO289cGFyc2VfY3NzX2Zsb2F0KHMucG9wKCkpO2Nhc2VcInJnYlwiOnJldHVybiAzIT09cy5sZW5ndGg/bnVsbDpbcGFyc2VfY3NzX2ludChzWzBdKSxwYXJzZV9jc3NfaW50KHNbMV0pLHBhcnNlX2Nzc19pbnQoc1syXSksb107Y2FzZVwiaHNsYVwiOmlmKDQhPT1zLmxlbmd0aClyZXR1cm4gbnVsbDtvPXBhcnNlX2Nzc19mbG9hdChzLnBvcCgpKTtjYXNlXCJoc2xcIjppZigzIT09cy5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIGk9KHBhcnNlRmxvYXQoc1swXSklMzYwKzM2MCklMzYwLzM2MCx1PXBhcnNlX2Nzc19mbG9hdChzWzFdKSxnPXBhcnNlX2Nzc19mbG9hdChzWzJdKSxkPS41Pj1nP2cqKHUrMSk6Zyt1LWcqdSxjPTIqZy1kO3JldHVybltjbGFtcF9jc3NfYnl0ZSgyNTUqY3NzX2h1ZV90b19yZ2IoYyxkLGkrMS8zKSksY2xhbXBfY3NzX2J5dGUoMjU1KmNzc19odWVfdG9fcmdiKGMsZCxpKSksY2xhbXBfY3NzX2J5dGUoMjU1KmNzc19odWVfdG9fcmdiKGMsZCxpLTEvMykpLG9dO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXJldHVybiBudWxsfXZhciBrQ1NTQ29sb3JUYWJsZT17dHJhbnNwYXJlbnQ6WzAsMCwwLDBdLGFsaWNlYmx1ZTpbMjQwLDI0OCwyNTUsMV0sYW50aXF1ZXdoaXRlOlsyNTAsMjM1LDIxNSwxXSxhcXVhOlswLDI1NSwyNTUsMV0sYXF1YW1hcmluZTpbMTI3LDI1NSwyMTIsMV0sYXp1cmU6WzI0MCwyNTUsMjU1LDFdLGJlaWdlOlsyNDUsMjQ1LDIyMCwxXSxiaXNxdWU6WzI1NSwyMjgsMTk2LDFdLGJsYWNrOlswLDAsMCwxXSxibGFuY2hlZGFsbW9uZDpbMjU1LDIzNSwyMDUsMV0sYmx1ZTpbMCwwLDI1NSwxXSxibHVldmlvbGV0OlsxMzgsNDMsMjI2LDFdLGJyb3duOlsxNjUsNDIsNDIsMV0sYnVybHl3b29kOlsyMjIsMTg0LDEzNSwxXSxjYWRldGJsdWU6Wzk1LDE1OCwxNjAsMV0sY2hhcnRyZXVzZTpbMTI3LDI1NSwwLDFdLGNob2NvbGF0ZTpbMjEwLDEwNSwzMCwxXSxjb3JhbDpbMjU1LDEyNyw4MCwxXSxjb3JuZmxvd2VyYmx1ZTpbMTAwLDE0OSwyMzcsMV0sY29ybnNpbGs6WzI1NSwyNDgsMjIwLDFdLGNyaW1zb246WzIyMCwyMCw2MCwxXSxjeWFuOlswLDI1NSwyNTUsMV0sZGFya2JsdWU6WzAsMCwxMzksMV0sZGFya2N5YW46WzAsMTM5LDEzOSwxXSxkYXJrZ29sZGVucm9kOlsxODQsMTM0LDExLDFdLGRhcmtncmF5OlsxNjksMTY5LDE2OSwxXSxkYXJrZ3JlZW46WzAsMTAwLDAsMV0sZGFya2dyZXk6WzE2OSwxNjksMTY5LDFdLGRhcmtraGFraTpbMTg5LDE4MywxMDcsMV0sZGFya21hZ2VudGE6WzEzOSwwLDEzOSwxXSxkYXJrb2xpdmVncmVlbjpbODUsMTA3LDQ3LDFdLGRhcmtvcmFuZ2U6WzI1NSwxNDAsMCwxXSxkYXJrb3JjaGlkOlsxNTMsNTAsMjA0LDFdLGRhcmtyZWQ6WzEzOSwwLDAsMV0sZGFya3NhbG1vbjpbMjMzLDE1MCwxMjIsMV0sZGFya3NlYWdyZWVuOlsxNDMsMTg4LDE0MywxXSxkYXJrc2xhdGVibHVlOls3Miw2MSwxMzksMV0sZGFya3NsYXRlZ3JheTpbNDcsNzksNzksMV0sZGFya3NsYXRlZ3JleTpbNDcsNzksNzksMV0sZGFya3R1cnF1b2lzZTpbMCwyMDYsMjA5LDFdLGRhcmt2aW9sZXQ6WzE0OCwwLDIxMSwxXSxkZWVwcGluazpbMjU1LDIwLDE0NywxXSxkZWVwc2t5Ymx1ZTpbMCwxOTEsMjU1LDFdLGRpbWdyYXk6WzEwNSwxMDUsMTA1LDFdLGRpbWdyZXk6WzEwNSwxMDUsMTA1LDFdLGRvZGdlcmJsdWU6WzMwLDE0NCwyNTUsMV0sZmlyZWJyaWNrOlsxNzgsMzQsMzQsMV0sZmxvcmFsd2hpdGU6WzI1NSwyNTAsMjQwLDFdLGZvcmVzdGdyZWVuOlszNCwxMzksMzQsMV0sZnVjaHNpYTpbMjU1LDAsMjU1LDFdLGdhaW5zYm9ybzpbMjIwLDIyMCwyMjAsMV0sZ2hvc3R3aGl0ZTpbMjQ4LDI0OCwyNTUsMV0sZ29sZDpbMjU1LDIxNSwwLDFdLGdvbGRlbnJvZDpbMjE4LDE2NSwzMiwxXSxncmF5OlsxMjgsMTI4LDEyOCwxXSxncmVlbjpbMCwxMjgsMCwxXSxncmVlbnllbGxvdzpbMTczLDI1NSw0NywxXSxncmV5OlsxMjgsMTI4LDEyOCwxXSxob25leWRldzpbMjQwLDI1NSwyNDAsMV0saG90cGluazpbMjU1LDEwNSwxODAsMV0saW5kaWFucmVkOlsyMDUsOTIsOTIsMV0saW5kaWdvOls3NSwwLDEzMCwxXSxpdm9yeTpbMjU1LDI1NSwyNDAsMV0sa2hha2k6WzI0MCwyMzAsMTQwLDFdLGxhdmVuZGVyOlsyMzAsMjMwLDI1MCwxXSxsYXZlbmRlcmJsdXNoOlsyNTUsMjQwLDI0NSwxXSxsYXduZ3JlZW46WzEyNCwyNTIsMCwxXSxsZW1vbmNoaWZmb246WzI1NSwyNTAsMjA1LDFdLGxpZ2h0Ymx1ZTpbMTczLDIxNiwyMzAsMV0sbGlnaHRjb3JhbDpbMjQwLDEyOCwxMjgsMV0sbGlnaHRjeWFuOlsyMjQsMjU1LDI1NSwxXSxsaWdodGdvbGRlbnJvZHllbGxvdzpbMjUwLDI1MCwyMTAsMV0sbGlnaHRncmF5OlsyMTEsMjExLDIxMSwxXSxsaWdodGdyZWVuOlsxNDQsMjM4LDE0NCwxXSxsaWdodGdyZXk6WzIxMSwyMTEsMjExLDFdLGxpZ2h0cGluazpbMjU1LDE4MiwxOTMsMV0sbGlnaHRzYWxtb246WzI1NSwxNjAsMTIyLDFdLGxpZ2h0c2VhZ3JlZW46WzMyLDE3OCwxNzAsMV0sbGlnaHRza3libHVlOlsxMzUsMjA2LDI1MCwxXSxsaWdodHNsYXRlZ3JheTpbMTE5LDEzNiwxNTMsMV0sbGlnaHRzbGF0ZWdyZXk6WzExOSwxMzYsMTUzLDFdLGxpZ2h0c3RlZWxibHVlOlsxNzYsMTk2LDIyMiwxXSxsaWdodHllbGxvdzpbMjU1LDI1NSwyMjQsMV0sbGltZTpbMCwyNTUsMCwxXSxsaW1lZ3JlZW46WzUwLDIwNSw1MCwxXSxsaW5lbjpbMjUwLDI0MCwyMzAsMV0sbWFnZW50YTpbMjU1LDAsMjU1LDFdLG1hcm9vbjpbMTI4LDAsMCwxXSxtZWRpdW1hcXVhbWFyaW5lOlsxMDIsMjA1LDE3MCwxXSxtZWRpdW1ibHVlOlswLDAsMjA1LDFdLG1lZGl1bW9yY2hpZDpbMTg2LDg1LDIxMSwxXSxtZWRpdW1wdXJwbGU6WzE0NywxMTIsMjE5LDFdLG1lZGl1bXNlYWdyZWVuOls2MCwxNzksMTEzLDFdLG1lZGl1bXNsYXRlYmx1ZTpbMTIzLDEwNCwyMzgsMV0sbWVkaXVtc3ByaW5nZ3JlZW46WzAsMjUwLDE1NCwxXSxtZWRpdW10dXJxdW9pc2U6WzcyLDIwOSwyMDQsMV0sbWVkaXVtdmlvbGV0cmVkOlsxOTksMjEsMTMzLDFdLG1pZG5pZ2h0Ymx1ZTpbMjUsMjUsMTEyLDFdLG1pbnRjcmVhbTpbMjQ1LDI1NSwyNTAsMV0sbWlzdHlyb3NlOlsyNTUsMjI4LDIyNSwxXSxtb2NjYXNpbjpbMjU1LDIyOCwxODEsMV0sbmF2YWpvd2hpdGU6WzI1NSwyMjIsMTczLDFdLG5hdnk6WzAsMCwxMjgsMV0sb2xkbGFjZTpbMjUzLDI0NSwyMzAsMV0sb2xpdmU6WzEyOCwxMjgsMCwxXSxvbGl2ZWRyYWI6WzEwNywxNDIsMzUsMV0sb3JhbmdlOlsyNTUsMTY1LDAsMV0sb3JhbmdlcmVkOlsyNTUsNjksMCwxXSxvcmNoaWQ6WzIxOCwxMTIsMjE0LDFdLHBhbGVnb2xkZW5yb2Q6WzIzOCwyMzIsMTcwLDFdLHBhbGVncmVlbjpbMTUyLDI1MSwxNTIsMV0scGFsZXR1cnF1b2lzZTpbMTc1LDIzOCwyMzgsMV0scGFsZXZpb2xldHJlZDpbMjE5LDExMiwxNDcsMV0scGFwYXlhd2hpcDpbMjU1LDIzOSwyMTMsMV0scGVhY2hwdWZmOlsyNTUsMjE4LDE4NSwxXSxwZXJ1OlsyMDUsMTMzLDYzLDFdLHBpbms6WzI1NSwxOTIsMjAzLDFdLHBsdW06WzIyMSwxNjAsMjIxLDFdLHBvd2RlcmJsdWU6WzE3NiwyMjQsMjMwLDFdLHB1cnBsZTpbMTI4LDAsMTI4LDFdLHJlZDpbMjU1LDAsMCwxXSxyb3N5YnJvd246WzE4OCwxNDMsMTQzLDFdLHJveWFsYmx1ZTpbNjUsMTA1LDIyNSwxXSxzYWRkbGVicm93bjpbMTM5LDY5LDE5LDFdLHNhbG1vbjpbMjUwLDEyOCwxMTQsMV0sc2FuZHlicm93bjpbMjQ0LDE2NCw5NiwxXSxzZWFncmVlbjpbNDYsMTM5LDg3LDFdLHNlYXNoZWxsOlsyNTUsMjQ1LDIzOCwxXSxzaWVubmE6WzE2MCw4Miw0NSwxXSxzaWx2ZXI6WzE5MiwxOTIsMTkyLDFdLHNreWJsdWU6WzEzNSwyMDYsMjM1LDFdLHNsYXRlYmx1ZTpbMTA2LDkwLDIwNSwxXSxzbGF0ZWdyYXk6WzExMiwxMjgsMTQ0LDFdLHNsYXRlZ3JleTpbMTEyLDEyOCwxNDQsMV0sc25vdzpbMjU1LDI1MCwyNTAsMV0sc3ByaW5nZ3JlZW46WzAsMjU1LDEyNywxXSxzdGVlbGJsdWU6WzcwLDEzMCwxODAsMV0sdGFuOlsyMTAsMTgwLDE0MCwxXSx0ZWFsOlswLDEyOCwxMjgsMV0sdGhpc3RsZTpbMjE2LDE5MSwyMTYsMV0sdG9tYXRvOlsyNTUsOTksNzEsMV0sdHVycXVvaXNlOls2NCwyMjQsMjA4LDFdLHZpb2xldDpbMjM4LDEzMCwyMzgsMV0sd2hlYXQ6WzI0NSwyMjIsMTc5LDFdLHdoaXRlOlsyNTUsMjU1LDI1NSwxXSx3aGl0ZXNtb2tlOlsyNDUsMjQ1LDI0NSwxXSx5ZWxsb3c6WzI1NSwyNTUsMCwxXSx5ZWxsb3dncmVlbjpbMTU0LDIwNSw1MCwxXX07dHJ5e2V4cG9ydHMucGFyc2VDU1NDb2xvcj1wYXJzZUNTU0NvbG9yfWNhdGNoKGUpe31cbn0se31dLDEwODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpbmZpeCh0KXtyZXR1cm4gZnVuY3Rpb24obixyLGkpe3JldHVyblwiJHR5cGVcIj09PXI/XCJ0XCIrdCtWZWN0b3JUaWxlRmVhdHVyZVR5cGVzLmluZGV4T2YoaSk6XCJwW1wiK0pTT04uc3RyaW5naWZ5KHIpK1wiXVwiK3QrSlNPTi5zdHJpbmdpZnkoaSl9fWZ1bmN0aW9uIHN0cmljdEluZml4KHQpe3ZhciBuPWluZml4KHQpO3JldHVybiBmdW5jdGlvbih0LHIsaSl7cmV0dXJuXCIkdHlwZVwiPT09cj9uKHQscixpKTpcInR5cGVvZihwW1wiK0pTT04uc3RyaW5naWZ5KHIpK1wiXSkgPT09IHR5cGVvZihcIitKU09OLnN0cmluZ2lmeShpKStcIikgJiYgXCIrbih0LHIsaSl9fWZ1bmN0aW9uIGNvbXBpbGUodCl7cmV0dXJuIG9wZXJhdG9yc1t0WzBdXS5hcHBseSh0LHQpfWZ1bmN0aW9uIHRydXRoKCl7cmV0dXJuITB9dmFyIFZlY3RvclRpbGVGZWF0dXJlVHlwZXM9W1wiVW5rbm93blwiLFwiUG9pbnRcIixcIkxpbmVTdHJpbmdcIixcIlBvbHlnb25cIl0sb3BlcmF0b3JzPXtcIj09XCI6aW5maXgoXCI9PT1cIiksXCIhPVwiOmluZml4KFwiIT09XCIpLFwiPlwiOnN0cmljdEluZml4KFwiPlwiKSxcIjxcIjpzdHJpY3RJbmZpeChcIjxcIiksXCI8PVwiOnN0cmljdEluZml4KFwiPD1cIiksXCI+PVwiOnN0cmljdEluZml4KFwiPj1cIiksXCJpblwiOmZ1bmN0aW9uKHQsbil7cmV0dXJuXCIoZnVuY3Rpb24oKXtcIitBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikubWFwKGZ1bmN0aW9uKHIpe3JldHVyblwiaWYgKFwiK29wZXJhdG9yc1tcIj09XCJdKHQsbixyKStcIikgcmV0dXJuIHRydWU7XCJ9KS5qb2luKFwiXCIpK1wicmV0dXJuIGZhbHNlO30pKClcIn0sXCIhaW5cIjpmdW5jdGlvbigpe3JldHVyblwiIShcIitvcGVyYXRvcnNbXCJpblwiXS5hcHBseSh0aGlzLGFyZ3VtZW50cykrXCIpXCJ9LGFueTpmdW5jdGlvbigpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkubWFwKGZ1bmN0aW9uKHQpe3JldHVyblwiKFwiK2NvbXBpbGUodCkrXCIpXCJ9KS5qb2luKFwifHxcIil8fFwiZmFsc2VcIn0sYWxsOmZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuXCIoXCIrY29tcGlsZSh0KStcIilcIn0pLmpvaW4oXCImJlwiKXx8XCJ0cnVlXCJ9LG5vbmU6ZnVuY3Rpb24oKXtyZXR1cm5cIiEoXCIrb3BlcmF0b3JzLmFueS5hcHBseSh0aGlzLGFyZ3VtZW50cykrXCIpXCJ9fTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighdClyZXR1cm4gdHJ1dGg7dmFyIG49XCJ2YXIgcCA9IGYucHJvcGVydGllcyB8fCBmLnRhZ3MgfHwge30sIHQgPSBmLnR5cGU7IHJldHVybiBcIitjb21waWxlKHQpK1wiO1wiO3JldHVybiBuZXcgRnVuY3Rpb24oXCJmXCIsbil9O1xufSx7fV0sMTA5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNsaXAoZSxuLHQscixsLHUsaSxzKXtpZih0Lz1uLHIvPW4saT49dCYmcj49cylyZXR1cm4gZTtpZihpPnJ8fHQ+cylyZXR1cm4gbnVsbDtmb3IodmFyIHA9W10saD0wO2g8ZS5sZW5ndGg7aCsrKXt2YXIgYyxhLG89ZVtoXSxmPW8uZ2VvbWV0cnksZz1vLnR5cGU7aWYoYz1vLm1pbltsXSxhPW8ubWF4W2xdLGM+PXQmJnI+PWEpcC5wdXNoKG8pO2Vsc2UgaWYoIShjPnJ8fHQ+YSkpe3ZhciBtPTE9PT1nP2NsaXBQb2ludHMoZix0LHIsbCk6Y2xpcEdlb21ldHJ5KGYsdCxyLGwsdSwzPT09Zyk7bS5sZW5ndGgmJnAucHVzaCh7Z2VvbWV0cnk6bSx0eXBlOmcsdGFnczplW2hdLnRhZ3N8fG51bGwsbWluOm8ubWluLG1heDpvLm1heH0pfX1yZXR1cm4gcC5sZW5ndGg/cDpudWxsfWZ1bmN0aW9uIGNsaXBQb2ludHMoZSxuLHQscil7Zm9yKHZhciBsPVtdLHU9MDt1PGUubGVuZ3RoO3UrKyl7dmFyIGk9ZVt1XSxzPWlbcl07cz49biYmdD49cyYmbC5wdXNoKGkpfXJldHVybiBsfWZ1bmN0aW9uIGNsaXBHZW9tZXRyeShlLG4sdCxyLGwsdSl7Zm9yKHZhciBpPVtdLHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHAsaCxjLGE9MCxvPTAsZj1udWxsLGc9ZVtzXSxtPWcuYXJlYSx2PWcuZGlzdCx3PWcubGVuZ3RoLHk9W107Zm9yKGg9MDt3LTE+aDtoKyspcD1mfHxnW2hdLGY9Z1toKzFdLGE9b3x8cFtyXSxvPWZbcl0sbj5hP28+dD8oeS5wdXNoKGwocCxmLG4pLGwocCxmLHQpKSx1fHwoeT1uZXdTbGljZShpLHksbSx2KSkpOm8+PW4mJnkucHVzaChsKHAsZixuKSk6YT50P24+bz8oeS5wdXNoKGwocCxmLHQpLGwocCxmLG4pKSx1fHwoeT1uZXdTbGljZShpLHksbSx2KSkpOnQ+PW8mJnkucHVzaChsKHAsZix0KSk6KHkucHVzaChwKSxuPm8/KHkucHVzaChsKHAsZixuKSksdXx8KHk9bmV3U2xpY2UoaSx5LG0sdikpKTpvPnQmJih5LnB1c2gobChwLGYsdCkpLHV8fCh5PW5ld1NsaWNlKGkseSxtLHYpKSkpO3A9Z1t3LTFdLGE9cFtyXSxhPj1uJiZ0Pj1hJiZ5LnB1c2gocCksYz15W3kubGVuZ3RoLTFdLHUmJmMmJih5WzBdWzBdIT09Y1swXXx8eVswXVsxXSE9PWNbMV0pJiZ5LnB1c2goeVswXSksbmV3U2xpY2UoaSx5LG0sdil9cmV0dXJuIGl9ZnVuY3Rpb24gbmV3U2xpY2UoZSxuLHQscil7cmV0dXJuIG4ubGVuZ3RoJiYobi5hcmVhPXQsbi5kaXN0PXIsZS5wdXNoKG4pKSxbXX1tb2R1bGUuZXhwb3J0cz1jbGlwO1xufSx7fV0sMTEwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNvbnZlcnQoZSx0KXt2YXIgcj1bXTtpZihcIkZlYXR1cmVDb2xsZWN0aW9uXCI9PT1lLnR5cGUpZm9yKHZhciBvPTA7bzxlLmZlYXR1cmVzLmxlbmd0aDtvKyspY29udmVydEZlYXR1cmUocixlLmZlYXR1cmVzW29dLHQpO2Vsc2VcIkZlYXR1cmVcIj09PWUudHlwZT9jb252ZXJ0RmVhdHVyZShyLGUsdCk6Y29udmVydEZlYXR1cmUocix7Z2VvbWV0cnk6ZX0sdCk7cmV0dXJuIHJ9ZnVuY3Rpb24gY29udmVydEZlYXR1cmUoZSx0LHIpe3ZhciBvLG4sYSxpPXQuZ2VvbWV0cnksYz1pLnR5cGUsbD1pLmNvb3JkaW5hdGVzLHU9dC5wcm9wZXJ0aWVzO2lmKFwiUG9pbnRcIj09PWMpZS5wdXNoKGNyZWF0ZSh1LDEsW3Byb2plY3RQb2ludChsKV0pKTtlbHNlIGlmKFwiTXVsdGlQb2ludFwiPT09YyllLnB1c2goY3JlYXRlKHUsMSxwcm9qZWN0KGwpKSk7ZWxzZSBpZihcIkxpbmVTdHJpbmdcIj09PWMpZS5wdXNoKGNyZWF0ZSh1LDIsW3Byb2plY3QobCxyKV0pKTtlbHNlIGlmKFwiTXVsdGlMaW5lU3RyaW5nXCI9PT1jfHxcIlBvbHlnb25cIj09PWMpe2ZvcihhPVtdLG89MDtvPGwubGVuZ3RoO28rKylhLnB1c2gocHJvamVjdChsW29dLHIpKTtlLnB1c2goY3JlYXRlKHUsXCJQb2x5Z29uXCI9PT1jPzM6MixhKSl9ZWxzZSBpZihcIk11bHRpUG9seWdvblwiPT09Yyl7Zm9yKGE9W10sbz0wO288bC5sZW5ndGg7bysrKWZvcihuPTA7bjxsW29dLmxlbmd0aDtuKyspYS5wdXNoKHByb2plY3QobFtvXVtuXSxyKSk7ZS5wdXNoKGNyZWF0ZSh1LDMsYSkpfWVsc2V7aWYoXCJHZW9tZXRyeUNvbGxlY3Rpb25cIiE9PWMpdGhyb3cgbmV3IEVycm9yKFwiSW5wdXQgZGF0YSBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5cIik7Zm9yKG89MDtvPGkuZ2VvbWV0cmllcy5sZW5ndGg7bysrKWNvbnZlcnRGZWF0dXJlKGUse2dlb21ldHJ5OmkuZ2VvbWV0cmllc1tvXSxwcm9wZXJ0aWVzOnV9LHIpfX1mdW5jdGlvbiBjcmVhdGUoZSx0LHIpe3ZhciBvPXtnZW9tZXRyeTpyLHR5cGU6dCx0YWdzOmV8fG51bGwsbWluOlsyLDFdLG1heDpbLTEsMF19O3JldHVybiBjYWxjQkJveChvKSxvfWZ1bmN0aW9uIHByb2plY3QoZSx0KXtmb3IodmFyIHI9W10sbz0wO288ZS5sZW5ndGg7bysrKXIucHVzaChwcm9qZWN0UG9pbnQoZVtvXSkpO3JldHVybiB0JiYoc2ltcGxpZnkocix0KSxjYWxjU2l6ZShyKSkscn1mdW5jdGlvbiBwcm9qZWN0UG9pbnQoZSl7dmFyIHQ9TWF0aC5zaW4oZVsxXSpNYXRoLlBJLzE4MCkscj1lWzBdLzM2MCsuNSxvPS41LS4yNSpNYXRoLmxvZygoMSt0KS8oMS10KSkvTWF0aC5QSTtyZXR1cm4gbz0tMT5vPy0xOm8+MT8xOm8sW3IsbywwXX1mdW5jdGlvbiBjYWxjU2l6ZShlKXtmb3IodmFyIHQscixvPTAsbj0wLGE9MDthPGUubGVuZ3RoLTE7YSsrKXQ9cnx8ZVthXSxyPWVbYSsxXSxvKz10WzBdKnJbMV0tclswXSp0WzFdLG4rPU1hdGguYWJzKHJbMF0tdFswXSkrTWF0aC5hYnMoclsxXS10WzFdKTtlLmFyZWE9TWF0aC5hYnMoby8yKSxlLmRpc3Q9bn1mdW5jdGlvbiBjYWxjQkJveChlKXt2YXIgdD1lLmdlb21ldHJ5LHI9ZS5taW4sbz1lLm1heDtpZigxPT09ZS50eXBlKWNhbGNSaW5nQkJveChyLG8sdCk7ZWxzZSBmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyljYWxjUmluZ0JCb3gocixvLHRbbl0pO3JldHVybiBlfWZ1bmN0aW9uIGNhbGNSaW5nQkJveChlLHQscil7Zm9yKHZhciBvLG49MDtuPHIubGVuZ3RoO24rKylvPXJbbl0sZVswXT1NYXRoLm1pbihvWzBdLGVbMF0pLHRbMF09TWF0aC5tYXgob1swXSx0WzBdKSxlWzFdPU1hdGgubWluKG9bMV0sZVsxXSksdFsxXT1NYXRoLm1heChvWzFdLHRbMV0pfW1vZHVsZS5leHBvcnRzPWNvbnZlcnQ7dmFyIHNpbXBsaWZ5PXJlcXVpcmUoXCIuL3NpbXBsaWZ5XCIpO1xufSx7XCIuL3NpbXBsaWZ5XCI6MTEyfV0sMTExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGdlb2pzb252dChlLHQpe3JldHVybiBuZXcgR2VvSlNPTlZUKGUsdCl9ZnVuY3Rpb24gR2VvSlNPTlZUKGUsdCl7dD10aGlzLm9wdGlvbnM9ZXh0ZW5kKE9iamVjdC5jcmVhdGUodGhpcy5vcHRpb25zKSx0KTt2YXIgaT10LmRlYnVnO2kmJmNvbnNvbGUudGltZShcInByZXByb2Nlc3MgZGF0YVwiKTt2YXIgbz0xPDx0Lm1heFpvb20sbj1jb252ZXJ0KGUsdC50b2xlcmFuY2UvKG8qdC5leHRlbnQpKTt0aGlzLnRpbGVzPXt9LHRoaXMudGlsZUNvb3Jkcz1bXSxpJiYoY29uc29sZS50aW1lRW5kKFwicHJlcHJvY2VzcyBkYXRhXCIpLGNvbnNvbGUubG9nKFwiaW5kZXg6IG1heFpvb206ICVkLCBtYXhQb2ludHM6ICVkXCIsdC5pbmRleE1heFpvb20sdC5pbmRleE1heFBvaW50cyksY29uc29sZS50aW1lKFwiZ2VuZXJhdGUgdGlsZXNcIiksdGhpcy5zdGF0cz17fSx0aGlzLnRvdGFsPTApLG49d3JhcChuLHQuYnVmZmVyL3QuZXh0ZW50LGludGVyc2VjdFgpLG4ubGVuZ3RoJiZ0aGlzLnNwbGl0VGlsZShuLDAsMCwwKSxpJiYobi5sZW5ndGgmJmNvbnNvbGUubG9nKFwiZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkXCIsdGhpcy50aWxlc1swXS5udW1GZWF0dXJlcyx0aGlzLnRpbGVzWzBdLm51bVBvaW50cyksY29uc29sZS50aW1lRW5kKFwiZ2VuZXJhdGUgdGlsZXNcIiksY29uc29sZS5sb2coXCJ0aWxlcyBnZW5lcmF0ZWQ6XCIsdGhpcy50b3RhbCxKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRzKSkpfWZ1bmN0aW9uIHRvSUQoZSx0LGkpe3JldHVybiAzMiooKDE8PGUpKmkrdCkrZX1mdW5jdGlvbiBpbnRlcnNlY3RYKGUsdCxpKXtyZXR1cm5baSwoaS1lWzBdKSoodFsxXS1lWzFdKS8odFswXS1lWzBdKStlWzFdLDFdfWZ1bmN0aW9uIGludGVyc2VjdFkoZSx0LGkpe3JldHVyblsoaS1lWzFdKSoodFswXS1lWzBdKS8odFsxXS1lWzFdKStlWzBdLGksMV19ZnVuY3Rpb24gZXh0ZW5kKGUsdCl7Zm9yKHZhciBpIGluIHQpZVtpXT10W2ldO3JldHVybiBlfWZ1bmN0aW9uIGlzQ2xpcHBlZFNxdWFyZShlLHQsaSl7dmFyIG89ZS5zb3VyY2U7aWYoMSE9PW8ubGVuZ3RoKXJldHVybiExO3ZhciBuPW9bMF07aWYoMyE9PW4udHlwZXx8bi5nZW9tZXRyeS5sZW5ndGg+MSlyZXR1cm4hMTt2YXIgcj1uLmdlb21ldHJ5WzBdLmxlbmd0aDtpZig1IT09cilyZXR1cm4hMTtmb3IodmFyIHM9MDtyPnM7cysrKXt2YXIgbD10cmFuc2Zvcm0ucG9pbnQobi5nZW9tZXRyeVswXVtzXSx0LGUuejIsZS54LGUueSk7aWYobFswXSE9PS1pJiZsWzBdIT09dCtpfHxsWzFdIT09LWkmJmxbMV0hPT10K2kpcmV0dXJuITF9cmV0dXJuITB9bW9kdWxlLmV4cG9ydHM9Z2VvanNvbnZ0O3ZhciBjb252ZXJ0PXJlcXVpcmUoXCIuL2NvbnZlcnRcIiksdHJhbnNmb3JtPXJlcXVpcmUoXCIuL3RyYW5zZm9ybVwiKSxjbGlwPXJlcXVpcmUoXCIuL2NsaXBcIiksd3JhcD1yZXF1aXJlKFwiLi93cmFwXCIpLGNyZWF0ZVRpbGU9cmVxdWlyZShcIi4vdGlsZVwiKTtHZW9KU09OVlQucHJvdG90eXBlLm9wdGlvbnM9e21heFpvb206MTQsaW5kZXhNYXhab29tOjUsaW5kZXhNYXhQb2ludHM6MWU1LHNvbGlkQ2hpbGRyZW46ITEsdG9sZXJhbmNlOjMsZXh0ZW50OjQwOTYsYnVmZmVyOjY0LGRlYnVnOjB9LEdlb0pTT05WVC5wcm90b3R5cGUuc3BsaXRUaWxlPWZ1bmN0aW9uKGUsdCxpLG8sbixyLHMpe2Zvcih2YXIgbD1bZSx0LGksb10sYT10aGlzLm9wdGlvbnMsdT1hLmRlYnVnLGM9bnVsbDtsLmxlbmd0aDspe289bC5wb3AoKSxpPWwucG9wKCksdD1sLnBvcCgpLGU9bC5wb3AoKTt2YXIgcD0xPDx0LGQ9dG9JRCh0LGksbyksbT10aGlzLnRpbGVzW2RdLGY9dD09PWEubWF4Wm9vbT8wOmEudG9sZXJhbmNlLyhwKmEuZXh0ZW50KTtpZighbSYmKHU+MSYmY29uc29sZS50aW1lKFwiY3JlYXRpb25cIiksbT10aGlzLnRpbGVzW2RdPWNyZWF0ZVRpbGUoZSxwLGksbyxmLHQ9PT1hLm1heFpvb20pLHRoaXMudGlsZUNvb3Jkcy5wdXNoKHt6OnQseDppLHk6b30pLHUpKXt1PjEmJihjb25zb2xlLmxvZyhcInRpbGUgeiVkLSVkLSVkIChmZWF0dXJlczogJWQsIHBvaW50czogJWQsIHNpbXBsaWZpZWQ6ICVkKVwiLHQsaSxvLG0ubnVtRmVhdHVyZXMsbS5udW1Qb2ludHMsbS5udW1TaW1wbGlmaWVkKSxjb25zb2xlLnRpbWVFbmQoXCJjcmVhdGlvblwiKSk7dmFyIGg9XCJ6XCIrdDt0aGlzLnN0YXRzW2hdPSh0aGlzLnN0YXRzW2hdfHwwKSsxLHRoaXMudG90YWwrK31pZihtLnNvdXJjZT1lLG4pe2lmKHQ9PT1hLm1heFpvb218fHQ9PT1uKWNvbnRpbnVlO3ZhciB4PTE8PG4tdDtpZihpIT09TWF0aC5mbG9vcihyL3gpfHxvIT09TWF0aC5mbG9vcihzL3gpKWNvbnRpbnVlfWVsc2UgaWYodD09PWEuaW5kZXhNYXhab29tfHxtLm51bVBvaW50czw9YS5pbmRleE1heFBvaW50cyljb250aW51ZTtpZihhLnNvbGlkQ2hpbGRyZW58fCFpc0NsaXBwZWRTcXVhcmUobSxhLmV4dGVudCxhLmJ1ZmZlcikpe20uc291cmNlPW51bGwsdT4xJiZjb25zb2xlLnRpbWUoXCJjbGlwcGluZ1wiKTt2YXIgZyx2LE0sVCxiLHksUz0uNSphLmJ1ZmZlci9hLmV4dGVudCxaPS41LVMscT0uNStTLHc9MStTO2c9dj1NPVQ9bnVsbCxiPWNsaXAoZSxwLGktUyxpK3EsMCxpbnRlcnNlY3RYLG0ubWluWzBdLG0ubWF4WzBdKSx5PWNsaXAoZSxwLGkrWixpK3csMCxpbnRlcnNlY3RYLG0ubWluWzBdLG0ubWF4WzBdKSxiJiYoZz1jbGlwKGIscCxvLVMsbytxLDEsaW50ZXJzZWN0WSxtLm1pblsxXSxtLm1heFsxXSksdj1jbGlwKGIscCxvK1osbyt3LDEsaW50ZXJzZWN0WSxtLm1pblsxXSxtLm1heFsxXSkpLHkmJihNPWNsaXAoeSxwLG8tUyxvK3EsMSxpbnRlcnNlY3RZLG0ubWluWzFdLG0ubWF4WzFdKSxUPWNsaXAoeSxwLG8rWixvK3csMSxpbnRlcnNlY3RZLG0ubWluWzFdLG0ubWF4WzFdKSksdT4xJiZjb25zb2xlLnRpbWVFbmQoXCJjbGlwcGluZ1wiKSxnJiZsLnB1c2goZyx0KzEsMippLDIqbyksdiYmbC5wdXNoKHYsdCsxLDIqaSwyKm8rMSksTSYmbC5wdXNoKE0sdCsxLDIqaSsxLDIqbyksVCYmbC5wdXNoKFQsdCsxLDIqaSsxLDIqbysxKX1lbHNlIG4mJihjPXQpfXJldHVybiBjfSxHZW9KU09OVlQucHJvdG90eXBlLmdldFRpbGU9ZnVuY3Rpb24oZSx0LGkpe3ZhciBvPXRoaXMub3B0aW9ucyxuPW8uZXh0ZW50LHI9by5kZWJ1ZyxzPTE8PGU7dD0odCVzK3MpJXM7dmFyIGw9dG9JRChlLHQsaSk7aWYodGhpcy50aWxlc1tsXSlyZXR1cm4gdHJhbnNmb3JtLnRpbGUodGhpcy50aWxlc1tsXSxuKTtyPjEmJmNvbnNvbGUubG9nKFwiZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWRcIixlLHQsaSk7Zm9yKHZhciBhLHU9ZSxjPXQscD1pOyFhJiZ1PjA7KXUtLSxjPU1hdGguZmxvb3IoYy8yKSxwPU1hdGguZmxvb3IocC8yKSxhPXRoaXMudGlsZXNbdG9JRCh1LGMscCldO2lmKCFhfHwhYS5zb3VyY2UpcmV0dXJuIG51bGw7aWYocj4xJiZjb25zb2xlLmxvZyhcImZvdW5kIHBhcmVudCB0aWxlIHolZC0lZC0lZFwiLHUsYyxwKSxpc0NsaXBwZWRTcXVhcmUoYSxuLG8uYnVmZmVyKSlyZXR1cm4gdHJhbnNmb3JtLnRpbGUoYSxuKTtyPjEmJmNvbnNvbGUudGltZShcImRyaWxsaW5nIGRvd25cIik7dmFyIGQ9dGhpcy5zcGxpdFRpbGUoYS5zb3VyY2UsdSxjLHAsZSx0LGkpO2lmKHI+MSYmY29uc29sZS50aW1lRW5kKFwiZHJpbGxpbmcgZG93blwiKSxudWxsIT09ZCl7dmFyIG09MTw8ZS1kO2w9dG9JRChkLE1hdGguZmxvb3IodC9tKSxNYXRoLmZsb29yKGkvbSkpfXJldHVybiB0aGlzLnRpbGVzW2xdP3RyYW5zZm9ybS50aWxlKHRoaXMudGlsZXNbbF0sbik6bnVsbH07XG59LHtcIi4vY2xpcFwiOjEwOSxcIi4vY29udmVydFwiOjExMCxcIi4vdGlsZVwiOjExMyxcIi4vdHJhbnNmb3JtXCI6MTE0LFwiLi93cmFwXCI6MTE1fV0sMTEyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHNpbXBsaWZ5KHQsaSl7dmFyIGUscCxyLHMsbz1pKmksZj10Lmxlbmd0aCx1PTAsbj1mLTEsZz1bXTtmb3IodFt1XVsyXT0xLHRbbl1bMl09MTtuOyl7Zm9yKHA9MCxlPXUrMTtuPmU7ZSsrKXI9Z2V0U3FTZWdEaXN0KHRbZV0sdFt1XSx0W25dKSxyPnAmJihzPWUscD1yKTtwPm8/KHRbc11bMl09cCxnLnB1c2godSksZy5wdXNoKHMpLHU9cyk6KG49Zy5wb3AoKSx1PWcucG9wKCkpfX1mdW5jdGlvbiBnZXRTcVNlZ0Rpc3QodCxpLGUpe3ZhciBwPWlbMF0scj1pWzFdLHM9ZVswXSxvPWVbMV0sZj10WzBdLHU9dFsxXSxuPXMtcCxnPW8tcjtpZigwIT09bnx8MCE9PWcpe3ZhciBsPSgoZi1wKSpuKyh1LXIpKmcpLyhuKm4rZypnKTtsPjE/KHA9cyxyPW8pOmw+MCYmKHArPW4qbCxyKz1nKmwpfXJldHVybiBuPWYtcCxnPXUtcixuKm4rZypnfW1vZHVsZS5leHBvcnRzPXNpbXBsaWZ5O1xufSx7fV0sMTEzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNyZWF0ZVRpbGUoZSxuLHQsbSxpLHUpe2Zvcih2YXIgcj17ZmVhdHVyZXM6W10sbnVtUG9pbnRzOjAsbnVtU2ltcGxpZmllZDowLG51bUZlYXR1cmVzOjAsc291cmNlOm51bGwseDp0LHk6bSx6MjpuLHRyYW5zZm9ybWVkOiExLG1pbjpbMiwxXSxtYXg6Wy0xLDBdfSxhPTA7YTxlLmxlbmd0aDthKyspe3IubnVtRmVhdHVyZXMrKyxhZGRGZWF0dXJlKHIsZVthXSxpLHUpO3ZhciBzPWVbYV0ubWluLGw9ZVthXS5tYXg7c1swXTxyLm1pblswXSYmKHIubWluWzBdPXNbMF0pLHNbMV08ci5taW5bMV0mJihyLm1pblsxXT1zWzFdKSxsWzBdPnIubWF4WzBdJiYoci5tYXhbMF09bFswXSksbFsxXT5yLm1heFsxXSYmKHIubWF4WzFdPWxbMV0pfXJldHVybiByfWZ1bmN0aW9uIGFkZEZlYXR1cmUoZSxuLHQsbSl7dmFyIGksdSxyLGEscz1uLmdlb21ldHJ5LGw9bi50eXBlLG89W10sZj10KnQ7aWYoMT09PWwpZm9yKGk9MDtpPHMubGVuZ3RoO2krKylvLnB1c2goc1tpXSksZS5udW1Qb2ludHMrKyxlLm51bVNpbXBsaWZpZWQrKztlbHNlIGZvcihpPTA7aTxzLmxlbmd0aDtpKyspaWYocj1zW2ldLG18fCEoMj09PWwmJnIuZGlzdDx0fHwzPT09bCYmci5hcmVhPGYpKXt2YXIgZD1bXTtmb3IodT0wO3U8ci5sZW5ndGg7dSsrKWE9clt1XSwobXx8YVsyXT5mKSYmKGQucHVzaChhKSxlLm51bVNpbXBsaWZpZWQrKyksZS5udW1Qb2ludHMrKztvLnB1c2goZCl9ZWxzZSBlLm51bVBvaW50cys9ci5sZW5ndGg7by5sZW5ndGgmJmUuZmVhdHVyZXMucHVzaCh7Z2VvbWV0cnk6byx0eXBlOmwsdGFnczpuLnRhZ3N8fG51bGx9KX1tb2R1bGUuZXhwb3J0cz1jcmVhdGVUaWxlO1xufSx7fV0sMTE0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHRyYW5zZm9ybVRpbGUocix0KXtpZihyLnRyYW5zZm9ybWVkKXJldHVybiByO3ZhciBuLGUsbyxmPXIuejIsYT1yLngscz1yLnk7Zm9yKG49MDtuPHIuZmVhdHVyZXMubGVuZ3RoO24rKyl7dmFyIGk9ci5mZWF0dXJlc1tuXSx1PWkuZ2VvbWV0cnksbT1pLnR5cGU7aWYoMT09PW0pZm9yKGU9MDtlPHUubGVuZ3RoO2UrKyl1W2VdPXRyYW5zZm9ybVBvaW50KHVbZV0sdCxmLGEscyk7ZWxzZSBmb3IoZT0wO2U8dS5sZW5ndGg7ZSsrKXt2YXIgbD11W2VdO2ZvcihvPTA7bzxsLmxlbmd0aDtvKyspbFtvXT10cmFuc2Zvcm1Qb2ludChsW29dLHQsZixhLHMpfX1yZXR1cm4gci50cmFuc2Zvcm1lZD0hMCxyfWZ1bmN0aW9uIHRyYW5zZm9ybVBvaW50KHIsdCxuLGUsbyl7dmFyIGY9TWF0aC5yb3VuZCh0KihyWzBdKm4tZSkpLGE9TWF0aC5yb3VuZCh0KihyWzFdKm4tbykpO3JldHVybltmLGFdfWV4cG9ydHMudGlsZT10cmFuc2Zvcm1UaWxlLGV4cG9ydHMucG9pbnQ9dHJhbnNmb3JtUG9pbnQ7XG59LHt9XSwxMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gd3JhcChyLHQsZSl7dmFyIG89cixhPWNsaXAociwxLC0xLXQsdCwwLGUsLTEsMikscz1jbGlwKHIsMSwxLXQsMit0LDAsZSwtMSwyKTtyZXR1cm4oYXx8cykmJihvPWNsaXAociwxLC10LDErdCwwLGUsLTEsMiksYSYmKG89c2hpZnRGZWF0dXJlQ29vcmRzKGEsMSkuY29uY2F0KG8pKSxzJiYobz1vLmNvbmNhdChzaGlmdEZlYXR1cmVDb29yZHMocywtMSkpKSksb31mdW5jdGlvbiBzaGlmdEZlYXR1cmVDb29yZHMocix0KXtmb3IodmFyIGU9W10sbz0wO288ci5sZW5ndGg7bysrKXt2YXIgYSxzPXJbb10saT1zLnR5cGU7aWYoMT09PWkpYT1zaGlmdENvb3JkcyhzLmdlb21ldHJ5LHQpO2Vsc2V7YT1bXTtmb3IodmFyIG49MDtuPHMuZ2VvbWV0cnkubGVuZ3RoO24rKylhLnB1c2goc2hpZnRDb29yZHMocy5nZW9tZXRyeVtuXSx0KSl9ZS5wdXNoKHtnZW9tZXRyeTphLHR5cGU6aSx0YWdzOnMudGFncyxtaW46W3MubWluWzBdK3Qscy5taW5bMV1dLG1heDpbcy5tYXhbMF0rdCxzLm1heFsxXV19KX1yZXR1cm4gZX1mdW5jdGlvbiBzaGlmdENvb3JkcyhyLHQpe3ZhciBlPVtdO2UuYXJlYT1yLmFyZWEsZS5kaXN0PXIuZGlzdDtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKyllLnB1c2goW3Jbb11bMF0rdCxyW29dWzFdLHJbb11bMl1dKTtyZXR1cm4gZX12YXIgY2xpcD1yZXF1aXJlKFwiLi9jbGlwXCIpO21vZHVsZS5leHBvcnRzPXdyYXA7XG59LHtcIi4vY2xpcFwiOjEwOX1dLDExNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5leHBvcnRzLmdsTWF0cml4PXJlcXVpcmUoXCIuL2dsLW1hdHJpeC9jb21tb24uanNcIiksZXhwb3J0cy5tYXQyPXJlcXVpcmUoXCIuL2dsLW1hdHJpeC9tYXQyLmpzXCIpLGV4cG9ydHMubWF0MmQ9cmVxdWlyZShcIi4vZ2wtbWF0cml4L21hdDJkLmpzXCIpLGV4cG9ydHMubWF0Mz1yZXF1aXJlKFwiLi9nbC1tYXRyaXgvbWF0My5qc1wiKSxleHBvcnRzLm1hdDQ9cmVxdWlyZShcIi4vZ2wtbWF0cml4L21hdDQuanNcIiksZXhwb3J0cy5xdWF0PXJlcXVpcmUoXCIuL2dsLW1hdHJpeC9xdWF0LmpzXCIpLGV4cG9ydHMudmVjMj1yZXF1aXJlKFwiLi9nbC1tYXRyaXgvdmVjMi5qc1wiKSxleHBvcnRzLnZlYzM9cmVxdWlyZShcIi4vZ2wtbWF0cml4L3ZlYzMuanNcIiksZXhwb3J0cy52ZWM0PXJlcXVpcmUoXCIuL2dsLW1hdHJpeC92ZWM0LmpzXCIpO1xufSx7XCIuL2dsLW1hdHJpeC9jb21tb24uanNcIjoxMTcsXCIuL2dsLW1hdHJpeC9tYXQyLmpzXCI6MTE4LFwiLi9nbC1tYXRyaXgvbWF0MmQuanNcIjoxMTksXCIuL2dsLW1hdHJpeC9tYXQzLmpzXCI6MTIwLFwiLi9nbC1tYXRyaXgvbWF0NC5qc1wiOjEyMSxcIi4vZ2wtbWF0cml4L3F1YXQuanNcIjoxMjIsXCIuL2dsLW1hdHJpeC92ZWMyLmpzXCI6MTIzLFwiLi9nbC1tYXRyaXgvdmVjMy5qc1wiOjEyNCxcIi4vZ2wtbWF0cml4L3ZlYzQuanNcIjoxMjV9XSwxMTc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsTWF0cml4PXt9O2dsTWF0cml4LkVQU0lMT049MWUtNixnbE1hdHJpeC5BUlJBWV9UWVBFPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBGbG9hdDMyQXJyYXk/RmxvYXQzMkFycmF5OkFycmF5LGdsTWF0cml4LlJBTkRPTT1NYXRoLnJhbmRvbSxnbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGU9ZnVuY3Rpb24ocil7R0xNQVRfQVJSQVlfVFlQRT1yfTt2YXIgZGVncmVlPU1hdGguUEkvMTgwO2dsTWF0cml4LnRvUmFkaWFuPWZ1bmN0aW9uKHIpe3JldHVybiByKmRlZ3JlZX0sbW9kdWxlLmV4cG9ydHM9Z2xNYXRyaXg7XG59LHt9XSwxMTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsTWF0cml4PXJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKSxtYXQyPXt9O21hdDIuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MSx0fSxtYXQyLmNsb25lPWZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO3JldHVybiBuWzBdPXRbMF0sblsxXT10WzFdLG5bMl09dFsyXSxuWzNdPXRbM10sbn0sbWF0Mi5jb3B5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT1uWzJdLHRbM109blszXSx0fSxtYXQyLmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTEsdH0sbWF0Mi50cmFuc3Bvc2U9ZnVuY3Rpb24odCxuKXtpZih0PT09bil7dmFyIHI9blsxXTt0WzFdPW5bMl0sdFsyXT1yfWVsc2UgdFswXT1uWzBdLHRbMV09blsyXSx0WzJdPW5bMV0sdFszXT1uWzNdO3JldHVybiB0fSxtYXQyLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciByPW5bMF0sYT1uWzFdLHU9blsyXSxvPW5bM10sZT1yKm8tdSphO3JldHVybiBlPyhlPTEvZSx0WzBdPW8qZSx0WzFdPS1hKmUsdFsyXT0tdSplLHRbM109ciplLHQpOm51bGx9LG1hdDIuYWRqb2ludD1mdW5jdGlvbih0LG4pe3ZhciByPW5bMF07cmV0dXJuIHRbMF09blszXSx0WzFdPS1uWzFdLHRbMl09LW5bMl0sdFszXT1yLHR9LG1hdDIuZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF0qdFszXS10WzJdKnRbMV19LG1hdDIubXVsdGlwbHk9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sdT1uWzFdLG89blsyXSxlPW5bM10saT1yWzBdLG09clsxXSxjPXJbMl0sZj1yWzNdO3JldHVybiB0WzBdPWEqaStvKm0sdFsxXT11KmkrZSptLHRbMl09YSpjK28qZix0WzNdPXUqYytlKmYsdH0sbWF0Mi5tdWw9bWF0Mi5tdWx0aXBseSxtYXQyLnJvdGF0ZT1mdW5jdGlvbih0LG4scil7dmFyIGE9blswXSx1PW5bMV0sbz1uWzJdLGU9blszXSxpPU1hdGguc2luKHIpLG09TWF0aC5jb3Mocik7cmV0dXJuIHRbMF09YSptK28qaSx0WzFdPXUqbStlKmksdFsyXT1hKi1pK28qbSx0WzNdPXUqLWkrZSptLHR9LG1hdDIuc2NhbGU9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sdT1uWzFdLG89blsyXSxlPW5bM10saT1yWzBdLG09clsxXTtyZXR1cm4gdFswXT1hKmksdFsxXT11KmksdFsyXT1vKm0sdFszXT1lKm0sdH0sbWF0Mi5mcm9tUm90YXRpb249ZnVuY3Rpb24odCxuKXt2YXIgcj1NYXRoLnNpbihuKSxhPU1hdGguY29zKG4pO3JldHVybiB0WzBdPWEsdFsxXT1yLHRbMl09LXIsdFszXT1hLHR9LG1hdDIuZnJvbVNjYWxpbmc9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT1uWzBdLHRbMV09MCx0WzJdPTAsdFszXT1uWzFdLHR9LG1hdDIuc3RyPWZ1bmN0aW9uKHQpe3JldHVyblwibWF0MihcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiLCBcIit0WzNdK1wiKVwifSxtYXQyLmZyb2I9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh0WzBdLDIpK01hdGgucG93KHRbMV0sMikrTWF0aC5wb3codFsyXSwyKStNYXRoLnBvdyh0WzNdLDIpKX0sbWF0Mi5MRFU9ZnVuY3Rpb24odCxuLHIsYSl7cmV0dXJuIHRbMl09YVsyXS9hWzBdLHJbMF09YVswXSxyWzFdPWFbMV0sclszXT1hWzNdLXRbMl0qclsxXSxbdCxuLHJdfSxtb2R1bGUuZXhwb3J0cz1tYXQyO1xufSx7XCIuL2NvbW1vbi5qc1wiOjExN31dLDExOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG52YXIgZ2xNYXRyaXg9cmVxdWlyZShcIi4vY29tbW9uLmpzXCIpLG1hdDJkPXt9O21hdDJkLmNyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDYpO3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTEsdFs0XT0wLHRbNV09MCx0fSxtYXQyZC5jbG9uZT1mdW5jdGlvbih0KXt2YXIgbj1uZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtyZXR1cm4gblswXT10WzBdLG5bMV09dFsxXSxuWzJdPXRbMl0sblszXT10WzNdLG5bNF09dFs0XSxuWzVdPXRbNV0sbn0sbWF0MmQuY29weT1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPW5bMF0sdFsxXT1uWzFdLHRbMl09blsyXSx0WzNdPW5bM10sdFs0XT1uWzRdLHRbNV09bls1XSx0fSxtYXQyZC5pZGVudGl0eT1mdW5jdGlvbih0KXtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0xLHRbNF09MCx0WzVdPTAsdH0sbWF0MmQuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIHI9blswXSxhPW5bMV0sbz1uWzJdLHU9blszXSxlPW5bNF0saT1uWzVdLG09cip1LWEqbztyZXR1cm4gbT8obT0xL20sdFswXT11Km0sdFsxXT0tYSptLHRbMl09LW8qbSx0WzNdPXIqbSx0WzRdPShvKmktdSplKSptLHRbNV09KGEqZS1yKmkpKm0sdCk6bnVsbH0sbWF0MmQuZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF0qdFszXS10WzFdKnRbMl19LG1hdDJkLm11bHRpcGx5PWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLG89blsxXSx1PW5bMl0sZT1uWzNdLGk9bls0XSxtPW5bNV0sYz1yWzBdLGQ9clsxXSxmPXJbMl0sbD1yWzNdLE09cls0XSxoPXJbNV07cmV0dXJuIHRbMF09YSpjK3UqZCx0WzFdPW8qYytlKmQsdFsyXT1hKmYrdSpsLHRbM109bypmK2UqbCx0WzRdPWEqTSt1KmgraSx0WzVdPW8qTStlKmgrbSx0fSxtYXQyZC5tdWw9bWF0MmQubXVsdGlwbHksbWF0MmQucm90YXRlPWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLG89blsxXSx1PW5bMl0sZT1uWzNdLGk9bls0XSxtPW5bNV0sYz1NYXRoLnNpbihyKSxkPU1hdGguY29zKHIpO3JldHVybiB0WzBdPWEqZCt1KmMsdFsxXT1vKmQrZSpjLHRbMl09YSotYyt1KmQsdFszXT1vKi1jK2UqZCx0WzRdPWksdFs1XT1tLHR9LG1hdDJkLnNjYWxlPWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLG89blsxXSx1PW5bMl0sZT1uWzNdLGk9bls0XSxtPW5bNV0sYz1yWzBdLGQ9clsxXTtyZXR1cm4gdFswXT1hKmMsdFsxXT1vKmMsdFsyXT11KmQsdFszXT1lKmQsdFs0XT1pLHRbNV09bSx0fSxtYXQyZC50cmFuc2xhdGU9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sbz1uWzFdLHU9blsyXSxlPW5bM10saT1uWzRdLG09bls1XSxjPXJbMF0sZD1yWzFdO3JldHVybiB0WzBdPWEsdFsxXT1vLHRbMl09dSx0WzNdPWUsdFs0XT1hKmMrdSpkK2ksdFs1XT1vKmMrZSpkK20sdH0sbWF0MmQuZnJvbVJvdGF0aW9uPWZ1bmN0aW9uKHQsbil7dmFyIHI9TWF0aC5zaW4obiksYT1NYXRoLmNvcyhuKTtyZXR1cm4gdFswXT1hLHRbMV09cix0WzJdPS1yLHRbM109YSx0WzRdPTAsdFs1XT0wLHR9LG1hdDJkLmZyb21TY2FsaW5nPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPTAsdFsyXT0wLHRbM109blsxXSx0WzRdPTAsdFs1XT0wLHR9LG1hdDJkLmZyb21UcmFuc2xhdGlvbj1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTEsdFs0XT1uWzBdLHRbNV09blsxXSx0fSxtYXQyZC5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuXCJtYXQyZChcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiLCBcIit0WzNdK1wiLCBcIit0WzRdK1wiLCBcIit0WzVdK1wiKVwifSxtYXQyZC5mcm9iPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codFswXSwyKStNYXRoLnBvdyh0WzFdLDIpK01hdGgucG93KHRbMl0sMikrTWF0aC5wb3codFszXSwyKStNYXRoLnBvdyh0WzRdLDIpK01hdGgucG93KHRbNV0sMikrMSl9LG1vZHVsZS5leHBvcnRzPW1hdDJkO1xufSx7XCIuL2NvbW1vbi5qc1wiOjExN31dLDEyMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG52YXIgZ2xNYXRyaXg9cmVxdWlyZShcIi4vY29tbW9uLmpzXCIpLG1hdDM9e307bWF0My5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MSx0WzVdPTAsdFs2XT0wLHRbN109MCx0WzhdPTEsdH0sbWF0My5mcm9tTWF0ND1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPW5bMF0sdFsxXT1uWzFdLHRbMl09blsyXSx0WzNdPW5bNF0sdFs0XT1uWzVdLHRbNV09bls2XSx0WzZdPW5bOF0sdFs3XT1uWzldLHRbOF09blsxMF0sdH0sbWF0My5jbG9uZT1mdW5jdGlvbih0KXt2YXIgbj1uZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtyZXR1cm4gblswXT10WzBdLG5bMV09dFsxXSxuWzJdPXRbMl0sblszXT10WzNdLG5bNF09dFs0XSxuWzVdPXRbNV0sbls2XT10WzZdLG5bN109dFs3XSxuWzhdPXRbOF0sbn0sbWF0My5jb3B5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT1uWzJdLHRbM109blszXSx0WzRdPW5bNF0sdFs1XT1uWzVdLHRbNl09bls2XSx0WzddPW5bN10sdFs4XT1uWzhdLHR9LG1hdDMuaWRlbnRpdHk9ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTEsdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT0xLHR9LG1hdDMudHJhbnNwb3NlPWZ1bmN0aW9uKHQsbil7aWYodD09PW4pe3ZhciByPW5bMV0sYT1uWzJdLG89bls1XTt0WzFdPW5bM10sdFsyXT1uWzZdLHRbM109cix0WzVdPW5bN10sdFs2XT1hLHRbN109b31lbHNlIHRbMF09blswXSx0WzFdPW5bM10sdFsyXT1uWzZdLHRbM109blsxXSx0WzRdPW5bNF0sdFs1XT1uWzddLHRbNl09blsyXSx0WzddPW5bNV0sdFs4XT1uWzhdO3JldHVybiB0fSxtYXQzLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciByPW5bMF0sYT1uWzFdLG89blsyXSx1PW5bM10sbT1uWzRdLGU9bls1XSxpPW5bNl0sYz1uWzddLGY9bls4XSxsPWYqbS1lKmMsTT0tZip1K2UqaSx2PWMqdS1tKmksaD1yKmwrYSpNK28qdjtyZXR1cm4gaD8oaD0xL2gsdFswXT1sKmgsdFsxXT0oLWYqYStvKmMpKmgsdFsyXT0oZSphLW8qbSkqaCx0WzNdPU0qaCx0WzRdPShmKnItbyppKSpoLHRbNV09KC1lKnIrbyp1KSpoLHRbNl09dipoLHRbN109KC1jKnIrYSppKSpoLHRbOF09KG0qci1hKnUpKmgsdCk6bnVsbH0sbWF0My5hZGpvaW50PWZ1bmN0aW9uKHQsbil7dmFyIHI9blswXSxhPW5bMV0sbz1uWzJdLHU9blszXSxtPW5bNF0sZT1uWzVdLGk9bls2XSxjPW5bN10sZj1uWzhdO3JldHVybiB0WzBdPW0qZi1lKmMsdFsxXT1vKmMtYSpmLHRbMl09YSplLW8qbSx0WzNdPWUqaS11KmYsdFs0XT1yKmYtbyppLHRbNV09byp1LXIqZSx0WzZdPXUqYy1tKmksdFs3XT1hKmktcipjLHRbOF09ciptLWEqdSx0fSxtYXQzLmRldGVybWluYW50PWZ1bmN0aW9uKHQpe3ZhciBuPXRbMF0scj10WzFdLGE9dFsyXSxvPXRbM10sdT10WzRdLG09dFs1XSxlPXRbNl0saT10WzddLGM9dFs4XTtyZXR1cm4gbiooYyp1LW0qaSkrciooLWMqbyttKmUpK2EqKGkqby11KmUpfSxtYXQzLm11bHRpcGx5PWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLG89blsxXSx1PW5bMl0sbT1uWzNdLGU9bls0XSxpPW5bNV0sYz1uWzZdLGY9bls3XSxsPW5bOF0sTT1yWzBdLHY9clsxXSxoPXJbMl0scD1yWzNdLHM9cls0XSx3PXJbNV0sZD1yWzZdLFI9cls3XSxnPXJbOF07cmV0dXJuIHRbMF09TSphK3YqbStoKmMsdFsxXT1NKm8rdiplK2gqZix0WzJdPU0qdSt2KmkraCpsLHRbM109cCphK3MqbSt3KmMsdFs0XT1wKm8rcyplK3cqZix0WzVdPXAqdStzKmkrdypsLHRbNl09ZCphK1IqbStnKmMsdFs3XT1kKm8rUiplK2cqZix0WzhdPWQqdStSKmkrZypsLHR9LG1hdDMubXVsPW1hdDMubXVsdGlwbHksbWF0My50cmFuc2xhdGU9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sbz1uWzFdLHU9blsyXSxtPW5bM10sZT1uWzRdLGk9bls1XSxjPW5bNl0sZj1uWzddLGw9bls4XSxNPXJbMF0sdj1yWzFdO3JldHVybiB0WzBdPWEsdFsxXT1vLHRbMl09dSx0WzNdPW0sdFs0XT1lLHRbNV09aSx0WzZdPU0qYSt2Km0rYyx0WzddPU0qbyt2KmUrZix0WzhdPU0qdSt2KmkrbCx0fSxtYXQzLnJvdGF0ZT1mdW5jdGlvbih0LG4scil7dmFyIGE9blswXSxvPW5bMV0sdT1uWzJdLG09blszXSxlPW5bNF0saT1uWzVdLGM9bls2XSxmPW5bN10sbD1uWzhdLE09TWF0aC5zaW4ociksdj1NYXRoLmNvcyhyKTtyZXR1cm4gdFswXT12KmErTSptLHRbMV09dipvK00qZSx0WzJdPXYqdStNKmksdFszXT12Km0tTSphLHRbNF09diplLU0qbyx0WzVdPXYqaS1NKnUsdFs2XT1jLHRbN109Zix0WzhdPWwsdH0sbWF0My5zY2FsZT1mdW5jdGlvbih0LG4scil7dmFyIGE9clswXSxvPXJbMV07cmV0dXJuIHRbMF09YSpuWzBdLHRbMV09YSpuWzFdLHRbMl09YSpuWzJdLHRbM109bypuWzNdLHRbNF09bypuWzRdLHRbNV09bypuWzVdLHRbNl09bls2XSx0WzddPW5bN10sdFs4XT1uWzhdLHR9LG1hdDMuZnJvbVRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTEsdFs1XT0wLHRbNl09blswXSx0WzddPW5bMV0sdFs4XT0xLHR9LG1hdDMuZnJvbVJvdGF0aW9uPWZ1bmN0aW9uKHQsbil7dmFyIHI9TWF0aC5zaW4obiksYT1NYXRoLmNvcyhuKTtyZXR1cm4gdFswXT1hLHRbMV09cix0WzJdPTAsdFszXT0tcix0WzRdPWEsdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT0xLHR9LG1hdDMuZnJvbVNjYWxpbmc9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT1uWzBdLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09blsxXSx0WzVdPTAsdFs2XT0wLHRbN109MCx0WzhdPTEsdH0sbWF0My5mcm9tTWF0MmQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT1uWzBdLHRbMV09blsxXSx0WzJdPTAsdFszXT1uWzJdLHRbNF09blszXSx0WzVdPTAsdFs2XT1uWzRdLHRbN109bls1XSx0WzhdPTEsdH0sbWF0My5mcm9tUXVhdD1mdW5jdGlvbih0LG4pe3ZhciByPW5bMF0sYT1uWzFdLG89blsyXSx1PW5bM10sbT1yK3IsZT1hK2EsaT1vK28sYz1yKm0sZj1hKm0sbD1hKmUsTT1vKm0sdj1vKmUsaD1vKmkscD11Km0scz11KmUsdz11Kmk7cmV0dXJuIHRbMF09MS1sLWgsdFszXT1mLXcsdFs2XT1NK3MsdFsxXT1mK3csdFs0XT0xLWMtaCx0WzddPXYtcCx0WzJdPU0tcyx0WzVdPXYrcCx0WzhdPTEtYy1sLHR9LG1hdDMubm9ybWFsRnJvbU1hdDQ9ZnVuY3Rpb24odCxuKXt2YXIgcj1uWzBdLGE9blsxXSxvPW5bMl0sdT1uWzNdLG09bls0XSxlPW5bNV0saT1uWzZdLGM9bls3XSxmPW5bOF0sbD1uWzldLE09blsxMF0sdj1uWzExXSxoPW5bMTJdLHA9blsxM10scz1uWzE0XSx3PW5bMTVdLGQ9ciplLWEqbSxSPXIqaS1vKm0sZz1yKmMtdSptLHg9YSppLW8qZSx5PWEqYy11KmUsQT1vKmMtdSppLFk9ZipwLWwqaCxUPWYqcy1NKmgsaj1mKnctdipoLHE9bCpzLU0qcCxFPWwqdy12KnAsUD1NKnctdipzLF89ZCpQLVIqRStnKnEreCpqLXkqVCtBKlk7cmV0dXJuIF8/KF89MS9fLHRbMF09KGUqUC1pKkUrYypxKSpfLHRbMV09KGkqai1tKlAtYypUKSpfLHRbMl09KG0qRS1lKmorYypZKSpfLHRbM109KG8qRS1hKlAtdSpxKSpfLHRbNF09KHIqUC1vKmordSpUKSpfLHRbNV09KGEqai1yKkUtdSpZKSpfLHRbNl09KHAqQS1zKnkrdyp4KSpfLHRbN109KHMqZy1oKkEtdypSKSpfLHRbOF09KGgqeS1wKmcrdypkKSpfLHQpOm51bGx9LG1hdDMuc3RyPWZ1bmN0aW9uKHQpe3JldHVyblwibWF0MyhcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiLCBcIit0WzNdK1wiLCBcIit0WzRdK1wiLCBcIit0WzVdK1wiLCBcIit0WzZdK1wiLCBcIit0WzddK1wiLCBcIit0WzhdK1wiKVwifSxtYXQzLmZyb2I9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh0WzBdLDIpK01hdGgucG93KHRbMV0sMikrTWF0aC5wb3codFsyXSwyKStNYXRoLnBvdyh0WzNdLDIpK01hdGgucG93KHRbNF0sMikrTWF0aC5wb3codFs1XSwyKStNYXRoLnBvdyh0WzZdLDIpK01hdGgucG93KHRbN10sMikrTWF0aC5wb3codFs4XSwyKSl9LG1vZHVsZS5leHBvcnRzPW1hdDM7XG59LHtcIi4vY29tbW9uLmpzXCI6MTE3fV0sMTIxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbnZhciBnbE1hdHJpeD1yZXF1aXJlKFwiLi9jb21tb24uanNcIiksbWF0ND17fTttYXQ0LmNyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDE2KTtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPTEsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTEsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9LG1hdDQuY2xvbmU9ZnVuY3Rpb24odCl7dmFyIGE9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO3JldHVybiBhWzBdPXRbMF0sYVsxXT10WzFdLGFbMl09dFsyXSxhWzNdPXRbM10sYVs0XT10WzRdLGFbNV09dFs1XSxhWzZdPXRbNl0sYVs3XT10WzddLGFbOF09dFs4XSxhWzldPXRbOV0sYVsxMF09dFsxMF0sYVsxMV09dFsxMV0sYVsxMl09dFsxMl0sYVsxM109dFsxM10sYVsxNF09dFsxNF0sYVsxNV09dFsxNV0sYX0sbWF0NC5jb3B5PWZ1bmN0aW9uKHQsYSl7cmV0dXJuIHRbMF09YVswXSx0WzFdPWFbMV0sdFsyXT1hWzJdLHRbM109YVszXSx0WzRdPWFbNF0sdFs1XT1hWzVdLHRbNl09YVs2XSx0WzddPWFbN10sdFs4XT1hWzhdLHRbOV09YVs5XSx0WzEwXT1hWzEwXSx0WzExXT1hWzExXSx0WzEyXT1hWzEyXSx0WzEzXT1hWzEzXSx0WzE0XT1hWzE0XSx0WzE1XT1hWzE1XSx0fSxtYXQ0LmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09MSx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMF09MSx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH0sbWF0NC50cmFuc3Bvc2U9ZnVuY3Rpb24odCxhKXtpZih0PT09YSl7dmFyIHI9YVsxXSxuPWFbMl0sbz1hWzNdLGU9YVs2XSxpPWFbN10sdT1hWzExXTt0WzFdPWFbNF0sdFsyXT1hWzhdLHRbM109YVsxMl0sdFs0XT1yLHRbNl09YVs5XSx0WzddPWFbMTNdLHRbOF09bix0WzldPWUsdFsxMV09YVsxNF0sdFsxMl09byx0WzEzXT1pLHRbMTRdPXV9ZWxzZSB0WzBdPWFbMF0sdFsxXT1hWzRdLHRbMl09YVs4XSx0WzNdPWFbMTJdLHRbNF09YVsxXSx0WzVdPWFbNV0sdFs2XT1hWzldLHRbN109YVsxM10sdFs4XT1hWzJdLHRbOV09YVs2XSx0WzEwXT1hWzEwXSx0WzExXT1hWzE0XSx0WzEyXT1hWzNdLHRbMTNdPWFbN10sdFsxNF09YVsxMV0sdFsxNV09YVsxNV07cmV0dXJuIHR9LG1hdDQuaW52ZXJ0PWZ1bmN0aW9uKHQsYSl7dmFyIHI9YVswXSxuPWFbMV0sbz1hWzJdLGU9YVszXSxpPWFbNF0sdT1hWzVdLE09YVs2XSxtPWFbN10saD1hWzhdLGM9YVs5XSxmPWFbMTBdLHM9YVsxMV0sbD1hWzEyXSx2PWFbMTNdLHA9YVsxNF0sdz1hWzE1XSxnPXIqdS1uKmksUD1yKk0tbyppLFI9ciptLWUqaSx4PW4qTS1vKnUsST1uKm0tZSp1LFM9byptLWUqTSxkPWgqdi1jKmwscT1oKnAtZipsLEU9aCp3LXMqbCxPPWMqcC1mKnYsYj1jKnctcyp2LFQ9Zip3LXMqcCxZPWcqVC1QKmIrUipPK3gqRS1JKnErUypkO3JldHVybiBZPyhZPTEvWSx0WzBdPSh1KlQtTSpiK20qTykqWSx0WzFdPShvKmItbipULWUqTykqWSx0WzJdPSh2KlMtcCpJK3cqeCkqWSx0WzNdPShmKkktYypTLXMqeCkqWSx0WzRdPShNKkUtaSpULW0qcSkqWSx0WzVdPShyKlQtbypFK2UqcSkqWSx0WzZdPShwKlItbCpTLXcqUCkqWSx0WzddPShoKlMtZipSK3MqUCkqWSx0WzhdPShpKmItdSpFK20qZCkqWSx0WzldPShuKkUtcipiLWUqZCkqWSx0WzEwXT0obCpJLXYqUit3KmcpKlksdFsxMV09KGMqUi1oKkktcypnKSpZLHRbMTJdPSh1KnEtaSpPLU0qZCkqWSx0WzEzXT0ocipPLW4qcStvKmQpKlksdFsxNF09KHYqUC1sKngtcCpnKSpZLHRbMTVdPShoKngtYypQK2YqZykqWSx0KTpudWxsfSxtYXQ0LmFkam9pbnQ9ZnVuY3Rpb24odCxhKXt2YXIgcj1hWzBdLG49YVsxXSxvPWFbMl0sZT1hWzNdLGk9YVs0XSx1PWFbNV0sTT1hWzZdLG09YVs3XSxoPWFbOF0sYz1hWzldLGY9YVsxMF0scz1hWzExXSxsPWFbMTJdLHY9YVsxM10scD1hWzE0XSx3PWFbMTVdO3JldHVybiB0WzBdPXUqKGYqdy1zKnApLWMqKE0qdy1tKnApK3YqKE0qcy1tKmYpLHRbMV09LShuKihmKnctcypwKS1jKihvKnctZSpwKSt2KihvKnMtZSpmKSksdFsyXT1uKihNKnctbSpwKS11KihvKnctZSpwKSt2KihvKm0tZSpNKSx0WzNdPS0obiooTSpzLW0qZiktdSoobypzLWUqZikrYyoobyptLWUqTSkpLHRbNF09LShpKihmKnctcypwKS1oKihNKnctbSpwKStsKihNKnMtbSpmKSksdFs1XT1yKihmKnctcypwKS1oKihvKnctZSpwKStsKihvKnMtZSpmKSx0WzZdPS0ociooTSp3LW0qcCktaSoobyp3LWUqcCkrbCoobyptLWUqTSkpLHRbN109ciooTSpzLW0qZiktaSoobypzLWUqZikraCoobyptLWUqTSksdFs4XT1pKihjKnctcyp2KS1oKih1KnctbSp2KStsKih1KnMtbSpjKSx0WzldPS0ociooYyp3LXMqdiktaCoobip3LWUqdikrbCoobipzLWUqYykpLHRbMTBdPXIqKHUqdy1tKnYpLWkqKG4qdy1lKnYpK2wqKG4qbS1lKnUpLHRbMTFdPS0ocioodSpzLW0qYyktaSoobipzLWUqYykraCoobiptLWUqdSkpLHRbMTJdPS0oaSooYypwLWYqdiktaCoodSpwLU0qdikrbCoodSpmLU0qYykpLHRbMTNdPXIqKGMqcC1mKnYpLWgqKG4qcC1vKnYpK2wqKG4qZi1vKmMpLHRbMTRdPS0ocioodSpwLU0qdiktaSoobipwLW8qdikrbCoobipNLW8qdSkpLHRbMTVdPXIqKHUqZi1NKmMpLWkqKG4qZi1vKmMpK2gqKG4qTS1vKnUpLHR9LG1hdDQuZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24odCl7dmFyIGE9dFswXSxyPXRbMV0sbj10WzJdLG89dFszXSxlPXRbNF0saT10WzVdLHU9dFs2XSxNPXRbN10sbT10WzhdLGg9dFs5XSxjPXRbMTBdLGY9dFsxMV0scz10WzEyXSxsPXRbMTNdLHY9dFsxNF0scD10WzE1XSx3PWEqaS1yKmUsZz1hKnUtbiplLFA9YSpNLW8qZSxSPXIqdS1uKmkseD1yKk0tbyppLEk9bipNLW8qdSxTPW0qbC1oKnMsZD1tKnYtYypzLHE9bSpwLWYqcyxFPWgqdi1jKmwsTz1oKnAtZipsLGI9YypwLWYqdjtyZXR1cm4gdypiLWcqTytQKkUrUipxLXgqZCtJKlN9LG1hdDQubXVsdGlwbHk9ZnVuY3Rpb24odCxhLHIpe3ZhciBuPWFbMF0sbz1hWzFdLGU9YVsyXSxpPWFbM10sdT1hWzRdLE09YVs1XSxtPWFbNl0saD1hWzddLGM9YVs4XSxmPWFbOV0scz1hWzEwXSxsPWFbMTFdLHY9YVsxMl0scD1hWzEzXSx3PWFbMTRdLGc9YVsxNV0sUD1yWzBdLFI9clsxXSx4PXJbMl0sST1yWzNdO3JldHVybiB0WzBdPVAqbitSKnUreCpjK0kqdix0WzFdPVAqbytSKk0reCpmK0kqcCx0WzJdPVAqZStSKm0reCpzK0kqdyx0WzNdPVAqaStSKmgreCpsK0kqZyxQPXJbNF0sUj1yWzVdLHg9cls2XSxJPXJbN10sdFs0XT1QKm4rUip1K3gqYytJKnYsdFs1XT1QKm8rUipNK3gqZitJKnAsdFs2XT1QKmUrUiptK3gqcytJKncsdFs3XT1QKmkrUipoK3gqbCtJKmcsUD1yWzhdLFI9cls5XSx4PXJbMTBdLEk9clsxMV0sdFs4XT1QKm4rUip1K3gqYytJKnYsdFs5XT1QKm8rUipNK3gqZitJKnAsdFsxMF09UCplK1IqbSt4KnMrSSp3LHRbMTFdPVAqaStSKmgreCpsK0kqZyxQPXJbMTJdLFI9clsxM10seD1yWzE0XSxJPXJbMTVdLHRbMTJdPVAqbitSKnUreCpjK0kqdix0WzEzXT1QKm8rUipNK3gqZitJKnAsdFsxNF09UCplK1IqbSt4KnMrSSp3LHRbMTVdPVAqaStSKmgreCpsK0kqZyx0fSxtYXQ0Lm11bD1tYXQ0Lm11bHRpcGx5LG1hdDQudHJhbnNsYXRlPWZ1bmN0aW9uKHQsYSxyKXt2YXIgbixvLGUsaSx1LE0sbSxoLGMsZixzLGwsdj1yWzBdLHA9clsxXSx3PXJbMl07cmV0dXJuIGE9PT10Pyh0WzEyXT1hWzBdKnYrYVs0XSpwK2FbOF0qdythWzEyXSx0WzEzXT1hWzFdKnYrYVs1XSpwK2FbOV0qdythWzEzXSx0WzE0XT1hWzJdKnYrYVs2XSpwK2FbMTBdKncrYVsxNF0sdFsxNV09YVszXSp2K2FbN10qcCthWzExXSp3K2FbMTVdKToobj1hWzBdLG89YVsxXSxlPWFbMl0saT1hWzNdLHU9YVs0XSxNPWFbNV0sbT1hWzZdLGg9YVs3XSxjPWFbOF0sZj1hWzldLHM9YVsxMF0sbD1hWzExXSx0WzBdPW4sdFsxXT1vLHRbMl09ZSx0WzNdPWksdFs0XT11LHRbNV09TSx0WzZdPW0sdFs3XT1oLHRbOF09Yyx0WzldPWYsdFsxMF09cyx0WzExXT1sLHRbMTJdPW4qdit1KnArYyp3K2FbMTJdLHRbMTNdPW8qditNKnArZip3K2FbMTNdLHRbMTRdPWUqdittKnArcyp3K2FbMTRdLHRbMTVdPWkqditoKnArbCp3K2FbMTVdKSx0fSxtYXQ0LnNjYWxlPWZ1bmN0aW9uKHQsYSxyKXt2YXIgbj1yWzBdLG89clsxXSxlPXJbMl07cmV0dXJuIHRbMF09YVswXSpuLHRbMV09YVsxXSpuLHRbMl09YVsyXSpuLHRbM109YVszXSpuLHRbNF09YVs0XSpvLHRbNV09YVs1XSpvLHRbNl09YVs2XSpvLHRbN109YVs3XSpvLHRbOF09YVs4XSplLHRbOV09YVs5XSplLHRbMTBdPWFbMTBdKmUsdFsxMV09YVsxMV0qZSx0WzEyXT1hWzEyXSx0WzEzXT1hWzEzXSx0WzE0XT1hWzE0XSx0WzE1XT1hWzE1XSx0fSxtYXQ0LnJvdGF0ZT1mdW5jdGlvbih0LGEscixuKXt2YXIgbyxlLGksdSxNLG0saCxjLGYscyxsLHYscCx3LGcsUCxSLHgsSSxTLGQscSxFLE8sYj1uWzBdLFQ9blsxXSxZPW5bMl0seT1NYXRoLnNxcnQoYipiK1QqVCtZKlkpO3JldHVybiBNYXRoLmFicyh5KTxnbE1hdHJpeC5FUFNJTE9OP251bGw6KHk9MS95LGIqPXksVCo9eSxZKj15LG89TWF0aC5zaW4ociksZT1NYXRoLmNvcyhyKSxpPTEtZSx1PWFbMF0sTT1hWzFdLG09YVsyXSxoPWFbM10sYz1hWzRdLGY9YVs1XSxzPWFbNl0sbD1hWzddLHY9YVs4XSxwPWFbOV0sdz1hWzEwXSxnPWFbMTFdLFA9YipiKmkrZSxSPVQqYippK1kqbyx4PVkqYippLVQqbyxJPWIqVCppLVkqbyxTPVQqVCppK2UsZD1ZKlQqaStiKm8scT1iKlkqaStUKm8sRT1UKlkqaS1iKm8sTz1ZKlkqaStlLHRbMF09dSpQK2MqUit2KngsdFsxXT1NKlArZipSK3AqeCx0WzJdPW0qUCtzKlIrdyp4LHRbM109aCpQK2wqUitnKngsdFs0XT11KkkrYypTK3YqZCx0WzVdPU0qSStmKlMrcCpkLHRbNl09bSpJK3MqUyt3KmQsdFs3XT1oKkkrbCpTK2cqZCx0WzhdPXUqcStjKkUrdipPLHRbOV09TSpxK2YqRStwKk8sdFsxMF09bSpxK3MqRSt3Kk8sdFsxMV09aCpxK2wqRStnKk8sYSE9PXQmJih0WzEyXT1hWzEyXSx0WzEzXT1hWzEzXSx0WzE0XT1hWzE0XSx0WzE1XT1hWzE1XSksdCl9LG1hdDQucm90YXRlWD1mdW5jdGlvbih0LGEscil7dmFyIG49TWF0aC5zaW4ociksbz1NYXRoLmNvcyhyKSxlPWFbNF0saT1hWzVdLHU9YVs2XSxNPWFbN10sbT1hWzhdLGg9YVs5XSxjPWFbMTBdLGY9YVsxMV07cmV0dXJuIGEhPT10JiYodFswXT1hWzBdLHRbMV09YVsxXSx0WzJdPWFbMl0sdFszXT1hWzNdLHRbMTJdPWFbMTJdLHRbMTNdPWFbMTNdLHRbMTRdPWFbMTRdLHRbMTVdPWFbMTVdKSx0WzRdPWUqbyttKm4sdFs1XT1pKm8raCpuLHRbNl09dSpvK2Mqbix0WzddPU0qbytmKm4sdFs4XT1tKm8tZSpuLHRbOV09aCpvLWkqbix0WzEwXT1jKm8tdSpuLHRbMTFdPWYqby1NKm4sdH0sbWF0NC5yb3RhdGVZPWZ1bmN0aW9uKHQsYSxyKXt2YXIgbj1NYXRoLnNpbihyKSxvPU1hdGguY29zKHIpLGU9YVswXSxpPWFbMV0sdT1hWzJdLE09YVszXSxtPWFbOF0saD1hWzldLGM9YVsxMF0sZj1hWzExXTtyZXR1cm4gYSE9PXQmJih0WzRdPWFbNF0sdFs1XT1hWzVdLHRbNl09YVs2XSx0WzddPWFbN10sdFsxMl09YVsxMl0sdFsxM109YVsxM10sdFsxNF09YVsxNF0sdFsxNV09YVsxNV0pLHRbMF09ZSpvLW0qbix0WzFdPWkqby1oKm4sdFsyXT11Km8tYypuLHRbM109TSpvLWYqbix0WzhdPWUqbittKm8sdFs5XT1pKm4raCpvLHRbMTBdPXUqbitjKm8sdFsxMV09TSpuK2Yqbyx0fSxtYXQ0LnJvdGF0ZVo9ZnVuY3Rpb24odCxhLHIpe3ZhciBuPU1hdGguc2luKHIpLG89TWF0aC5jb3MociksZT1hWzBdLGk9YVsxXSx1PWFbMl0sTT1hWzNdLG09YVs0XSxoPWFbNV0sYz1hWzZdLGY9YVs3XTtyZXR1cm4gYSE9PXQmJih0WzhdPWFbOF0sdFs5XT1hWzldLHRbMTBdPWFbMTBdLHRbMTFdPWFbMTFdLHRbMTJdPWFbMTJdLHRbMTNdPWFbMTNdLHRbMTRdPWFbMTRdLHRbMTVdPWFbMTVdKSx0WzBdPWUqbyttKm4sdFsxXT1pKm8raCpuLHRbMl09dSpvK2Mqbix0WzNdPU0qbytmKm4sdFs0XT1tKm8tZSpuLHRbNV09aCpvLWkqbix0WzZdPWMqby11Km4sdFs3XT1mKm8tTSpuLHR9LG1hdDQuZnJvbVRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsYSl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0xLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0xLHRbMTFdPTAsdFsxMl09YVswXSx0WzEzXT1hWzFdLHRbMTRdPWFbMl0sdFsxNV09MSx0fSxtYXQ0LmZyb21TY2FsaW5nPWZ1bmN0aW9uKHQsYSl7cmV0dXJuIHRbMF09YVswXSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1hWzFdLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT1hWzJdLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fSxtYXQ0LmZyb21Sb3RhdGlvbj1mdW5jdGlvbih0LGEscil7dmFyIG4sbyxlLGk9clswXSx1PXJbMV0sTT1yWzJdLG09TWF0aC5zcXJ0KGkqaSt1KnUrTSpNKTtyZXR1cm4gTWF0aC5hYnMobSk8Z2xNYXRyaXguRVBTSUxPTj9udWxsOihtPTEvbSxpKj1tLHUqPW0sTSo9bSxuPU1hdGguc2luKGEpLG89TWF0aC5jb3MoYSksZT0xLW8sdFswXT1pKmkqZStvLHRbMV09dSppKmUrTSpuLHRbMl09TSppKmUtdSpuLHRbM109MCx0WzRdPWkqdSplLU0qbix0WzVdPXUqdSplK28sdFs2XT1NKnUqZStpKm4sdFs3XT0wLHRbOF09aSpNKmUrdSpuLHRbOV09dSpNKmUtaSpuLHRbMTBdPU0qTSplK28sdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHQpfSxtYXQ0LmZyb21YUm90YXRpb249ZnVuY3Rpb24odCxhKXt2YXIgcj1NYXRoLnNpbihhKSxuPU1hdGguY29zKGEpO3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09bix0WzZdPXIsdFs3XT0wLHRbOF09MCx0WzldPS1yLHRbMTBdPW4sdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9LG1hdDQuZnJvbVlSb3RhdGlvbj1mdW5jdGlvbih0LGEpe3ZhciByPU1hdGguc2luKGEpLG49TWF0aC5jb3MoYSk7cmV0dXJuIHRbMF09bix0WzFdPTAsdFsyXT0tcix0WzNdPTAsdFs0XT0wLHRbNV09MSx0WzZdPTAsdFs3XT0wLHRbOF09cix0WzldPTAsdFsxMF09bix0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH0sbWF0NC5mcm9tWlJvdGF0aW9uPWZ1bmN0aW9uKHQsYSl7dmFyIHI9TWF0aC5zaW4oYSksbj1NYXRoLmNvcyhhKTtyZXR1cm4gdFswXT1uLHRbMV09cix0WzJdPTAsdFszXT0wLHRbNF09LXIsdFs1XT1uLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0xLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fSxtYXQ0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsYSxyKXt2YXIgbj1hWzBdLG89YVsxXSxlPWFbMl0saT1hWzNdLHU9bituLE09bytvLG09ZStlLGg9bip1LGM9bipNLGY9biptLHM9bypNLGw9byptLHY9ZSptLHA9aSp1LHc9aSpNLGc9aSptO3JldHVybiB0WzBdPTEtKHMrdiksdFsxXT1jK2csdFsyXT1mLXcsdFszXT0wLHRbNF09Yy1nLHRbNV09MS0oaCt2KSx0WzZdPWwrcCx0WzddPTAsdFs4XT1mK3csdFs5XT1sLXAsdFsxMF09MS0oaCtzKSx0WzExXT0wLHRbMTJdPXJbMF0sdFsxM109clsxXSx0WzE0XT1yWzJdLHRbMTVdPTEsdH0sbWF0NC5mcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlPWZ1bmN0aW9uKHQsYSxyLG4pe3ZhciBvPWFbMF0sZT1hWzFdLGk9YVsyXSx1PWFbM10sTT1vK28sbT1lK2UsaD1pK2ksYz1vKk0sZj1vKm0scz1vKmgsbD1lKm0sdj1lKmgscD1pKmgsdz11Kk0sZz11Km0sUD11KmgsUj1uWzBdLHg9blsxXSxJPW5bMl07cmV0dXJuIHRbMF09KDEtKGwrcCkpKlIsdFsxXT0oZitQKSpSLHRbMl09KHMtZykqUix0WzNdPTAsdFs0XT0oZi1QKSp4LHRbNV09KDEtKGMrcCkpKngsdFs2XT0odit3KSp4LHRbN109MCx0WzhdPShzK2cpKkksdFs5XT0odi13KSpJLHRbMTBdPSgxLShjK2wpKSpJLHRbMTFdPTAsdFsxMl09clswXSx0WzEzXT1yWzFdLHRbMTRdPXJbMl0sdFsxNV09MSx0fSxtYXQ0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGVPcmlnaW49ZnVuY3Rpb24odCxhLHIsbixvKXt2YXIgZT1hWzBdLGk9YVsxXSx1PWFbMl0sTT1hWzNdLG09ZStlLGg9aStpLGM9dSt1LGY9ZSptLHM9ZSpoLGw9ZSpjLHY9aSpoLHA9aSpjLHc9dSpjLGc9TSptLFA9TSpoLFI9TSpjLHg9blswXSxJPW5bMV0sUz1uWzJdLGQ9b1swXSxxPW9bMV0sRT1vWzJdO3JldHVybiB0WzBdPSgxLSh2K3cpKSp4LHRbMV09KHMrUikqeCx0WzJdPShsLVApKngsdFszXT0wLHRbNF09KHMtUikqSSx0WzVdPSgxLShmK3cpKSpJLHRbNl09KHArZykqSSx0WzddPTAsdFs4XT0obCtQKSpTLHRbOV09KHAtZykqUyx0WzEwXT0oMS0oZit2KSkqUyx0WzExXT0wLHRbMTJdPXJbMF0rZC0odFswXSpkK3RbNF0qcSt0WzhdKkUpLHRbMTNdPXJbMV0rcS0odFsxXSpkK3RbNV0qcSt0WzldKkUpLHRbMTRdPXJbMl0rRS0odFsyXSpkK3RbNl0qcSt0WzEwXSpFKSx0WzE1XT0xLHR9LG1hdDQuZnJvbVF1YXQ9ZnVuY3Rpb24odCxhKXt2YXIgcj1hWzBdLG49YVsxXSxvPWFbMl0sZT1hWzNdLGk9cityLHU9bituLE09bytvLG09cippLGg9bippLGM9bip1LGY9byppLHM9byp1LGw9bypNLHY9ZSppLHA9ZSp1LHc9ZSpNO3JldHVybiB0WzBdPTEtYy1sLHRbMV09aCt3LHRbMl09Zi1wLHRbM109MCx0WzRdPWgtdyx0WzVdPTEtbS1sLHRbNl09cyt2LHRbN109MCx0WzhdPWYrcCx0WzldPXMtdix0WzEwXT0xLW0tYyx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH0sbWF0NC5mcnVzdHVtPWZ1bmN0aW9uKHQsYSxyLG4sbyxlLGkpe3ZhciB1PTEvKHItYSksTT0xLyhvLW4pLG09MS8oZS1pKTtyZXR1cm4gdFswXT0yKmUqdSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0yKmUqTSx0WzZdPTAsdFs3XT0wLHRbOF09KHIrYSkqdSx0WzldPShvK24pKk0sdFsxMF09KGkrZSkqbSx0WzExXT0tMSx0WzEyXT0wLHRbMTNdPTAsdFsxNF09aSplKjIqbSx0WzE1XT0wLHR9LG1hdDQucGVyc3BlY3RpdmU9ZnVuY3Rpb24odCxhLHIsbixvKXt2YXIgZT0xL01hdGgudGFuKGEvMiksaT0xLyhuLW8pO3JldHVybiB0WzBdPWUvcix0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1lLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0obytuKSppLHRbMTFdPS0xLHRbMTJdPTAsdFsxM109MCx0WzE0XT0yKm8qbippLHRbMTVdPTAsdH0sbWF0NC5wZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldz1mdW5jdGlvbih0LGEscixuKXt2YXIgbz1NYXRoLnRhbihhLnVwRGVncmVlcypNYXRoLlBJLzE4MCksZT1NYXRoLnRhbihhLmRvd25EZWdyZWVzKk1hdGguUEkvMTgwKSxpPU1hdGgudGFuKGEubGVmdERlZ3JlZXMqTWF0aC5QSS8xODApLHU9TWF0aC50YW4oYS5yaWdodERlZ3JlZXMqTWF0aC5QSS8xODApLE09Mi8oaSt1KSxtPTIvKG8rZSk7cmV0dXJuIHRbMF09TSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1tLHRbNl09MCx0WzddPTAsdFs4XT0tKChpLXUpKk0qLjUpLHRbOV09KG8tZSkqbSouNSx0WzEwXT1uLyhyLW4pLHRbMTFdPS0xLHRbMTJdPTAsdFsxM109MCx0WzE0XT1uKnIvKHItbiksdFsxNV09MCx0fSxtYXQ0Lm9ydGhvPWZ1bmN0aW9uKHQsYSxyLG4sbyxlLGkpe3ZhciB1PTEvKGEtciksTT0xLyhuLW8pLG09MS8oZS1pKTtyZXR1cm4gdFswXT0tMip1LHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPS0yKk0sdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTIqbSx0WzExXT0wLHRbMTJdPShhK3IpKnUsdFsxM109KG8rbikqTSx0WzE0XT0oaStlKSptLHRbMTVdPTEsdH0sbWF0NC5sb29rQXQ9ZnVuY3Rpb24odCxhLHIsbil7dmFyIG8sZSxpLHUsTSxtLGgsYyxmLHMsbD1hWzBdLHY9YVsxXSxwPWFbMl0sdz1uWzBdLGc9blsxXSxQPW5bMl0sUj1yWzBdLHg9clsxXSxJPXJbMl07cmV0dXJuIE1hdGguYWJzKGwtUik8Z2xNYXRyaXguRVBTSUxPTiYmTWF0aC5hYnModi14KTxnbE1hdHJpeC5FUFNJTE9OJiZNYXRoLmFicyhwLUkpPGdsTWF0cml4LkVQU0lMT04/bWF0NC5pZGVudGl0eSh0KTooaD1sLVIsYz12LXgsZj1wLUkscz0xL01hdGguc3FydChoKmgrYypjK2YqZiksaCo9cyxjKj1zLGYqPXMsbz1nKmYtUCpjLGU9UCpoLXcqZixpPXcqYy1nKmgscz1NYXRoLnNxcnQobypvK2UqZStpKmkpLHM/KHM9MS9zLG8qPXMsZSo9cyxpKj1zKToobz0wLGU9MCxpPTApLHU9YyppLWYqZSxNPWYqby1oKmksbT1oKmUtYypvLHM9TWF0aC5zcXJ0KHUqdStNKk0rbSptKSxzPyhzPTEvcyx1Kj1zLE0qPXMsbSo9cyk6KHU9MCxNPTAsbT0wKSx0WzBdPW8sdFsxXT11LHRbMl09aCx0WzNdPTAsdFs0XT1lLHRbNV09TSx0WzZdPWMsdFs3XT0wLHRbOF09aSx0WzldPW0sdFsxMF09Zix0WzExXT0wLHRbMTJdPS0obypsK2UqditpKnApLHRbMTNdPS0odSpsK00qdittKnApLHRbMTRdPS0oaCpsK2MqditmKnApLHRbMTVdPTEsdCl9LG1hdDQuc3RyPWZ1bmN0aW9uKHQpe3JldHVyblwibWF0NChcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiLCBcIit0WzNdK1wiLCBcIit0WzRdK1wiLCBcIit0WzVdK1wiLCBcIit0WzZdK1wiLCBcIit0WzddK1wiLCBcIit0WzhdK1wiLCBcIit0WzldK1wiLCBcIit0WzEwXStcIiwgXCIrdFsxMV0rXCIsIFwiK3RbMTJdK1wiLCBcIit0WzEzXStcIiwgXCIrdFsxNF0rXCIsIFwiK3RbMTVdK1wiKVwifSxtYXQ0LmZyb2I9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh0WzBdLDIpK01hdGgucG93KHRbMV0sMikrTWF0aC5wb3codFsyXSwyKStNYXRoLnBvdyh0WzNdLDIpK01hdGgucG93KHRbNF0sMikrTWF0aC5wb3codFs1XSwyKStNYXRoLnBvdyh0WzZdLDIpK01hdGgucG93KHRbN10sMikrTWF0aC5wb3codFs4XSwyKStNYXRoLnBvdyh0WzldLDIpK01hdGgucG93KHRbMTBdLDIpK01hdGgucG93KHRbMTFdLDIpK01hdGgucG93KHRbMTJdLDIpK01hdGgucG93KHRbMTNdLDIpK01hdGgucG93KHRbMTRdLDIpK01hdGgucG93KHRbMTVdLDIpKX0sbW9kdWxlLmV4cG9ydHM9bWF0NDtcbn0se1wiLi9jb21tb24uanNcIjoxMTd9XSwxMjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsTWF0cml4PXJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKSxtYXQzPXJlcXVpcmUoXCIuL21hdDMuanNcIiksdmVjMz1yZXF1aXJlKFwiLi92ZWMzLmpzXCIpLHZlYzQ9cmVxdWlyZShcIi4vdmVjNC5qc1wiKSxxdWF0PXt9O3F1YXQuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7cmV0dXJuIHRbMF09MCx0WzFdPTAsdFsyXT0wLHRbM109MSx0fSxxdWF0LnJvdGF0aW9uVG89ZnVuY3Rpb24oKXt2YXIgdD12ZWMzLmNyZWF0ZSgpLGE9dmVjMy5mcm9tVmFsdWVzKDEsMCwwKSxlPXZlYzMuZnJvbVZhbHVlcygwLDEsMCk7cmV0dXJuIGZ1bmN0aW9uKHIsdSxuKXt2YXIgYz12ZWMzLmRvdCh1LG4pO3JldHVybi0uOTk5OTk5PmM/KHZlYzMuY3Jvc3ModCxhLHUpLHZlYzMubGVuZ3RoKHQpPDFlLTYmJnZlYzMuY3Jvc3ModCxlLHUpLHZlYzMubm9ybWFsaXplKHQsdCkscXVhdC5zZXRBeGlzQW5nbGUocix0LE1hdGguUEkpLHIpOmM+Ljk5OTk5OT8oclswXT0wLHJbMV09MCxyWzJdPTAsclszXT0xLHIpOih2ZWMzLmNyb3NzKHQsdSxuKSxyWzBdPXRbMF0sclsxXT10WzFdLHJbMl09dFsyXSxyWzNdPTErYyxxdWF0Lm5vcm1hbGl6ZShyLHIpKX19KCkscXVhdC5zZXRBeGVzPWZ1bmN0aW9uKCl7dmFyIHQ9bWF0My5jcmVhdGUoKTtyZXR1cm4gZnVuY3Rpb24oYSxlLHIsdSl7cmV0dXJuIHRbMF09clswXSx0WzNdPXJbMV0sdFs2XT1yWzJdLHRbMV09dVswXSx0WzRdPXVbMV0sdFs3XT11WzJdLHRbMl09LWVbMF0sdFs1XT0tZVsxXSx0WzhdPS1lWzJdLHF1YXQubm9ybWFsaXplKGEscXVhdC5mcm9tTWF0MyhhLHQpKX19KCkscXVhdC5jbG9uZT12ZWM0LmNsb25lLHF1YXQuZnJvbVZhbHVlcz12ZWM0LmZyb21WYWx1ZXMscXVhdC5jb3B5PXZlYzQuY29weSxxdWF0LnNldD12ZWM0LnNldCxxdWF0LmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTAsdFsxXT0wLHRbMl09MCx0WzNdPTEsdH0scXVhdC5zZXRBeGlzQW5nbGU9ZnVuY3Rpb24odCxhLGUpe2U9LjUqZTt2YXIgcj1NYXRoLnNpbihlKTtyZXR1cm4gdFswXT1yKmFbMF0sdFsxXT1yKmFbMV0sdFsyXT1yKmFbMl0sdFszXT1NYXRoLmNvcyhlKSx0fSxxdWF0LmFkZD12ZWM0LmFkZCxxdWF0Lm11bHRpcGx5PWZ1bmN0aW9uKHQsYSxlKXt2YXIgcj1hWzBdLHU9YVsxXSxuPWFbMl0sYz1hWzNdLHE9ZVswXSxvPWVbMV0scz1lWzJdLGk9ZVszXTtyZXR1cm4gdFswXT1yKmkrYypxK3Uqcy1uKm8sdFsxXT11KmkrYypvK24qcS1yKnMsdFsyXT1uKmkrYypzK3Iqby11KnEsdFszXT1jKmktcipxLXUqby1uKnMsdH0scXVhdC5tdWw9cXVhdC5tdWx0aXBseSxxdWF0LnNjYWxlPXZlYzQuc2NhbGUscXVhdC5yb3RhdGVYPWZ1bmN0aW9uKHQsYSxlKXtlKj0uNTt2YXIgcj1hWzBdLHU9YVsxXSxuPWFbMl0sYz1hWzNdLHE9TWF0aC5zaW4oZSksbz1NYXRoLmNvcyhlKTtyZXR1cm4gdFswXT1yKm8rYypxLHRbMV09dSpvK24qcSx0WzJdPW4qby11KnEsdFszXT1jKm8tcipxLHR9LHF1YXQucm90YXRlWT1mdW5jdGlvbih0LGEsZSl7ZSo9LjU7dmFyIHI9YVswXSx1PWFbMV0sbj1hWzJdLGM9YVszXSxxPU1hdGguc2luKGUpLG89TWF0aC5jb3MoZSk7cmV0dXJuIHRbMF09cipvLW4qcSx0WzFdPXUqbytjKnEsdFsyXT1uKm8rcipxLHRbM109YypvLXUqcSx0fSxxdWF0LnJvdGF0ZVo9ZnVuY3Rpb24odCxhLGUpe2UqPS41O3ZhciByPWFbMF0sdT1hWzFdLG49YVsyXSxjPWFbM10scT1NYXRoLnNpbihlKSxvPU1hdGguY29zKGUpO3JldHVybiB0WzBdPXIqbyt1KnEsdFsxXT11Km8tcipxLHRbMl09bipvK2MqcSx0WzNdPWMqby1uKnEsdH0scXVhdC5jYWxjdWxhdGVXPWZ1bmN0aW9uKHQsYSl7dmFyIGU9YVswXSxyPWFbMV0sdT1hWzJdO3JldHVybiB0WzBdPWUsdFsxXT1yLHRbMl09dSx0WzNdPU1hdGguc3FydChNYXRoLmFicygxLWUqZS1yKnItdSp1KSksdH0scXVhdC5kb3Q9dmVjNC5kb3QscXVhdC5sZXJwPXZlYzQubGVycCxxdWF0LnNsZXJwPWZ1bmN0aW9uKHQsYSxlLHIpe3ZhciB1LG4sYyxxLG8scz1hWzBdLGk9YVsxXSx2PWFbMl0sbD1hWzNdLGY9ZVswXSxoPWVbMV0sTT1lWzJdLG09ZVszXTtyZXR1cm4gbj1zKmYraSpoK3YqTStsKm0sMD5uJiYobj0tbixmPS1mLGg9LWgsTT0tTSxtPS1tKSwxLW4+MWUtNj8odT1NYXRoLmFjb3MobiksYz1NYXRoLnNpbih1KSxxPU1hdGguc2luKCgxLXIpKnUpL2Msbz1NYXRoLnNpbihyKnUpL2MpOihxPTEtcixvPXIpLHRbMF09cSpzK28qZix0WzFdPXEqaStvKmgsdFsyXT1xKnYrbypNLHRbM109cSpsK28qbSx0fSxxdWF0LnNxbGVycD1mdW5jdGlvbigpe3ZhciB0PXF1YXQuY3JlYXRlKCksYT1xdWF0LmNyZWF0ZSgpO3JldHVybiBmdW5jdGlvbihlLHIsdSxuLGMscSl7cmV0dXJuIHF1YXQuc2xlcnAodCxyLGMscSkscXVhdC5zbGVycChhLHUsbixxKSxxdWF0LnNsZXJwKGUsdCxhLDIqcSooMS1xKSksZX19KCkscXVhdC5pbnZlcnQ9ZnVuY3Rpb24odCxhKXt2YXIgZT1hWzBdLHI9YVsxXSx1PWFbMl0sbj1hWzNdLGM9ZSplK3Iqcit1KnUrbipuLHE9Yz8xL2M6MDtyZXR1cm4gdFswXT0tZSpxLHRbMV09LXIqcSx0WzJdPS11KnEsdFszXT1uKnEsdH0scXVhdC5jb25qdWdhdGU9ZnVuY3Rpb24odCxhKXtyZXR1cm4gdFswXT0tYVswXSx0WzFdPS1hWzFdLHRbMl09LWFbMl0sdFszXT1hWzNdLHR9LHF1YXQubGVuZ3RoPXZlYzQubGVuZ3RoLHF1YXQubGVuPXF1YXQubGVuZ3RoLHF1YXQuc3F1YXJlZExlbmd0aD12ZWM0LnNxdWFyZWRMZW5ndGgscXVhdC5zcXJMZW49cXVhdC5zcXVhcmVkTGVuZ3RoLHF1YXQubm9ybWFsaXplPXZlYzQubm9ybWFsaXplLHF1YXQuZnJvbU1hdDM9ZnVuY3Rpb24odCxhKXt2YXIgZSxyPWFbMF0rYVs0XSthWzhdO2lmKHI+MCllPU1hdGguc3FydChyKzEpLHRbM109LjUqZSxlPS41L2UsdFswXT0oYVs1XS1hWzddKSplLHRbMV09KGFbNl0tYVsyXSkqZSx0WzJdPShhWzFdLWFbM10pKmU7ZWxzZXt2YXIgdT0wO2FbNF0+YVswXSYmKHU9MSksYVs4XT5hWzMqdSt1XSYmKHU9Mik7dmFyIG49KHUrMSklMyxjPSh1KzIpJTM7ZT1NYXRoLnNxcnQoYVszKnUrdV0tYVszKm4rbl0tYVszKmMrY10rMSksdFt1XT0uNSplLGU9LjUvZSx0WzNdPShhWzMqbitjXS1hWzMqYytuXSkqZSx0W25dPShhWzMqbit1XSthWzMqdStuXSkqZSx0W2NdPShhWzMqYyt1XSthWzMqdStjXSkqZX1yZXR1cm4gdH0scXVhdC5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuXCJxdWF0KFwiK3RbMF0rXCIsIFwiK3RbMV0rXCIsIFwiK3RbMl0rXCIsIFwiK3RbM10rXCIpXCJ9LG1vZHVsZS5leHBvcnRzPXF1YXQ7XG59LHtcIi4vY29tbW9uLmpzXCI6MTE3LFwiLi9tYXQzLmpzXCI6MTIwLFwiLi92ZWMzLmpzXCI6MTI0LFwiLi92ZWM0LmpzXCI6MTI1fV0sMTIzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbnZhciBnbE1hdHJpeD1yZXF1aXJlKFwiLi9jb21tb24uanNcIiksdmVjMj17fTt2ZWMyLmNyZWF0ZT1mdW5jdGlvbigpe3ZhciBuPW5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO3JldHVybiBuWzBdPTAsblsxXT0wLG59LHZlYzIuY2xvbmU9ZnVuY3Rpb24obil7dmFyIGU9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7cmV0dXJuIGVbMF09blswXSxlWzFdPW5bMV0sZX0sdmVjMi5mcm9tVmFsdWVzPWZ1bmN0aW9uKG4sZSl7dmFyIHI9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7cmV0dXJuIHJbMF09bixyWzFdPWUscn0sdmVjMi5jb3B5PWZ1bmN0aW9uKG4sZSl7cmV0dXJuIG5bMF09ZVswXSxuWzFdPWVbMV0sbn0sdmVjMi5zZXQ9ZnVuY3Rpb24obixlLHIpe3JldHVybiBuWzBdPWUsblsxXT1yLG59LHZlYzIuYWRkPWZ1bmN0aW9uKG4sZSxyKXtyZXR1cm4gblswXT1lWzBdK3JbMF0sblsxXT1lWzFdK3JbMV0sbn0sdmVjMi5zdWJ0cmFjdD1mdW5jdGlvbihuLGUscil7cmV0dXJuIG5bMF09ZVswXS1yWzBdLG5bMV09ZVsxXS1yWzFdLG59LHZlYzIuc3ViPXZlYzIuc3VidHJhY3QsdmVjMi5tdWx0aXBseT1mdW5jdGlvbihuLGUscil7cmV0dXJuIG5bMF09ZVswXSpyWzBdLG5bMV09ZVsxXSpyWzFdLG59LHZlYzIubXVsPXZlYzIubXVsdGlwbHksdmVjMi5kaXZpZGU9ZnVuY3Rpb24obixlLHIpe3JldHVybiBuWzBdPWVbMF0vclswXSxuWzFdPWVbMV0vclsxXSxufSx2ZWMyLmRpdj12ZWMyLmRpdmlkZSx2ZWMyLm1pbj1mdW5jdGlvbihuLGUscil7cmV0dXJuIG5bMF09TWF0aC5taW4oZVswXSxyWzBdKSxuWzFdPU1hdGgubWluKGVbMV0sclsxXSksbn0sdmVjMi5tYXg9ZnVuY3Rpb24obixlLHIpe3JldHVybiBuWzBdPU1hdGgubWF4KGVbMF0sclswXSksblsxXT1NYXRoLm1heChlWzFdLHJbMV0pLG59LHZlYzIuc2NhbGU9ZnVuY3Rpb24obixlLHIpe3JldHVybiBuWzBdPWVbMF0qcixuWzFdPWVbMV0qcixufSx2ZWMyLnNjYWxlQW5kQWRkPWZ1bmN0aW9uKG4sZSxyLHQpe3JldHVybiBuWzBdPWVbMF0rclswXSp0LG5bMV09ZVsxXStyWzFdKnQsbn0sdmVjMi5kaXN0YW5jZT1mdW5jdGlvbihuLGUpe3ZhciByPWVbMF0tblswXSx0PWVbMV0tblsxXTtyZXR1cm4gTWF0aC5zcXJ0KHIqcit0KnQpfSx2ZWMyLmRpc3Q9dmVjMi5kaXN0YW5jZSx2ZWMyLnNxdWFyZWREaXN0YW5jZT1mdW5jdGlvbihuLGUpe3ZhciByPWVbMF0tblswXSx0PWVbMV0tblsxXTtyZXR1cm4gcipyK3QqdH0sdmVjMi5zcXJEaXN0PXZlYzIuc3F1YXJlZERpc3RhbmNlLHZlYzIubGVuZ3RoPWZ1bmN0aW9uKG4pe3ZhciBlPW5bMF0scj1uWzFdO3JldHVybiBNYXRoLnNxcnQoZSplK3Iqcil9LHZlYzIubGVuPXZlYzIubGVuZ3RoLHZlYzIuc3F1YXJlZExlbmd0aD1mdW5jdGlvbihuKXt2YXIgZT1uWzBdLHI9blsxXTtyZXR1cm4gZSplK3Iqcn0sdmVjMi5zcXJMZW49dmVjMi5zcXVhcmVkTGVuZ3RoLHZlYzIubmVnYXRlPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIG5bMF09LWVbMF0sblsxXT0tZVsxXSxufSx2ZWMyLmludmVyc2U9ZnVuY3Rpb24obixlKXtyZXR1cm4gblswXT0xL2VbMF0sblsxXT0xL2VbMV0sbn0sdmVjMi5ub3JtYWxpemU9ZnVuY3Rpb24obixlKXt2YXIgcj1lWzBdLHQ9ZVsxXSxjPXIqcit0KnQ7cmV0dXJuIGM+MCYmKGM9MS9NYXRoLnNxcnQoYyksblswXT1lWzBdKmMsblsxXT1lWzFdKmMpLG59LHZlYzIuZG90PWZ1bmN0aW9uKG4sZSl7cmV0dXJuIG5bMF0qZVswXStuWzFdKmVbMV19LHZlYzIuY3Jvc3M9ZnVuY3Rpb24obixlLHIpe3ZhciB0PWVbMF0qclsxXS1lWzFdKnJbMF07cmV0dXJuIG5bMF09blsxXT0wLG5bMl09dCxufSx2ZWMyLmxlcnA9ZnVuY3Rpb24obixlLHIsdCl7dmFyIGM9ZVswXSx1PWVbMV07cmV0dXJuIG5bMF09Yyt0KihyWzBdLWMpLG5bMV09dSt0KihyWzFdLXUpLG59LHZlYzIucmFuZG9tPWZ1bmN0aW9uKG4sZSl7ZT1lfHwxO3ZhciByPTIqZ2xNYXRyaXguUkFORE9NKCkqTWF0aC5QSTtyZXR1cm4gblswXT1NYXRoLmNvcyhyKSplLG5bMV09TWF0aC5zaW4ocikqZSxufSx2ZWMyLnRyYW5zZm9ybU1hdDI9ZnVuY3Rpb24obixlLHIpe3ZhciB0PWVbMF0sYz1lWzFdO3JldHVybiBuWzBdPXJbMF0qdCtyWzJdKmMsblsxXT1yWzFdKnQrclszXSpjLG59LHZlYzIudHJhbnNmb3JtTWF0MmQ9ZnVuY3Rpb24obixlLHIpe3ZhciB0PWVbMF0sYz1lWzFdO3JldHVybiBuWzBdPXJbMF0qdCtyWzJdKmMrcls0XSxuWzFdPXJbMV0qdCtyWzNdKmMrcls1XSxufSx2ZWMyLnRyYW5zZm9ybU1hdDM9ZnVuY3Rpb24obixlLHIpe3ZhciB0PWVbMF0sYz1lWzFdO3JldHVybiBuWzBdPXJbMF0qdCtyWzNdKmMrcls2XSxuWzFdPXJbMV0qdCtyWzRdKmMrcls3XSxufSx2ZWMyLnRyYW5zZm9ybU1hdDQ9ZnVuY3Rpb24obixlLHIpe3ZhciB0PWVbMF0sYz1lWzFdO3JldHVybiBuWzBdPXJbMF0qdCtyWzRdKmMrclsxMl0sblsxXT1yWzFdKnQrcls1XSpjK3JbMTNdLG59LHZlYzIuZm9yRWFjaD1mdW5jdGlvbigpe3ZhciBuPXZlYzIuY3JlYXRlKCk7cmV0dXJuIGZ1bmN0aW9uKGUscix0LGMsdSx2KXt2YXIgYSxpO2ZvcihyfHwocj0yKSx0fHwodD0wKSxpPWM/TWF0aC5taW4oYypyK3QsZS5sZW5ndGgpOmUubGVuZ3RoLGE9dDtpPmE7YSs9ciluWzBdPWVbYV0sblsxXT1lW2ErMV0sdShuLG4sdiksZVthXT1uWzBdLGVbYSsxXT1uWzFdO3JldHVybiBlfX0oKSx2ZWMyLnN0cj1mdW5jdGlvbihuKXtyZXR1cm5cInZlYzIoXCIrblswXStcIiwgXCIrblsxXStcIilcIn0sbW9kdWxlLmV4cG9ydHM9dmVjMjtcbn0se1wiLi9jb21tb24uanNcIjoxMTd9XSwxMjQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsTWF0cml4PXJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKSx2ZWMzPXt9O3ZlYzMuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIG49bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7cmV0dXJuIG5bMF09MCxuWzFdPTAsblsyXT0wLG59LHZlYzMuY2xvbmU9ZnVuY3Rpb24obil7dmFyIHQ9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT1uWzJdLHR9LHZlYzMuZnJvbVZhbHVlcz1mdW5jdGlvbihuLHQsZSl7dmFyIHI9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7cmV0dXJuIHJbMF09bixyWzFdPXQsclsyXT1lLHJ9LHZlYzMuY29weT1mdW5jdGlvbihuLHQpe3JldHVybiBuWzBdPXRbMF0sblsxXT10WzFdLG5bMl09dFsyXSxufSx2ZWMzLnNldD1mdW5jdGlvbihuLHQsZSxyKXtyZXR1cm4gblswXT10LG5bMV09ZSxuWzJdPXIsbn0sdmVjMy5hZGQ9ZnVuY3Rpb24obix0LGUpe3JldHVybiBuWzBdPXRbMF0rZVswXSxuWzFdPXRbMV0rZVsxXSxuWzJdPXRbMl0rZVsyXSxufSx2ZWMzLnN1YnRyYWN0PWZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gblswXT10WzBdLWVbMF0sblsxXT10WzFdLWVbMV0sblsyXT10WzJdLWVbMl0sbn0sdmVjMy5zdWI9dmVjMy5zdWJ0cmFjdCx2ZWMzLm11bHRpcGx5PWZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gblswXT10WzBdKmVbMF0sblsxXT10WzFdKmVbMV0sblsyXT10WzJdKmVbMl0sbn0sdmVjMy5tdWw9dmVjMy5tdWx0aXBseSx2ZWMzLmRpdmlkZT1mdW5jdGlvbihuLHQsZSl7cmV0dXJuIG5bMF09dFswXS9lWzBdLG5bMV09dFsxXS9lWzFdLG5bMl09dFsyXS9lWzJdLG59LHZlYzMuZGl2PXZlYzMuZGl2aWRlLHZlYzMubWluPWZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gblswXT1NYXRoLm1pbih0WzBdLGVbMF0pLG5bMV09TWF0aC5taW4odFsxXSxlWzFdKSxuWzJdPU1hdGgubWluKHRbMl0sZVsyXSksbn0sdmVjMy5tYXg9ZnVuY3Rpb24obix0LGUpe3JldHVybiBuWzBdPU1hdGgubWF4KHRbMF0sZVswXSksblsxXT1NYXRoLm1heCh0WzFdLGVbMV0pLG5bMl09TWF0aC5tYXgodFsyXSxlWzJdKSxufSx2ZWMzLnNjYWxlPWZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gblswXT10WzBdKmUsblsxXT10WzFdKmUsblsyXT10WzJdKmUsbn0sdmVjMy5zY2FsZUFuZEFkZD1mdW5jdGlvbihuLHQsZSxyKXtyZXR1cm4gblswXT10WzBdK2VbMF0qcixuWzFdPXRbMV0rZVsxXSpyLG5bMl09dFsyXStlWzJdKnIsbn0sdmVjMy5kaXN0YW5jZT1mdW5jdGlvbihuLHQpe3ZhciBlPXRbMF0tblswXSxyPXRbMV0tblsxXSxjPXRbMl0tblsyXTtyZXR1cm4gTWF0aC5zcXJ0KGUqZStyKnIrYypjKX0sdmVjMy5kaXN0PXZlYzMuZGlzdGFuY2UsdmVjMy5zcXVhcmVkRGlzdGFuY2U9ZnVuY3Rpb24obix0KXt2YXIgZT10WzBdLW5bMF0scj10WzFdLW5bMV0sYz10WzJdLW5bMl07cmV0dXJuIGUqZStyKnIrYypjfSx2ZWMzLnNxckRpc3Q9dmVjMy5zcXVhcmVkRGlzdGFuY2UsdmVjMy5sZW5ndGg9ZnVuY3Rpb24obil7dmFyIHQ9blswXSxlPW5bMV0scj1uWzJdO3JldHVybiBNYXRoLnNxcnQodCp0K2UqZStyKnIpfSx2ZWMzLmxlbj12ZWMzLmxlbmd0aCx2ZWMzLnNxdWFyZWRMZW5ndGg9ZnVuY3Rpb24obil7dmFyIHQ9blswXSxlPW5bMV0scj1uWzJdO3JldHVybiB0KnQrZSplK3Iqcn0sdmVjMy5zcXJMZW49dmVjMy5zcXVhcmVkTGVuZ3RoLHZlYzMubmVnYXRlPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG5bMF09LXRbMF0sblsxXT0tdFsxXSxuWzJdPS10WzJdLG59LHZlYzMuaW52ZXJzZT1mdW5jdGlvbihuLHQpe3JldHVybiBuWzBdPTEvdFswXSxuWzFdPTEvdFsxXSxuWzJdPTEvdFsyXSxufSx2ZWMzLm5vcm1hbGl6ZT1mdW5jdGlvbihuLHQpe3ZhciBlPXRbMF0scj10WzFdLGM9dFsyXSxhPWUqZStyKnIrYypjO3JldHVybiBhPjAmJihhPTEvTWF0aC5zcXJ0KGEpLG5bMF09dFswXSphLG5bMV09dFsxXSphLG5bMl09dFsyXSphKSxufSx2ZWMzLmRvdD1mdW5jdGlvbihuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdK25bMl0qdFsyXX0sdmVjMy5jcm9zcz1mdW5jdGlvbihuLHQsZSl7dmFyIHI9dFswXSxjPXRbMV0sYT10WzJdLHU9ZVswXSx2PWVbMV0saT1lWzJdO3JldHVybiBuWzBdPWMqaS1hKnYsblsxXT1hKnUtcippLG5bMl09cip2LWMqdSxufSx2ZWMzLmxlcnA9ZnVuY3Rpb24obix0LGUscil7dmFyIGM9dFswXSxhPXRbMV0sdT10WzJdO3JldHVybiBuWzBdPWMrciooZVswXS1jKSxuWzFdPWErciooZVsxXS1hKSxuWzJdPXUrciooZVsyXS11KSxufSx2ZWMzLmhlcm1pdGU9ZnVuY3Rpb24obix0LGUscixjLGEpe3ZhciB1PWEqYSx2PXUqKDIqYS0zKSsxLGk9dSooYS0yKSthLG89dSooYS0xKSxzPXUqKDMtMiphKTtyZXR1cm4gblswXT10WzBdKnYrZVswXSppK3JbMF0qbytjWzBdKnMsblsxXT10WzFdKnYrZVsxXSppK3JbMV0qbytjWzFdKnMsblsyXT10WzJdKnYrZVsyXSppK3JbMl0qbytjWzJdKnMsbn0sdmVjMy5iZXppZXI9ZnVuY3Rpb24obix0LGUscixjLGEpe3ZhciB1PTEtYSx2PXUqdSxpPWEqYSxvPXYqdSxzPTMqYSp2LGY9MyppKnUsTT1pKmE7cmV0dXJuIG5bMF09dFswXSpvK2VbMF0qcytyWzBdKmYrY1swXSpNLG5bMV09dFsxXSpvK2VbMV0qcytyWzFdKmYrY1sxXSpNLG5bMl09dFsyXSpvK2VbMl0qcytyWzJdKmYrY1syXSpNLG59LHZlYzMucmFuZG9tPWZ1bmN0aW9uKG4sdCl7dD10fHwxO3ZhciBlPTIqZ2xNYXRyaXguUkFORE9NKCkqTWF0aC5QSSxyPTIqZ2xNYXRyaXguUkFORE9NKCktMSxjPU1hdGguc3FydCgxLXIqcikqdDtyZXR1cm4gblswXT1NYXRoLmNvcyhlKSpjLG5bMV09TWF0aC5zaW4oZSkqYyxuWzJdPXIqdCxufSx2ZWMzLnRyYW5zZm9ybU1hdDQ9ZnVuY3Rpb24obix0LGUpe3ZhciByPXRbMF0sYz10WzFdLGE9dFsyXSx1PWVbM10qcitlWzddKmMrZVsxMV0qYStlWzE1XTtyZXR1cm4gdT11fHwxLG5bMF09KGVbMF0qcitlWzRdKmMrZVs4XSphK2VbMTJdKS91LG5bMV09KGVbMV0qcitlWzVdKmMrZVs5XSphK2VbMTNdKS91LG5bMl09KGVbMl0qcitlWzZdKmMrZVsxMF0qYStlWzE0XSkvdSxufSx2ZWMzLnRyYW5zZm9ybU1hdDM9ZnVuY3Rpb24obix0LGUpe3ZhciByPXRbMF0sYz10WzFdLGE9dFsyXTtyZXR1cm4gblswXT1yKmVbMF0rYyplWzNdK2EqZVs2XSxuWzFdPXIqZVsxXStjKmVbNF0rYSplWzddLG5bMl09ciplWzJdK2MqZVs1XSthKmVbOF0sbn0sdmVjMy50cmFuc2Zvcm1RdWF0PWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj10WzBdLGM9dFsxXSxhPXRbMl0sdT1lWzBdLHY9ZVsxXSxpPWVbMl0sbz1lWzNdLHM9bypyK3YqYS1pKmMsZj1vKmMraSpyLXUqYSxNPW8qYSt1KmMtdipyLGg9LXUqci12KmMtaSphO3JldHVybiBuWzBdPXMqbytoKi11K2YqLWktTSotdixuWzFdPWYqbytoKi12K00qLXUtcyotaSxuWzJdPU0qbytoKi1pK3MqLXYtZiotdSxufSx2ZWMzLnJvdGF0ZVg9ZnVuY3Rpb24obix0LGUscil7dmFyIGM9W10sYT1bXTtyZXR1cm4gY1swXT10WzBdLWVbMF0sY1sxXT10WzFdLWVbMV0sY1syXT10WzJdLWVbMl0sYVswXT1jWzBdLGFbMV09Y1sxXSpNYXRoLmNvcyhyKS1jWzJdKk1hdGguc2luKHIpLGFbMl09Y1sxXSpNYXRoLnNpbihyKStjWzJdKk1hdGguY29zKHIpLG5bMF09YVswXStlWzBdLG5bMV09YVsxXStlWzFdLG5bMl09YVsyXStlWzJdLG59LHZlYzMucm90YXRlWT1mdW5jdGlvbihuLHQsZSxyKXt2YXIgYz1bXSxhPVtdO3JldHVybiBjWzBdPXRbMF0tZVswXSxjWzFdPXRbMV0tZVsxXSxjWzJdPXRbMl0tZVsyXSxhWzBdPWNbMl0qTWF0aC5zaW4ocikrY1swXSpNYXRoLmNvcyhyKSxhWzFdPWNbMV0sYVsyXT1jWzJdKk1hdGguY29zKHIpLWNbMF0qTWF0aC5zaW4ociksblswXT1hWzBdK2VbMF0sblsxXT1hWzFdK2VbMV0sblsyXT1hWzJdK2VbMl0sbn0sdmVjMy5yb3RhdGVaPWZ1bmN0aW9uKG4sdCxlLHIpe3ZhciBjPVtdLGE9W107cmV0dXJuIGNbMF09dFswXS1lWzBdLGNbMV09dFsxXS1lWzFdLGNbMl09dFsyXS1lWzJdLGFbMF09Y1swXSpNYXRoLmNvcyhyKS1jWzFdKk1hdGguc2luKHIpLGFbMV09Y1swXSpNYXRoLnNpbihyKStjWzFdKk1hdGguY29zKHIpLGFbMl09Y1syXSxuWzBdPWFbMF0rZVswXSxuWzFdPWFbMV0rZVsxXSxuWzJdPWFbMl0rZVsyXSxufSx2ZWMzLmZvckVhY2g9ZnVuY3Rpb24oKXt2YXIgbj12ZWMzLmNyZWF0ZSgpO3JldHVybiBmdW5jdGlvbih0LGUscixjLGEsdSl7dmFyIHYsaTtmb3IoZXx8KGU9Mykscnx8KHI9MCksaT1jP01hdGgubWluKGMqZStyLHQubGVuZ3RoKTp0Lmxlbmd0aCx2PXI7aT52O3YrPWUpblswXT10W3ZdLG5bMV09dFt2KzFdLG5bMl09dFt2KzJdLGEobixuLHUpLHRbdl09blswXSx0W3YrMV09blsxXSx0W3YrMl09blsyXTtyZXR1cm4gdH19KCksdmVjMy5hbmdsZT1mdW5jdGlvbihuLHQpe3ZhciBlPXZlYzMuZnJvbVZhbHVlcyhuWzBdLG5bMV0sblsyXSkscj12ZWMzLmZyb21WYWx1ZXModFswXSx0WzFdLHRbMl0pO3ZlYzMubm9ybWFsaXplKGUsZSksdmVjMy5ub3JtYWxpemUocixyKTt2YXIgYz12ZWMzLmRvdChlLHIpO3JldHVybiBjPjE/MDpNYXRoLmFjb3MoYyl9LHZlYzMuc3RyPWZ1bmN0aW9uKG4pe3JldHVyblwidmVjMyhcIituWzBdK1wiLCBcIituWzFdK1wiLCBcIituWzJdK1wiKVwifSxtb2R1bGUuZXhwb3J0cz12ZWMzO1xufSx7XCIuL2NvbW1vbi5qc1wiOjExN31dLDEyNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG52YXIgZ2xNYXRyaXg9cmVxdWlyZShcIi4vY29tbW9uLmpzXCIpLHZlYzQ9e307dmVjNC5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtyZXR1cm4gZVswXT0wLGVbMV09MCxlWzJdPTAsZVszXT0wLGV9LHZlYzQuY2xvbmU9ZnVuY3Rpb24oZSl7dmFyIG49bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7cmV0dXJuIG5bMF09ZVswXSxuWzFdPWVbMV0sblsyXT1lWzJdLG5bM109ZVszXSxufSx2ZWM0LmZyb21WYWx1ZXM9ZnVuY3Rpb24oZSxuLHQscil7dmFyIGM9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7cmV0dXJuIGNbMF09ZSxjWzFdPW4sY1syXT10LGNbM109cixjfSx2ZWM0LmNvcHk9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGV9LHZlYzQuc2V0PWZ1bmN0aW9uKGUsbix0LHIsYyl7cmV0dXJuIGVbMF09bixlWzFdPXQsZVsyXT1yLGVbM109YyxlfSx2ZWM0LmFkZD1mdW5jdGlvbihlLG4sdCl7cmV0dXJuIGVbMF09blswXSt0WzBdLGVbMV09blsxXSt0WzFdLGVbMl09blsyXSt0WzJdLGVbM109blszXSt0WzNdLGV9LHZlYzQuc3VidHJhY3Q9ZnVuY3Rpb24oZSxuLHQpe3JldHVybiBlWzBdPW5bMF0tdFswXSxlWzFdPW5bMV0tdFsxXSxlWzJdPW5bMl0tdFsyXSxlWzNdPW5bM10tdFszXSxlfSx2ZWM0LnN1Yj12ZWM0LnN1YnRyYWN0LHZlYzQubXVsdGlwbHk9ZnVuY3Rpb24oZSxuLHQpe3JldHVybiBlWzBdPW5bMF0qdFswXSxlWzFdPW5bMV0qdFsxXSxlWzJdPW5bMl0qdFsyXSxlWzNdPW5bM10qdFszXSxlfSx2ZWM0Lm11bD12ZWM0Lm11bHRpcGx5LHZlYzQuZGl2aWRlPWZ1bmN0aW9uKGUsbix0KXtyZXR1cm4gZVswXT1uWzBdL3RbMF0sZVsxXT1uWzFdL3RbMV0sZVsyXT1uWzJdL3RbMl0sZVszXT1uWzNdL3RbM10sZX0sdmVjNC5kaXY9dmVjNC5kaXZpZGUsdmVjNC5taW49ZnVuY3Rpb24oZSxuLHQpe3JldHVybiBlWzBdPU1hdGgubWluKG5bMF0sdFswXSksZVsxXT1NYXRoLm1pbihuWzFdLHRbMV0pLGVbMl09TWF0aC5taW4oblsyXSx0WzJdKSxlWzNdPU1hdGgubWluKG5bM10sdFszXSksZX0sdmVjNC5tYXg9ZnVuY3Rpb24oZSxuLHQpe3JldHVybiBlWzBdPU1hdGgubWF4KG5bMF0sdFswXSksZVsxXT1NYXRoLm1heChuWzFdLHRbMV0pLGVbMl09TWF0aC5tYXgoblsyXSx0WzJdKSxlWzNdPU1hdGgubWF4KG5bM10sdFszXSksZX0sdmVjNC5zY2FsZT1mdW5jdGlvbihlLG4sdCl7cmV0dXJuIGVbMF09blswXSp0LGVbMV09blsxXSp0LGVbMl09blsyXSp0LGVbM109blszXSp0LGV9LHZlYzQuc2NhbGVBbmRBZGQ9ZnVuY3Rpb24oZSxuLHQscil7cmV0dXJuIGVbMF09blswXSt0WzBdKnIsZVsxXT1uWzFdK3RbMV0qcixlWzJdPW5bMl0rdFsyXSpyLGVbM109blszXSt0WzNdKnIsZX0sdmVjNC5kaXN0YW5jZT1mdW5jdGlvbihlLG4pe3ZhciB0PW5bMF0tZVswXSxyPW5bMV0tZVsxXSxjPW5bMl0tZVsyXSx1PW5bM10tZVszXTtyZXR1cm4gTWF0aC5zcXJ0KHQqdCtyKnIrYypjK3UqdSl9LHZlYzQuZGlzdD12ZWM0LmRpc3RhbmNlLHZlYzQuc3F1YXJlZERpc3RhbmNlPWZ1bmN0aW9uKGUsbil7dmFyIHQ9blswXS1lWzBdLHI9blsxXS1lWzFdLGM9blsyXS1lWzJdLHU9blszXS1lWzNdO3JldHVybiB0KnQrcipyK2MqYyt1KnV9LHZlYzQuc3FyRGlzdD12ZWM0LnNxdWFyZWREaXN0YW5jZSx2ZWM0Lmxlbmd0aD1mdW5jdGlvbihlKXt2YXIgbj1lWzBdLHQ9ZVsxXSxyPWVbMl0sYz1lWzNdO3JldHVybiBNYXRoLnNxcnQobipuK3QqdCtyKnIrYypjKX0sdmVjNC5sZW49dmVjNC5sZW5ndGgsdmVjNC5zcXVhcmVkTGVuZ3RoPWZ1bmN0aW9uKGUpe3ZhciBuPWVbMF0sdD1lWzFdLHI9ZVsyXSxjPWVbM107cmV0dXJuIG4qbit0KnQrcipyK2MqY30sdmVjNC5zcXJMZW49dmVjNC5zcXVhcmVkTGVuZ3RoLHZlYzQubmVnYXRlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGVbMF09LW5bMF0sZVsxXT0tblsxXSxlWzJdPS1uWzJdLGVbM109LW5bM10sZX0sdmVjNC5pbnZlcnNlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGVbMF09MS9uWzBdLGVbMV09MS9uWzFdLGVbMl09MS9uWzJdLGVbM109MS9uWzNdLGV9LHZlYzQubm9ybWFsaXplPWZ1bmN0aW9uKGUsbil7dmFyIHQ9blswXSxyPW5bMV0sYz1uWzJdLHU9blszXSxhPXQqdCtyKnIrYypjK3UqdTtyZXR1cm4gYT4wJiYoYT0xL01hdGguc3FydChhKSxlWzBdPXQqYSxlWzFdPXIqYSxlWzJdPWMqYSxlWzNdPXUqYSksZX0sdmVjNC5kb3Q9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZVswXSpuWzBdK2VbMV0qblsxXStlWzJdKm5bMl0rZVszXSpuWzNdfSx2ZWM0LmxlcnA9ZnVuY3Rpb24oZSxuLHQscil7dmFyIGM9blswXSx1PW5bMV0sYT1uWzJdLHY9blszXTtyZXR1cm4gZVswXT1jK3IqKHRbMF0tYyksZVsxXT11K3IqKHRbMV0tdSksZVsyXT1hK3IqKHRbMl0tYSksZVszXT12K3IqKHRbM10tdiksZX0sdmVjNC5yYW5kb209ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbj1ufHwxLGVbMF09Z2xNYXRyaXguUkFORE9NKCksZVsxXT1nbE1hdHJpeC5SQU5ET00oKSxlWzJdPWdsTWF0cml4LlJBTkRPTSgpLGVbM109Z2xNYXRyaXguUkFORE9NKCksdmVjNC5ub3JtYWxpemUoZSxlKSx2ZWM0LnNjYWxlKGUsZSxuKSxlfSx2ZWM0LnRyYW5zZm9ybU1hdDQ9ZnVuY3Rpb24oZSxuLHQpe3ZhciByPW5bMF0sYz1uWzFdLHU9blsyXSxhPW5bM107cmV0dXJuIGVbMF09dFswXSpyK3RbNF0qYyt0WzhdKnUrdFsxMl0qYSxlWzFdPXRbMV0qcit0WzVdKmMrdFs5XSp1K3RbMTNdKmEsZVsyXT10WzJdKnIrdFs2XSpjK3RbMTBdKnUrdFsxNF0qYSxlWzNdPXRbM10qcit0WzddKmMrdFsxMV0qdSt0WzE1XSphLGV9LHZlYzQudHJhbnNmb3JtUXVhdD1mdW5jdGlvbihlLG4sdCl7dmFyIHI9blswXSxjPW5bMV0sdT1uWzJdLGE9dFswXSx2PXRbMV0saT10WzJdLG89dFszXSxmPW8qcit2KnUtaSpjLHM9bypjK2kqci1hKnUsbD1vKnUrYSpjLXYqcixNPS1hKnItdipjLWkqdTtyZXR1cm4gZVswXT1mKm8rTSotYStzKi1pLWwqLXYsZVsxXT1zKm8rTSotditsKi1hLWYqLWksZVsyXT1sKm8rTSotaStmKi12LXMqLWEsZVszXT1uWzNdLGV9LHZlYzQuZm9yRWFjaD1mdW5jdGlvbigpe3ZhciBlPXZlYzQuY3JlYXRlKCk7cmV0dXJuIGZ1bmN0aW9uKG4sdCxyLGMsdSxhKXt2YXIgdixpO2Zvcih0fHwodD00KSxyfHwocj0wKSxpPWM/TWF0aC5taW4oYyp0K3Isbi5sZW5ndGgpOm4ubGVuZ3RoLHY9cjtpPnY7dis9dCllWzBdPW5bdl0sZVsxXT1uW3YrMV0sZVsyXT1uW3YrMl0sZVszXT1uW3YrM10sdShlLGUsYSksblt2XT1lWzBdLG5bdisxXT1lWzFdLG5bdisyXT1lWzJdLG5bdiszXT1lWzNdO3JldHVybiBufX0oKSx2ZWM0LnN0cj1mdW5jdGlvbihlKXtyZXR1cm5cInZlYzQoXCIrZVswXStcIiwgXCIrZVsxXStcIiwgXCIrZVsyXStcIiwgXCIrZVszXStcIilcIn0sbW9kdWxlLmV4cG9ydHM9dmVjNDtcbn0se1wiLi9jb21tb24uanNcIjoxMTd9XSwxMjY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuZXhwb3J0cy5yZWFkPWZ1bmN0aW9uKGEsbyx0LHIsaCl7dmFyIE0scCx3PTgqaC1yLTEsZj0oMTw8dyktMSxlPWY+PjEsaT0tNyxOPXQ/aC0xOjAsbj10Py0xOjEscz1hW28rTl07Zm9yKE4rPW4sTT1zJigxPDwtaSktMSxzPj49LWksaSs9dztpPjA7TT0yNTYqTSthW28rTl0sTis9bixpLT04KTtmb3IocD1NJigxPDwtaSktMSxNPj49LWksaSs9cjtpPjA7cD0yNTYqcCthW28rTl0sTis9bixpLT04KTtpZigwPT09TSlNPTEtZTtlbHNle2lmKE09PT1mKXJldHVybiBwP05hTjoocz8tMToxKSooMS8wKTtwKz1NYXRoLnBvdygyLHIpLE0tPWV9cmV0dXJuKHM/LTE6MSkqcCpNYXRoLnBvdygyLE0tcil9LGV4cG9ydHMud3JpdGU9ZnVuY3Rpb24oYSxvLHQscixoLE0pe3ZhciBwLHcsZixlPTgqTS1oLTEsaT0oMTw8ZSktMSxOPWk+PjEsbj0yMz09PWg/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLHM9cj8wOk0tMSx1PXI/MTotMSxsPTA+b3x8MD09PW8mJjA+MS9vPzE6MDtmb3Iobz1NYXRoLmFicyhvKSxpc05hTihvKXx8bz09PTEvMD8odz1pc05hTihvKT8xOjAscD1pKToocD1NYXRoLmZsb29yKE1hdGgubG9nKG8pL01hdGguTE4yKSxvKihmPU1hdGgucG93KDIsLXApKTwxJiYocC0tLGYqPTIpLG8rPXArTj49MT9uL2Y6bipNYXRoLnBvdygyLDEtTiksbypmPj0yJiYocCsrLGYvPTIpLHArTj49aT8odz0wLHA9aSk6cCtOPj0xPyh3PShvKmYtMSkqTWF0aC5wb3coMixoKSxwKz1OKToodz1vKk1hdGgucG93KDIsTi0xKSpNYXRoLnBvdygyLGgpLHA9MCkpO2g+PTg7YVt0K3NdPTI1NSZ3LHMrPXUsdy89MjU2LGgtPTgpO2ZvcihwPXA8PGh8dyxlKz1oO2U+MDthW3Qrc109MjU1JnAscys9dSxwLz0yNTYsZS09OCk7YVt0K3MtdV18PTEyOCpsfTtcbn0se31dLDEyNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KX06bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lO3ZhciBvPWZ1bmN0aW9uKCl7fTtvLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgbyx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fTtcbn0se31dLDEyODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBjb25zdGFudChyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcn19ZnVuY3Rpb24gaW50ZXJwb2xhdGVOdW1iZXIocix0LG4pe3JldHVybiByKigxLW4pK3Qqbn1mdW5jdGlvbiBpbnRlcnBvbGF0ZUFycmF5KHIsdCxuKXtmb3IodmFyIGU9W10sbz0wO288ci5sZW5ndGg7bysrKWVbb109aW50ZXJwb2xhdGVOdW1iZXIocltvXSx0W29dLG4pO3JldHVybiBlfWV4cG9ydHMuaW50ZXJwb2xhdGVkPWZ1bmN0aW9uKHIpe2lmKCFyLnN0b3BzKXJldHVybiBjb25zdGFudChyKTt2YXIgdD1yLnN0b3BzLG49ci5iYXNlfHwxLGU9QXJyYXkuaXNBcnJheSh0WzBdWzFdKT9pbnRlcnBvbGF0ZUFycmF5OmludGVycG9sYXRlTnVtYmVyO3JldHVybiBmdW5jdGlvbihyKXtmb3IodmFyIG8sYSxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciB1PXRbaV07aWYodVswXTw9ciYmKG89dSksdVswXT5yKXthPXU7YnJlYWt9fWlmKG8mJmEpe3ZhciBzPWFbMF0tb1swXSxmPXItb1swXSxwPTE9PT1uP2YvczooTWF0aC5wb3cobixmKS0xKS8oTWF0aC5wb3cobixzKS0xKTtyZXR1cm4gZShvWzFdLGFbMV0scCl9cmV0dXJuIG8/b1sxXTphP2FbMV06dm9pZCAwfX0sZXhwb3J0c1tcInBpZWNld2lzZS1jb25zdGFudFwiXT1mdW5jdGlvbihyKXtpZighci5zdG9wcylyZXR1cm4gY29uc3RhbnQocik7dmFyIHQ9ci5zdG9wcztyZXR1cm4gZnVuY3Rpb24ocil7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspaWYodFtuXVswXT5yKXJldHVybiB0WzA9PT1uPzA6bi0xXVsxXTtyZXR1cm4gdFt0Lmxlbmd0aC0xXVsxXX19O1xufSx7fV0sMTI5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciByZWZlcmVuY2U9cmVxdWlyZShcIi4uLy4uL3JlZmVyZW5jZS9sYXRlc3QubWluLmpzXCIpLHZhbGlkYXRlPXJlcXVpcmUoXCIuL3BhcnNlZFwiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gdmFsaWRhdGUoZSxyZWZlcmVuY2UpfTtcbn0se1wiLi4vLi4vcmVmZXJlbmNlL2xhdGVzdC5taW4uanNcIjoxMzIsXCIuL3BhcnNlZFwiOjEzMH1dLDEzMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0eXBlb2ZfKGUpe3JldHVybiBlIGluc3RhbmNlb2YgTnVtYmVyP1wibnVtYmVyXCI6ZSBpbnN0YW5jZW9mIFN0cmluZz9cInN0cmluZ1wiOmUgaW5zdGFuY2VvZiBCb29sZWFuP1wiYm9vbGVhblwiOkFycmF5LmlzQXJyYXkoZSk/XCJhcnJheVwiOm51bGw9PT1lP1wibnVsbFwiOnR5cGVvZiBlfWZ1bmN0aW9uIHVuYnVuZGxlKGUpe3JldHVybiBlIGluc3RhbmNlb2YgTnVtYmVyfHxlIGluc3RhbmNlb2YgU3RyaW5nfHxlIGluc3RhbmNlb2YgQm9vbGVhbj9lLnZhbHVlT2YoKTplfXZhciBwYXJzZUNTU0NvbG9yPXJlcXVpcmUoXCJjc3Njb2xvcnBhcnNlclwiKS5wYXJzZUNTU0NvbG9yLGZvcm1hdD1yZXF1aXJlKFwidXRpbFwiKS5mb3JtYXQ7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKGUsdCl7dmFyIHI9e21lc3NhZ2U6KGU/ZStcIjogXCI6XCJcIikrZm9ybWF0LmFwcGx5KGZvcm1hdCxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfTtudWxsIT09dCYmdm9pZCAwIT09dCYmdC5fX2xpbmVfXyYmKHIubGluZT10Ll9fbGluZV9fKSxzLnB1c2gocil9ZnVuY3Rpb24gbihlLG8saSl7dmFyIHM9dHlwZW9mXyhvKTtpZihcInN0cmluZ1wiPT09cyYmXCJAXCI9PT1vWzBdKXtpZih0LiR2ZXJzaW9uPjcpcmV0dXJuIHIoZSxvLFwiY29uc3RhbnRzIGhhdmUgYmVlbiBkZXByZWNhdGVkIGFzIG9mIHY4XCIpO2lmKCEobyBpbiBhKSlyZXR1cm4gcihlLG8sJ2NvbnN0YW50IFwiJXNcIiBub3QgZm91bmQnLG8pO289YVtvXSxzPXR5cGVvZl8obyl9aWYoaVtcImZ1bmN0aW9uXCJdJiZcIm9iamVjdFwiPT09cylyZXR1cm4gbltcImZ1bmN0aW9uXCJdKGUsbyxpKTtpZihpLnR5cGUpe3ZhciB1PW5baS50eXBlXTtpZih1KXJldHVybiB1KGUsbyxpKTtpPXRbaS50eXBlXX1uLm9iamVjdChlLG8saSl9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZnVuY3Rpb24odCxuLG8pe3ZhciBhPXR5cGVvZl8obik7YSE9PWUmJnIodCxuLFwiJXMgZXhwZWN0ZWQsICVzIGZvdW5kXCIsZSxhKSxcIm1pbmltdW1cImluIG8mJm48by5taW5pbXVtJiZyKHQsbixcIiVzIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bSB2YWx1ZSAlc1wiLG4sby5taW5pbXVtKSxcIm1heGltdW1cImluIG8mJm4+by5tYXhpbXVtJiZyKHQsbixcIiVzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSAlc1wiLG4sby5tYXhpbXVtKX19dmFyIGE9ZS5jb25zdGFudHN8fHt9LGk9e30scz1bXTtyZXR1cm4gbi5jb25zdGFudHM9ZnVuY3Rpb24oZSxuKXtpZih0LiR2ZXJzaW9uPjcpe2lmKG4pcmV0dXJuIHIoZSxuLFwiY29uc3RhbnRzIGhhdmUgYmVlbiBkZXByZWNhdGVkIGFzIG9mIHY4XCIpfWVsc2V7dmFyIG89dHlwZW9mXyhuKTtpZihcIm9iamVjdFwiIT09bylyZXR1cm4gcihlLG4sXCJvYmplY3QgZXhwZWN0ZWQsICVzIGZvdW5kXCIsbyk7Zm9yKHZhciBhIGluIG4pXCJAXCIhPT1hWzBdJiZyKGUrXCIuXCIrYSxuW2FdLCdjb25zdGFudHMgbXVzdCBzdGFydCB3aXRoIFwiQFwiJyl9fSxuLnNvdXJjZT1mdW5jdGlvbihlLG8pe2lmKCFvLnR5cGUpcmV0dXJuIHZvaWQgcihlLG8sJ1widHlwZVwiIGlzIHJlcXVpcmVkJyk7dmFyIGE9dW5idW5kbGUoby50eXBlKTtzd2l0Y2goYSl7Y2FzZVwidmVjdG9yXCI6Y2FzZVwicmFzdGVyXCI6aWYobi5vYmplY3QoZSxvLHQuc291cmNlX3RpbGUpLFwidXJsXCJpbiBvKWZvcih2YXIgaSBpbiBvKVtcInR5cGVcIixcInVybFwiLFwidGlsZVNpemVcIl0uaW5kZXhPZihpKTwwJiZyKGUrXCIuXCIraSxvW2ldLCdhIHNvdXJjZSB3aXRoIGEgXCJ1cmxcIiBwcm9wZXJ0eSBtYXkgbm90IGluY2x1ZGUgYSBcIiVzXCIgcHJvcGVydHknLGkpO2JyZWFrO2Nhc2VcImdlb2pzb25cIjpuLm9iamVjdChlLG8sdC5zb3VyY2VfZ2VvanNvbik7YnJlYWs7Y2FzZVwidmlkZW9cIjpuLm9iamVjdChlLG8sdC5zb3VyY2VfdmlkZW8pO2JyZWFrO2Nhc2VcImltYWdlXCI6bi5vYmplY3QoZSxvLHQuc291cmNlX2ltYWdlKTticmVhaztkZWZhdWx0Om5bXCJlbnVtXCJdKGUrXCIudHlwZVwiLG8udHlwZSx7dmFsdWVzOltcInZlY3RvclwiLFwicmFzdGVyXCIsXCJnZW9qc29uXCIsXCJ2aWRlb1wiLFwiaW1hZ2VcIl19KX19LG4ubGF5ZXI9ZnVuY3Rpb24obyxhKXthLnR5cGV8fGEucmVmfHxyKG8sYSwnZWl0aGVyIFwidHlwZVwiIG9yIFwicmVmXCIgaXMgcmVxdWlyZWQnKTt2YXIgcz11bmJ1bmRsZShhLnR5cGUpLHU9dW5idW5kbGUoYS5yZWYpO2lmKGEuaWQmJihpW2EuaWRdP3IobyxhLmlkLCdkdXBsaWNhdGUgbGF5ZXIgaWQgXCIlc1wiLCBwcmV2aW91c2x5IHVzZWQgYXQgbGluZSAlZCcsYS5pZCxpW2EuaWRdKTppW2EuaWRdPWEuaWQuX19saW5lX18pLFwicmVmXCJpbiBhKXtbXCJ0eXBlXCIsXCJzb3VyY2VcIixcInNvdXJjZS1sYXllclwiLFwiZmlsdGVyXCIsXCJsYXlvdXRcIl0uZm9yRWFjaChmdW5jdGlvbihlKXtlIGluIGEmJnIobyxhW2VdLCdcIiVzXCIgaXMgcHJvaGliaXRlZCBmb3IgcmVmIGxheWVycycsZSl9KTt2YXIgYztlLmxheWVycy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuaWQ9PXUmJihjPWUpfSksYz9jLnJlZj9yKG8sYS5yZWYsXCJyZWYgY2Fubm90IHJlZmVyZW5jZSBhbm90aGVyIHJlZiBsYXllclwiKTpzPWMudHlwZTpyKG8sYS5yZWYsJ3JlZiBsYXllciBcIiVzXCIgbm90IGZvdW5kJyx1KX1lbHNlIGlmKFwiYmFja2dyb3VuZFwiIT09cylpZihhLnNvdXJjZSl7dmFyIGY9ZS5zb3VyY2VzW2Euc291cmNlXTtmP1widmVjdG9yXCI9PWYudHlwZSYmXCJyYXN0ZXJcIj09cz9yKG8sYS5zb3VyY2UsJ2xheWVyIFwiJXNcIiByZXF1aXJlcyBhIHJhc3RlciBzb3VyY2UnLGEuaWQpOlwicmFzdGVyXCI9PWYudHlwZSYmXCJyYXN0ZXJcIiE9cz9yKG8sYS5zb3VyY2UsJ2xheWVyIFwiJXNcIiByZXF1aXJlcyBhIHZlY3RvciBzb3VyY2UnLGEuaWQpOlwidmVjdG9yXCIhPWYudHlwZXx8YVtcInNvdXJjZS1sYXllclwiXXx8cihvLGEsJ2xheWVyIFwiJXNcIiBtdXN0IHNwZWNpZnkgYSBcInNvdXJjZS1sYXllclwiJyxhLmlkKTpyKG8sYS5zb3VyY2UsJ3NvdXJjZSBcIiVzXCIgbm90IGZvdW5kJyxhLnNvdXJjZSl9ZWxzZSByKG8sYSwnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInNvdXJjZVwiJyk7bi5vYmplY3QobyxhLHQubGF5ZXIse2ZpbHRlcjpuLmZpbHRlcixsYXlvdXQ6ZnVuY3Rpb24oZSxyKXt2YXIgbz10W1wibGF5b3V0X1wiK3NdO3JldHVybiBzJiZvJiZuKGUscixvKX0scGFpbnQ6ZnVuY3Rpb24oZSxyKXt2YXIgbz10W1wicGFpbnRfXCIrc107cmV0dXJuIHMmJm8mJm4oZSxyLG8pfX0pfSxuLm9iamVjdD1mdW5jdGlvbihlLG8sYSxpKXtpPWl8fHt9O3ZhciBzPXR5cGVvZl8obyk7aWYoXCJvYmplY3RcIiE9PXMpcmV0dXJuIHIoZSxvLFwib2JqZWN0IGV4cGVjdGVkLCAlcyBmb3VuZFwiLHMpO2Zvcih2YXIgdSBpbiBvKXt2YXIgYz11LnNwbGl0KFwiLlwiKVswXSxmPWFbY118fGFbXCIqXCJdLGw9Yy5tYXRjaCgvXiguKiktdHJhbnNpdGlvbiQvKTtmPyhpW2NdfHxuKSgoZT9lK1wiLlwiOmUpK3Usb1t1XSxmKTpsJiZhW2xbMV1dJiZhW2xbMV1dLnRyYW5zaXRpb24/bigoZT9lK1wiLlwiOmUpK3Usb1t1XSx0LnRyYW5zaXRpb24pOlwiXCIhPT1lJiYxIT09ZS5zcGxpdChcIi5cIikubGVuZ3RoJiZyKGUsb1t1XSwndW5rbm93biBwcm9wZXJ0eSBcIiVzXCInLHUpfWZvcih2YXIgcCBpbiBhKWFbcF0ucmVxdWlyZWQmJnZvaWQgMD09PWFbcF1bXCJkZWZhdWx0XCJdJiZ2b2lkIDA9PT1vW3BdJiZyKGUsbywnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcIiVzXCInLHApfSxuLmFycmF5PWZ1bmN0aW9uKHQsbyxhLGkpe2lmKFwiYXJyYXlcIiE9PXR5cGVvZl8obykpcmV0dXJuIHIodCxvLFwiYXJyYXkgZXhwZWN0ZWQsICVzIGZvdW5kXCIsdHlwZW9mXyhvKSk7aWYoYS5sZW5ndGgmJm8ubGVuZ3RoIT09YS5sZW5ndGgpcmV0dXJuIHIodCxvLFwiYXJyYXkgbGVuZ3RoICVkIGV4cGVjdGVkLCBsZW5ndGggJWQgZm91bmRcIixhLmxlbmd0aCxvLmxlbmd0aCk7aWYoYVtcIm1pbi1sZW5ndGhcIl0mJm8ubGVuZ3RoPGFbXCJtaW4tbGVuZ3RoXCJdKXJldHVybiByKHQsbyxcImFycmF5IGxlbmd0aCBhdCBsZWFzdCAlZCBleHBlY3RlZCwgbGVuZ3RoICVkIGZvdW5kXCIsYVtcIm1pbi1sZW5ndGhcIl0sby5sZW5ndGgpO3ZhciBzPXt0eXBlOmEudmFsdWV9O2UudmVyc2lvbjw3JiYoc1tcImZ1bmN0aW9uXCJdPWFbXCJmdW5jdGlvblwiXSksXCJvYmplY3RcIj09PXR5cGVvZl8oYS52YWx1ZSkmJihzPWEudmFsdWUpO2Zvcih2YXIgdT0wO3U8by5sZW5ndGg7dSsrKShpfHxuKSh0K1wiW1wiK3UrXCJdXCIsb1t1XSxzKX0sbi5maWx0ZXI9ZnVuY3Rpb24oZSxvKXt2YXIgYTtpZihcImFycmF5XCIhPT10eXBlb2ZfKG8pKXJldHVybiByKGUsbyxcImFycmF5IGV4cGVjdGVkLCAlcyBmb3VuZFwiLHR5cGVvZl8obykpO2lmKG8ubGVuZ3RoPDEpcmV0dXJuIHIoZSxvLFwiZmlsdGVyIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCAxIGVsZW1lbnRcIik7c3dpdGNoKG5bXCJlbnVtXCJdKGUrXCJbMF1cIixvWzBdLHQuZmlsdGVyX29wZXJhdG9yKSx1bmJ1bmRsZShvWzBdKSl7Y2FzZVwiPFwiOmNhc2VcIjw9XCI6Y2FzZVwiPlwiOmNhc2VcIj49XCI6by5sZW5ndGg+PTImJlwiJHR5cGVcIj09b1sxXSYmcihlLG8sJ1wiJHR5cGVcIiBjYW5ub3QgYmUgdXNlIHdpdGggb3BlcmF0b3IgXCIlc1wiJyxvWzBdKTtjYXNlXCI9PVwiOmNhc2VcIiE9XCI6MyE9by5sZW5ndGgmJnIoZSxvLCdmaWx0ZXIgYXJyYXkgZm9yIG9wZXJhdG9yIFwiJXNcIiBtdXN0IGhhdmUgMyBlbGVtZW50cycsb1swXSk7Y2FzZVwiaW5cIjpjYXNlXCIhaW5cIjpvLmxlbmd0aD49MiYmKGE9dHlwZW9mXyhvWzFdKSxcInN0cmluZ1wiIT09YT9yKGUrXCJbMV1cIixvWzFdLFwic3RyaW5nIGV4cGVjdGVkLCAlcyBmb3VuZFwiLGEpOlwiQFwiPT09b1sxXVswXSYmcihlK1wiWzFdXCIsb1sxXSxcImZpbHRlciBrZXkgY2Fubm90IGJlIGEgY29uc3RhbnRcIikpO2Zvcih2YXIgaT0yO2k8by5sZW5ndGg7aSsrKWE9dHlwZW9mXyhvW2ldKSxcIiR0eXBlXCI9PW9bMV0/bltcImVudW1cIl0oZStcIltcIitpK1wiXVwiLG9baV0sdC5nZW9tZXRyeV90eXBlKTpcInN0cmluZ1wiPT09YSYmXCJAXCI9PT1vW2ldWzBdP3IoZStcIltcIitpK1wiXVwiLG9baV0sXCJmaWx0ZXIgdmFsdWUgY2Fubm90IGJlIGEgY29uc3RhbnRcIik6XCJzdHJpbmdcIiE9PWEmJlwibnVtYmVyXCIhPT1hJiZcImJvb2xlYW5cIiE9PWEmJnIoZStcIltcIitpK1wiXVwiLG9baV0sXCJzdHJpbmcsIG51bWJlciwgb3IgYm9vbGVhbiBleHBlY3RlZCwgJXMgZm91bmRcIixhKTticmVhaztjYXNlXCJhbnlcIjpjYXNlXCJhbGxcIjpjYXNlXCJub25lXCI6Zm9yKGk9MTtpPG8ubGVuZ3RoO2krKyluLmZpbHRlcihlK1wiW1wiK2krXCJdXCIsb1tpXSl9fSxuW1wiZnVuY3Rpb25cIl09ZnVuY3Rpb24oZSxvLGEpe24ub2JqZWN0KGUsbyx0W1wiZnVuY3Rpb25cIl0se3N0b3BzOmZ1bmN0aW9uKGUsdCxvKXt2YXIgaT0tKDEvMCk7bi5hcnJheShlLHQsbyxmdW5jdGlvbihlLHQpe3JldHVyblwiYXJyYXlcIiE9PXR5cGVvZl8odCk/cihlLHQsXCJhcnJheSBleHBlY3RlZCwgJXMgZm91bmRcIix0eXBlb2ZfKHQpKToyIT09dC5sZW5ndGg/cihlLHQsXCJhcnJheSBsZW5ndGggJWQgZXhwZWN0ZWQsIGxlbmd0aCAlZCBmb3VuZFwiLDIsdC5sZW5ndGgpOihuKGUrXCJbMF1cIix0WzBdLHt0eXBlOlwibnVtYmVyXCJ9KSxuKGUrXCJbMV1cIix0WzFdLGEpLHZvaWQoXCJudW1iZXJcIj09PXR5cGVvZl8odFswXSkmJihcInBpZWNld2lzZS1jb25zdGFudFwiPT09YVtcImZ1bmN0aW9uXCJdJiZ0WzBdJTEhPT0wJiZyKGUrXCJbMF1cIix0WzBdLFwiem9vbSBsZXZlbCBmb3IgcGllY2V3aXNlLWNvbnN0YW50IGZ1bmN0aW9ucyBtdXN0IGJlIGFuIGludGVnZXJcIiksdFswXTw9aSYmcihlK1wiWzBdXCIsdFswXSxcImFycmF5IHN0b3BzIG11c3QgYXBwZWFyIGluIGFzY2VuZGluZyBvcmRlciBhbmQgaGF2ZSBubyBkdXBsaWNhdGVzXCIpLGk9dFswXSkpKX0pLFwiYXJyYXlcIj09PXR5cGVvZl8odCkmJjA9PT10Lmxlbmd0aCYmcihlLHQsXCJhcnJheSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHN0b3BcIil9fSl9LG5bXCJlbnVtXCJdPWZ1bmN0aW9uKGUsdCxuKXstMT09PW4udmFsdWVzLmluZGV4T2YodW5idW5kbGUodCkpJiZyKGUsdCxcImV4cGVjdGVkIG9uZSBvZiBbJXNdLCAlcyBmb3VuZFwiLG4udmFsdWVzLmpvaW4oXCIsIFwiKSx0KX0sbi5jb2xvcj1mdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZl8odCk7cmV0dXJuXCJzdHJpbmdcIiE9PW4/cihlLHQsXCJjb2xvciBleHBlY3RlZCwgJXMgZm91bmRcIixuKTpudWxsPT09cGFyc2VDU1NDb2xvcih0KT9yKGUsdCwnY29sb3IgZXhwZWN0ZWQsIFwiJXNcIiBmb3VuZCcsdCk6dm9pZCAwfSxuLm51bWJlcj1vKFwibnVtYmVyXCIpLG4uc3RyaW5nPW8oXCJzdHJpbmdcIiksbltcImJvb2xlYW5cIl09byhcImJvb2xlYW5cIiksbltcIipcIl09ZnVuY3Rpb24oKXt9LG4oXCJcIixlLHQuJHJvb3QpLHQuJHZlcnNpb24+NyYmZS5jb25zdGFudHMmJm4uY29uc3RhbnRzKFwiY29uc3RhbnRzXCIsZS5jb25zdGFudHMpLHMuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLmxpbmUtdC5saW5lfSksc307XG59LHtcImNzc2NvbG9ycGFyc2VyXCI6MTA3LFwidXRpbFwiOjE0M31dLDEzMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cz1yZXF1aXJlKFwiLi92OC5qc29uXCIpO1xufSx7XCIuL3Y4Lmpzb25cIjoxMzN9XSwxMzI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHM9cmVxdWlyZShcIi4vdjgubWluLmpzb25cIik7XG59LHtcIi4vdjgubWluLmpzb25cIjoxMzR9XSwxMzM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHM9e1wiJHZlcnNpb25cIjo4LFwiJHJvb3RcIjp7XCJ2ZXJzaW9uXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6WzhdLFwiZG9jXCI6XCJTdHlsZXNoZWV0IHZlcnNpb24gbnVtYmVyLiBNdXN0IGJlIDguXCIsXCJleGFtcGxlXCI6OH0sXCJuYW1lXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJkb2NcIjpcIkEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhlIHN0eWxlLlwiLFwiZXhhbXBsZVwiOlwiQnJpZ2h0XCJ9LFwibWV0YWRhdGFcIjp7XCJ0eXBlXCI6XCIqXCIsXCJkb2NcIjpcIkFyYml0cmFyeSBwcm9wZXJ0aWVzIHVzZWZ1bCB0byB0cmFjayB3aXRoIHRoZSBzdHlsZXNoZWV0LCBidXQgZG8gbm90IGluZmx1ZW5jZSByZW5kZXJpbmcuIFByb3BlcnRpZXMgc2hvdWxkIGJlIHByZWZpeGVkIHRvIGF2b2lkIGNvbGxpc2lvbnMsIGxpa2UgJ21hcGJveDonLlwifSxcImNlbnRlclwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJkb2NcIjpcIkRlZmF1bHQgbWFwIGNlbnRlciBpbiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLiAgVGhlIHN0eWxlIGNlbnRlciB3aWxsIGJlIHVzZWQgb25seSBpZiB0aGUgbWFwIGhhcyBub3QgYmVlbiBwb3NpdGlvbmVkIGJ5IG90aGVyIG1lYW5zIChlLmcuIG1hcCBvcHRpb25zIG9yIHVzZXIgaW50ZXJhY3Rpb24pLlwiLFwiZXhhbXBsZVwiOlstNzMuOTc0OSw0MC43NzM2XX0sXCJ6b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkb2NcIjpcIkRlZmF1bHQgem9vbSBsZXZlbC4gIFRoZSBzdHlsZSB6b29tIHdpbGwgYmUgdXNlZCBvbmx5IGlmIHRoZSBtYXAgaGFzIG5vdCBiZWVuIHBvc2l0aW9uZWQgYnkgb3RoZXIgbWVhbnMgKGUuZy4gbWFwIG9wdGlvbnMgb3IgdXNlciBpbnRlcmFjdGlvbikuXCIsXCJleGFtcGxlXCI6MTIuNX0sXCJiZWFyaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJkb2NcIjpcIkRlZmF1bHQgYmVhcmluZywgaW4gZGVncmVlcy4gIFRoZSBzdHlsZSBiZWFyaW5nIHdpbGwgYmUgdXNlZCBvbmx5IGlmIHRoZSBtYXAgaGFzIG5vdCBiZWVuIHBvc2l0aW9uZWQgYnkgb3RoZXIgbWVhbnMgKGUuZy4gbWFwIG9wdGlvbnMgb3IgdXNlciBpbnRlcmFjdGlvbikuXCIsXCJleGFtcGxlXCI6Mjl9LFwicGl0Y2hcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwidW5pdHNcIjpcImRlZ3JlZXNcIixcImRvY1wiOlwiRGVmYXVsdCBwaXRjaCwgaW4gZGVncmVlcy4gWmVybyBpcyBwZXJwZW5kaWN1bGFyIHRvIHRoZSBzdXJmYWNlLiAgVGhlIHN0eWxlIHBpdGNoIHdpbGwgYmUgdXNlZCBvbmx5IGlmIHRoZSBtYXAgaGFzIG5vdCBiZWVuIHBvc2l0aW9uZWQgYnkgb3RoZXIgbWVhbnMgKGUuZy4gbWFwIG9wdGlvbnMgb3IgdXNlciBpbnRlcmFjdGlvbikuXCIsXCJleGFtcGxlXCI6NTB9LFwic291cmNlc1wiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcInNvdXJjZXNcIixcImRvY1wiOlwiRGF0YSBzb3VyY2Ugc3BlY2lmaWNhdGlvbnMuXCIsXCJleGFtcGxlXCI6e1wibWFwYm94LXN0cmVldHNcIjp7XCJ0eXBlXCI6XCJ2ZWN0b3JcIixcInVybFwiOlwibWFwYm94Oi8vbWFwYm94Lm1hcGJveC1zdHJlZXRzLXY2XCJ9fX0sXCJzcHJpdGVcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImRvY1wiOlwiQSBiYXNlIFVSTCBmb3IgcmV0cmlldmluZyB0aGUgc3ByaXRlIGltYWdlIGFuZCBtZXRhZGF0YS4gVGhlIGV4dGVuc2lvbnMgYC5wbmdgLCBgLmpzb25gIGFuZCBzY2FsZSBmYWN0b3IgYEAyeC5wbmdgIHdpbGwgYmUgYXV0b21hdGljYWxseSBhcHBlbmRlZC5cIixcImV4YW1wbGVcIjpcIm1hcGJveDovL3Nwcml0ZXMvbWFwYm94L2JyaWdodC12OFwifSxcImdseXBoc1wiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZG9jXCI6XCJBIFVSTCB0ZW1wbGF0ZSBmb3IgbG9hZGluZyBzaWduZWQtZGlzdGFuY2UtZmllbGQgZ2x5cGggc2V0cyBpbiBQQkYgZm9ybWF0LiBWYWxpZCB0b2tlbnMgYXJlIHtmb250c3RhY2t9IGFuZCB7cmFuZ2V9LlwiLFwiZXhhbXBsZVwiOlwibWFwYm94Oi8vZm9udHMvbWFwYm94L3tmb250c3RhY2t9L3tyYW5nZX0ucGJmXCJ9LFwidHJhbnNpdGlvblwiOntcInR5cGVcIjpcInRyYW5zaXRpb25cIixcImRvY1wiOlwiQSBnbG9iYWwgdHJhbnNpdGlvbiBkZWZpbml0aW9uIHRvIHVzZSBhcyBhIGRlZmF1bHQgYWNyb3NzIHByb3BlcnRpZXMuXCIsXCJleGFtcGxlXCI6e1wiZHVyYXRpb25cIjozMDAsXCJkZWxheVwiOjB9fSxcImxheWVyc1wiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibGF5ZXJcIixcImRvY1wiOlwiTGF5ZXJzIHdpbGwgYmUgZHJhd24gaW4gdGhlIG9yZGVyIG9mIHRoaXMgYXJyYXkuXCIsXCJleGFtcGxlXCI6W3tcImlkXCI6XCJ3YXRlclwiLFwic291cmNlXCI6XCJtYXBib3gtc3RyZWV0c1wiLFwic291cmNlLWxheWVyXCI6XCJ3YXRlclwiLFwidHlwZVwiOlwiZmlsbFwiLFwicGFpbnRcIjp7XCJmaWxsLWNvbG9yXCI6XCIjMDBmZmZmXCJ9fV19fSxcInNvdXJjZXNcIjp7XCIqXCI6e1widHlwZVwiOlwic291cmNlXCIsXCJkb2NcIjpcIlNwZWNpZmljYXRpb24gb2YgYSBkYXRhIHNvdXJjZS4gRm9yIHZlY3RvciBhbmQgcmFzdGVyIHNvdXJjZXMsIGVpdGhlciBUaWxlSlNPTiBvciBhIFVSTCB0byBhIFRpbGVKU09OIG11c3QgYmUgcHJvdmlkZWQuIEZvciBHZW9KU09OIGFuZCB2aWRlbyBzb3VyY2VzLCBhIFVSTCBtdXN0IGJlIHByb3ZpZGVkLlwifX0sXCJzb3VyY2VcIjpbXCJzb3VyY2VfdGlsZVwiLFwic291cmNlX2dlb2pzb25cIixcInNvdXJjZV92aWRlb1wiLFwic291cmNlX2ltYWdlXCJdLFwic291cmNlX3RpbGVcIjp7XCJ0eXBlXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6W1widmVjdG9yXCIsXCJyYXN0ZXJcIl0sXCJkb2NcIjpcIlRoZSBkYXRhIHR5cGUgb2YgdGhlIHRpbGUgc291cmNlLlwifSxcInVybFwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZG9jXCI6XCJBIFVSTCB0byBhIFRpbGVKU09OIHJlc291cmNlLiBTdXBwb3J0ZWQgcHJvdG9jb2xzIGFyZSBgaHR0cDpgLCBgaHR0cHM6YCwgYW5kIGBtYXBib3g6Ly88bWFwaWQ+YC5cIn0sXCJ0aWxlc1wiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCIsXCJkb2NcIjpcIkFuIGFycmF5IG9mIG9uZSBvciBtb3JlIHRpbGUgc291cmNlIFVSTHMsIGFzIGluIHRoZSBUaWxlSlNPTiBzcGVjLlwifSxcIm1pbnpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwiZG9jXCI6XCJNaW5pbXVtIHpvb20gbGV2ZWwgZm9yIHdoaWNoIHRpbGVzIGFyZSBhdmFpbGFibGUsIGFzIGluIHRoZSBUaWxlSlNPTiBzcGVjLlwifSxcIm1heHpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoyMixcImRvY1wiOlwiTWF4aW11bSB6b29tIGxldmVsIGZvciB3aGljaCB0aWxlcyBhcmUgYXZhaWxhYmxlLCBhcyBpbiB0aGUgVGlsZUpTT04gc3BlYy4gRGF0YSBmcm9tIHRpbGVzIGF0IHRoZSBtYXh6b29tIGFyZSB1c2VkIHdoZW4gZGlzcGxheWluZyB0aGUgbWFwIGF0IGhpZ2hlciB6b29tIGxldmVscy5cIn0sXCJ0aWxlU2l6ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjUxMixcInVuaXRzXCI6XCJwaXhlbHNcIixcImRvY1wiOlwiVGhlIG1pbmltdW0gdmlzdWFsIHNpemUgdG8gZGlzcGxheSB0aWxlcyBmb3IgdGhpcyBsYXllci4gT25seSBjb25maWd1cmFibGUgZm9yIHJhc3RlciBsYXllcnMuXCJ9LFwiKlwiOntcInR5cGVcIjpcIipcIixcImRvY1wiOlwiT3RoZXIga2V5cyB0byBjb25maWd1cmUgdGhlIGRhdGEgc291cmNlLlwifX0sXCJzb3VyY2VfZ2VvanNvblwiOntcInR5cGVcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbXCJnZW9qc29uXCJdLFwiZG9jXCI6XCJUaGUgZGF0YSB0eXBlIG9mIHRoZSBHZW9KU09OIHNvdXJjZS5cIn0sXCJkYXRhXCI6e1widHlwZVwiOlwiKlwiLFwiZG9jXCI6XCJBIFVSTCB0byBhIEdlb0pTT04gZmlsZSwgb3IgaW5saW5lIEdlb0pTT04uXCJ9LFwibWF4em9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjE0LFwiZG9jXCI6XCJNYXhpbXVtIHpvb20gbGV2ZWwgYXQgd2hpY2ggdG8gY3JlYXRlIHZlY3RvciB0aWxlcyAoaGlnaGVyIG1lYW5zIGdyZWF0ZXIgZGV0YWlsIGF0IGhpZ2ggem9vbSBsZXZlbHMpLlwifSxcImJ1ZmZlclwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjY0LFwiZG9jXCI6XCJUaWxlIGJ1ZmZlciBzaXplIG9uIGVhY2ggc2lkZSAoaGlnaGVyIG1lYW5zIGZld2VyIHJlbmRlcmluZyBhcnRpZmFjdHMgbmVhciB0aWxlIGVkZ2VzIGJ1dCBzbG93ZXIgcGVyZm9ybWFuY2UpLlwifSxcInRvbGVyYW5jZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMsXCJkb2NcIjpcIkRvdWdsYXMtUGV1Y2tlciBzaW1wbGlmaWNhdGlvbiB0b2xlcmFuY2UgKGhpZ2hlciBtZWFucyBzaW1wbGVyIGdlb21ldHJpZXMgYW5kIGZhc3RlciBwZXJmb3JtYW5jZSkuXCJ9LFwiY2x1c3RlclwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImRlZmF1bHRcIjpmYWxzZSxcImRvY1wiOlwiSWYgdGhlIGRhdGEgaXMgYSBjb2xsZWN0aW9uIG9mIHBvaW50IGZlYXR1cmVzLCBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBjbHVzdGVycyB0aGUgcG9pbnRzIGJ5IHJhZGl1cyBpbnRvIGdyb3Vwcy5cIn0sXCJjbHVzdGVyUmFkaXVzXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NDAwLFwiZG9jXCI6XCJSYWRpdXMgb2YgZWFjaCBjbHVzdGVyIHdoZW4gY2x1c3RlcmluZyBwb2ludHMsIHJlbGF0aXZlIHRvIDQwOTYgdGlsZS5cIn0sXCJjbHVzdGVyTWF4Wm9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJNYXggem9vbSB0byBjbHVzdGVyIHBvaW50cyBvbi4gRGVmYXVsdHMgdG8gb25lIHpvb20gbGVzcyB0aGFuIG1heHpvb20gKHNvIHRoYXQgbGFzdCB6b29tIGZlYXR1cmVzIGFyZSBub3QgY2x1c3RlcmVkKS5cIn19LFwic291cmNlX3ZpZGVvXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcInZpZGVvXCJdLFwiZG9jXCI6XCJUaGUgZGF0YSB0eXBlIG9mIHRoZSB2aWRlbyBzb3VyY2UuXCJ9LFwidXJsc1wiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCIsXCJkb2NcIjpcIlVSTHMgdG8gdmlkZW8gY29udGVudCBpbiBvcmRlciBvZiBwcmVmZXJyZWQgZm9ybWF0LlwifSxcImNvb3JkaW5hdGVzXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwiZG9jXCI6XCJDb3JuZXJzIG9mIHZpZGVvIHNwZWNpZmllZCBpbiBsb25naXR1ZGUsIGxhdGl0dWRlIHBhaXJzLlwiLFwidHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjQsXCJ2YWx1ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJsZW5ndGhcIjoyLFwidmFsdWVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJBIHNpbmdsZSBsb25naXR1ZGUsIGxhdGl0dWRlIHBhaXIuXCJ9fX0sXCJzb3VyY2VfaW1hZ2VcIjp7XCJ0eXBlXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6W1wiaW1hZ2VcIl0sXCJkb2NcIjpcIlRoZSBkYXRhIHR5cGUgb2YgdGhlIGltYWdlIHNvdXJjZS5cIn0sXCJ1cmxcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJzdHJpbmdcIixcImRvY1wiOlwiVVJMIHRoYXQgcG9pbnRzIHRvIGFuIGltYWdlXCJ9LFwiY29vcmRpbmF0ZXNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJkb2NcIjpcIkNvcm5lcnMgb2YgaW1hZ2Ugc3BlY2lmaWVkIGluIGxvbmdpdHVkZSwgbGF0aXR1ZGUgcGFpcnMuXCIsXCJ0eXBlXCI6XCJhcnJheVwiLFwibGVuZ3RoXCI6NCxcInZhbHVlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJkb2NcIjpcIkEgc2luZ2xlIGxvbmdpdHVkZSwgbGF0aXR1ZGUgcGFpci5cIn19fSxcImxheWVyXCI6e1wiaWRcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImRvY1wiOlwiVW5pcXVlIGxheWVyIG5hbWUuXCIsXCJyZXF1aXJlZFwiOnRydWV9LFwidHlwZVwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcImZpbGxcIixcImxpbmVcIixcInN5bWJvbFwiLFwiY2lyY2xlXCIsXCJyYXN0ZXJcIixcImJhY2tncm91bmRcIl0sXCJkb2NcIjpcIlJlbmRlcmluZyB0eXBlIG9mIHRoaXMgbGF5ZXIuXCJ9LFwibWV0YWRhdGFcIjp7XCJ0eXBlXCI6XCIqXCIsXCJkb2NcIjpcIkFyYml0cmFyeSBwcm9wZXJ0aWVzIHVzZWZ1bCB0byB0cmFjayB3aXRoIHRoZSBsYXllciwgYnV0IGRvIG5vdCBpbmZsdWVuY2UgcmVuZGVyaW5nLiBQcm9wZXJ0aWVzIHNob3VsZCBiZSBwcmVmaXhlZCB0byBhdm9pZCBjb2xsaXNpb25zLCBsaWtlICdtYXBib3g6Jy5cIn0sXCJyZWZcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImRvY1wiOlwiUmVmZXJlbmNlcyBhbm90aGVyIGxheWVyIHRvIGNvcHkgYHR5cGVgLCBgc291cmNlYCwgYHNvdXJjZS1sYXllcmAsIGBtaW56b29tYCwgYG1heHpvb21gLCBgZmlsdGVyYCwgYW5kIGBsYXlvdXRgIHByb3BlcnRpZXMgZnJvbS4gVGhpcyBhbGxvd3MgdGhlIGxheWVycyB0byBzaGFyZSBwcm9jZXNzaW5nIGFuZCBiZSBtb3JlIGVmZmljaWVudC5cIn0sXCJzb3VyY2VcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImRvY1wiOlwiTmFtZSBvZiBhIHNvdXJjZSBkZXNjcmlwdGlvbiB0byBiZSB1c2VkIGZvciB0aGlzIGxheWVyLlwifSxcInNvdXJjZS1sYXllclwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZG9jXCI6XCJMYXllciB0byB1c2UgZnJvbSBhIHZlY3RvciB0aWxlIHNvdXJjZS4gUmVxdWlyZWQgaWYgdGhlIHNvdXJjZSBzdXBwb3J0cyBtdWx0aXBsZSBsYXllcnMuXCJ9LFwibWluem9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MjIsXCJkb2NcIjpcIlRoZSBtaW5pbXVtIHpvb20gbGV2ZWwgb24gd2hpY2ggdGhlIGxheWVyIGdldHMgcGFyc2VkIGFuZCBhcHBlYXJzIG9uLlwifSxcIm1heHpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjIyLFwiZG9jXCI6XCJUaGUgbWF4aW11bSB6b29tIGxldmVsIG9uIHdoaWNoIHRoZSBsYXllciBnZXRzIHBhcnNlZCBhbmQgYXBwZWFycyBvbi5cIn0sXCJpbnRlcmFjdGl2ZVwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImRvY1wiOlwiRW5hYmxlIHF1ZXJ5aW5nIG9mIGZlYXR1cmUgZGF0YSBmcm9tIHRoaXMgbGF5ZXIgZm9yIGludGVyYWN0aXZpdHkuXCIsXCJkZWZhdWx0XCI6ZmFsc2V9LFwiZmlsdGVyXCI6e1widHlwZVwiOlwiZmlsdGVyXCIsXCJkb2NcIjpcIkEgZXhwcmVzc2lvbiBzcGVjaWZ5aW5nIGNvbmRpdGlvbnMgb24gc291cmNlIGZlYXR1cmVzLiBPbmx5IGZlYXR1cmVzIHRoYXQgbWF0Y2ggdGhlIGZpbHRlciBhcmUgZGlzcGxheWVkLlwifSxcImxheW91dFwiOntcInR5cGVcIjpcImxheW91dFwiLFwiZG9jXCI6XCJMYXlvdXQgcHJvcGVydGllcyBmb3IgdGhlIGxheWVyLlwifSxcInBhaW50XCI6e1widHlwZVwiOlwicGFpbnRcIixcImRvY1wiOlwiRGVmYXVsdCBwYWludCBwcm9wZXJ0aWVzIGZvciB0aGlzIGxheWVyLlwifSxcInBhaW50LipcIjp7XCJ0eXBlXCI6XCJwYWludFwiLFwiZG9jXCI6XCJDbGFzcy1zcGVjaWZpYyBwYWludCBwcm9wZXJ0aWVzIGZvciB0aGlzIGxheWVyLiBUaGUgY2xhc3MgbmFtZSBpcyB0aGUgcGFydCBhZnRlciB0aGUgZmlyc3QgZG90LlwifX0sXCJsYXlvdXRcIjpbXCJsYXlvdXRfZmlsbFwiLFwibGF5b3V0X2xpbmVcIixcImxheW91dF9jaXJjbGVcIixcImxheW91dF9zeW1ib2xcIixcImxheW91dF9yYXN0ZXJcIixcImxheW91dF9iYWNrZ3JvdW5kXCJdLFwibGF5b3V0X2JhY2tncm91bmRcIjp7XCJ2aXNpYmlsaXR5XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1widmlzaWJsZVwiLFwibm9uZVwiXSxcImRlZmF1bHRcIjpcInZpc2libGVcIixcImRvY1wiOlwiVGhlIGRpc3BsYXkgb2YgdGhpcyBsYXllci4gYG5vbmVgIGhpZGVzIHRoaXMgbGF5ZXIuXCJ9fSxcImxheW91dF9maWxsXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCIsXCJkb2NcIjpcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwifX0sXCJsYXlvdXRfY2lyY2xlXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCIsXCJkb2NcIjpcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwifX0sXCJsYXlvdXRfbGluZVwiOntcImxpbmUtY2FwXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wiYnV0dFwiLFwicm91bmRcIixcInNxdWFyZVwiXSxcImRlZmF1bHRcIjpcImJ1dHRcIixcImRvY1wiOlwiVGhlIGRpc3BsYXkgb2YgbGluZSBlbmRpbmdzLlwifSxcImxpbmUtam9pblwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcImJldmVsXCIsXCJyb3VuZFwiLFwibWl0ZXJcIl0sXCJkZWZhdWx0XCI6XCJtaXRlclwiLFwiZG9jXCI6XCJUaGUgZGlzcGxheSBvZiBsaW5lcyB3aGVuIGpvaW5pbmcuXCJ9LFwibGluZS1taXRlci1saW1pdFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIlVzZWQgdG8gYXV0b21hdGljYWxseSBjb252ZXJ0IG1pdGVyIGpvaW5zIHRvIGJldmVsIGpvaW5zIGZvciBzaGFycCBhbmdsZXMuXCIsXCJyZXF1aXJlc1wiOlt7XCJsaW5lLWpvaW5cIjpcIm1pdGVyXCJ9XX0sXCJsaW5lLXJvdW5kLWxpbWl0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MS4wNSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRvY1wiOlwiVXNlZCB0byBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgcm91bmQgam9pbnMgdG8gbWl0ZXIgam9pbnMgZm9yIHNoYWxsb3cgYW5nbGVzLlwiLFwicmVxdWlyZXNcIjpbe1wibGluZS1qb2luXCI6XCJyb3VuZFwifV19LFwidmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCIsXCJkb2NcIjpcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwifX0sXCJsYXlvdXRfc3ltYm9sXCI6e1wic3ltYm9sLXBsYWNlbWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInBvaW50XCIsXCJsaW5lXCJdLFwiZGVmYXVsdFwiOlwicG9pbnRcIixcImRvY1wiOlwiTGFiZWwgcGxhY2VtZW50IHJlbGF0aXZlIHRvIGl0cyBnZW9tZXRyeS4gYGxpbmVgIGNhbiBvbmx5IGJlIHVzZWQgb24gTGluZVN0cmluZ3MgYW5kIFBvbHlnb25zLlwifSxcInN5bWJvbC1zcGFjaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MjUwLFwibWluaW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJkb2NcIjpcIkRpc3RhbmNlIGJldHdlZW4gdHdvIHN5bWJvbCBhbmNob3JzLlwiLFwicmVxdWlyZXNcIjpbe1wic3ltYm9sLXBsYWNlbWVudFwiOlwibGluZVwifV19LFwic3ltYm9sLWF2b2lkLWVkZ2VzXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlLFwiZG9jXCI6XCJJZiB0cnVlLCB0aGUgc3ltYm9scyB3aWxsIG5vdCBjcm9zcyB0aWxlIGVkZ2VzIHRvIGF2b2lkIG11dHVhbCBjb2xsaXNpb25zLiBSZWNvbW1lbmRlZCBpbiBsYXllcnMgdGhhdCBkb24ndCBoYXZlIGVub3VnaCBwYWRkaW5nIGluIHRoZSB2ZWN0b3IgdGlsZSB0byBwcmV2ZW50IGNvbGxpc2lvbnMsIG9yIGlmIGl0IGlzIGEgcG9pbnQgc3ltYm9sIGxheWVyIHBsYWNlZCBhZnRlciBhIGxpbmUgc3ltYm9sIGxheWVyLlwifSxcImljb24tYWxsb3ctb3ZlcmxhcFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcImRvY1wiOlwiSWYgdHJ1ZSwgdGhlIGljb24gd2lsbCBiZSB2aXNpYmxlIGV2ZW4gaWYgaXQgY29sbGlkZXMgd2l0aCBvdGhlciBwcmV2aW91c2x5IGRyYXduIHN5bWJvbHMuXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1pZ25vcmUtcGxhY2VtZW50XCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlLFwiZG9jXCI6XCJJZiB0cnVlLCBvdGhlciBzeW1ib2xzIGNhbiBiZSB2aXNpYmxlIGV2ZW4gaWYgdGhleSBjb2xsaWRlIHdpdGggdGhlIGljb24uXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1vcHRpb25hbFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcImRvY1wiOlwiSWYgdHJ1ZSwgdGV4dCB3aWxsIGRpc3BsYXkgd2l0aG91dCB0aGVpciBjb3JyZXNwb25kaW5nIGljb25zIHdoZW4gdGhlIGljb24gY29sbGlkZXMgd2l0aCBvdGhlciBzeW1ib2xzIGFuZCB0aGUgdGV4dCBkb2VzIG5vdC5cIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiLFwidGV4dC1maWVsZFwiXX0sXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkZWZhdWx0XCI6XCJ2aWV3cG9ydFwiLFwiZG9jXCI6XCJPcmllbnRhdGlvbiBvZiBpY29uIHdoZW4gbWFwIGlzIHJvdGF0ZWQuXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1zaXplXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiZG9jXCI6XCJTY2FsZSBmYWN0b3IgZm9yIGljb24uIDEgaXMgb3JpZ2luYWwgc2l6ZSwgMyB0cmlwbGVzIHRoZSBzaXplLlwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24taW1hZ2VcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRvY1wiOlwiQSBzdHJpbmcgd2l0aCB7dG9rZW5zfSByZXBsYWNlZCwgcmVmZXJlbmNpbmcgdGhlIGRhdGEgcHJvcGVydHkgdG8gcHVsbCBmcm9tLlwiLFwidG9rZW5zXCI6dHJ1ZX0sXCJpY29uLXJvdGF0ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJwZXJpb2RcIjozNjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ1bml0c1wiOlwiZGVncmVlc1wiLFwiZG9jXCI6XCJSb3RhdGVzIHRoZSBpY29uIGNsb2Nrd2lzZS5cIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLXBhZGRpbmdcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoyLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJkb2NcIjpcIlNpemUgb2YgdGhlIGFkZGl0aW9uYWwgYXJlYSBhcm91bmQgdGhlIGljb24gYm91bmRpbmcgYm94IHVzZWQgZm9yIGRldGVjdGluZyBzeW1ib2wgY29sbGlzaW9ucy5cIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWtlZXAtdXByaWdodFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcImRvY1wiOlwiSWYgdHJ1ZSwgdGhlIGljb24gbWF5IGJlIGZsaXBwZWQgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHJlbmRlcmVkIHVwc2lkZS1kb3duLlwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCIse1wiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjpcIm1hcFwifSx7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJpY29uLW9mZnNldFwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiZG9jXCI6XCJPZmZzZXQgZGlzdGFuY2Ugb2YgaWNvbiBmcm9tIGl0cyBhbmNob3IuIFBvc2l0aXZlIHZhbHVlcyBpbmRpY2F0ZSByaWdodCBhbmQgZG93biwgd2hpbGUgbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxlZnQgYW5kIHVwLlwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wibWFwXCIsXCJ2aWV3cG9ydFwiXSxcImRlZmF1bHRcIjpcInZpZXdwb3J0XCIsXCJkb2NcIjpcIk9yaWVudGF0aW9uIG9mIHRleHQgd2hlbiBtYXAgaXMgcm90YXRlZC5cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWZpZWxkXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkZWZhdWx0XCI6XCJcIixcInRva2Vuc1wiOnRydWUsXCJkb2NcIjpcIlZhbHVlIHRvIHVzZSBmb3IgYSB0ZXh0IGxhYmVsLiBGZWF0dXJlIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCB1c2luZyB0b2tlbnMgbGlrZSB7ZmllbGRfbmFtZX0uXCJ9LFwidGV4dC1mb250XCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpbXCJPcGVuIFNhbnMgUmVndWxhclwiLFwiQXJpYWwgVW5pY29kZSBNUyBSZWd1bGFyXCJdLFwiZG9jXCI6XCJGb250IHN0YWNrIHRvIHVzZSBmb3IgZGlzcGxheWluZyB0ZXh0LlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtc2l6ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjE2LFwibWluaW11bVwiOjAsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIkZvbnQgc2l6ZS5cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LW1heC13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEwLFwibWluaW11bVwiOjAsXCJ1bml0c1wiOlwiZW1cIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRvY1wiOlwiVGhlIG1heGltdW0gbGluZSB3aWR0aCBmb3IgdGV4dCB3cmFwcGluZy5cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWxpbmUtaGVpZ2h0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MS4yLFwidW5pdHNcIjpcImVtXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIlRleHQgbGVhZGluZyB2YWx1ZSBmb3IgbXVsdGktbGluZSB0ZXh0LlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtbGV0dGVyLXNwYWNpbmdcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwidW5pdHNcIjpcImVtXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIlRleHQgdHJhY2tpbmcgYW1vdW50LlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtanVzdGlmeVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcImxlZnRcIixcImNlbnRlclwiLFwicmlnaHRcIl0sXCJkZWZhdWx0XCI6XCJjZW50ZXJcIixcImRvY1wiOlwiVGV4dCBqdXN0aWZpY2F0aW9uIG9wdGlvbnMuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ2YWx1ZXNcIjpbXCJjZW50ZXJcIixcImxlZnRcIixcInJpZ2h0XCIsXCJ0b3BcIixcImJvdHRvbVwiLFwidG9wLWxlZnRcIixcInRvcC1yaWdodFwiLFwiYm90dG9tLWxlZnRcIixcImJvdHRvbS1yaWdodFwiXSxcImRlZmF1bHRcIjpcImNlbnRlclwiLFwiZG9jXCI6XCJQYXJ0IG9mIHRoZSB0ZXh0IHBsYWNlZCBjbG9zZXN0IHRvIHRoZSBhbmNob3IuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1tYXgtYW5nbGVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjo0NSxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIk1heGltdW0gYW5nbGUgY2hhbmdlIGJldHdlZW4gYWRqYWNlbnQgY2hhcmFjdGVycy5cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiLHtcInN5bWJvbC1wbGFjZW1lbnRcIjpcImxpbmVcIn1dfSxcInRleHQtcm90YXRlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIlJvdGF0ZXMgdGhlIHRleHQgY2xvY2t3aXNlLlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtcGFkZGluZ1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJwaXhlbHNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRvY1wiOlwiU2l6ZSBvZiB0aGUgYWRkaXRpb25hbCBhcmVhIGFyb3VuZCB0aGUgdGV4dCBib3VuZGluZyBib3ggdXNlZCBmb3IgZGV0ZWN0aW5nIHN5bWJvbCBjb2xsaXNpb25zLlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQta2VlcC11cHJpZ2h0XCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOnRydWUsXCJkb2NcIjpcIklmIHRydWUsIHRoZSB0ZXh0IG1heSBiZSBmbGlwcGVkIHZlcnRpY2FsbHkgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHJlbmRlcmVkIHVwc2lkZS1kb3duLlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIse1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjpcIm1hcFwifSx7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJ0ZXh0LXRyYW5zZm9ybVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm5vbmVcIixcInVwcGVyY2FzZVwiLFwibG93ZXJjYXNlXCJdLFwiZGVmYXVsdFwiOlwibm9uZVwiLFwiZG9jXCI6XCJTcGVjaWZpZXMgaG93IHRvIGNhcGl0YWxpemUgdGV4dCwgc2ltaWxhciB0byB0aGUgQ1NTIGB0ZXh0LXRyYW5zZm9ybWAgcHJvcGVydHkuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1vZmZzZXRcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwiZG9jXCI6XCJPZmZzZXQgZGlzdGFuY2Ugb2YgdGV4dCBmcm9tIGl0cyBhbmNob3IuIFBvc2l0aXZlIHZhbHVlcyBpbmRpY2F0ZSByaWdodCBhbmQgZG93biwgd2hpbGUgbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxlZnQgYW5kIHVwLlwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwidW5pdHNcIjpcImVtc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkZWZhdWx0XCI6ZmFsc2UsXCJkb2NcIjpcIklmIHRydWUsIHRoZSB0ZXh0IHdpbGwgYmUgdmlzaWJsZSBldmVuIGlmIGl0IGNvbGxpZGVzIHdpdGggb3RoZXIgcHJldmlvdXNseSBkcmF3biBzeW1ib2xzLlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtaWdub3JlLXBsYWNlbWVudFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcImRvY1wiOlwiSWYgdHJ1ZSwgb3RoZXIgc3ltYm9scyBjYW4gYmUgdmlzaWJsZSBldmVuIGlmIHRoZXkgY29sbGlkZSB3aXRoIHRoZSB0ZXh0LlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtb3B0aW9uYWxcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkZWZhdWx0XCI6ZmFsc2UsXCJkb2NcIjpcIklmIHRydWUsIGljb25zIHdpbGwgZGlzcGxheSB3aXRob3V0IHRoZWlyIGNvcnJlc3BvbmRpbmcgdGV4dCB3aGVuIHRoZSB0ZXh0IGNvbGxpZGVzIHdpdGggb3RoZXIgc3ltYm9scyBhbmQgdGhlIGljb24gZG9lcyBub3QuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIixcImljb24taW1hZ2VcIl19LFwidmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCIsXCJkb2NcIjpcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwifX0sXCJsYXlvdXRfcmFzdGVyXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCIsXCJkb2NcIjpcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwifX0sXCJmaWx0ZXJcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIipcIixcImRvY1wiOlwiQSBmaWx0ZXIgc2VsZWN0cyBzcGVjaWZpYyBmZWF0dXJlcyBmcm9tIGEgbGF5ZXIuXCJ9LFwiZmlsdGVyX29wZXJhdG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6W1wiPT1cIixcIiE9XCIsXCI+XCIsXCI+PVwiLFwiPFwiLFwiPD1cIixcImluXCIsXCIhaW5cIixcImFsbFwiLFwiYW55XCIsXCJub25lXCJdLFwiZG9jXCI6XCJUaGUgZmlsdGVyIG9wZXJhdG9yLlwifSxcImdlb21ldHJ5X3R5cGVcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbXCJQb2ludFwiLFwiTGluZVN0cmluZ1wiLFwiUG9seWdvblwiXSxcImRvY1wiOlwiVGhlIGdlb21ldHJ5IHR5cGUgZm9yIHRoZSBmaWx0ZXIgdG8gc2VsZWN0LlwifSxcImNvbG9yX29wZXJhdGlvblwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcImxpZ2h0ZW5cIixcInNhdHVyYXRlXCIsXCJzcGluXCIsXCJmYWRlXCIsXCJtaXhcIl0sXCJkb2NcIjpcIkEgY29sb3Igb3BlcmF0aW9uIHRvIGFwcGx5LlwifSxcImZ1bmN0aW9uXCI6e1wic3RvcHNcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwicmVxdWlyZWRcIjp0cnVlLFwiZG9jXCI6XCJBbiBhcnJheSBvZiBzdG9wcy5cIixcInZhbHVlXCI6XCJmdW5jdGlvbl9zdG9wXCJ9LFwiYmFzZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcImRvY1wiOlwiVGhlIGV4cG9uZW50aWFsIGJhc2Ugb2YgdGhlIGludGVycG9sYXRpb24gY3VydmUuIEl0IGNvbnRyb2xzIHRoZSByYXRlIGF0IHdoaWNoIHRoZSByZXN1bHQgaW5jcmVhc2VzLiBIaWdoZXIgdmFsdWVzIG1ha2UgdGhlIHJlc3VsdCBpbmNyZWFzZSBtb3JlIHRvd2FyZHMgdGhlIGhpZ2ggZW5kIG9mIHRoZSByYW5nZS4gV2l0aCBgMWAgdGhlIHN0b3BzIGFyZSBpbnRlcnBvbGF0ZWQgbGluZWFybHkuXCJ9fSxcImZ1bmN0aW9uX3N0b3BcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MjIsXCJ2YWx1ZVwiOltcIm51bWJlclwiLFwiY29sb3JcIl0sXCJsZW5ndGhcIjoyLFwiZG9jXCI6XCJab29tIGxldmVsIGFuZCB2YWx1ZSBwYWlyLlwifSxcInBhaW50XCI6W1wicGFpbnRfZmlsbFwiLFwicGFpbnRfbGluZVwiLFwicGFpbnRfY2lyY2xlXCIsXCJwYWludF9zeW1ib2xcIixcInBhaW50X3Jhc3RlclwiLFwicGFpbnRfYmFja2dyb3VuZFwiXSxcInBhaW50X2ZpbGxcIjp7XCJmaWxsLWFudGlhbGlhc1wiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjp0cnVlLFwiZG9jXCI6XCJXaGV0aGVyIG9yIG5vdCB0aGUgZmlsbCBzaG91bGQgYmUgYW50aWFsaWFzZWQuXCJ9LFwiZmlsbC1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJkb2NcIjpcIlRoZSBvcGFjaXR5IGdpdmVuIHRvIHRoZSBmaWxsIGNvbG9yLlwiLFwidHJhbnNpdGlvblwiOnRydWV9LFwiZmlsbC1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJkb2NcIjpcIlRoZSBjb2xvciBvZiB0aGUgZmlsbC5cIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwiZmlsbC1wYXR0ZXJuXCJ9XX0sXCJmaWxsLW91dGxpbmUtY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZG9jXCI6XCJUaGUgb3V0bGluZSBjb2xvciBvZiB0aGUgZmlsbC4gTWF0Y2hlcyB0aGUgdmFsdWUgb2YgYGZpbGwtY29sb3JgIGlmIHVuc3BlY2lmaWVkLlwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJmaWxsLXBhdHRlcm5cIn0se1wiZmlsbC1hbnRpYWxpYXNcIjp0cnVlfV19LFwiZmlsbC10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJUaGUgZ2VvbWV0cnkncyBvZmZzZXQuIFZhbHVlcyBhcmUgW3gsIHldIHdoZXJlIG5lZ2F0aXZlcyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cCwgcmVzcGVjdGl2ZWx5LlwifSxcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkb2NcIjpcIkNvbnRyb2wgd2hldGhlciB0aGUgdHJhbnNsYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIG1hcCAobm9ydGgpIG9yIHZpZXdwb3J0IChzY3JlZW4pXCIsXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wiZmlsbC10cmFuc2xhdGVcIl19LFwiZmlsbC1wYXR0ZXJuXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcImRvY1wiOlwiTmFtZSBvZiBpbWFnZSBpbiBzcHJpdGUgdG8gdXNlIGZvciBkcmF3aW5nIGltYWdlIGZpbGxzLiBGb3Igc2VhbWxlc3MgcGF0dGVybnMsIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQgbXVzdCBiZSBhIGZhY3RvciBvZiB0d28gKDIsIDQsIDgsIC4uLiwgNTEyKS5cIn19LFwicGFpbnRfbGluZVwiOntcImxpbmUtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJUaGUgb3BhY2l0eSBhdCB3aGljaCB0aGUgbGluZSB3aWxsIGJlIGRyYXduLlwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwidHJhbnNpdGlvblwiOnRydWV9LFwibGluZS1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkb2NcIjpcIlRoZSBjb2xvciB3aXRoIHdoaWNoIHRoZSBsaW5lIHdpbGwgYmUgZHJhd24uXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcIiFcIjpcImxpbmUtcGF0dGVyblwifV19LFwibGluZS10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJUaGUgZ2VvbWV0cnkncyBvZmZzZXQuIFZhbHVlcyBhcmUgW3gsIHldIHdoZXJlIG5lZ2F0aXZlcyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cCwgcmVzcGVjdGl2ZWx5LlwifSxcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkb2NcIjpcIkNvbnRyb2wgd2hldGhlciB0aGUgdHJhbnNsYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIG1hcCAobm9ydGgpIG9yIHZpZXdwb3J0IChzY3JlZW4pXCIsXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wibGluZS10cmFuc2xhdGVcIl19LFwibGluZS13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJTdHJva2UgdGhpY2tuZXNzLlwifSxcImxpbmUtZ2FwLXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZG9jXCI6XCJEcmF3cyBhIGxpbmUgY2FzaW5nIG91dHNpZGUgb2YgYSBsaW5lJ3MgYWN0dWFsIHBhdGguIFZhbHVlIGluZGljYXRlcyB0aGUgd2lkdGggb2YgdGhlIGlubmVyIGdhcC5cIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtb2Zmc2V0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcImRvY1wiOlwiVGhlIGxpbmUncyBvZmZzZXQgcGVycGVuZGljdWxhciB0byBpdHMgZGlyZWN0aW9uLiBWYWx1ZXMgbWF5IGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLCB3aGVyZSBwb3NpdGl2ZSBpbmRpY2F0ZXMgXFxcInJpZ2h0d2FyZHNcXFwiIChpZiB5b3Ugd2VyZSBtb3ZpbmcgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgbGluZSkgYW5kIG5lZ2F0aXZlIGluZGljYXRlcyBcXFwibGVmdHdhcmRzLlxcXCJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtYmx1clwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJCbHVyIGFwcGxpZWQgdG8gdGhlIGxpbmUsIGluIHBpeGVscy5cIn0sXCJsaW5lLWRhc2hhcnJheVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkb2NcIjpcIlNwZWNpZmllcyB0aGUgbGVuZ3RocyBvZiB0aGUgYWx0ZXJuYXRpbmcgZGFzaGVzIGFuZCBnYXBzIHRoYXQgZm9ybSB0aGUgZGFzaCBwYXR0ZXJuLiBUaGUgbGVuZ3RocyBhcmUgbGF0ZXIgc2NhbGVkIGJ5IHRoZSBsaW5lIHdpZHRoLiBUbyBjb252ZXJ0IGEgZGFzaCBsZW5ndGggdG8gcGl4ZWxzLCBtdWx0aXBseSB0aGUgbGVuZ3RoIGJ5IHRoZSBjdXJyZW50IGxpbmUgd2lkdGguXCIsXCJtaW5pbXVtXCI6MCxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcImxpbmUgd2lkdGhzXCIsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJsaW5lLXBhdHRlcm5cIn1dfSxcImxpbmUtcGF0dGVyblwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJkb2NcIjpcIk5hbWUgb2YgaW1hZ2UgaW4gc3ByaXRlIHRvIHVzZSBmb3IgZHJhd2luZyBpbWFnZSBsaW5lcy4gRm9yIHNlYW1sZXNzIHBhdHRlcm5zLCBpbWFnZSB3aWR0aCBtdXN0IGJlIGEgZmFjdG9yIG9mIHR3byAoMiwgNCwgOCwgLi4uLCA1MTIpLlwifX0sXCJwYWludF9jaXJjbGVcIjp7XCJjaXJjbGUtcmFkaXVzXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NSxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJkb2NcIjpcIkNpcmNsZSByYWRpdXMuXCJ9LFwiY2lyY2xlLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImRvY1wiOlwiVGhlIGNvbG9yIG9mIHRoZSBjaXJjbGUuXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJjaXJjbGUtYmx1clwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJkb2NcIjpcIkFtb3VudCB0byBibHVyIHRoZSBjaXJjbGUuIDEgYmx1cnMgdGhlIGNpcmNsZSBzdWNoIHRoYXQgb25seSB0aGUgY2VudGVycG9pbnQgaXMgZnVsbCBvcGFjaXR5LlwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWV9LFwiY2lyY2xlLW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRvY1wiOlwiVGhlIG9wYWNpdHkgYXQgd2hpY2ggdGhlIGNpcmNsZSB3aWxsIGJlIGRyYXduLlwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWV9LFwiY2lyY2xlLXRyYW5zbGF0ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJkb2NcIjpcIlRoZSBnZW9tZXRyeSdzIG9mZnNldC4gVmFsdWVzIGFyZSBbeCwgeV0gd2hlcmUgbmVnYXRpdmVzIGluZGljYXRlIGxlZnQgYW5kIHVwLCByZXNwZWN0aXZlbHkuXCJ9LFwiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ2YWx1ZXNcIjpbXCJtYXBcIixcInZpZXdwb3J0XCJdLFwiZG9jXCI6XCJDb250cm9sIHdoZXRoZXIgdGhlIHRyYW5zbGF0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBtYXAgKG5vcnRoKSBvciB2aWV3cG9ydCAoc2NyZWVuKVwiLFwiZGVmYXVsdFwiOlwibWFwXCIsXCJyZXF1aXJlc1wiOltcImNpcmNsZS10cmFuc2xhdGVcIl19fSxcInBhaW50X3N5bWJvbFwiOntcImljb24tb3BhY2l0eVwiOntcImRvY1wiOlwiVGhlIG9wYWNpdHkgYXQgd2hpY2ggdGhlIGljb24gd2lsbCBiZSBkcmF3bi5cIixcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcImRvY1wiOlwiVGhlIGNvbG9yIG9mIHRoZSBpY29uLiBUaGlzIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBzZGYgaWNvbnMuXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1oYWxvLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcInJnYmEoMCwgMCwgMCwgMClcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwiZG9jXCI6XCJUaGUgY29sb3Igb2YgdGhlIGljb24ncyBoYWxvLiBJY29uIGhhbG9zIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBzZGYgaWNvbnMuXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1oYWxvLXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJkb2NcIjpcIkRpc3RhbmNlIG9mIGhhbG8gdG8gdGhlIGljb24gb3V0bGluZS5cIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWhhbG8tYmx1clwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJGYWRlIG91dCB0aGUgaGFsbyB0b3dhcmRzIHRoZSBvdXRzaWRlLlwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tdHJhbnNsYXRlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcImRvY1wiOlwiRGlzdGFuY2UgdGhhdCB0aGUgaWNvbidzIGFuY2hvciBpcyBtb3ZlZCBmcm9tIGl0cyBvcmlnaW5hbCBwbGFjZW1lbnQuIFBvc2l0aXZlIHZhbHVlcyBpbmRpY2F0ZSByaWdodCBhbmQgZG93biwgd2hpbGUgbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxlZnQgYW5kIHVwLlwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkb2NcIjpcIkNvbnRyb2wgd2hldGhlciB0aGUgdHJhbnNsYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIG1hcCAobm9ydGgpIG9yIHZpZXdwb3J0IChzY3JlZW4pLlwiLFwiZGVmYXVsdFwiOlwibWFwXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIixcImljb24tdHJhbnNsYXRlXCJdfSxcInRleHQtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJUaGUgb3BhY2l0eSBhdCB3aGljaCB0aGUgdGV4dCB3aWxsIGJlIGRyYXduLlwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkb2NcIjpcIlRoZSBjb2xvciB3aXRoIHdoaWNoIHRoZSB0ZXh0IHdpbGwgYmUgZHJhd24uXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWhhbG8tY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwicmdiYSgwLCAwLCAwLCAwKVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJkb2NcIjpcIlRoZSBjb2xvciBvZiB0aGUgdGV4dCdzIGhhbG8sIHdoaWNoIGhlbHBzIGl0IHN0YW5kIG91dCBmcm9tIGJhY2tncm91bmRzLlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtaGFsby13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJEaXN0YW5jZSBvZiBoYWxvIHRvIHRoZSBmb250IG91dGxpbmUuIE1heCB0ZXh0IGhhbG8gd2lkdGggaXMgMS80IG9mIHRoZSBmb250LXNpemUuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1oYWxvLWJsdXJcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcImRvY1wiOlwiVGhlIGhhbG8ncyBmYWRlb3V0IGRpc3RhbmNlIHRvd2FyZHMgdGhlIG91dHNpZGUuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJEaXN0YW5jZSB0aGF0IHRoZSB0ZXh0J3MgYW5jaG9yIGlzIG1vdmVkIGZyb20gaXRzIG9yaWdpbmFsIHBsYWNlbWVudC4gUG9zaXRpdmUgdmFsdWVzIGluZGljYXRlIHJpZ2h0IGFuZCBkb3duLCB3aGlsZSBuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgbGVmdCBhbmQgdXAuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC10cmFuc2xhdGUtYW5jaG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wibWFwXCIsXCJ2aWV3cG9ydFwiXSxcImRvY1wiOlwiQ29udHJvbCB3aGV0aGVyIHRoZSB0cmFuc2xhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgbWFwIChub3J0aCkgb3Igdmlld3BvcnQgKHNjcmVlbikuXCIsXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiLFwidGV4dC10cmFuc2xhdGVcIl19fSxcInBhaW50X3Jhc3RlclwiOntcInJhc3Rlci1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkb2NcIjpcIlRoZSBvcGFjaXR5IGF0IHdoaWNoIHRoZSBpbWFnZSB3aWxsIGJlIGRyYXduLlwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWV9LFwicmFzdGVyLWh1ZS1yb3RhdGVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwicGVyaW9kXCI6MzYwLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwiZGVncmVlc1wiLFwiZG9jXCI6XCJSb3RhdGVzIGh1ZXMgYXJvdW5kIHRoZSBjb2xvciB3aGVlbC5cIn0sXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRvY1wiOlwiSW5jcmVhc2Ugb3IgcmVkdWNlIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBpbWFnZS4gVGhlIHZhbHVlIGlzIHRoZSBtaW5pbXVtIGJyaWdodG5lc3MuXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRvY1wiOlwiSW5jcmVhc2Ugb3IgcmVkdWNlIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBpbWFnZS4gVGhlIHZhbHVlIGlzIHRoZSBtYXhpbXVtIGJyaWdodG5lc3MuXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItc2F0dXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJJbmNyZWFzZSBvciByZWR1Y2UgdGhlIHNhdHVyYXRpb24gb2YgdGhlIGltYWdlLlwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6LTEsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcInJhc3Rlci1jb250cmFzdFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJJbmNyZWFzZSBvciByZWR1Y2UgdGhlIGNvbnRyYXN0IG9mIHRoZSBpbWFnZS5cIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOi0xLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwMCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwibWlsbGlzZWNvbmRzXCIsXCJkb2NcIjpcIkZhZGUgZHVyYXRpb24gd2hlbiBhIG5ldyB0aWxlIGlzIGFkZGVkLlwifX0sXCJwYWludF9iYWNrZ3JvdW5kXCI6e1wiYmFja2dyb3VuZC1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJkb2NcIjpcIlRoZSBjb2xvciB3aXRoIHdoaWNoIHRoZSBiYWNrZ3JvdW5kIHdpbGwgYmUgZHJhd24uXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcIiFcIjpcImJhY2tncm91bmQtcGF0dGVyblwifV19LFwiYmFja2dyb3VuZC1wYXR0ZXJuXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcImRvY1wiOlwiTmFtZSBvZiBpbWFnZSBpbiBzcHJpdGUgdG8gdXNlIGZvciBkcmF3aW5nIGFuIGltYWdlIGJhY2tncm91bmQuIEZvciBzZWFtbGVzcyBwYXR0ZXJucywgaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIGEgZmFjdG9yIG9mIHR3byAoMiwgNCwgOCwgLi4uLCA1MTIpLlwifSxcImJhY2tncm91bmQtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZG9jXCI6XCJUaGUgb3BhY2l0eSBhdCB3aGljaCB0aGUgYmFja2dyb3VuZCB3aWxsIGJlIGRyYXduLlwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWV9fSxcInRyYW5zaXRpb25cIjp7XCJkdXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwMCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcIm1pbGxpc2Vjb25kc1wiLFwiZG9jXCI6XCJUaW1lIGFsbG90dGVkIGZvciB0cmFuc2l0aW9ucyB0byBjb21wbGV0ZS5cIn0sXCJkZWxheVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJtaWxsaXNlY29uZHNcIixcImRvY1wiOlwiTGVuZ3RoIG9mIHRpbWUgYmVmb3JlIGEgdHJhbnNpdGlvbiBiZWdpbnMuXCJ9fX1cbn0se31dLDEzNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cz17XCIkdmVyc2lvblwiOjgsXCIkcm9vdFwiOntcInZlcnNpb25cIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbOF19LFwibmFtZVwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcIm1ldGFkYXRhXCI6e1widHlwZVwiOlwiKlwifSxcImNlbnRlclwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCJ9LFwiem9vbVwiOntcInR5cGVcIjpcIm51bWJlclwifSxcImJlYXJpbmdcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwicGVyaW9kXCI6MzYwLFwidW5pdHNcIjpcImRlZ3JlZXNcIn0sXCJwaXRjaFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJ1bml0c1wiOlwiZGVncmVlc1wifSxcInNvdXJjZXNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJzb3VyY2VzXCJ9LFwic3ByaXRlXCI6e1widHlwZVwiOlwic3RyaW5nXCJ9LFwiZ2x5cGhzXCI6e1widHlwZVwiOlwic3RyaW5nXCJ9LFwidHJhbnNpdGlvblwiOntcInR5cGVcIjpcInRyYW5zaXRpb25cIn0sXCJsYXllcnNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcImxheWVyXCJ9fSxcInNvdXJjZXNcIjp7XCIqXCI6e1widHlwZVwiOlwic291cmNlXCJ9fSxcInNvdXJjZVwiOltcInNvdXJjZV90aWxlXCIsXCJzb3VyY2VfZ2VvanNvblwiLFwic291cmNlX3ZpZGVvXCIsXCJzb3VyY2VfaW1hZ2VcIl0sXCJzb3VyY2VfdGlsZVwiOntcInR5cGVcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbXCJ2ZWN0b3JcIixcInJhc3RlclwiXX0sXCJ1cmxcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIn0sXCJ0aWxlc1wiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCJ9LFwibWluem9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjB9LFwibWF4em9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIyfSxcInRpbGVTaXplXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NTEyLFwidW5pdHNcIjpcInBpeGVsc1wifSxcIipcIjp7XCJ0eXBlXCI6XCIqXCJ9fSxcInNvdXJjZV9nZW9qc29uXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcImdlb2pzb25cIl19LFwiZGF0YVwiOntcInR5cGVcIjpcIipcIn0sXCJtYXh6b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MTR9LFwiYnVmZmVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NjR9LFwidG9sZXJhbmNlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6M30sXCJjbHVzdGVyXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZGVmYXVsdFwiOmZhbHNlfSxcImNsdXN0ZXJSYWRpdXNcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjo0MDB9LFwiY2x1c3Rlck1heFpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIn19LFwic291cmNlX3ZpZGVvXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcInZpZGVvXCJdfSxcInVybHNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcInN0cmluZ1wifSxcImNvb3JkaW5hdGVzXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjQsXCJ2YWx1ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJsZW5ndGhcIjoyLFwidmFsdWVcIjpcIm51bWJlclwifX19LFwic291cmNlX2ltYWdlXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcImltYWdlXCJdfSxcInVybFwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcInN0cmluZ1wifSxcImNvb3JkaW5hdGVzXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjQsXCJ2YWx1ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJsZW5ndGhcIjoyLFwidmFsdWVcIjpcIm51bWJlclwifX19LFwibGF5ZXJcIjp7XCJpZFwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwicmVxdWlyZWRcIjp0cnVlfSxcInR5cGVcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbXCJmaWxsXCIsXCJsaW5lXCIsXCJzeW1ib2xcIixcImNpcmNsZVwiLFwicmFzdGVyXCIsXCJiYWNrZ3JvdW5kXCJdfSxcIm1ldGFkYXRhXCI6e1widHlwZVwiOlwiKlwifSxcInJlZlwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcInNvdXJjZVwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcInNvdXJjZS1sYXllclwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcIm1pbnpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjIyfSxcIm1heHpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjIyfSxcImludGVyYWN0aXZlXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZGVmYXVsdFwiOmZhbHNlfSxcImZpbHRlclwiOntcInR5cGVcIjpcImZpbHRlclwifSxcImxheW91dFwiOntcInR5cGVcIjpcImxheW91dFwifSxcInBhaW50XCI6e1widHlwZVwiOlwicGFpbnRcIn0sXCJwYWludC4qXCI6e1widHlwZVwiOlwicGFpbnRcIn19LFwibGF5b3V0XCI6W1wibGF5b3V0X2ZpbGxcIixcImxheW91dF9saW5lXCIsXCJsYXlvdXRfY2lyY2xlXCIsXCJsYXlvdXRfc3ltYm9sXCIsXCJsYXlvdXRfcmFzdGVyXCIsXCJsYXlvdXRfYmFja2dyb3VuZFwiXSxcImxheW91dF9iYWNrZ3JvdW5kXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImxheW91dF9maWxsXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImxheW91dF9jaXJjbGVcIjp7XCJ2aXNpYmlsaXR5XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1widmlzaWJsZVwiLFwibm9uZVwiXSxcImRlZmF1bHRcIjpcInZpc2libGVcIn19LFwibGF5b3V0X2xpbmVcIjp7XCJsaW5lLWNhcFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcImJ1dHRcIixcInJvdW5kXCIsXCJzcXVhcmVcIl0sXCJkZWZhdWx0XCI6XCJidXR0XCJ9LFwibGluZS1qb2luXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wiYmV2ZWxcIixcInJvdW5kXCIsXCJtaXRlclwiXSxcImRlZmF1bHRcIjpcIm1pdGVyXCJ9LFwibGluZS1taXRlci1saW1pdFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJyZXF1aXJlc1wiOlt7XCJsaW5lLWpvaW5cIjpcIm1pdGVyXCJ9XX0sXCJsaW5lLXJvdW5kLWxpbWl0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MS4wNSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInJlcXVpcmVzXCI6W3tcImxpbmUtam9pblwiOlwicm91bmRcIn1dfSxcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ2YWx1ZXNcIjpbXCJ2aXNpYmxlXCIsXCJub25lXCJdLFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJsYXlvdXRfc3ltYm9sXCI6e1wic3ltYm9sLXBsYWNlbWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInBvaW50XCIsXCJsaW5lXCJdLFwiZGVmYXVsdFwiOlwicG9pbnRcIn0sXCJzeW1ib2wtc3BhY2luZ1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjI1MCxcIm1pbmltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbe1wic3ltYm9sLXBsYWNlbWVudFwiOlwibGluZVwifV19LFwic3ltYm9sLWF2b2lkLWVkZ2VzXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlfSxcImljb24tYWxsb3ctb3ZlcmxhcFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkZWZhdWx0XCI6ZmFsc2UsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1vcHRpb25hbFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiLFwidGV4dC1maWVsZFwiXX0sXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkZWZhdWx0XCI6XCJ2aWV3cG9ydFwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tc2l6ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWltYWdlXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ0b2tlbnNcIjp0cnVlfSxcImljb24tcm90YXRlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1wYWRkaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MixcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24ta2VlcC11cHJpZ2h0XCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCIse1wiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjpcIm1hcFwifSx7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJpY29uLW9mZnNldFwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wibWFwXCIsXCJ2aWV3cG9ydFwiXSxcImRlZmF1bHRcIjpcInZpZXdwb3J0XCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1maWVsZFwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOlwiXCIsXCJ0b2tlbnNcIjp0cnVlfSxcInRleHQtZm9udFwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkZWZhdWx0XCI6W1wiT3BlbiBTYW5zIFJlZ3VsYXJcIixcIkFyaWFsIFVuaWNvZGUgTVMgUmVndWxhclwiXSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXNpemVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxNixcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtbWF4LXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MTAsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJlbVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtbGluZS1oZWlnaHRcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLjIsXCJ1bml0c1wiOlwiZW1cIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWxldHRlci1zcGFjaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInVuaXRzXCI6XCJlbVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtanVzdGlmeVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcImxlZnRcIixcImNlbnRlclwiLFwicmlnaHRcIl0sXCJkZWZhdWx0XCI6XCJjZW50ZXJcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcImNlbnRlclwiLFwibGVmdFwiLFwicmlnaHRcIixcInRvcFwiLFwiYm90dG9tXCIsXCJ0b3AtbGVmdFwiLFwidG9wLXJpZ2h0XCIsXCJib3R0b20tbGVmdFwiLFwiYm90dG9tLXJpZ2h0XCJdLFwiZGVmYXVsdFwiOlwiY2VudGVyXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1tYXgtYW5nbGVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjo0NSxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIix7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJ0ZXh0LXJvdGF0ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJwZXJpb2RcIjozNjAsXCJ1bml0c1wiOlwiZGVncmVlc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtcGFkZGluZ1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJwaXhlbHNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWtlZXAtdXByaWdodFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIse1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjpcIm1hcFwifSx7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJ0ZXh0LXRyYW5zZm9ybVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm5vbmVcIixcInVwcGVyY2FzZVwiLFwibG93ZXJjYXNlXCJdLFwiZGVmYXVsdFwiOlwibm9uZVwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtb2Zmc2V0XCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcInVuaXRzXCI6XCJlbXNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1hbGxvdy1vdmVybGFwXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtaWdub3JlLXBsYWNlbWVudFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LW9wdGlvbmFsXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIsXCJpY29uLWltYWdlXCJdfSxcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ2YWx1ZXNcIjpbXCJ2aXNpYmxlXCIsXCJub25lXCJdLFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJsYXlvdXRfcmFzdGVyXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImZpbHRlclwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwiKlwifSxcImZpbHRlcl9vcGVyYXRvclwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcIj09XCIsXCIhPVwiLFwiPlwiLFwiPj1cIixcIjxcIixcIjw9XCIsXCJpblwiLFwiIWluXCIsXCJhbGxcIixcImFueVwiLFwibm9uZVwiXX0sXCJnZW9tZXRyeV90eXBlXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6W1wiUG9pbnRcIixcIkxpbmVTdHJpbmdcIixcIlBvbHlnb25cIl19LFwiY29sb3Jfb3BlcmF0aW9uXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6W1wibGlnaHRlblwiLFwic2F0dXJhdGVcIixcInNwaW5cIixcImZhZGVcIixcIm1peFwiXX0sXCJmdW5jdGlvblwiOntcInN0b3BzXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInJlcXVpcmVkXCI6dHJ1ZSxcInZhbHVlXCI6XCJmdW5jdGlvbl9zdG9wXCJ9LFwiYmFzZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MH19LFwiZnVuY3Rpb25fc3RvcFwiOntcInR5cGVcIjpcImFycmF5XCIsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoyMixcInZhbHVlXCI6W1wibnVtYmVyXCIsXCJjb2xvclwiXSxcImxlbmd0aFwiOjJ9LFwicGFpbnRcIjpbXCJwYWludF9maWxsXCIsXCJwYWludF9saW5lXCIsXCJwYWludF9jaXJjbGVcIixcInBhaW50X3N5bWJvbFwiLFwicGFpbnRfcmFzdGVyXCIsXCJwYWludF9iYWNrZ3JvdW5kXCJdLFwicGFpbnRfZmlsbFwiOntcImZpbGwtYW50aWFsaWFzXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOnRydWV9LFwiZmlsbC1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJmaWxsLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwiZmlsbC1wYXR0ZXJuXCJ9XX0sXCJmaWxsLW91dGxpbmUtY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJmaWxsLXBhdHRlcm5cIn0se1wiZmlsbC1hbnRpYWxpYXNcIjp0cnVlfV19LFwiZmlsbC10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wiZmlsbC10cmFuc2xhdGVcIl19LFwiZmlsbC1wYXR0ZXJuXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX19LFwicGFpbnRfbGluZVwiOntcImxpbmUtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwidHJhbnNpdGlvblwiOnRydWV9LFwibGluZS1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcIiFcIjpcImxpbmUtcGF0dGVyblwifV19LFwibGluZS10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wibGluZS10cmFuc2xhdGVcIl19LFwibGluZS13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtZ2FwLXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwibGluZS1vZmZzZXRcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwibGluZS1ibHVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwibGluZS1kYXNoYXJyYXlcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwibWluaW11bVwiOjAsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJsaW5lIHdpZHRoc1wiLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwibGluZS1wYXR0ZXJuXCJ9XX0sXCJsaW5lLXBhdHRlcm5cIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInRyYW5zaXRpb25cIjp0cnVlfX0sXCJwYWludF9jaXJjbGVcIjp7XCJjaXJjbGUtcmFkaXVzXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NSxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwiY2lyY2xlLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcImNpcmNsZS1ibHVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcImNpcmNsZS1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJjaXJjbGUtdHJhbnNsYXRlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIn0sXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wiY2lyY2xlLXRyYW5zbGF0ZVwiXX19LFwicGFpbnRfc3ltYm9sXCI6e1wiaWNvbi1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24taGFsby1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCJyZ2JhKDAsIDAsIDAsIDApXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWhhbG8td2lkdGhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWhhbG8tYmx1clwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tdHJhbnNsYXRlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ2YWx1ZXNcIjpbXCJtYXBcIixcInZpZXdwb3J0XCJdLFwiZGVmYXVsdFwiOlwibWFwXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIixcImljb24tdHJhbnNsYXRlXCJdfSxcInRleHQtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWhhbG8tY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwicmdiYSgwLCAwLCAwLCAwKVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1oYWxvLXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1oYWxvLWJsdXJcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXRyYW5zbGF0ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC10cmFuc2xhdGUtYW5jaG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wibWFwXCIsXCJ2aWV3cG9ydFwiXSxcImRlZmF1bHRcIjpcIm1hcFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIsXCJ0ZXh0LXRyYW5zbGF0ZVwiXX19LFwicGFpbnRfcmFzdGVyXCI6e1wicmFzdGVyLW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcInJhc3Rlci1odWUtcm90YXRlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcImRlZ3JlZXNcIn0sXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcInRyYW5zaXRpb25cIjp0cnVlfSxcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwidHJhbnNpdGlvblwiOnRydWV9LFwicmFzdGVyLXNhdHVyYXRpb25cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOi0xLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItY29udHJhc3RcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOi0xLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwMCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwibWlsbGlzZWNvbmRzXCJ9fSxcInBhaW50X2JhY2tncm91bmRcIjp7XCJiYWNrZ3JvdW5kLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwiYmFja2dyb3VuZC1wYXR0ZXJuXCJ9XX0sXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcImJhY2tncm91bmQtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWV9fSxcInRyYW5zaXRpb25cIjp7XCJkdXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwMCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcIm1pbGxpc2Vjb25kc1wifSxcImRlbGF5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcIm1pbGxpc2Vjb25kc1wifX19XG59LHt9XSwxMzU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQnVmZmVyKHQpe3ZhciBlO3QmJnQubGVuZ3RoJiYoZT10LHQ9ZS5sZW5ndGgpO3ZhciByPW5ldyBVaW50OEFycmF5KHR8fDApO3JldHVybiBlJiZyLnNldChlKSxyLnJlYWRVSW50MzJMRT1CdWZmZXJNZXRob2RzLnJlYWRVSW50MzJMRSxyLndyaXRlVUludDMyTEU9QnVmZmVyTWV0aG9kcy53cml0ZVVJbnQzMkxFLHIucmVhZEludDMyTEU9QnVmZmVyTWV0aG9kcy5yZWFkSW50MzJMRSxyLndyaXRlSW50MzJMRT1CdWZmZXJNZXRob2RzLndyaXRlSW50MzJMRSxyLnJlYWRGbG9hdExFPUJ1ZmZlck1ldGhvZHMucmVhZEZsb2F0TEUsci53cml0ZUZsb2F0TEU9QnVmZmVyTWV0aG9kcy53cml0ZUZsb2F0TEUsci5yZWFkRG91YmxlTEU9QnVmZmVyTWV0aG9kcy5yZWFkRG91YmxlTEUsci53cml0ZURvdWJsZUxFPUJ1ZmZlck1ldGhvZHMud3JpdGVEb3VibGVMRSxyLnRvU3RyaW5nPUJ1ZmZlck1ldGhvZHMudG9TdHJpbmcsci53cml0ZT1CdWZmZXJNZXRob2RzLndyaXRlLHIuc2xpY2U9QnVmZmVyTWV0aG9kcy5zbGljZSxyLmNvcHk9QnVmZmVyTWV0aG9kcy5jb3B5LHIuX2lzQnVmZmVyPSEwLHJ9ZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHQpe2Zvcih2YXIgZSxyLG49dC5sZW5ndGgsaT1bXSxvPTA7bj5vO28rKyl7aWYoZT10LmNoYXJDb2RlQXQobyksZT41NTI5NSYmNTczNDQ+ZSl7aWYoIXIpe2U+NTYzMTl8fG8rMT09PW4/aS5wdXNoKDIzOSwxOTEsMTg5KTpyPWU7Y29udGludWV9aWYoNTYzMjA+ZSl7aS5wdXNoKDIzOSwxOTEsMTg5KSxyPWU7Y29udGludWV9ZT1yLTU1Mjk2PDwxMHxlLTU2MzIwfDY1NTM2LHI9bnVsbH1lbHNlIHImJihpLnB1c2goMjM5LDE5MSwxODkpLHI9bnVsbCk7MTI4PmU/aS5wdXNoKGUpOjIwNDg+ZT9pLnB1c2goZT4+NnwxOTIsNjMmZXwxMjgpOjY1NTM2PmU/aS5wdXNoKGU+PjEyfDIyNCxlPj42JjYzfDEyOCw2MyZlfDEyOCk6aS5wdXNoKGU+PjE4fDI0MCxlPj4xMiY2M3wxMjgsZT4+NiY2M3wxMjgsNjMmZXwxMjgpfXJldHVybiBpfW1vZHVsZS5leHBvcnRzPUJ1ZmZlcjt2YXIgaWVlZTc1ND1yZXF1aXJlKFwiaWVlZTc1NFwiKSxCdWZmZXJNZXRob2RzLGxhc3RTdHIsbGFzdFN0ckVuY29kZWQ7QnVmZmVyTWV0aG9kcz17cmVhZFVJbnQzMkxFOmZ1bmN0aW9uKHQpe3JldHVybih0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LHdyaXRlVUludDMyTEU6ZnVuY3Rpb24odCxlKXt0aGlzW2VdPXQsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzNdPXQ+Pj4yNH0scmVhZEludDMyTEU6ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTYpKyh0aGlzW3QrM108PDI0KX0scmVhZEZsb2F0TEU6ZnVuY3Rpb24odCl7cmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLHQsITAsMjMsNCl9LHJlYWREb3VibGVMRTpmdW5jdGlvbih0KXtyZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsdCwhMCw1Miw4KX0sd3JpdGVGbG9hdExFOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGllZWU3NTQud3JpdGUodGhpcyx0LGUsITAsMjMsNCl9LHdyaXRlRG91YmxlTEU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaWVlZTc1NC53cml0ZSh0aGlzLHQsZSwhMCw1Miw4KX0sdG9TdHJpbmc6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVwiXCIsaT1cIlwiO2U9ZXx8MCxyPU1hdGgubWluKHRoaXMubGVuZ3RoLHJ8fHRoaXMubGVuZ3RoKTtmb3IodmFyIG89ZTtyPm87bysrKXt2YXIgdT10aGlzW29dOzEyNz49dT8obis9ZGVjb2RlVVJJQ29tcG9uZW50KGkpK1N0cmluZy5mcm9tQ2hhckNvZGUodSksaT1cIlwiKTppKz1cIiVcIit1LnRvU3RyaW5nKDE2KX1yZXR1cm4gbis9ZGVjb2RlVVJJQ29tcG9uZW50KGkpfSx3cml0ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10PT09bGFzdFN0cj9sYXN0U3RyRW5jb2RlZDplbmNvZGVTdHJpbmcodCksbj0wO248ci5sZW5ndGg7bisrKXRoaXNbZStuXT1yW25dfSxzbGljZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnN1YmFycmF5KHQsZSl9LGNvcHk6ZnVuY3Rpb24odCxlKXtlPWV8fDA7Zm9yKHZhciByPTA7cjx0aGlzLmxlbmd0aDtyKyspdFtlK3JdPXRoaXNbcl19fSxCdWZmZXJNZXRob2RzLndyaXRlSW50MzJMRT1CdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEUsQnVmZmVyLmJ5dGVMZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGxhc3RTdHI9dCxsYXN0U3RyRW5jb2RlZD1lbmNvZGVTdHJpbmcodCksbGFzdFN0ckVuY29kZWQubGVuZ3RofSxCdWZmZXIuaXNCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuISghdHx8IXQuX2lzQnVmZmVyKX07XG59LHtcImllZWU3NTRcIjoxMjZ9XSwxMzY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuKGZ1bmN0aW9uIChnbG9iYWwpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gUGJmKHQpe3RoaXMuYnVmPUJ1ZmZlci5pc0J1ZmZlcih0KT90Om5ldyBCdWZmZXIodHx8MCksdGhpcy5wb3M9MCx0aGlzLmxlbmd0aD10aGlzLmJ1Zi5sZW5ndGh9ZnVuY3Rpb24gd3JpdGVQYWNrZWRWYXJpbnQodCxpKXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpLndyaXRlVmFyaW50KHRbZV0pfWZ1bmN0aW9uIHdyaXRlUGFja2VkU1ZhcmludCh0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVTVmFyaW50KHRbZV0pfWZ1bmN0aW9uIHdyaXRlUGFja2VkRmxvYXQodCxpKXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpLndyaXRlRmxvYXQodFtlXSl9ZnVuY3Rpb24gd3JpdGVQYWNrZWREb3VibGUodCxpKXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpLndyaXRlRG91YmxlKHRbZV0pfWZ1bmN0aW9uIHdyaXRlUGFja2VkQm9vbGVhbih0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVCb29sZWFuKHRbZV0pfWZ1bmN0aW9uIHdyaXRlUGFja2VkRml4ZWQzMih0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVGaXhlZDMyKHRbZV0pfWZ1bmN0aW9uIHdyaXRlUGFja2VkU0ZpeGVkMzIodCxpKXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpLndyaXRlU0ZpeGVkMzIodFtlXSl9ZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDY0KHQsaSl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspaS53cml0ZUZpeGVkNjQodFtlXSl9ZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQ2NCh0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVTRml4ZWQ2NCh0W2VdKX1tb2R1bGUuZXhwb3J0cz1QYmY7dmFyIEJ1ZmZlcj1nbG9iYWwuQnVmZmVyfHxyZXF1aXJlKFwiLi9idWZmZXJcIik7UGJmLlZhcmludD0wLFBiZi5GaXhlZDY0PTEsUGJmLkJ5dGVzPTIsUGJmLkZpeGVkMzI9NTt2YXIgU0hJRlRfTEVGVF8zMj00Mjk0OTY3Mjk2LFNISUZUX1JJR0hUXzMyPTEvU0hJRlRfTEVGVF8zMixQT1dfMl82Mz1NYXRoLnBvdygyLDYzKTtQYmYucHJvdG90eXBlPXtkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5idWY9bnVsbH0scmVhZEZpZWxkczpmdW5jdGlvbih0LGksZSl7Zm9yKGU9ZXx8dGhpcy5sZW5ndGg7dGhpcy5wb3M8ZTspe3ZhciByPXRoaXMucmVhZFZhcmludCgpLHM9cj4+MyxuPXRoaXMucG9zO3QocyxpLHRoaXMpLHRoaXMucG9zPT09biYmdGhpcy5za2lwKHIpfXJldHVybiBpfSxyZWFkTWVzc2FnZTpmdW5jdGlvbih0LGkpe3JldHVybiB0aGlzLnJlYWRGaWVsZHModCxpLHRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zKX0scmVhZEZpeGVkMzI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCx0fSxyZWFkU0ZpeGVkMzI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1Zi5yZWFkSW50MzJMRSh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWRGaXhlZDY0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKSt0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MrNCkqU0hJRlRfTEVGVF8zMjtyZXR1cm4gdGhpcy5wb3MrPTgsdH0scmVhZFNGaXhlZDY0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKSt0aGlzLmJ1Zi5yZWFkSW50MzJMRSh0aGlzLnBvcys0KSpTSElGVF9MRUZUXzMyO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkRmxvYXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1Zi5yZWFkRmxvYXRMRSh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWREb3VibGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1Zi5yZWFkRG91YmxlTEUodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkVmFyaW50OmZ1bmN0aW9uKCl7dmFyIHQsaSxlLHIscyxuLG89dGhpcy5idWY7aWYoZT1vW3RoaXMucG9zKytdLDEyOD5lKXJldHVybiBlO2lmKGU9MTI3JmUscj1vW3RoaXMucG9zKytdLDEyOD5yKXJldHVybiBlfHI8PDc7aWYocj0oMTI3JnIpPDw3LHM9b1t0aGlzLnBvcysrXSwxMjg+cylyZXR1cm4gZXxyfHM8PDE0O2lmKHM9KDEyNyZzKTw8MTQsbj1vW3RoaXMucG9zKytdLDEyOD5uKXJldHVybiBlfHJ8c3xuPDwyMTtpZih0PWV8cnxzfCgxMjcmbik8PDIxLGk9b1t0aGlzLnBvcysrXSx0Kz0yNjg0MzU0NTYqKDEyNyZpKSwxMjg+aSlyZXR1cm4gdDtpZihpPW9bdGhpcy5wb3MrK10sdCs9MzQzNTk3MzgzNjgqKDEyNyZpKSwxMjg+aSlyZXR1cm4gdDtpZihpPW9bdGhpcy5wb3MrK10sdCs9NDM5ODA0NjUxMTEwNCooMTI3JmkpLDEyOD5pKXJldHVybiB0O2lmKGk9b1t0aGlzLnBvcysrXSx0Kz01NjI5NDk5NTM0MjEzMTIqKDEyNyZpKSwxMjg+aSlyZXR1cm4gdDtpZihpPW9bdGhpcy5wb3MrK10sdCs9NzIwNTc1OTQwMzc5Mjc5NDAqKDEyNyZpKSwxMjg+aSlyZXR1cm4gdDtpZihpPW9bdGhpcy5wb3MrK10sdCs9MHg4MDAwMDAwMDAwMDAwMDAwKigxMjcmaSksMTI4PmkpcmV0dXJuIHQ7dGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXNcIil9LHJlYWRWYXJpbnQ2NDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucG9zLGk9dGhpcy5yZWFkVmFyaW50KCk7aWYoUE9XXzJfNjM+aSlyZXR1cm4gaTtmb3IodmFyIGU9dGhpcy5wb3MtMjsyNTU9PT10aGlzLmJ1ZltlXTspZS0tO3Q+ZSYmKGU9dCksaT0wO2Zvcih2YXIgcj0wO2UtdCsxPnI7cisrKXt2YXIgcz0xMjcmfnRoaXMuYnVmW3Qrcl07aSs9ND5yP3M8PDcqcjpzKk1hdGgucG93KDIsNypyKX1yZXR1cm4taS0xfSxyZWFkU1ZhcmludDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpO3JldHVybiB0JTI9PT0xPyh0KzEpLy0yOnQvMn0scmVhZEJvb2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbih0aGlzLnJlYWRWYXJpbnQoKSl9LHJlYWRTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPXRoaXMuYnVmLnRvU3RyaW5nKFwidXRmOFwiLHRoaXMucG9zLHQpO3JldHVybiB0aGlzLnBvcz10LGl9LHJlYWRCeXRlczpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9dGhpcy5idWYuc2xpY2UodGhpcy5wb3MsdCk7cmV0dXJuIHRoaXMucG9zPXQsaX0scmVhZFBhY2tlZFZhcmludDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWRWYXJpbnQoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRTVmFyaW50OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRCb29sZWFuOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRGbG9hdDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtyZXR1cm4gaX0scmVhZFBhY2tlZERvdWJsZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRGaXhlZDMyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRTRml4ZWQzMjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtyZXR1cm4gaX0scmVhZFBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5yZWFkVmFyaW50KCkrdGhpcy5wb3MsaT1bXTt0aGlzLnBvczx0OylpLnB1c2godGhpcy5yZWFkRml4ZWQ2NCgpKTtyZXR1cm4gaX0scmVhZFBhY2tlZFNGaXhlZDY0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3JldHVybiBpfSxza2lwOmZ1bmN0aW9uKHQpe3ZhciBpPTcmdDtpZihpPT09UGJmLlZhcmludClmb3IoO3RoaXMuYnVmW3RoaXMucG9zKytdPjEyNzspO2Vsc2UgaWYoaT09PVBiZi5CeXRlcyl0aGlzLnBvcz10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcztlbHNlIGlmKGk9PT1QYmYuRml4ZWQzMil0aGlzLnBvcys9NDtlbHNle2lmKGkhPT1QYmYuRml4ZWQ2NCl0aHJvdyBuZXcgRXJyb3IoXCJVbmltcGxlbWVudGVkIHR5cGU6IFwiK2kpO3RoaXMucG9zKz04fX0sd3JpdGVUYWc6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVmFyaW50KHQ8PDN8aSl9LHJlYWxsb2M6ZnVuY3Rpb24odCl7Zm9yKHZhciBpPXRoaXMubGVuZ3RofHwxNjtpPHRoaXMucG9zK3Q7KWkqPTI7aWYoaSE9PXRoaXMubGVuZ3RoKXt2YXIgZT1uZXcgQnVmZmVyKGkpO3RoaXMuYnVmLmNvcHkoZSksdGhpcy5idWY9ZSx0aGlzLmxlbmd0aD1pfX0sZmluaXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RoPXRoaXMucG9zLHRoaXMucG9zPTAsdGhpcy5idWYuc2xpY2UoMCx0aGlzLmxlbmd0aCl9LHdyaXRlRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksdGhpcy5idWYud3JpdGVVSW50MzJMRSh0LHRoaXMucG9zKSx0aGlzLnBvcys9NH0sd3JpdGVTRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksdGhpcy5idWYud3JpdGVJbnQzMkxFKHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZUZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHRoaXMuYnVmLndyaXRlSW50MzJMRSgtMSZ0LHRoaXMucG9zKSx0aGlzLmJ1Zi53cml0ZVVJbnQzMkxFKE1hdGguZmxvb3IodCpTSElGVF9SSUdIVF8zMiksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlU0ZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHRoaXMuYnVmLndyaXRlSW50MzJMRSgtMSZ0LHRoaXMucG9zKSx0aGlzLmJ1Zi53cml0ZUludDMyTEUoTWF0aC5mbG9vcih0KlNISUZUX1JJR0hUXzMyKSx0aGlzLnBvcys0KSx0aGlzLnBvcys9OH0sd3JpdGVWYXJpbnQ6ZnVuY3Rpb24odCl7aWYodD0rdCwxMjc+PXQpdGhpcy5yZWFsbG9jKDEpLHRoaXMuYnVmW3RoaXMucG9zKytdPXQ7ZWxzZSBpZigxNjM4Mz49dCl0aGlzLnJlYWxsb2MoMiksdGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjAmMTI3fDEyOCx0aGlzLmJ1Zlt0aGlzLnBvcysrXT10Pj4+NyYxMjc7ZWxzZSBpZigyMDk3MTUxPj10KXRoaXMucmVhbGxvYygzKSx0aGlzLmJ1Zlt0aGlzLnBvcysrXT10Pj4+MCYxMjd8MTI4LHRoaXMuYnVmW3RoaXMucG9zKytdPXQ+Pj43JjEyN3wxMjgsdGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjE0JjEyNztlbHNlIGlmKDI2ODQzNTQ1NT49dCl0aGlzLnJlYWxsb2MoNCksdGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjAmMTI3fDEyOCx0aGlzLmJ1Zlt0aGlzLnBvcysrXT10Pj4+NyYxMjd8MTI4LHRoaXMuYnVmW3RoaXMucG9zKytdPXQ+Pj4xNCYxMjd8MTI4LHRoaXMuYnVmW3RoaXMucG9zKytdPXQ+Pj4yMSYxMjc7ZWxzZXtmb3IodmFyIGk9dGhpcy5wb3M7dD49MTI4Oyl0aGlzLnJlYWxsb2MoMSksdGhpcy5idWZbdGhpcy5wb3MrK109MjU1JnR8MTI4LHQvPTEyODtpZih0aGlzLnJlYWxsb2MoMSksdGhpcy5idWZbdGhpcy5wb3MrK109MHx0LHRoaXMucG9zLWk+MTApdGhyb3cgbmV3IEVycm9yKFwiR2l2ZW4gdmFyaW50IGRvZXNuJ3QgZml0IGludG8gMTAgYnl0ZXNcIil9fSx3cml0ZVNWYXJpbnQ6ZnVuY3Rpb24odCl7dGhpcy53cml0ZVZhcmludCgwPnQ/MiotdC0xOjIqdCl9LHdyaXRlQm9vbGVhbjpmdW5jdGlvbih0KXt0aGlzLndyaXRlVmFyaW50KEJvb2xlYW4odCkpfSx3cml0ZVN0cmluZzpmdW5jdGlvbih0KXt0PVN0cmluZyh0KTt2YXIgaT1CdWZmZXIuYnl0ZUxlbmd0aCh0KTt0aGlzLndyaXRlVmFyaW50KGkpLHRoaXMucmVhbGxvYyhpKSx0aGlzLmJ1Zi53cml0ZSh0LHRoaXMucG9zKSx0aGlzLnBvcys9aX0sd3JpdGVGbG9hdDpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksdGhpcy5idWYud3JpdGVGbG9hdExFKHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZURvdWJsZTpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoOCksdGhpcy5idWYud3JpdGVEb3VibGVMRSh0LHRoaXMucG9zKSx0aGlzLnBvcys9OH0sd3JpdGVCeXRlczpmdW5jdGlvbih0KXt2YXIgaT10Lmxlbmd0aDt0aGlzLndyaXRlVmFyaW50KGkpLHRoaXMucmVhbGxvYyhpKTtmb3IodmFyIGU9MDtpPmU7ZSsrKXRoaXMuYnVmW3RoaXMucG9zKytdPXRbZV19LHdyaXRlUmF3TWVzc2FnZTpmdW5jdGlvbih0LGkpe3RoaXMucG9zKys7dmFyIGU9dGhpcy5wb3M7dChpLHRoaXMpO3ZhciByPXRoaXMucG9zLWUscz0xMjc+PXI/MToxNjM4Mz49cj8yOjIwOTcxNTE+PXI/MzoyNjg0MzU0NTU+PXI/NDpNYXRoLmNlaWwoTWF0aC5sb2cocikvKDcqTWF0aC5MTjIpKTtpZihzPjEpe3RoaXMucmVhbGxvYyhzLTEpO2Zvcih2YXIgbj10aGlzLnBvcy0xO24+PWU7bi0tKXRoaXMuYnVmW24rcy0xXT10aGlzLmJ1ZltuXX10aGlzLnBvcz1lLTEsdGhpcy53cml0ZVZhcmludChyKSx0aGlzLnBvcys9cn0sd3JpdGVNZXNzYWdlOmZ1bmN0aW9uKHQsaSxlKXt0aGlzLndyaXRlVGFnKHQsUGJmLkJ5dGVzKSx0aGlzLndyaXRlUmF3TWVzc2FnZShpLGUpfSx3cml0ZVBhY2tlZFZhcmludDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVNZXNzYWdlKHQsd3JpdGVQYWNrZWRWYXJpbnQsaSl9LHdyaXRlUGFja2VkU1ZhcmludDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVNZXNzYWdlKHQsd3JpdGVQYWNrZWRTVmFyaW50LGkpfSx3cml0ZVBhY2tlZEJvb2xlYW46ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkQm9vbGVhbixpKX0sd3JpdGVQYWNrZWRGbG9hdDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVNZXNzYWdlKHQsd3JpdGVQYWNrZWRGbG9hdCxpKX0sd3JpdGVQYWNrZWREb3VibGU6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkRG91YmxlLGkpfSx3cml0ZVBhY2tlZEZpeGVkMzI6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkRml4ZWQzMixpKX0sd3JpdGVQYWNrZWRTRml4ZWQzMjpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVNZXNzYWdlKHQsd3JpdGVQYWNrZWRTRml4ZWQzMixpKX0sd3JpdGVQYWNrZWRGaXhlZDY0OmZ1bmN0aW9uKHQsaSl7dGhpcy53cml0ZU1lc3NhZ2UodCx3cml0ZVBhY2tlZEZpeGVkNjQsaSl9LHdyaXRlUGFja2VkU0ZpeGVkNjQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkU0ZpeGVkNjQsaSl9LHdyaXRlQnl0ZXNGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuQnl0ZXMpLHRoaXMud3JpdGVCeXRlcyhpKX0sd3JpdGVGaXhlZDMyRmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLkZpeGVkMzIpLHRoaXMud3JpdGVGaXhlZDMyKGkpfSx3cml0ZVNGaXhlZDMyRmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLkZpeGVkMzIpLHRoaXMud3JpdGVTRml4ZWQzMihpKX0sd3JpdGVGaXhlZDY0RmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLkZpeGVkNjQpLHRoaXMud3JpdGVGaXhlZDY0KGkpfSx3cml0ZVNGaXhlZDY0RmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLkZpeGVkNjQpLHRoaXMud3JpdGVTRml4ZWQ2NChpKX0sd3JpdGVWYXJpbnRGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuVmFyaW50KSx0aGlzLndyaXRlVmFyaW50KGkpfSx3cml0ZVNWYXJpbnRGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuVmFyaW50KSx0aGlzLndyaXRlU1ZhcmludChpKX0sd3JpdGVTdHJpbmdGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuQnl0ZXMpLHRoaXMud3JpdGVTdHJpbmcoaSl9LHdyaXRlRmxvYXRGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuRml4ZWQzMiksdGhpcy53cml0ZUZsb2F0KGkpfSx3cml0ZURvdWJsZUZpZWxkOmZ1bmN0aW9uKHQsaSl7dGhpcy53cml0ZVRhZyh0LFBiZi5GaXhlZDY0KSx0aGlzLndyaXRlRG91YmxlKGkpfSx3cml0ZUJvb2xlYW5GaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVWYXJpbnRGaWVsZCh0LEJvb2xlYW4oaSkpfX07XG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcblxufSx7XCIuL2J1ZmZlclwiOjEzNX1dLDEzNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBQb2ludCh0LG4pe3RoaXMueD10LHRoaXMueT1ufW1vZHVsZS5leHBvcnRzPVBvaW50LFBvaW50LnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFBvaW50KHRoaXMueCx0aGlzLnkpfSxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHQpfSxzdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHQpfSxtdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX211bHQodCl9LGRpdjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYodCl9LHJvdGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUodCl9LG1hdE11bHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fbWF0TXVsdCh0KX0sdW5pdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX3VuaXQoKX0scGVycDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX3BlcnAoKX0scm91bmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3VuZCgpfSxtYWc6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9LGVxdWFsczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54PT09dC54JiZ0aGlzLnk9PT10Lnl9LGRpc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RTcXIodCkpfSxkaXN0U3FyOmZ1bmN0aW9uKHQpe3ZhciBuPXQueC10aGlzLngsaT10LnktdGhpcy55O3JldHVybiBuKm4raSppfSxhbmdsZTpmdW5jdGlvbigpe3JldHVybiBNYXRoLmF0YW4yKHRoaXMueSx0aGlzLngpfSxhbmdsZVRvOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmF0YW4yKHRoaXMueS10LnksdGhpcy54LXQueCl9LGFuZ2xlV2l0aDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hbmdsZVdpdGhTZXAodC54LHQueSl9LGFuZ2xlV2l0aFNlcDpmdW5jdGlvbih0LG4pe3JldHVybiBNYXRoLmF0YW4yKHRoaXMueCpuLXRoaXMueSp0LHRoaXMueCp0K3RoaXMueSpuKX0sX21hdE11bHQ6ZnVuY3Rpb24odCl7dmFyIG49dFswXSp0aGlzLngrdFsxXSp0aGlzLnksaT10WzJdKnRoaXMueCt0WzNdKnRoaXMueTtyZXR1cm4gdGhpcy54PW4sdGhpcy55PWksdGhpc30sX2FkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc30sX3N1YjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpc30sX211bHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc30sX2RpdjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Lz10LHRoaXMueS89dCx0aGlzfSxfdW5pdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXYodGhpcy5tYWcoKSksdGhpc30sX3BlcnA6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnk7cmV0dXJuIHRoaXMueT10aGlzLngsdGhpcy54PS10LHRoaXN9LF9yb3RhdGU6ZnVuY3Rpb24odCl7dmFyIG49TWF0aC5jb3ModCksaT1NYXRoLnNpbih0KSxzPW4qdGhpcy54LWkqdGhpcy55LHI9aSp0aGlzLngrbip0aGlzLnk7cmV0dXJuIHRoaXMueD1zLHRoaXMueT1yLHRoaXN9LF9yb3VuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc319LFBvaW50LmNvbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBQb2ludD90OkFycmF5LmlzQXJyYXkodCk/bmV3IFBvaW50KHRbMF0sdFsxXSk6dH07XG59LHt9XSwxMzg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7ZHJhaW5pbmc9ITEsY3VycmVudFF1ZXVlLmxlbmd0aD9xdWV1ZT1jdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTpxdWV1ZUluZGV4PS0xLHF1ZXVlLmxlbmd0aCYmZHJhaW5RdWV1ZSgpfWZ1bmN0aW9uIGRyYWluUXVldWUoKXtpZighZHJhaW5pbmcpe3ZhciBlPXNldFRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtkcmFpbmluZz0hMDtmb3IodmFyIG49cXVldWUubGVuZ3RoO247KXtmb3IoY3VycmVudFF1ZXVlPXF1ZXVlLHF1ZXVlPVtdOysrcXVldWVJbmRleDxuOyljdXJyZW50UXVldWUmJmN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtxdWV1ZUluZGV4PS0xLG49cXVldWUubGVuZ3RofWN1cnJlbnRRdWV1ZT1udWxsLGRyYWluaW5nPSExLGNsZWFyVGltZW91dChlKX19ZnVuY3Rpb24gSXRlbShlLG4pe3RoaXMuZnVuPWUsdGhpcy5hcnJheT1ufWZ1bmN0aW9uIG5vb3AoKXt9dmFyIHByb2Nlc3M9bW9kdWxlLmV4cG9ydHM9e30scXVldWU9W10sZHJhaW5pbmc9ITEsY3VycmVudFF1ZXVlLHF1ZXVlSW5kZXg9LTE7cHJvY2Vzcy5uZXh0VGljaz1mdW5jdGlvbihlKXt2YXIgbj1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO3F1ZXVlLnB1c2gobmV3IEl0ZW0oZSxuKSksMSE9PXF1ZXVlLmxlbmd0aHx8ZHJhaW5pbmd8fHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwwKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0scHJvY2Vzcy50aXRsZT1cImJyb3dzZXJcIixwcm9jZXNzLmJyb3dzZXI9ITAscHJvY2Vzcy5lbnY9e30scHJvY2Vzcy5hcmd2PVtdLHByb2Nlc3MudmVyc2lvbj1cIlwiLHByb2Nlc3MudmVyc2lvbnM9e30scHJvY2Vzcy5vbj1ub29wLHByb2Nlc3MuYWRkTGlzdGVuZXI9bm9vcCxwcm9jZXNzLm9uY2U9bm9vcCxwcm9jZXNzLm9mZj1ub29wLHByb2Nlc3MucmVtb3ZlTGlzdGVuZXI9bm9vcCxwcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycz1ub29wLHByb2Nlc3MuZW1pdD1ub29wLHByb2Nlc3MuYmluZGluZz1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZFwiKX0scHJvY2Vzcy5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm5cIi9cIn0scHJvY2Vzcy5jaGRpcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcIil9LHByb2Nlc3MudW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH07XG59LHt9XSwxMzk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuIWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChpLG4pe3JldHVybiB0aGlzIGluc3RhbmNlb2YgdD8odGhpcy5fbWF4RW50cmllcz1NYXRoLm1heCg0LGl8fDkpLHRoaXMuX21pbkVudHJpZXM9TWF0aC5tYXgoMixNYXRoLmNlaWwoLjQqdGhpcy5fbWF4RW50cmllcykpLG4mJnRoaXMuX2luaXRGb3JtYXQobiksdm9pZCB0aGlzLmNsZWFyKCkpOm5ldyB0KGksbil9ZnVuY3Rpb24gaSh0LGkpe3QuYmJveD1uKHQsMCx0LmNoaWxkcmVuLmxlbmd0aCxpKX1mdW5jdGlvbiBuKHQsaSxuLHIpe2Zvcih2YXIgbyxhPWUoKSxzPWk7bj5zO3MrKylvPXQuY2hpbGRyZW5bc10saChhLHQubGVhZj9yKG8pOm8uYmJveCk7cmV0dXJuIGF9ZnVuY3Rpb24gZSgpe3JldHVyblsxLzAsMS8wLC0oMS8wKSwtKDEvMCldfWZ1bmN0aW9uIGgodCxpKXtyZXR1cm4gdFswXT1NYXRoLm1pbih0WzBdLGlbMF0pLHRbMV09TWF0aC5taW4odFsxXSxpWzFdKSx0WzJdPU1hdGgubWF4KHRbMl0saVsyXSksdFszXT1NYXRoLm1heCh0WzNdLGlbM10pLHR9ZnVuY3Rpb24gcih0LGkpe3JldHVybiB0LmJib3hbMF0taS5iYm94WzBdfWZ1bmN0aW9uIG8odCxpKXtyZXR1cm4gdC5iYm94WzFdLWkuYmJveFsxXX1mdW5jdGlvbiBhKHQpe3JldHVybih0WzJdLXRbMF0pKih0WzNdLXRbMV0pfWZ1bmN0aW9uIHModCl7cmV0dXJuIHRbMl0tdFswXSsodFszXS10WzFdKX1mdW5jdGlvbiBsKHQsaSl7cmV0dXJuKE1hdGgubWF4KGlbMl0sdFsyXSktTWF0aC5taW4oaVswXSx0WzBdKSkqKE1hdGgubWF4KGlbM10sdFszXSktTWF0aC5taW4oaVsxXSx0WzFdKSl9ZnVuY3Rpb24gdSh0LGkpe3ZhciBuPU1hdGgubWF4KHRbMF0saVswXSksZT1NYXRoLm1heCh0WzFdLGlbMV0pLGg9TWF0aC5taW4odFsyXSxpWzJdKSxyPU1hdGgubWluKHRbM10saVszXSk7cmV0dXJuIE1hdGgubWF4KDAsaC1uKSpNYXRoLm1heCgwLHItZSl9ZnVuY3Rpb24gZih0LGkpe3JldHVybiB0WzBdPD1pWzBdJiZ0WzFdPD1pWzFdJiZpWzJdPD10WzJdJiZpWzNdPD10WzNdfWZ1bmN0aW9uIGModCxpKXtyZXR1cm4gaVswXTw9dFsyXSYmaVsxXTw9dFszXSYmaVsyXT49dFswXSYmaVszXT49dFsxXX1mdW5jdGlvbiBkKHQsaSxuLGUsaCl7Zm9yKHZhciByLG89W2ksbl07by5sZW5ndGg7KW49by5wb3AoKSxpPW8ucG9wKCksZT49bi1pfHwocj1pK01hdGguY2VpbCgobi1pKS9lLzIpKmUseCh0LGksbixyLGgpLG8ucHVzaChpLHIscixuKSl9ZnVuY3Rpb24geCh0LGksbixlLGgpe2Zvcih2YXIgcixvLGEscyxsLHUsZixjLGQ7bj5pOyl7Zm9yKG4taT42MDAmJihyPW4taSsxLG89ZS1pKzEsYT1NYXRoLmxvZyhyKSxzPS41Kk1hdGguZXhwKDIqYS8zKSxsPS41Kk1hdGguc3FydChhKnMqKHItcykvcikqKDA+by1yLzI/LTE6MSksdT1NYXRoLm1heChpLE1hdGguZmxvb3IoZS1vKnMvcitsKSksZj1NYXRoLm1pbihuLE1hdGguZmxvb3IoZSsoci1vKSpzL3IrbCkpLHgodCx1LGYsZSxoKSksYz10W2VdLG89aSxkPW4scCh0LGksZSksaCh0W25dLGMpPjAmJnAodCxpLG4pO2Q+bzspe2ZvcihwKHQsbyxkKSxvKyssZC0tO2godFtvXSxjKTwwOylvKys7Zm9yKDtoKHRbZF0sYyk+MDspZC0tfTA9PT1oKHRbaV0sYyk/cCh0LGksZCk6KGQrKyxwKHQsZCxuKSksZT49ZCYmKGk9ZCsxKSxkPj1lJiYobj1kLTEpfX1mdW5jdGlvbiBwKHQsaSxuKXt2YXIgZT10W2ldO3RbaV09dFtuXSx0W25dPWV9dC5wcm90b3R5cGU9e2FsbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbGwodGhpcy5kYXRhLFtdKX0sc2VhcmNoOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZGF0YSxuPVtdLGU9dGhpcy50b0JCb3g7aWYoIWModCxpLmJib3gpKXJldHVybiBuO2Zvcih2YXIgaCxyLG8sYSxzPVtdO2k7KXtmb3IoaD0wLHI9aS5jaGlsZHJlbi5sZW5ndGg7cj5oO2grKylvPWkuY2hpbGRyZW5baF0sYT1pLmxlYWY/ZShvKTpvLmJib3gsYyh0LGEpJiYoaS5sZWFmP24ucHVzaChvKTpmKHQsYSk/dGhpcy5fYWxsKG8sbik6cy5wdXNoKG8pKTtpPXMucG9wKCl9cmV0dXJuIG59LGNvbGxpZGVzOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZGF0YSxuPXRoaXMudG9CQm94O2lmKCFjKHQsaS5iYm94KSlyZXR1cm4hMTtmb3IodmFyIGUsaCxyLG8sYT1bXTtpOyl7Zm9yKGU9MCxoPWkuY2hpbGRyZW4ubGVuZ3RoO2g+ZTtlKyspaWYocj1pLmNoaWxkcmVuW2VdLG89aS5sZWFmP24ocik6ci5iYm94LGModCxvKSl7aWYoaS5sZWFmfHxmKHQsbykpcmV0dXJuITA7YS5wdXNoKHIpfWk9YS5wb3AoKX1yZXR1cm4hMX0sbG9hZDpmdW5jdGlvbih0KXtpZighdHx8IXQubGVuZ3RoKXJldHVybiB0aGlzO2lmKHQubGVuZ3RoPHRoaXMuX21pbkVudHJpZXMpe2Zvcih2YXIgaT0wLG49dC5sZW5ndGg7bj5pO2krKyl0aGlzLmluc2VydCh0W2ldKTtyZXR1cm4gdGhpc312YXIgZT10aGlzLl9idWlsZCh0LnNsaWNlKCksMCx0Lmxlbmd0aC0xLDApO2lmKHRoaXMuZGF0YS5jaGlsZHJlbi5sZW5ndGgpaWYodGhpcy5kYXRhLmhlaWdodD09PWUuaGVpZ2h0KXRoaXMuX3NwbGl0Um9vdCh0aGlzLmRhdGEsZSk7ZWxzZXtpZih0aGlzLmRhdGEuaGVpZ2h0PGUuaGVpZ2h0KXt2YXIgaD10aGlzLmRhdGE7dGhpcy5kYXRhPWUsZT1ofXRoaXMuX2luc2VydChlLHRoaXMuZGF0YS5oZWlnaHQtZS5oZWlnaHQtMSwhMCl9ZWxzZSB0aGlzLmRhdGE9ZTtyZXR1cm4gdGhpc30saW5zZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0aGlzLl9pbnNlcnQodCx0aGlzLmRhdGEuaGVpZ2h0LTEpLHRoaXN9LGNsZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YT17Y2hpbGRyZW46W10saGVpZ2h0OjEsYmJveDplKCksbGVhZjohMH0sdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiB0aGlzO2Zvcih2YXIgaSxuLGUsaCxyPXRoaXMuZGF0YSxvPXRoaXMudG9CQm94KHQpLGE9W10scz1bXTtyfHxhLmxlbmd0aDspe2lmKHJ8fChyPWEucG9wKCksbj1hW2EubGVuZ3RoLTFdLGk9cy5wb3AoKSxoPSEwKSxyLmxlYWYmJihlPXIuY2hpbGRyZW4uaW5kZXhPZih0KSwtMSE9PWUpKXJldHVybiByLmNoaWxkcmVuLnNwbGljZShlLDEpLGEucHVzaChyKSx0aGlzLl9jb25kZW5zZShhKSx0aGlzO2h8fHIubGVhZnx8IWYoci5iYm94LG8pP24/KGkrKyxyPW4uY2hpbGRyZW5baV0saD0hMSk6cj1udWxsOihhLnB1c2gocikscy5wdXNoKGkpLGk9MCxuPXIscj1yLmNoaWxkcmVuWzBdKX1yZXR1cm4gdGhpc30sdG9CQm94OmZ1bmN0aW9uKHQpe3JldHVybiB0fSxjb21wYXJlTWluWDpmdW5jdGlvbih0LGkpe3JldHVybiB0WzBdLWlbMF19LGNvbXBhcmVNaW5ZOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRbMV0taVsxXX0sdG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX0sZnJvbUpTT046ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YT10LHRoaXN9LF9hbGw6ZnVuY3Rpb24odCxpKXtmb3IodmFyIG49W107dDspdC5sZWFmP2kucHVzaC5hcHBseShpLHQuY2hpbGRyZW4pOm4ucHVzaC5hcHBseShuLHQuY2hpbGRyZW4pLHQ9bi5wb3AoKTtyZXR1cm4gaX0sX2J1aWxkOmZ1bmN0aW9uKHQsbixlLGgpe3ZhciByLG89ZS1uKzEsYT10aGlzLl9tYXhFbnRyaWVzO2lmKGE+PW8pcmV0dXJuIHI9e2NoaWxkcmVuOnQuc2xpY2UobixlKzEpLGhlaWdodDoxLGJib3g6bnVsbCxsZWFmOiEwfSxpKHIsdGhpcy50b0JCb3gpLHI7aHx8KGg9TWF0aC5jZWlsKE1hdGgubG9nKG8pL01hdGgubG9nKGEpKSxhPU1hdGguY2VpbChvL01hdGgucG93KGEsaC0xKSkpLHI9e2NoaWxkcmVuOltdLGhlaWdodDpoLGJib3g6bnVsbCxsZWFmOiExfTt2YXIgcyxsLHUsZixjPU1hdGguY2VpbChvL2EpLHg9YypNYXRoLmNlaWwoTWF0aC5zcXJ0KGEpKTtmb3IoZCh0LG4sZSx4LHRoaXMuY29tcGFyZU1pblgpLHM9bjtlPj1zO3MrPXgpZm9yKHU9TWF0aC5taW4ocyt4LTEsZSksZCh0LHMsdSxjLHRoaXMuY29tcGFyZU1pblkpLGw9czt1Pj1sO2wrPWMpZj1NYXRoLm1pbihsK2MtMSx1KSxyLmNoaWxkcmVuLnB1c2godGhpcy5fYnVpbGQodCxsLGYsaC0xKSk7cmV0dXJuIGkocix0aGlzLnRvQkJveCkscn0sX2Nob29zZVN1YnRyZWU6ZnVuY3Rpb24odCxpLG4sZSl7Zm9yKHZhciBoLHIsbyxzLHUsZixjLGQ7Oyl7aWYoZS5wdXNoKGkpLGkubGVhZnx8ZS5sZW5ndGgtMT09PW4pYnJlYWs7Zm9yKGM9ZD0xLzAsaD0wLHI9aS5jaGlsZHJlbi5sZW5ndGg7cj5oO2grKylvPWkuY2hpbGRyZW5baF0sdT1hKG8uYmJveCksZj1sKHQsby5iYm94KS11LGQ+Zj8oZD1mLGM9Yz51P3U6YyxzPW8pOmY9PT1kJiZjPnUmJihjPXUscz1vKTtpPXN9cmV0dXJuIGl9LF9pbnNlcnQ6ZnVuY3Rpb24odCxpLG4pe3ZhciBlPXRoaXMudG9CQm94LHI9bj90LmJib3g6ZSh0KSxvPVtdLGE9dGhpcy5fY2hvb3NlU3VidHJlZShyLHRoaXMuZGF0YSxpLG8pO2ZvcihhLmNoaWxkcmVuLnB1c2godCksaChhLmJib3gscik7aT49MCYmb1tpXS5jaGlsZHJlbi5sZW5ndGg+dGhpcy5fbWF4RW50cmllczspdGhpcy5fc3BsaXQobyxpKSxpLS07dGhpcy5fYWRqdXN0UGFyZW50QkJveGVzKHIsbyxpKX0sX3NwbGl0OmZ1bmN0aW9uKHQsbil7dmFyIGU9dFtuXSxoPWUuY2hpbGRyZW4ubGVuZ3RoLHI9dGhpcy5fbWluRW50cmllczt0aGlzLl9jaG9vc2VTcGxpdEF4aXMoZSxyLGgpO3ZhciBvPXRoaXMuX2Nob29zZVNwbGl0SW5kZXgoZSxyLGgpLGE9e2NoaWxkcmVuOmUuY2hpbGRyZW4uc3BsaWNlKG8sZS5jaGlsZHJlbi5sZW5ndGgtbyksaGVpZ2h0OmUuaGVpZ2h0LGJib3g6bnVsbCxsZWFmOiExfTtlLmxlYWYmJihhLmxlYWY9ITApLGkoZSx0aGlzLnRvQkJveCksaShhLHRoaXMudG9CQm94KSxuP3Rbbi0xXS5jaGlsZHJlbi5wdXNoKGEpOnRoaXMuX3NwbGl0Um9vdChlLGEpfSxfc3BsaXRSb290OmZ1bmN0aW9uKHQsbil7dGhpcy5kYXRhPXtjaGlsZHJlbjpbdCxuXSxoZWlnaHQ6dC5oZWlnaHQrMSxiYm94Om51bGwsbGVhZjohMX0saSh0aGlzLmRhdGEsdGhpcy50b0JCb3gpfSxfY2hvb3NlU3BsaXRJbmRleDpmdW5jdGlvbih0LGksZSl7dmFyIGgscixvLHMsbCxmLGMsZDtmb3IoZj1jPTEvMCxoPWk7ZS1pPj1oO2grKylyPW4odCwwLGgsdGhpcy50b0JCb3gpLG89bih0LGgsZSx0aGlzLnRvQkJveCkscz11KHIsbyksbD1hKHIpK2EobyksZj5zPyhmPXMsZD1oLGM9Yz5sP2w6Yyk6cz09PWYmJmM+bCYmKGM9bCxkPWgpO3JldHVybiBkfSxfY2hvb3NlU3BsaXRBeGlzOmZ1bmN0aW9uKHQsaSxuKXt2YXIgZT10LmxlYWY/dGhpcy5jb21wYXJlTWluWDpyLGg9dC5sZWFmP3RoaXMuY29tcGFyZU1pblk6byxhPXRoaXMuX2FsbERpc3RNYXJnaW4odCxpLG4sZSkscz10aGlzLl9hbGxEaXN0TWFyZ2luKHQsaSxuLGgpO3M+YSYmdC5jaGlsZHJlbi5zb3J0KGUpfSxfYWxsRGlzdE1hcmdpbjpmdW5jdGlvbih0LGksZSxyKXt0LmNoaWxkcmVuLnNvcnQocik7dmFyIG8sYSxsPXRoaXMudG9CQm94LHU9bih0LDAsaSxsKSxmPW4odCxlLWksZSxsKSxjPXModSkrcyhmKTtmb3Iobz1pO2UtaT5vO28rKylhPXQuY2hpbGRyZW5bb10saCh1LHQubGVhZj9sKGEpOmEuYmJveCksYys9cyh1KTtmb3Iobz1lLWktMTtvPj1pO28tLSlhPXQuY2hpbGRyZW5bb10saChmLHQubGVhZj9sKGEpOmEuYmJveCksYys9cyhmKTtyZXR1cm4gY30sX2FkanVzdFBhcmVudEJCb3hlczpmdW5jdGlvbih0LGksbil7Zm9yKHZhciBlPW47ZT49MDtlLS0paChpW2VdLmJib3gsdCl9LF9jb25kZW5zZTpmdW5jdGlvbih0KXtmb3IodmFyIG4sZT10Lmxlbmd0aC0xO2U+PTA7ZS0tKTA9PT10W2VdLmNoaWxkcmVuLmxlbmd0aD9lPjA/KG49dFtlLTFdLmNoaWxkcmVuLG4uc3BsaWNlKG4uaW5kZXhPZih0W2VdKSwxKSk6dGhpcy5jbGVhcigpOmkodFtlXSx0aGlzLnRvQkJveCl9LF9pbml0Rm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBpPVtcInJldHVybiBhXCIsXCIgLSBiXCIsXCI7XCJdO3RoaXMuY29tcGFyZU1pblg9bmV3IEZ1bmN0aW9uKFwiYVwiLFwiYlwiLGkuam9pbih0WzBdKSksdGhpcy5jb21wYXJlTWluWT1uZXcgRnVuY3Rpb24oXCJhXCIsXCJiXCIsaS5qb2luKHRbMV0pKSx0aGlzLnRvQkJveD1uZXcgRnVuY3Rpb24oXCJhXCIsXCJyZXR1cm4gW2FcIit0LmpvaW4oXCIsIGFcIikrXCJdO1wiKX19LFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoXCJyYnVzaFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHR9KTpcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQ6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZi5yYnVzaD10OndpbmRvdy5yYnVzaD10fSgpO1xufSx7fV0sMTQwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbnZvaWQgZnVuY3Rpb24oZSxyKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHIpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPXIoKTplLnJlc29sdmVVcmw9cigpfSh0aGlzLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7aWYoMD09PWUpdGhyb3cgbmV3IEVycm9yKFwicmVzb2x2ZVVybCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYXJndW1lbnQ7IGdvdCBub25lLlwiKTt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYmFzZVwiKTtpZihyLmhyZWY9YXJndW1lbnRzWzBdLDE9PT1lKXJldHVybiByLmhyZWY7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdO3QuaW5zZXJ0QmVmb3JlKHIsdC5maXJzdENoaWxkKTtmb3IodmFyIG4sbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKSxmPTE7ZT5mO2YrKylvLmhyZWY9YXJndW1lbnRzW2ZdLG49by5ocmVmLHIuaHJlZj1uO3JldHVybiB0LnJlbW92ZUNoaWxkKHIpLG59cmV0dXJuIGV9KTtcbn0se31dLDE0MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5mdW5jdGlvbiBVbml0QmV6aWVyKHQsaSxlLHIpe3RoaXMuY3g9Myp0LHRoaXMuYng9MyooZS10KS10aGlzLmN4LHRoaXMuYXg9MS10aGlzLmN4LXRoaXMuYngsdGhpcy5jeT0zKmksdGhpcy5ieT0zKihyLWkpLXRoaXMuY3ksdGhpcy5heT0xLXRoaXMuY3ktdGhpcy5ieSx0aGlzLnAxeD10LHRoaXMucDF5PXIsdGhpcy5wMng9ZSx0aGlzLnAyeT1yfW1vZHVsZS5leHBvcnRzPVVuaXRCZXppZXIsVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVYPWZ1bmN0aW9uKHQpe3JldHVybigodGhpcy5heCp0K3RoaXMuYngpKnQrdGhpcy5jeCkqdH0sVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVZPWZ1bmN0aW9uKHQpe3JldHVybigodGhpcy5heSp0K3RoaXMuYnkpKnQrdGhpcy5jeSkqdH0sVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVEZXJpdmF0aXZlWD1mdW5jdGlvbih0KXtyZXR1cm4oMyp0aGlzLmF4KnQrMip0aGlzLmJ4KSp0K3RoaXMuY3h9LFVuaXRCZXppZXIucHJvdG90eXBlLnNvbHZlQ3VydmVYPWZ1bmN0aW9uKHQsaSl7XCJ1bmRlZmluZWRcIj09dHlwZW9mIGkmJihpPTFlLTYpO3ZhciBlLHIscyxoLG47Zm9yKHM9dCxuPTA7OD5uO24rKyl7aWYoaD10aGlzLnNhbXBsZUN1cnZlWChzKS10LE1hdGguYWJzKGgpPGkpcmV0dXJuIHM7dmFyIHU9dGhpcy5zYW1wbGVDdXJ2ZURlcml2YXRpdmVYKHMpO2lmKE1hdGguYWJzKHUpPDFlLTYpYnJlYWs7cy09aC91fWlmKGU9MCxyPTEscz10LGU+cylyZXR1cm4gZTtpZihzPnIpcmV0dXJuIHI7Zm9yKDtyPmU7KXtpZihoPXRoaXMuc2FtcGxlQ3VydmVYKHMpLE1hdGguYWJzKGgtdCk8aSlyZXR1cm4gczt0Pmg/ZT1zOnI9cyxzPS41KihyLWUpK2V9cmV0dXJuIHN9LFVuaXRCZXppZXIucHJvdG90eXBlLnNvbHZlPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRoaXMuc2FtcGxlQ3VydmVZKHRoaXMuc29sdmVDdXJ2ZVgodCxpKSl9O1xufSx7fV0sMTQyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKG8pe3JldHVybiBvJiZcIm9iamVjdFwiPT10eXBlb2YgbyYmXCJmdW5jdGlvblwiPT10eXBlb2Ygby5jb3B5JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBvLmZpbGwmJlwiZnVuY3Rpb25cIj09dHlwZW9mIG8ucmVhZFVJbnQ4fTtcbn0se31dLDE0MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4oZnVuY3Rpb24gKHByb2Nlc3MsZ2xvYmFsKXtcbmZ1bmN0aW9uIGluc3BlY3QoZSxyKXt2YXIgdD17c2VlbjpbXSxzdHlsaXplOnN0eWxpemVOb0NvbG9yfTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49MyYmKHQuZGVwdGg9YXJndW1lbnRzWzJdKSxhcmd1bWVudHMubGVuZ3RoPj00JiYodC5jb2xvcnM9YXJndW1lbnRzWzNdKSxpc0Jvb2xlYW4ocik/dC5zaG93SGlkZGVuPXI6ciYmZXhwb3J0cy5fZXh0ZW5kKHQsciksaXNVbmRlZmluZWQodC5zaG93SGlkZGVuKSYmKHQuc2hvd0hpZGRlbj0hMSksaXNVbmRlZmluZWQodC5kZXB0aCkmJih0LmRlcHRoPTIpLGlzVW5kZWZpbmVkKHQuY29sb3JzKSYmKHQuY29sb3JzPSExKSxpc1VuZGVmaW5lZCh0LmN1c3RvbUluc3BlY3QpJiYodC5jdXN0b21JbnNwZWN0PSEwKSx0LmNvbG9ycyYmKHQuc3R5bGl6ZT1zdHlsaXplV2l0aENvbG9yKSxmb3JtYXRWYWx1ZSh0LGUsdC5kZXB0aCl9ZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihlLHIpe3ZhciB0PWluc3BlY3Quc3R5bGVzW3JdO3JldHVybiB0P1wiXHUwMDFiW1wiK2luc3BlY3QuY29sb3JzW3RdWzBdK1wibVwiK2UrXCJcdTAwMWJbXCIraW5zcGVjdC5jb2xvcnNbdF1bMV0rXCJtXCI6ZX1mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihlLHIpe3JldHVybiBlfWZ1bmN0aW9uIGFycmF5VG9IYXNoKGUpe3ZhciByPXt9O3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oZSx0KXtyW2VdPSEwfSkscn1mdW5jdGlvbiBmb3JtYXRWYWx1ZShlLHIsdCl7aWYoZS5jdXN0b21JbnNwZWN0JiZyJiZpc0Z1bmN0aW9uKHIuaW5zcGVjdCkmJnIuaW5zcGVjdCE9PWV4cG9ydHMuaW5zcGVjdCYmKCFyLmNvbnN0cnVjdG9yfHxyLmNvbnN0cnVjdG9yLnByb3RvdHlwZSE9PXIpKXt2YXIgbj1yLmluc3BlY3QodCxlKTtyZXR1cm4gaXNTdHJpbmcobil8fChuPWZvcm1hdFZhbHVlKGUsbix0KSksbn12YXIgaT1mb3JtYXRQcmltaXRpdmUoZSxyKTtpZihpKXJldHVybiBpO3ZhciBvPU9iamVjdC5rZXlzKHIpLHM9YXJyYXlUb0hhc2gobyk7aWYoZS5zaG93SGlkZGVuJiYobz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKSksaXNFcnJvcihyKSYmKG8uaW5kZXhPZihcIm1lc3NhZ2VcIik+PTB8fG8uaW5kZXhPZihcImRlc2NyaXB0aW9uXCIpPj0wKSlyZXR1cm4gZm9ybWF0RXJyb3Iocik7aWYoMD09PW8ubGVuZ3RoKXtpZihpc0Z1bmN0aW9uKHIpKXt2YXIgdT1yLm5hbWU/XCI6IFwiK3IubmFtZTpcIlwiO3JldHVybiBlLnN0eWxpemUoXCJbRnVuY3Rpb25cIit1K1wiXVwiLFwic3BlY2lhbFwiKX1pZihpc1JlZ0V4cChyKSlyZXR1cm4gZS5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyKSxcInJlZ2V4cFwiKTtpZihpc0RhdGUocikpcmV0dXJuIGUuc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpLFwiZGF0ZVwiKTtpZihpc0Vycm9yKHIpKXJldHVybiBmb3JtYXRFcnJvcihyKX12YXIgYT1cIlwiLGM9ITEsbD1bXCJ7XCIsXCJ9XCJdO2lmKGlzQXJyYXkocikmJihjPSEwLGw9W1wiW1wiLFwiXVwiXSksaXNGdW5jdGlvbihyKSl7dmFyIHA9ci5uYW1lP1wiOiBcIityLm5hbWU6XCJcIjthPVwiIFtGdW5jdGlvblwiK3ArXCJdXCJ9aWYoaXNSZWdFeHAocikmJihhPVwiIFwiK1JlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyKSksaXNEYXRlKHIpJiYoYT1cIiBcIitEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHIpKSxpc0Vycm9yKHIpJiYoYT1cIiBcIitmb3JtYXRFcnJvcihyKSksMD09PW8ubGVuZ3RoJiYoIWN8fDA9PXIubGVuZ3RoKSlyZXR1cm4gbFswXSthK2xbMV07aWYoMD50KXJldHVybiBpc1JlZ0V4cChyKT9lLnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpLFwicmVnZXhwXCIpOmUuc3R5bGl6ZShcIltPYmplY3RdXCIsXCJzcGVjaWFsXCIpO2Uuc2Vlbi5wdXNoKHIpO3ZhciBmO3JldHVybiBmPWM/Zm9ybWF0QXJyYXkoZSxyLHQscyxvKTpvLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZm9ybWF0UHJvcGVydHkoZSxyLHQscyxuLGMpfSksZS5zZWVuLnBvcCgpLHJlZHVjZVRvU2luZ2xlU3RyaW5nKGYsYSxsKX1mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoZSxyKXtpZihpc1VuZGVmaW5lZChyKSlyZXR1cm4gZS5zdHlsaXplKFwidW5kZWZpbmVkXCIsXCJ1bmRlZmluZWRcIik7aWYoaXNTdHJpbmcocikpe3ZhciB0PVwiJ1wiK0pTT04uc3RyaW5naWZ5KHIpLnJlcGxhY2UoL15cInxcIiQvZyxcIlwiKS5yZXBsYWNlKC8nL2csXCJcXFxcJ1wiKS5yZXBsYWNlKC9cXFxcXCIvZywnXCInKStcIidcIjtyZXR1cm4gZS5zdHlsaXplKHQsXCJzdHJpbmdcIil9cmV0dXJuIGlzTnVtYmVyKHIpP2Uuc3R5bGl6ZShcIlwiK3IsXCJudW1iZXJcIik6aXNCb29sZWFuKHIpP2Uuc3R5bGl6ZShcIlwiK3IsXCJib29sZWFuXCIpOmlzTnVsbChyKT9lLnN0eWxpemUoXCJudWxsXCIsXCJudWxsXCIpOnZvaWQgMH1mdW5jdGlvbiBmb3JtYXRFcnJvcihlKXtyZXR1cm5cIltcIitFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKStcIl1cIn1mdW5jdGlvbiBmb3JtYXRBcnJheShlLHIsdCxuLGkpe2Zvcih2YXIgbz1bXSxzPTAsdT1yLmxlbmd0aDt1PnM7KytzKWhhc093blByb3BlcnR5KHIsU3RyaW5nKHMpKT9vLnB1c2goZm9ybWF0UHJvcGVydHkoZSxyLHQsbixTdHJpbmcocyksITApKTpvLnB1c2goXCJcIik7cmV0dXJuIGkuZm9yRWFjaChmdW5jdGlvbihpKXtpLm1hdGNoKC9eXFxkKyQvKXx8by5wdXNoKGZvcm1hdFByb3BlcnR5KGUscix0LG4saSwhMCkpfSksb31mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShlLHIsdCxuLGksbyl7dmFyIHMsdSxhO2lmKGE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLGkpfHx7dmFsdWU6cltpXX0sYS5nZXQ/dT1hLnNldD9lLnN0eWxpemUoXCJbR2V0dGVyL1NldHRlcl1cIixcInNwZWNpYWxcIik6ZS5zdHlsaXplKFwiW0dldHRlcl1cIixcInNwZWNpYWxcIik6YS5zZXQmJih1PWUuc3R5bGl6ZShcIltTZXR0ZXJdXCIsXCJzcGVjaWFsXCIpKSxoYXNPd25Qcm9wZXJ0eShuLGkpfHwocz1cIltcIitpK1wiXVwiKSx1fHwoZS5zZWVuLmluZGV4T2YoYS52YWx1ZSk8MD8odT1pc051bGwodCk/Zm9ybWF0VmFsdWUoZSxhLnZhbHVlLG51bGwpOmZvcm1hdFZhbHVlKGUsYS52YWx1ZSx0LTEpLHUuaW5kZXhPZihcIlxcblwiKT4tMSYmKHU9bz91LnNwbGl0KFwiXFxuXCIpLm1hcChmdW5jdGlvbihlKXtyZXR1cm5cIiAgXCIrZX0pLmpvaW4oXCJcXG5cIikuc3Vic3RyKDIpOlwiXFxuXCIrdS5zcGxpdChcIlxcblwiKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuXCIgICBcIitlfSkuam9pbihcIlxcblwiKSkpOnU9ZS5zdHlsaXplKFwiW0NpcmN1bGFyXVwiLFwic3BlY2lhbFwiKSksaXNVbmRlZmluZWQocykpe2lmKG8mJmkubWF0Y2goL15cXGQrJC8pKXJldHVybiB1O3M9SlNPTi5zdHJpbmdpZnkoXCJcIitpKSxzLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKT8ocz1zLnN1YnN0cigxLHMubGVuZ3RoLTIpLHM9ZS5zdHlsaXplKHMsXCJuYW1lXCIpKToocz1zLnJlcGxhY2UoLycvZyxcIlxcXFwnXCIpLnJlcGxhY2UoL1xcXFxcIi9nLCdcIicpLnJlcGxhY2UoLyheXCJ8XCIkKS9nLFwiJ1wiKSxzPWUuc3R5bGl6ZShzLFwic3RyaW5nXCIpKX1yZXR1cm4gcytcIjogXCIrdX1mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhlLHIsdCl7dmFyIG49MCxpPWUucmVkdWNlKGZ1bmN0aW9uKGUscil7cmV0dXJuIG4rKyxyLmluZGV4T2YoXCJcXG5cIik+PTAmJm4rKyxlK3IucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csXCJcIikubGVuZ3RoKzF9LDApO3JldHVybiBpPjYwP3RbMF0rKFwiXCI9PT1yP1wiXCI6citcIlxcbiBcIikrXCIgXCIrZS5qb2luKFwiLFxcbiAgXCIpK1wiIFwiK3RbMV06dFswXStyK1wiIFwiK2Uuam9pbihcIiwgXCIpK1wiIFwiK3RbMV19ZnVuY3Rpb24gaXNBcnJheShlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKX1mdW5jdGlvbiBpc0Jvb2xlYW4oZSl7cmV0dXJuXCJib29sZWFuXCI9PXR5cGVvZiBlfWZ1bmN0aW9uIGlzTnVsbChlKXtyZXR1cm4gbnVsbD09PWV9ZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoZSl7cmV0dXJuIG51bGw9PWV9ZnVuY3Rpb24gaXNOdW1iZXIoZSl7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIGV9ZnVuY3Rpb24gaXNTdHJpbmcoZSl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGV9ZnVuY3Rpb24gaXNTeW1ib2woZSl7cmV0dXJuXCJzeW1ib2xcIj09dHlwZW9mIGV9ZnVuY3Rpb24gaXNVbmRlZmluZWQoZSl7cmV0dXJuIHZvaWQgMD09PWV9ZnVuY3Rpb24gaXNSZWdFeHAoZSl7cmV0dXJuIGlzT2JqZWN0KGUpJiZcIltvYmplY3QgUmVnRXhwXVwiPT09b2JqZWN0VG9TdHJpbmcoZSl9ZnVuY3Rpb24gaXNPYmplY3QoZSl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIGUmJm51bGwhPT1lfWZ1bmN0aW9uIGlzRGF0ZShlKXtyZXR1cm4gaXNPYmplY3QoZSkmJlwiW29iamVjdCBEYXRlXVwiPT09b2JqZWN0VG9TdHJpbmcoZSl9ZnVuY3Rpb24gaXNFcnJvcihlKXtyZXR1cm4gaXNPYmplY3QoZSkmJihcIltvYmplY3QgRXJyb3JdXCI9PT1vYmplY3RUb1N0cmluZyhlKXx8ZSBpbnN0YW5jZW9mIEVycm9yKX1mdW5jdGlvbiBpc0Z1bmN0aW9uKGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGV9ZnVuY3Rpb24gaXNQcmltaXRpdmUoZSl7cmV0dXJuIG51bGw9PT1lfHxcImJvb2xlYW5cIj09dHlwZW9mIGV8fFwibnVtYmVyXCI9PXR5cGVvZiBlfHxcInN0cmluZ1wiPT10eXBlb2YgZXx8XCJzeW1ib2xcIj09dHlwZW9mIGV8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiBlfWZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gcGFkKGUpe3JldHVybiAxMD5lP1wiMFwiK2UudG9TdHJpbmcoMTApOmUudG9TdHJpbmcoMTApfWZ1bmN0aW9uIHRpbWVzdGFtcCgpe3ZhciBlPW5ldyBEYXRlLHI9W3BhZChlLmdldEhvdXJzKCkpLHBhZChlLmdldE1pbnV0ZXMoKSkscGFkKGUuZ2V0U2Vjb25kcygpKV0uam9pbihcIjpcIik7cmV0dXJuW2UuZ2V0RGF0ZSgpLG1vbnRoc1tlLmdldE1vbnRoKCldLHJdLmpvaW4oXCIgXCIpfWZ1bmN0aW9uIGhhc093blByb3BlcnR5KGUscil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpfXZhciBmb3JtYXRSZWdFeHA9LyVbc2RqJV0vZztleHBvcnRzLmZvcm1hdD1mdW5jdGlvbihlKXtpZighaXNTdHJpbmcoZSkpe2Zvcih2YXIgcj1bXSx0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylyLnB1c2goaW5zcGVjdChhcmd1bWVudHNbdF0pKTtyZXR1cm4gci5qb2luKFwiIFwiKX1mb3IodmFyIHQ9MSxuPWFyZ3VtZW50cyxpPW4ubGVuZ3RoLG89U3RyaW5nKGUpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLGZ1bmN0aW9uKGUpe2lmKFwiJSVcIj09PWUpcmV0dXJuXCIlXCI7aWYodD49aSlyZXR1cm4gZTtzd2l0Y2goZSl7Y2FzZVwiJXNcIjpyZXR1cm4gU3RyaW5nKG5bdCsrXSk7Y2FzZVwiJWRcIjpyZXR1cm4gTnVtYmVyKG5bdCsrXSk7Y2FzZVwiJWpcIjp0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG5bdCsrXSl9Y2F0Y2gocil7cmV0dXJuXCJbQ2lyY3VsYXJdXCJ9ZGVmYXVsdDpyZXR1cm4gZX19KSxzPW5bdF07aT50O3M9blsrK3RdKW8rPWlzTnVsbChzKXx8IWlzT2JqZWN0KHMpP1wiIFwiK3M6XCIgXCIraW5zcGVjdChzKTtyZXR1cm4gb30sZXhwb3J0cy5kZXByZWNhdGU9ZnVuY3Rpb24oZSxyKXtmdW5jdGlvbiB0KCl7aWYoIW4pe2lmKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbil0aHJvdyBuZXcgRXJyb3Iocik7cHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uP2NvbnNvbGUudHJhY2Uocik6Y29uc29sZS5lcnJvcihyKSxuPSEwfXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1pZihpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGUscikuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtpZihwcm9jZXNzLm5vRGVwcmVjYXRpb249PT0hMClyZXR1cm4gZTt2YXIgbj0hMTtyZXR1cm4gdH07dmFyIGRlYnVncz17fSxkZWJ1Z0Vudmlyb247ZXhwb3J0cy5kZWJ1Z2xvZz1mdW5jdGlvbihlKXtpZihpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pJiYoZGVidWdFbnZpcm9uPXByb2Nlc3MuZW52Lk5PREVfREVCVUd8fFwiXCIpLGU9ZS50b1VwcGVyQ2FzZSgpLCFkZWJ1Z3NbZV0paWYobmV3IFJlZ0V4cChcIlxcXFxiXCIrZStcIlxcXFxiXCIsXCJpXCIpLnRlc3QoZGVidWdFbnZpcm9uKSl7dmFyIHI9cHJvY2Vzcy5waWQ7ZGVidWdzW2VdPWZ1bmN0aW9uKCl7dmFyIHQ9ZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpO2NvbnNvbGUuZXJyb3IoXCIlcyAlZDogJXNcIixlLHIsdCl9fWVsc2UgZGVidWdzW2VdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gZGVidWdzW2VdfSxleHBvcnRzLmluc3BlY3Q9aW5zcGVjdCxpbnNwZWN0LmNvbG9ycz17Ym9sZDpbMSwyMl0saXRhbGljOlszLDIzXSx1bmRlcmxpbmU6WzQsMjRdLGludmVyc2U6WzcsMjddLHdoaXRlOlszNywzOV0sZ3JleTpbOTAsMzldLGJsYWNrOlszMCwzOV0sYmx1ZTpbMzQsMzldLGN5YW46WzM2LDM5XSxncmVlbjpbMzIsMzldLG1hZ2VudGE6WzM1LDM5XSxyZWQ6WzMxLDM5XSx5ZWxsb3c6WzMzLDM5XX0saW5zcGVjdC5zdHlsZXM9e3NwZWNpYWw6XCJjeWFuXCIsbnVtYmVyOlwieWVsbG93XCIsXCJib29sZWFuXCI6XCJ5ZWxsb3dcIix1bmRlZmluZWQ6XCJncmV5XCIsXCJudWxsXCI6XCJib2xkXCIsc3RyaW5nOlwiZ3JlZW5cIixkYXRlOlwibWFnZW50YVwiLHJlZ2V4cDpcInJlZFwifSxleHBvcnRzLmlzQXJyYXk9aXNBcnJheSxleHBvcnRzLmlzQm9vbGVhbj1pc0Jvb2xlYW4sZXhwb3J0cy5pc051bGw9aXNOdWxsLGV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQ9aXNOdWxsT3JVbmRlZmluZWQsZXhwb3J0cy5pc051bWJlcj1pc051bWJlcixleHBvcnRzLmlzU3RyaW5nPWlzU3RyaW5nLGV4cG9ydHMuaXNTeW1ib2w9aXNTeW1ib2wsZXhwb3J0cy5pc1VuZGVmaW5lZD1pc1VuZGVmaW5lZCxleHBvcnRzLmlzUmVnRXhwPWlzUmVnRXhwLGV4cG9ydHMuaXNPYmplY3Q9aXNPYmplY3QsZXhwb3J0cy5pc0RhdGU9aXNEYXRlLGV4cG9ydHMuaXNFcnJvcj1pc0Vycm9yLGV4cG9ydHMuaXNGdW5jdGlvbj1pc0Z1bmN0aW9uLGV4cG9ydHMuaXNQcmltaXRpdmU9aXNQcmltaXRpdmUsZXhwb3J0cy5pc0J1ZmZlcj1yZXF1aXJlKFwiLi9zdXBwb3J0L2lzQnVmZmVyXCIpO3ZhciBtb250aHM9W1wiSmFuXCIsXCJGZWJcIixcIk1hclwiLFwiQXByXCIsXCJNYXlcIixcIkp1blwiLFwiSnVsXCIsXCJBdWdcIixcIlNlcFwiLFwiT2N0XCIsXCJOb3ZcIixcIkRlY1wiXTtleHBvcnRzLmxvZz1mdW5jdGlvbigpe2NvbnNvbGUubG9nKFwiJXMgLSAlc1wiLHRpbWVzdGFtcCgpLGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKSl9LGV4cG9ydHMuaW5oZXJpdHM9cmVxdWlyZShcImluaGVyaXRzXCIpLGV4cG9ydHMuX2V4dGVuZD1mdW5jdGlvbihlLHIpe2lmKCFyfHwhaXNPYmplY3QocikpcmV0dXJuIGU7Zm9yKHZhciB0PU9iamVjdC5rZXlzKHIpLG49dC5sZW5ndGg7bi0tOyllW3Rbbl1dPXJbdFtuXV07cmV0dXJuIGV9O1xufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJyksdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcblxufSx7XCIuL3N1cHBvcnQvaXNCdWZmZXJcIjoxNDIsXCJfcHJvY2Vzc1wiOjEzOCxcImluaGVyaXRzXCI6MTI3fV0sMTQ0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGU9cmVxdWlyZShcIi4vbGliL3ZlY3RvcnRpbGUuanNcIiksbW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZUZlYXR1cmU9cmVxdWlyZShcIi4vbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzXCIpLG1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVMYXllcj1yZXF1aXJlKFwiLi9saWIvdmVjdG9ydGlsZWxheWVyLmpzXCIpO1xufSx7XCIuL2xpYi92ZWN0b3J0aWxlLmpzXCI6MTQ1LFwiLi9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanNcIjoxNDcsXCIuL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanNcIjoxNDh9XSwxNDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gVmVjdG9yVGlsZShlLHIpe3RoaXMubGF5ZXJzPWUucmVhZEZpZWxkcyhyZWFkVGlsZSx7fSxyKX1mdW5jdGlvbiByZWFkVGlsZShlLHIsaSl7aWYoMz09PWUpe3ZhciB0PW5ldyBWZWN0b3JUaWxlTGF5ZXIoaSxpLnJlYWRWYXJpbnQoKStpLnBvcyk7dC5sZW5ndGgmJihyW3QubmFtZV09dCl9fXZhciBWZWN0b3JUaWxlTGF5ZXI9cmVxdWlyZShcIi4vdmVjdG9ydGlsZWxheWVyXCIpO21vZHVsZS5leHBvcnRzPVZlY3RvclRpbGU7XG59LHtcIi4vdmVjdG9ydGlsZWxheWVyXCI6MTQ4fV0sMTQ2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFZlY3RvclRpbGVDbGlwcGVyKGkpe3RoaXMuZmVhdHVyZT1pLHRoaXMuZmluYWxSYXRpbz00MDk2L2kuZXh0ZW50Kk1hdGgucG93KDIsaS5keik7dmFyIHQ9NjQ7dC89dGhpcy5maW5hbFJhdGlvO3ZhciBzPWkuZXh0ZW50Pj5pLmR6O3Q+cyYmKHQ9cyksdGhpcy5kej1pLmR6LHRoaXMubWFyZ2luPXQsdGhpcy54bWluPXMqaS54UG9zLXQsdGhpcy55bWluPXMqaS55UG9zLXQsdGhpcy54bWF4PXRoaXMueG1pbitzKzIqdCx0aGlzLnltYXg9dGhpcy55bWluK3MrMip0LHRoaXMubGluZXM9W10sdGhpcy5fcHJldklzSW49ITEsdGhpcy50eXBlPWkudHlwZX12YXIgUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpO21vZHVsZS5leHBvcnRzPVZlY3RvclRpbGVDbGlwcGVyLFZlY3RvclRpbGVDbGlwcGVyLnByb3RvdHlwZS5sb2FkR2VvbWV0cnk9ZnVuY3Rpb24oKXt2YXIgaT10aGlzLmZlYXR1cmUuX3BiZjtpLnBvcz10aGlzLmZlYXR1cmUuX2dlb21ldHJ5O2Zvcih2YXIgdD1pLnJlYWRWYXJpbnQoKStpLnBvcyxzPTEsaD0wLG49MCxlPTA7aS5wb3M8dDspe2lmKCFoKXt2YXIgeD1pLnJlYWRWYXJpbnQoKTtzPTcmeCxoPXg+PjN9aWYoaC0tLDE9PT1zfHwyPT09cyluKz1pLnJlYWRTVmFyaW50KCksZSs9aS5yZWFkU1ZhcmludCgpLDE9PT1zP3RoaXMubW92ZVRvKG4sZSk6dGhpcy5saW5lVG8obixlKTtlbHNle2lmKDchPT1zKXRocm93IG5ldyBFcnJvcihcInVua25vd24gY29tbWFuZCBcIitzKTt0aGlzLmNsb3NlUG9seWdvbigpfX1yZXR1cm4gdGhpcy5yZXN1bHQoKX0sVmVjdG9yVGlsZUNsaXBwZXIucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbihpLHQpe3RoaXMuX3B1c2hfbGluZSgpLHRoaXMuX3ByZXZJc0luPXRoaXMuX2lzSW4oaSx0KSx0aGlzLl9tb3ZlVG8oaSx0LHRoaXMuX3ByZXZJc0luKSx0aGlzLl9wcmV2UHQ9bmV3IFBvaW50KGksdCksdGhpcy5fZmlyc3RQdD1uZXcgUG9pbnQoaSx0KX0sVmVjdG9yVGlsZUNsaXBwZXIucHJvdG90eXBlLmxpbmVUbz1mdW5jdGlvbihpLHQpe3ZhciBzLGgsbixlLHgseSxsLG8sbSxyLGEscCxfPXRoaXMuX2lzSW4oaSx0KTtpZihfKXRoaXMuX3ByZXZJc0luP3RoaXMuX2xpbmVUbyhpLHQsITApOihzPXRoaXMuX3ByZXZQdCxoPW5ldyBQb2ludChpLHQpLG49dGhpcy5faW50ZXJzZWN0KGgscyksdGhpcy5fbGluZVRvKG4ueCxuLnksITApLHRoaXMuX2xpbmVUbyhoLngsaC55LCEwKSk7ZWxzZSBpZih0aGlzLl9wcmV2SXNJbiloPXRoaXMuX3ByZXZQdCxzPW5ldyBQb2ludChpLHQpLG49dGhpcy5faW50ZXJzZWN0KGgscyksdGhpcy5fbGluZVRvKG4ueCxuLnksITApLHRoaXMuX2xpbmVUbyhzLngscy55LCExKTtlbHNlIGlmKGU9dGhpcy5fcHJldlB0LHg9bmV3IFBvaW50KGksdCksZS54PD10aGlzLnhtaW4mJngueDw9dGhpcy54bWlufHxlLng+PXRoaXMueG1heCYmeC54Pj10aGlzLnhtYXh8fGUueTw9dGhpcy55bWluJiZ4Lnk8PXRoaXMueW1pbnx8ZS55Pj10aGlzLnltYXgmJngueT49dGhpcy55bWF4KXRoaXMuX2xpbmVUbyh4LngseC55LCExKTtlbHNle2lmKG89W10sKGUueDx0aGlzLnhtaW4mJngueD50aGlzLnhtaW58fGUueD50aGlzLnhtaW4mJngueDx0aGlzLnhtaW4pJiYoeT0odGhpcy54bWluLWUueCkvKHgueC1lLngpLHA9ZS55K3kqKHgueS1lLnkpLHA8PXRoaXMueW1pbj9yPSExOnA+PXRoaXMueW1heD9yPSEwOihsPXt9LGwucmF0aW89eSxsLng9dGhpcy54bWluLGwueT1wLG8ucHVzaChsKSkpLChlLng8dGhpcy54bWF4JiZ4Lng+dGhpcy54bWF4fHxlLng+dGhpcy54bWF4JiZ4Lng8dGhpcy54bWF4KSYmKHk9KHRoaXMueG1heC1lLngpLyh4LngtZS54KSxwPWUueSt5Kih4LnktZS55KSxwPD10aGlzLnltaW4/cj0hMTpwPj10aGlzLnltYXg/cj0hMDoobD17fSxsLnJhdGlvPXksbC54PXRoaXMueG1heCxsLnk9cCxvLnB1c2gobCkpKSwoZS55PHRoaXMueW1pbiYmeC55PnRoaXMueW1pbnx8ZS55PnRoaXMueW1pbiYmeC55PHRoaXMueW1pbikmJih5PSh0aGlzLnltaW4tZS55KS8oeC55LWUueSksYT1lLngreSooeC54LWUueCksYTw9dGhpcy54bWluP209ITE6YT49dGhpcy54bWF4P209ITA6KGw9e30sbC5yYXRpbz15LGwueD1hLGwueT10aGlzLnltaW4sby5wdXNoKGwpKSksKGUueTx0aGlzLnltYXgmJngueT50aGlzLnltYXh8fGUueT50aGlzLnltYXgmJngueTx0aGlzLnltYXgpJiYoeT0odGhpcy55bWF4LWUueSkvKHgueS1lLnkpLGE9ZS54K3kqKHgueC1lLngpLGE8PXRoaXMueG1pbj9tPSExOmE+PXRoaXMueG1heD9tPSEwOihsPXt9LGwucmF0aW89eSxsLng9YSxsLnk9dGhpcy55bWF4LG8ucHVzaChsKSkpLDA9PT1vLmxlbmd0aCltP3I/dGhpcy5fbGluZVRvKHRoaXMueG1heCx0aGlzLnltYXgsITApOnRoaXMuX2xpbmVUbyh0aGlzLnhtYXgsdGhpcy55bWluLCEwKTpyP3RoaXMuX2xpbmVUbyh0aGlzLnhtaW4sdGhpcy55bWF4LCEwKTp0aGlzLl9saW5lVG8odGhpcy54bWluLHRoaXMueW1pbiwhMCk7ZWxzZSBpZihvLmxlbmd0aD4xJiZvWzBdLnJhdGlvPm9bMV0ucmF0aW8pdGhpcy5fbGluZVRvKG9bMV0ueCxvWzFdLnksITApLHRoaXMuX2xpbmVUbyhvWzBdLngsb1swXS55LCEwKTtlbHNlIGZvcih2YXIgdT0wO3U8by5sZW5ndGg7dSsrKXRoaXMuX2xpbmVUbyhvW3VdLngsb1t1XS55LCEwKTt0aGlzLl9saW5lVG8oeC54LHgueSwhMSl9dGhpcy5fcHJldklzSW49Xyx0aGlzLl9wcmV2UHQ9bmV3IFBvaW50KGksdCl9LFZlY3RvclRpbGVDbGlwcGVyLnByb3RvdHlwZS5jbG9zZVBvbHlnb249ZnVuY3Rpb24oKXt2YXIgaSx0O3RoaXMubGluZS5sZW5ndGg+MCYmKGk9dGhpcy5fZmlyc3RQdCx0PXRoaXMuX3ByZXZQdCwoaS54IT09dC54fHxpLnkhPT10LnkpJiZ0aGlzLmxpbmVUbyhpLngsaS55KSl9LFZlY3RvclRpbGVDbGlwcGVyLnByb3RvdHlwZS5yZXN1bHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHVzaF9saW5lKCksMD09PXRoaXMubGluZXMubGVuZ3RoP251bGw6dGhpcy5saW5lc30sVmVjdG9yVGlsZUNsaXBwZXIucHJvdG90eXBlLl9pc0luPWZ1bmN0aW9uKGksdCl7cmV0dXJuIGk+PXRoaXMueG1pbiYmaTw9dGhpcy54bWF4JiZ0Pj10aGlzLnltaW4mJnQ8PXRoaXMueW1heH0sVmVjdG9yVGlsZUNsaXBwZXIucHJvdG90eXBlLl9pbnRlcnNlY3Q9ZnVuY3Rpb24oaSx0KXt2YXIgcyxoLG4sZTtyZXR1cm4gdC54Pj10aGlzLnhtaW4mJnQueDw9dGhpcy54bWF4PyhoPXQueTw9dGhpcy55bWluP3RoaXMueW1pbjp0aGlzLnltYXgscz1pLngrKGgtaS55KS8odC55LWkueSkqKHQueC1pLngpKTp0Lnk+PXRoaXMueW1pbiYmdC55PD10aGlzLnltYXg/KHM9dC54PD10aGlzLnhtaW4/dGhpcy54bWluOnRoaXMueG1heCxoPWkueSsocy1pLngpLyh0LngtaS54KSoodC55LWkueSkpOihoPXQueTw9dGhpcy55bWluP3RoaXMueW1pbjp0aGlzLnltYXgscz10Lng8PXRoaXMueG1pbj90aGlzLnhtaW46dGhpcy54bWF4LG49KHMtaS54KS8odC54LWkueCksZT0oaC1pLnkpLyh0LnktaS55KSxlPm4/aD1pLnkrbioodC55LWkueSk6cz1pLngrZSoodC54LWkueCkpLG5ldyBQb2ludChzLGgpfSxWZWN0b3JUaWxlQ2xpcHBlci5wcm90b3R5cGUuX3B1c2hfbGluZT1mdW5jdGlvbigpe3RoaXMubGluZSYmKDE9PT10aGlzLnR5cGU/dGhpcy5saW5lLmxlbmd0aD4wJiZ0aGlzLmxpbmVzLnB1c2godGhpcy5saW5lKToyPT09dGhpcy50eXBlP3RoaXMubGluZS5sZW5ndGg+MSYmdGhpcy5saW5lcy5wdXNoKHRoaXMubGluZSk6Mz09PXRoaXMudHlwZSYmdGhpcy5saW5lLmxlbmd0aD4zJiZ0aGlzLmxpbmVzLnB1c2godGhpcy5saW5lKSksdGhpcy5saW5lPVtdfSxWZWN0b3JUaWxlQ2xpcHBlci5wcm90b3R5cGUuX21vdmVUbz1mdW5jdGlvbihpLHQscyl7MyE9PXRoaXMudHlwZT9zJiYoaT0oaS0odGhpcy54bWluK3RoaXMubWFyZ2luKSkqdGhpcy5maW5hbFJhdGlvLHQ9KHQtKHRoaXMueW1pbit0aGlzLm1hcmdpbikpKnRoaXMuZmluYWxSYXRpbyx0aGlzLmxpbmUucHVzaChuZXcgUG9pbnQoaSx0KSkpOihzfHwoaTx0aGlzLnhtaW4mJihpPXRoaXMueG1pbiksaT50aGlzLnhtYXgmJihpPXRoaXMueG1heCksdDx0aGlzLnltaW4mJih0PXRoaXMueW1pbiksdD50aGlzLnltYXgmJih0PXRoaXMueW1heCkpLGk9KGktKHRoaXMueG1pbit0aGlzLm1hcmdpbikpKnRoaXMuZmluYWxSYXRpbyx0PSh0LSh0aGlzLnltaW4rdGhpcy5tYXJnaW4pKSp0aGlzLmZpbmFsUmF0aW8sdGhpcy5saW5lLnB1c2gobmV3IFBvaW50KGksdCkpLHRoaXMuX2lzX2g9ITEsdGhpcy5faXNfdj0hMSl9LFZlY3RvclRpbGVDbGlwcGVyLnByb3RvdHlwZS5fbGluZVRvPWZ1bmN0aW9uKGksdCxzKXt2YXIgaCxuO2lmKDMhPT10aGlzLnR5cGUpaWYocyl7aWYoaT0oaS0odGhpcy54bWluK3RoaXMubWFyZ2luKSkqdGhpcy5maW5hbFJhdGlvLHQ9KHQtKHRoaXMueW1pbit0aGlzLm1hcmdpbikpKnRoaXMuZmluYWxSYXRpbyx0aGlzLmxpbmUubGVuZ3RoPjAmJihoPXRoaXMubGluZVt0aGlzLmxpbmUubGVuZ3RoLTFdLGgueD09PWkmJmgueT09PXQpKXJldHVybjt0aGlzLmxpbmUucHVzaChuZXcgUG9pbnQoaSx0KSl9ZWxzZSB0aGlzLmxpbmUmJnRoaXMubGluZS5sZW5ndGg+MCYmdGhpcy5fcHVzaF9saW5lKCk7ZWxzZSBpZihzfHwoaTx0aGlzLnhtaW4mJihpPXRoaXMueG1pbiksaT50aGlzLnhtYXgmJihpPXRoaXMueG1heCksdDx0aGlzLnltaW4mJih0PXRoaXMueW1pbiksdD50aGlzLnltYXgmJih0PXRoaXMueW1heCkpLGk9KGktKHRoaXMueG1pbit0aGlzLm1hcmdpbikpKnRoaXMuZmluYWxSYXRpbyx0PSh0LSh0aGlzLnltaW4rdGhpcy5tYXJnaW4pKSp0aGlzLmZpbmFsUmF0aW8sdGhpcy5saW5lJiZ0aGlzLmxpbmUubGVuZ3RoPjApe2g9dGhpcy5saW5lW3RoaXMubGluZS5sZW5ndGgtMV07dmFyIGU9aC54PT09aSx4PWgueT09PXQ7aWYoZSYmeClyZXR1cm47dGhpcy5faXNfaCYmZT8oaC54PWksaC55PXQsbj10aGlzLmxpbmVbdGhpcy5saW5lLmxlbmd0aC0yXSx0aGlzLl9pc19oPW4ueD09PWksdGhpcy5faXNfdj1uLnk9PT10KTp0aGlzLl9pc192JiZ4PyhoLng9aSxoLnk9dCxuPXRoaXMubGluZVt0aGlzLmxpbmUubGVuZ3RoLTJdLHRoaXMuX2lzX2g9bi54PT09aSx0aGlzLl9pc192PW4ueT09PXQpOih0aGlzLmxpbmUucHVzaChuZXcgUG9pbnQoaSx0KSksdGhpcy5faXNfaD1lLHRoaXMuX2lzX3Y9eCl9ZWxzZSB0aGlzLmxpbmUucHVzaChuZXcgUG9pbnQoaSx0KSl9O1xufSx7XCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDE0NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBWZWN0b3JUaWxlRmVhdHVyZShlLHQscixpLG8pe3RoaXMucHJvcGVydGllcz17fSx0aGlzLmV4dGVudD1yLHRoaXMudHlwZT0wLHRoaXMuX3BiZj1lLHRoaXMuX2dlb21ldHJ5PS0xLHRoaXMuX2tleXM9aSx0aGlzLl92YWx1ZXM9byxlLnJlYWRGaWVsZHMocmVhZEZlYXR1cmUsdGhpcyx0KX1mdW5jdGlvbiByZWFkRmVhdHVyZShlLHQscil7MT09ZT90Ll9pZD1yLnJlYWRWYXJpbnQoKToyPT1lP3JlYWRUYWcocix0KTozPT1lP3QudHlwZT1yLnJlYWRWYXJpbnQoKTo0PT1lJiYodC5fZ2VvbWV0cnk9ci5wb3MpfWZ1bmN0aW9uIHJlYWRUYWcoZSx0KXtmb3IodmFyIHI9ZS5yZWFkVmFyaW50KCkrZS5wb3M7ZS5wb3M8cjspe3ZhciBpPXQuX2tleXNbZS5yZWFkVmFyaW50KCldLG89dC5fdmFsdWVzW2UucmVhZFZhcmludCgpXTt0LnByb3BlcnRpZXNbaV09b319dmFyIFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKSxWZWN0b3JUaWxlQ2xpcHBlcj1yZXF1aXJlKFwiLi92ZWN0b3J0aWxlY2xpcHBlclwiKTttb2R1bGUuZXhwb3J0cz1WZWN0b3JUaWxlRmVhdHVyZSxWZWN0b3JUaWxlRmVhdHVyZS50eXBlcz1bXCJVbmtub3duXCIsXCJQb2ludFwiLFwiTGluZVN0cmluZ1wiLFwiUG9seWdvblwiXSxWZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUubG9hZEdlb21ldHJ5PWZ1bmN0aW9uKCl7dmFyIGU7aWYodGhpcy5keil7dmFyIHQ9bmV3IFZlY3RvclRpbGVDbGlwcGVyKHRoaXMpO2U9dC5sb2FkR2VvbWV0cnkoKX1lbHNle2Zvcih2YXIgcj0wLGk9dGhpcy5leHRlbnQ7aT40MDk2OylyKz0xLGk+Pj0xO3ZhciBvPXRoaXMuX3BiZjtvLnBvcz10aGlzLl9nZW9tZXRyeTt2YXIgYSxuPW8ucmVhZFZhcmludCgpK28ucG9zLHM9MSxwPTAsaD0wLHU9MDtmb3IoZT1bXTtvLnBvczxuOyl7aWYoIXApe3ZhciBsPW8ucmVhZFZhcmludCgpO3M9NyZsLHA9bD4+M31pZihwLS0sMT09PXN8fDI9PT1zKWgrPW8ucmVhZFNWYXJpbnQoKSx1Kz1vLnJlYWRTVmFyaW50KCksMT09PXMmJihhJiZlLnB1c2goYSksYT1bXSksYS5wdXNoKG5ldyBQb2ludChoPj5yLHU+PnIpKTtlbHNle2lmKDchPT1zKXRocm93IG5ldyBFcnJvcihcInVua25vd24gY29tbWFuZCBcIitzKTthJiZhLnB1c2goYVswXS5jbG9uZSgpKX19YSYmZS5wdXNoKGEpfXJldHVybiBlfSxWZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUuYmJveD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX3BiZjtlLnBvcz10aGlzLl9nZW9tZXRyeTtmb3IodmFyIHQ9ZS5yZWFkVmFyaW50KCkrZS5wb3Mscj0xLGk9MCxvPTAsYT0wLG49MS8wLHM9LSgxLzApLHA9MS8wLGg9LSgxLzApO2UucG9zPHQ7KXtpZighaSl7dmFyIHU9ZS5yZWFkVmFyaW50KCk7cj03JnUsaT11Pj4zfWlmKGktLSwxPT09cnx8Mj09PXIpbys9ZS5yZWFkU1ZhcmludCgpLGErPWUucmVhZFNWYXJpbnQoKSxuPm8mJihuPW8pLG8+cyYmKHM9bykscD5hJiYocD1hKSxhPmgmJihoPWEpO2Vsc2UgaWYoNyE9PXIpdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBjb21tYW5kIFwiK3IpfXJldHVybltuLHAscyxoXX0sVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTj1mdW5jdGlvbihlLHQscil7Zm9yKHZhciBpPXRoaXMuZXh0ZW50Kk1hdGgucG93KDIsciksbz10aGlzLmV4dGVudCplLGE9dGhpcy5leHRlbnQqdCxuPXRoaXMubG9hZEdlb21ldHJ5KCkscz1WZWN0b3JUaWxlRmVhdHVyZS50eXBlc1t0aGlzLnR5cGVdLHA9MDtwPG4ubGVuZ3RoO3ArKylmb3IodmFyIGg9bltwXSx1PTA7dTxoLmxlbmd0aDt1Kyspe3ZhciBsPWhbdV0sZD0xODAtMzYwKihsLnkrYSkvaTtoW3VdPVszNjAqKGwueCtvKS9pLTE4MCwzNjAvTWF0aC5QSSpNYXRoLmF0YW4oTWF0aC5leHAoZCpNYXRoLlBJLzE4MCkpLTkwXX1yZXR1cm5cIlBvaW50XCI9PT1zJiYxPT09bi5sZW5ndGg/bj1uWzBdWzBdOlwiUG9pbnRcIj09PXM/KG49blswXSxzPVwiTXVsdGlQb2ludFwiKTpcIkxpbmVTdHJpbmdcIj09PXMmJjE9PT1uLmxlbmd0aD9uPW5bMF06XCJMaW5lU3RyaW5nXCI9PT1zJiYocz1cIk11bHRpTGluZVN0cmluZ1wiKSx7dHlwZTpcIkZlYXR1cmVcIixnZW9tZXRyeTp7dHlwZTpzLGNvb3JkaW5hdGVzOm59LHByb3BlcnRpZXM6dGhpcy5wcm9wZXJ0aWVzfX07XG59LHtcIi4vdmVjdG9ydGlsZWNsaXBwZXJcIjoxNDYsXCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDE0ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBWZWN0b3JUaWxlTGF5ZXIoZSx0KXt0aGlzLnZlcnNpb249MSx0aGlzLm5hbWU9bnVsbCx0aGlzLmV4dGVudD00MDk2LHRoaXMubGVuZ3RoPTAsdGhpcy5fcGJmPWUsdGhpcy5fa2V5cz1bXSx0aGlzLl92YWx1ZXM9W10sdGhpcy5fZmVhdHVyZXM9W10sZS5yZWFkRmllbGRzKHJlYWRMYXllcix0aGlzLHQpLHRoaXMubGVuZ3RoPXRoaXMuX2ZlYXR1cmVzLmxlbmd0aH1mdW5jdGlvbiByZWFkTGF5ZXIoZSx0LHIpezE1PT09ZT90LnZlcnNpb249ci5yZWFkVmFyaW50KCk6MT09PWU/dC5uYW1lPXIucmVhZFN0cmluZygpOjU9PT1lP3QuZXh0ZW50PXIucmVhZFZhcmludCgpOjI9PT1lP3QuX2ZlYXR1cmVzLnB1c2goci5wb3MpOjM9PT1lP3QuX2tleXMucHVzaChyLnJlYWRTdHJpbmcoKSk6ND09PWUmJnQuX3ZhbHVlcy5wdXNoKHJlYWRWYWx1ZU1lc3NhZ2UocikpfWZ1bmN0aW9uIHJlYWRWYWx1ZU1lc3NhZ2UoZSl7Zm9yKHZhciB0PW51bGwscj1lLnJlYWRWYXJpbnQoKStlLnBvcztlLnBvczxyOyl7dmFyIGE9ZS5yZWFkVmFyaW50KCk+PjM7dD0xPT09YT9lLnJlYWRTdHJpbmcoKToyPT09YT9lLnJlYWRGbG9hdCgpOjM9PT1hP2UucmVhZERvdWJsZSgpOjQ9PT1hP2UucmVhZFZhcmludDY0KCk6NT09PWE/ZS5yZWFkVmFyaW50KCk6Nj09PWE/ZS5yZWFkU1ZhcmludCgpOjc9PT1hP2UucmVhZEJvb2xlYW4oKTpudWxsfXJldHVybiB0fXZhciBWZWN0b3JUaWxlRmVhdHVyZT1yZXF1aXJlKFwiLi92ZWN0b3J0aWxlZmVhdHVyZS5qc1wiKTttb2R1bGUuZXhwb3J0cz1WZWN0b3JUaWxlTGF5ZXIsVmVjdG9yVGlsZUxheWVyLnByb3RvdHlwZS5mZWF0dXJlPWZ1bmN0aW9uKGUpe2lmKDA+ZXx8ZT49dGhpcy5fZmVhdHVyZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcImZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kc1wiKTt0aGlzLl9wYmYucG9zPXRoaXMuX2ZlYXR1cmVzW2VdO3ZhciB0PXRoaXMuX3BiZi5yZWFkVmFyaW50KCkrdGhpcy5fcGJmLnBvcztyZXR1cm4gbmV3IFZlY3RvclRpbGVGZWF0dXJlKHRoaXMuX3BiZix0LHRoaXMuZXh0ZW50LHRoaXMuX2tleXMsdGhpcy5fdmFsdWVzKX07XG59LHtcIi4vdmVjdG9ydGlsZWZlYXR1cmUuanNcIjoxNDd9XSwxNDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGJ1bmRsZUZuPWFyZ3VtZW50c1szXSxzb3VyY2VzPWFyZ3VtZW50c1s0XSxjYWNoZT1hcmd1bWVudHNbNV0sc3RyaW5naWZ5PUpTT04uc3RyaW5naWZ5O21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHIpe2Zvcih2YXIgZSx0PU9iamVjdC5rZXlzKGNhY2hlKSxuPTAsbz10Lmxlbmd0aDtvPm47bisrKXt2YXIgYT10W25dLGk9Y2FjaGVbYV0uZXhwb3J0cztpZihpPT09cnx8aVtcImRlZmF1bHRcIl09PT1yKXtlPWE7YnJlYWt9fWlmKCFlKXtlPU1hdGguZmxvb3IoTWF0aC5wb3coMTYsOCkqTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoMTYpO2Zvcih2YXIgcz17fSxuPTAsbz10Lmxlbmd0aDtvPm47bisrKXt2YXIgYT10W25dO3NbYV09YX1zb3VyY2VzW2VdPVtGdW5jdGlvbihbXCJyZXF1aXJlXCIsXCJtb2R1bGVcIixcImV4cG9ydHNcIl0sXCIoXCIrcitcIikoc2VsZilcIiksc119dmFyIHU9TWF0aC5mbG9vcihNYXRoLnBvdygxNiw4KSpNYXRoLnJhbmRvbSgpKS50b1N0cmluZygxNiksZj17fTtmW2VdPWUsc291cmNlc1t1XT1bRnVuY3Rpb24oW1wicmVxdWlyZVwiXSxcInZhciBmID0gcmVxdWlyZShcIitzdHJpbmdpZnkoZSkrXCIpOyhmLmRlZmF1bHQgPyBmLmRlZmF1bHQgOiBmKShzZWxmKTtcIiksZl07dmFyIGM9XCIoXCIrYnVuZGxlRm4rXCIpKHtcIitPYmplY3Qua2V5cyhzb3VyY2VzKS5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHN0cmluZ2lmeShyKStcIjpbXCIrc291cmNlc1tyXVswXStcIixcIitzdHJpbmdpZnkoc291cmNlc1tyXVsxXSkrXCJdXCJ9KS5qb2luKFwiLFwiKStcIn0se30sW1wiK3N0cmluZ2lmeSh1KStcIl0pXCIsbD13aW5kb3cuVVJMfHx3aW5kb3cud2Via2l0VVJMfHx3aW5kb3cubW96VVJMfHx3aW5kb3cubXNVUkw7cmV0dXJuIG5ldyBXb3JrZXIobC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2NdLHt0eXBlOlwidGV4dC9qYXZhc2NyaXB0XCJ9KSkpfTtcbn0se31dfSx7fSxbMjRdKSgyNClcbn0pO1xuXG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hcGJveC1nbC5qcy5tYXAiLCJMLk1hcGJveEdMID0gTC5MYXllci5leHRlbmQoe1xuICAgIG9wdGlvbnM6IHtcbiAgICAgIHVwZGF0ZUludGVydmFsOiAzMlxuICAgIH0sXG5cbiAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgIG1hcGJveGdsLmFjY2Vzc1Rva2VuID0gb3B0aW9ucy5hY2Nlc3NUb2tlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IHNob3VsZCBwcm92aWRlIGEgTWFwYm94IEdMIGFjY2VzcyB0b2tlbiBhcyBhIHRva2VuIG9wdGlvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgdmVyc2lvbiBvZiBgZm5gIHRoYXQgb25seSBmaXJlcyBvbmNlIGV2ZXJ5IGB0aW1lYCBtaWxsc2Vjb25kcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gdGhlIGZ1bmN0aW9uIHRvIGJlIHRocm90dGxlZFxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSBtaWxsc2Vjb25kcyByZXF1aXJlZCBiZXR3ZWVuIGZ1bmN0aW9uIGNhbGxzXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gY29udGV4dCB0aGUgdmFsdWUgb2YgYHRoaXNgIHdpdGggd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZFxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IGRlYm91bmNlZCBmdW5jdGlvblxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIHRocm90dGxlID0gZnVuY3Rpb24gKGZuLCB0aW1lLCBjb250ZXh0KSB7XG4gICAgICAgICAgICB2YXIgbG9jaywgYXJncywgd3JhcHBlckZuLCBsYXRlcjtcblxuICAgICAgICAgICAgbGF0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVzZXQgbG9jayBhbmQgY2FsbCBpZiBxdWV1ZWRcbiAgICAgICAgICAgICAgICBsb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgd3JhcHBlckZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICBhcmdzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgd3JhcHBlckZuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCB0b28gc29vbiwgcXVldWUgdG8gY2FsbCBsYXRlclxuICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCBhbmQgbG9jayB1bnRpbCBsYXRlclxuICAgICAgICAgICAgICAgICAgICBmbi5hcHBseShjb250ZXh0LCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGxhdGVyLCB0aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbG9jayA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXJGbjtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBzZXR1cCB0aHJvdHRsaW5nIHRoZSB1cGRhdGUgZXZlbnQgd2hlbiBwYW5uaW5nXG4gICAgICAgIHRoaXMuX3Rocm90dGxlZFVwZGF0ZSA9IHRocm90dGxlKEwuVXRpbC5iaW5kKHRoaXMuX3VwZGF0ZSwgdGhpcyksIHRoaXMub3B0aW9ucy51cGRhdGVJbnRlcnZhbCk7XG4gICAgfSxcblxuICAgIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgICAgIGlmICghdGhpcy5fZ2xDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRDb250YWluZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcC5fcGFuZXMudGlsZVBhbmUuYXBwZW5kQ2hpbGQodGhpcy5fZ2xDb250YWluZXIpO1xuXG4gICAgICAgIHRoaXMuX2luaXRHTCgpO1xuXG4gICAgICAgIHRoaXMuX29mZnNldCA9IHRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChbMCwgMF0pO1xuXG4gICAgICAgIC8vIHdvcmsgYXJvdW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWxlYWZsZXQvaXNzdWVzLzQ3XG4gICAgICAgIGlmIChtYXAub3B0aW9ucy56b29tQW5pbWF0aW9uKSB7XG4gICAgICAgICAgICBMLkRvbUV2ZW50Lm9uKG1hcC5fcHJveHksIEwuRG9tVXRpbC5UUkFOU0lUSU9OX0VORCwgdGhpcy5fdHJhbnNpdGlvbkVuZCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgb25SZW1vdmU6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgaWYgKHRoaXMuX21hcC5vcHRpb25zLnpvb21BbmltYXRpb24pIHtcbiAgICAgICAgICAgIEwuRG9tRXZlbnQub2ZmKHRoaXMuX21hcC5fcHJveHksIEwuRG9tVXRpbC5UUkFOU0lUSU9OX0VORCwgdGhpcy5fdHJhbnNpdGlvbkVuZCwgdGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXAuZ2V0UGFuZXMoKS50aWxlUGFuZS5yZW1vdmVDaGlsZCh0aGlzLl9nbENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuX2dsTWFwLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLl9nbE1hcCA9IG51bGw7XG4gICAgfSxcblxuICAgIGdldEV2ZW50czogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbW92ZTogdGhpcy5fdGhyb3R0bGVkVXBkYXRlLCAvLyBzZW5zaWJseSB0aHJvdHRsZSB1cGRhdGluZyB3aGlsZSBwYW5uaW5nXG4gICAgICAgICAgICB6b29tYW5pbTogdGhpcy5fYW5pbWF0ZVpvb20sIC8vIGFwcGx5cyB0aGUgem9vbSBhbmltYXRpb24gdG8gdGhlIDxjYW52YXM+XG4gICAgICAgICAgICB6b29tOiB0aGlzLl9waW5jaFpvb20sIC8vIGFuaW1hdGUgZXZlcnkgem9vbSBldmVudCBmb3Igc21vb3RoZXIgcGluY2gtem9vbWluZ1xuICAgICAgICAgICAgem9vbXN0YXJ0OiB0aGlzLl96b29tU3RhcnQsIC8vIGZsYWcgc3RhcnRpbmcgYSB6b29tIHRvIGRpc2FibGUgcGFubmluZ1xuICAgICAgICAgICAgem9vbWVuZDogdGhpcy5fem9vbUVuZFxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICBfaW5pdENvbnRhaW5lcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZ2xDb250YWluZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnLCAnbGVhZmxldC1nbC1sYXllcicpO1xuXG4gICAgICAgIHZhciBzaXplID0gdGhpcy5fbWFwLmdldFNpemUoKTtcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoICA9IHNpemUueCArICdweCc7XG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBzaXplLnkgKyAncHgnO1xuICAgIH0sXG5cbiAgICBfaW5pdEdMOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjZW50ZXIgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCk7XG5cbiAgICAgICAgdmFyIG9wdGlvbnMgPSBMLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLCB7XG4gICAgICAgICAgICBjb250YWluZXI6IHRoaXMuX2dsQ29udGFpbmVyLFxuICAgICAgICAgICAgaW50ZXJhY3RpdmU6IGZhbHNlLFxuICAgICAgICAgICAgY2VudGVyOiBbY2VudGVyLmxuZywgY2VudGVyLmxhdF0sXG4gICAgICAgICAgICB6b29tOiB0aGlzLl9tYXAuZ2V0Wm9vbSgpIC0gMSxcbiAgICAgICAgICAgIGF0dHJpYnV0aW9uQ29udHJvbDogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZ2xNYXAgPSBuZXcgbWFwYm94Z2wuTWFwKG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIGFsbG93IEdMIGJhc2UgbWFwIHRvIHBhbiBiZXlvbmQgbWluL21heCBsYXRpdHVkZXNcbiAgICAgICAgdGhpcy5fZ2xNYXAudHJhbnNmb3JtLmxhdFJhbmdlID0gbnVsbDtcblxuICAgICAgICAvLyB0cmVhdCBjaGlsZCA8Y2FudmFzPiBlbGVtZW50IGxpa2UgTC5JbWFnZU92ZXJsYXlcbiAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2dsTWFwLl9jYW52YXMuY2FudmFzLCAnbGVhZmxldC1pbWFnZS1sYXllcicpO1xuICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fZ2xNYXAuX2NhbnZhcy5jYW52YXMsICdsZWFmbGV0LXpvb20tYW5pbWF0ZWQnKTtcbiAgICB9LFxuXG4gICAgX3VwZGF0ZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgLy8gdXBkYXRlIHRoZSBvZmZzZXQgc28gd2UgY2FuIGNvcnJlY3QgZm9yIGl0IGxhdGVyIHdoZW4gd2Ugem9vbVxuICAgICAgICB0aGlzLl9vZmZzZXQgPSB0aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQoWzAsIDBdKTtcblxuICAgICAgICBpZiAodGhpcy5fem9vbWluZykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaXplID0gdGhpcy5fbWFwLmdldFNpemUoKSxcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMuX2dsQ29udGFpbmVyLFxuICAgICAgICAgICAgZ2wgPSB0aGlzLl9nbE1hcCxcbiAgICAgICAgICAgIHRvcExlZnQgPSB0aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQoWzAsIDBdKTtcblxuICAgICAgICBMLkRvbVV0aWwuc2V0UG9zaXRpb24oY29udGFpbmVyLCB0b3BMZWZ0KTtcblxuICAgICAgICB2YXIgY2VudGVyID0gdGhpcy5fbWFwLmdldENlbnRlcigpO1xuXG4gICAgICAgIC8vIGdsLnNldFZpZXcoW2NlbnRlci5sYXQsIGNlbnRlci5sbmddLCB0aGlzLl9tYXAuZ2V0Wm9vbSgpIC0gMSwgMCk7XG4gICAgICAgIC8vIGNhbGxpbmcgc2V0VmlldyBkaXJlY3RseSBjYXVzZXMgc3luYyBpc3N1ZXMgYmVjYXVzZSBpdCB1c2VzIHJlcXVlc3RBbmltRnJhbWVcblxuICAgICAgICB2YXIgdHIgPSBnbC50cmFuc2Zvcm07XG4gICAgICAgIHRyLmNlbnRlciA9IG1hcGJveGdsLkxuZ0xhdC5jb252ZXJ0KFtjZW50ZXIubG5nLCBjZW50ZXIubGF0XSk7XG4gICAgICAgIHRyLnpvb20gPSB0aGlzLl9tYXAuZ2V0Wm9vbSgpIC0gMTtcblxuICAgICAgICBpZiAoZ2wudHJhbnNmb3JtLndpZHRoICE9PSBzaXplLnggfHwgZ2wudHJhbnNmb3JtLmhlaWdodCAhPT0gc2l6ZS55KSB7XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUud2lkdGggID0gc2l6ZS54ICsgJ3B4JztcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBzaXplLnkgKyAncHgnO1xuICAgICAgICAgICAgZ2wuX3Jlc2l6ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdsLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIHVwZGF0ZSB0aGUgbWFwIGNvbnN0YW50bHkgZHVyaW5nIGEgcGluY2ggem9vbVxuICAgIF9waW5jaFpvb206IGZ1bmN0aW9uIChlKSB7XG4gICAgICB0aGlzLl9nbE1hcC5qdW1wVG8oe1xuICAgICAgICB6b29tOiB0aGlzLl9tYXAuZ2V0Wm9vbSgpIC0gMSxcbiAgICAgICAgY2VudGVyOiB0aGlzLl9tYXAuZ2V0Q2VudGVyKClcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBib3Jyb3dlZCBmcm9tIEwuSW1hZ2VPdmVybGF5IGh0dHBzOi8vZ2l0aHViLmNvbS9MZWFmbGV0L0xlYWZsZXQvYmxvYi9tYXN0ZXIvc3JjL2xheWVyL0ltYWdlT3ZlcmxheS5qcyNMMTM5LUwxNDRcbiAgICBfYW5pbWF0ZVpvb206IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgc2NhbGUgPSB0aGlzLl9tYXAuZ2V0Wm9vbVNjYWxlKGUuem9vbSksXG4gICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbWFwLl9sYXRMbmdUb05ld0xheWVyUG9pbnQodGhpcy5fbWFwLmdldEJvdW5kcygpLmdldE5vcnRoV2VzdCgpLCBlLnpvb20sIGUuY2VudGVyKTtcblxuICAgICAgTC5Eb21VdGlsLnNldFRyYW5zZm9ybSh0aGlzLl9nbE1hcC5fY2FudmFzLmNhbnZhcywgb2Zmc2V0LnN1YnRyYWN0KHRoaXMuX29mZnNldCksIHNjYWxlKTtcbiAgICB9LFxuXG4gICAgX3pvb21TdGFydDogZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMuX3pvb21pbmcgPSB0cnVlO1xuICAgIH0sXG5cbiAgICBfem9vbUVuZDogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHNjYWxlID0gdGhpcy5fbWFwLmdldFpvb21TY2FsZSh0aGlzLl9tYXAuZ2V0Wm9vbSgpKSxcbiAgICAgICAgICBvZmZzZXQgPSB0aGlzLl9tYXAuX2xhdExuZ1RvTmV3TGF5ZXJQb2ludCh0aGlzLl9tYXAuZ2V0Qm91bmRzKCkuZ2V0Tm9ydGhXZXN0KCksIHRoaXMuX21hcC5nZXRab29tKCksIHRoaXMuX21hcC5nZXRDZW50ZXIoKSk7XG5cbiAgICAgIEwuRG9tVXRpbC5zZXRUcmFuc2Zvcm0odGhpcy5fZ2xNYXAuX2NhbnZhcy5jYW52YXMsIG9mZnNldC5zdWJ0cmFjdCh0aGlzLl9vZmZzZXQpLCBzY2FsZSk7XG4gICAgfSxcblxuICAgIF90cmFuc2l0aW9uRW5kOiBmdW5jdGlvbiAoZSkge1xuICAgICAgTC5VdGlsLnJlcXVlc3RBbmltRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKSxcbiAgICAgICAgICBjZW50ZXIgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCksXG4gICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbWFwLmxhdExuZ1RvQ29udGFpbmVyUG9pbnQodGhpcy5fbWFwLmdldEJvdW5kcygpLmdldE5vcnRoV2VzdCgpKTtcblxuICAgICAgICAgIC8vIHJlc2V0IHRoZSBzY2FsZSBhbmQgb2Zmc2V0XG4gICAgICAgICAgTC5Eb21VdGlsLnNldFRyYW5zZm9ybSh0aGlzLl9nbE1hcC5fY2FudmFzLmNhbnZhcywgb2Zmc2V0LCAxKTtcblxuICAgICAgICAgIC8vIGVuYWJsZSBwYW5uaW5nIG9uY2UgdGhlIGdsIG1hcCBpcyByZWFkeSBhZ2FpblxuICAgICAgICAgIHRoaXMuX2dsTWFwLm9uY2UoJ21vdmVlbmQnLCBMLlV0aWwuYmluZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3pvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy5fem9vbUVuZCgpO1xuICAgICAgICAgIH0sIHRoaXMpKTtcblxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbWFwIHBvc2l0aW9uXG4gICAgICAgICAgdGhpcy5fZ2xNYXAuanVtcFRvKHtcbiAgICAgICAgICAgICAgY2VudGVyOiBjZW50ZXIsXG4gICAgICAgICAgICAgIHpvb206IHpvb20gLSAxXG4gICAgICAgICAgfSk7XG4gICAgICB9LCB0aGlzKVxuICAgIH1cbn0pO1xuXG5MLm1hcGJveEdMID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEwuTWFwYm94R0wob3B0aW9ucyk7XG59O1xuIiwiaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgJ21hcGJveC1nbCc7XG5pbXBvcnQgJ21hcGJveC1nbC1sZWFmbGV0JztcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdlc3JpLWxlYWZsZXQnO1xuXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2hNZXRhZGF0YSAodXJsLCBjb250ZXh0KSB7XG4gIHJlcXVlc3QodXJsLCB7fSwgZnVuY3Rpb24gKGVycm9yLCBzdHlsZSkge1xuICAgIGlmICghZXJyb3IpIHtcbiAgICAgIHJlcXVlc3Qoc3R5bGUuc291cmNlcy5lc3JpLnVybCwge30sIGZ1bmN0aW9uIChlcnJvciwgdGlsZU1ldGFkYXRhKSB7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICBmb3JtYXRTdHlsZShzdHlsZSwgdGlsZU1ldGFkYXRhLCB1cmwpO1xuICAgICAgICAgIGNvbnRleHQuX21hcGJveEdMID0gTC5tYXBib3hHTCh7XG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogJ2V6cmVlJyxcbiAgICAgICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29udGV4dC5fcmVhZHkgPSB0cnVlO1xuICAgICAgICAgIGNvbnRleHQuZmlyZSgncmVhZHknLCB7fSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmZXRjaCB2ZWN0b3IgdGlsZSBzdHlsZSBtZXRhZGF0YScpO1xuICAgIH1cbiAgfSwgY29udGV4dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTdHlsZSAoc3R5bGUsIG1ldGFkYXRhLCBzdHlsZVVybCkge1xuICAvLyBpZiBhIHJlbGF0aXZlIHBhdGggaXMgcmVmZXJlbmNlZCwgdGhlIGRlZmF1bHQgc3R5bGUgY2FuIGJlIGZvdW5kIGluIGEgc3RhbmRhcmQgbG9jYXRpb25cbiAgaWYgKHN0eWxlLnNvdXJjZXMuZXNyaS51cmwgJiYgc3R5bGUuc291cmNlcy5lc3JpLnVybC5pbmRleE9mKCdodHRwJykgPT09IC0xKSB7XG4gICAgc3R5bGUuc291cmNlcy5lc3JpLnVybCA9IHN0eWxlVXJsLnJlcGxhY2UoJy9yZXNvdXJjZXMvc3R5bGVzL3Jvb3QuanNvbicsICcnKTtcbiAgfVxuXG4gIC8vIHJpZ2h0IG5vdyBBcmNHSVMgUHJvIHB1Ymxpc2hlZCB2ZWN0b3Igc2VydmljZXMgaGF2ZSBhIHNsaWdodGx5IGRpZmZlcmVudCBzaWduYXR1cmVcbiAgaWYgKG1ldGFkYXRhLnRpbGVzICYmIG1ldGFkYXRhLnRpbGVzWzBdLmNoYXJBdCgwKSAhPT0gJy8nKSB7XG4gICAgbWV0YWRhdGEudGlsZXNbMF0gPSAnLycgKyBtZXRhZGF0YS50aWxlc1swXTtcbiAgfVxuXG4gIGlmIChtZXRhZGF0YS50aWxlTWFwICYmIG1ldGFkYXRhLnRpbGVNYXAuY2hhckF0KDApICE9PSAnLycpIHtcbiAgICBtZXRhZGF0YS50aWxlTWFwID0gJy8nICsgbWV0YWRhdGEudGlsZU1hcDtcbiAgfVxuXG4gIHN0eWxlLnNvdXJjZXMuZXNyaSA9IHtcbiAgICB0eXBlOiAndmVjdG9yJyxcbiAgICBzY2hlbWU6ICd4eXonLFxuICAgIHRpbGVqc29uOiBtZXRhZGF0YS50aWxlanNvbiB8fCAnMi4wLjAnLFxuICAgIGZvcm1hdDogKG1ldGFkYXRhLnRpbGVJbmZvICYmIG1ldGFkYXRhLnRpbGVJbmZvLmZvcm1hdCkgfHwgJ3BiZicsXG4gICAgaW5kZXg6IG1ldGFkYXRhLnRpbGVNYXAgPyBzdHlsZS5zb3VyY2VzLmVzcmkudXJsICsgbWV0YWRhdGEudGlsZU1hcCA6IG51bGwsXG4gICAgdGlsZXM6IFtcbiAgICAgIHN0eWxlLnNvdXJjZXMuZXNyaS51cmwgKyBtZXRhZGF0YS50aWxlc1swXVxuICAgIF0sXG4gICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgIG5hbWU6IG1ldGFkYXRhLm5hbWVcbiAgfTtcblxuICBpZiAoc3R5bGUuZ2x5cGhzLmluZGV4T2YoJ2h0dHAnKSA9PT0gLTEpIHtcbiAgICAvLyBzZXQgcGF0aHMgdG8gc3ByaXRlIGFuZCBnbHlwaHNcbiAgICBzdHlsZS5nbHlwaHMgPSBzdHlsZVVybC5yZXBsYWNlKCdzdHlsZXMvcm9vdC5qc29uJywgc3R5bGUuZ2x5cGhzLnJlcGxhY2UoJy4uLycsICcnKSk7XG4gICAgc3R5bGUuc3ByaXRlID0gc3R5bGVVcmwucmVwbGFjZSgnc3R5bGVzL3Jvb3QuanNvbicsIHN0eWxlLnNwcml0ZS5yZXBsYWNlKCcuLi8nLCAnJykpO1xuICB9XG59XG5cbmV4cG9ydCB2YXIgVXRpbCA9IHtcbiAgZmV0Y2hNZXRhZGF0YTogZmV0Y2hNZXRhZGF0YSxcbiAgZm9ybWF0U3R5bGU6IGZvcm1hdFN0eWxlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBVdGlsO1xuIiwiaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnZXNyaS1sZWFmbGV0JztcbmltcG9ydCB7IGZldGNoTWV0YWRhdGEgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdmFyIEJhc2VtYXAgPSBMLkxheWVyLmV4dGVuZCh7XG4gIHN0YXRpY3M6IHtcbiAgICBVUkxQUkVGSVg6ICdodHRwczovL3d3dy5hcmNnaXMuY29tL3NoYXJpbmcvcmVzdC9jb250ZW50L2l0ZW1zLycsXG4gICAgVVJMU1VGRklYOiAnL3Jlc291cmNlcy9zdHlsZXMvcm9vdC5qc29uJyxcbiAgICBTVFlMRVM6IHtcbiAgICAgICdEYXJrR3JheSc6ICc1NzQzNmMwMWJjNzU0ZGJiODdkZmI2MzZiNjQ4NDAyMicsXG4gICAgICAnR3JheSc6ICcxZTQ3MTY4ZDE4MTI0OGU0OTE1NDFmZmQ1YTkxYzBkZScsXG4gICAgICAnSHlicmlkJzogJ2FmNjA2M2Q2OTA2YzRlYjU4OWRmZTAzODE5NjEwNjYwJyxcbiAgICAgICdOYXZpZ2F0aW9uJzogJ2UxOWU5MzMwYmYwODQ5MGNhODM1M2Q3NmI1ZTJlNjU4JyxcbiAgICAgICdTdHJlZXRzJzogJ2E2MGEzN2EyN2NjMTQwZGRhZDE1ZjkxOWNkNWE2OWYyJyxcbiAgICAgICdTdHJlZXRzTmlnaHQnOiAnOTJjNTUxYzlmMDdiNDE0Nzg0NmFhZTI3M2U4MjI3MTQnLFxuICAgICAgJ1N0cmVldHNSZWxpZWYnOiAnNzhjMGE5YWI0ZmJmNDE5OGE4Yjk1MTg0OGFhYjE5ZDgnLFxuICAgICAgJ1RvcG9ncmFwaGljJzogJzg2ZDVlZDRiNmRjNzQxZGU5ZGFkNWYwZmJlMDlhZTk1JyxcbiAgICAgICdTcHJpbmcnOiAnNzYzODg0OTgzZDM1NDRjMGE0MThhOTc5OTI4ODFmY2UnLFxuICAgICAgJ05ld3NwYXBlcic6ICc0ZjQ4NDNkOTljMzQ0MzZmODI5MjA5MzIzMTc4OTNhZScsXG4gICAgICAnTWlkQ2VudHVyeSc6ICcyNjdmNDRmMDhhODQ0YzdhYmVlMmI2MmIwMDYwMDU0MCcsXG4gICAgICAnTW9kZXJuQW50aXF1ZSc6ICc5OTZkOWU3YTNhYWM0NTE0YmI2OTJjZTdhOTkwZjFjMScsXG4gICAgICAnQmxhY2tBbmRXaGl0ZSc6ICczMTYxNDQzMTc5MjQ0NzAyYTVlMDQ0OTAxMDAxM2I1NCdcbiAgICB9XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAvLyBMLkxheWVyIGV4cGVjdHMgYSBKU09OIG9iamVjdCBsaXRlcmFsIHRvIGJlIHBhc3NlZCBpbiBjb25zdHJ1Y3RvclxuICAgIG9wdGlvbnMgPSB7XG4gICAgICBrZXk6IG9wdGlvbnNcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmtleSA9PT0gJ3N0cmluZycgJiYgQmFzZW1hcC5TVFlMRVNbb3B0aW9ucy5rZXldKSB7XG4gICAgICB2YXIgdXJsID0gQmFzZW1hcC5VUkxQUkVGSVggKyBCYXNlbWFwLlNUWUxFU1tvcHRpb25zLmtleV0gKyBCYXNlbWFwLlVSTFNVRkZJWDtcbiAgICAgIGZldGNoTWV0YWRhdGEodXJsLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMLmVzcmkuVmVjdG9yLkJhc2VtYXA6IEludmFsaWQgcGFyYW1ldGVyLiBVc2Ugb25lIG9mIFwiRGFya0dyYXlcIiwgXCJHcmF5XCIsIFwiSHlicmlkXCIsIFwiTmF2aWdhdGlvblwiLCBcIlN0cmVldHNcIiwgXCJTdHJlZXRzTmlnaHRcIiwgXCJTdHJlZXRzUmVsaWVmXCIsIFwiVG9wb2dyYXBoaWNcIicpO1xuICAgIH1cbiAgfSxcblxuICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xuICAgIHRoaXMuX21hcCA9IG1hcDtcblxuICAgIFV0aWwuc2V0RXNyaUF0dHJpYnV0aW9uKG1hcCk7XG5cbiAgICBpZiAobWFwLmF0dHJpYnV0aW9uQ29udHJvbCkge1xuICAgICAgLy8gOTUlIHN1cmUgdGhpcyBpcyB0aGUgcmlnaHQgc3RhdGljIGF0dHJpYnV0aW9uIHVybFxuICAgICAgVXRpbC5fZ2V0QXR0cmlidXRpb25EYXRhKCdodHRwczovL3N0YXRpYy5hcmNnaXMuY29tL2F0dHJpYnV0aW9uL1dvcmxkX1N0cmVldF9NYXAnLCBtYXApO1xuICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5hZGRBdHRyaWJ1dGlvbignPHNwYW4gY2xhc3M9XCJlc3JpLWR5bmFtaWMtYXR0cmlidXRpb25cIj5VU0dTLCBOT0FBPC9zcGFuPicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZWFkeSkge1xuICAgICAgdGhpcy5fYXN5bmNBZGQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbmNlKCdyZWFkeScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fYXN5bmNBZGQoKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH1cbiAgfSxcblxuICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgIG1hcC5vZmYoJ21vdmVlbmQnLCBVdGlsLl91cGRhdGVNYXBBdHRyaWJ1dGlvbik7XG4gICAgbWFwLnJlbW92ZUxheWVyKHRoaXMuX21hcGJveEdMKTtcblxuICAgIGlmIChtYXAuYXR0cmlidXRpb25Db250cm9sKSB7XG4gICAgICB2YXIgdmVjdG9yQXR0cmlidXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdlc3JpLWR5bmFtaWMtYXR0cmlidXRpb24nKVswXS5vdXRlckhUTUw7XG4gICAgICAvLyB0aGlzIGRvZXNuJ3Qgd29yaywgbm90IHN1cmUgd2h5LlxuICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5yZW1vdmVBdHRyaWJ1dGlvbih2ZWN0b3JBdHRyaWJ1dGlvbik7XG4gICAgfVxuICB9LFxuXG4gIF9hc3luY0FkZDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAvLyBzZXQgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIG1hcCB0byB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgdGlsZXNcbiAgICBtYXAuZ2V0Q29udGFpbmVyKCkuc3R5bGUuYmFja2dyb3VuZCA9IHRoaXMuX21hcGJveEdMLm9wdGlvbnMuc3R5bGUubGF5ZXJzWzBdLnBhaW50WydiYWNrZ3JvdW5kLWNvbG9yJ107XG5cbiAgICBtYXAub24oJ21vdmVlbmQnLCBVdGlsLl91cGRhdGVNYXBBdHRyaWJ1dGlvbik7XG4gICAgdGhpcy5fbWFwYm94R0wuYWRkVG8obWFwLCB0aGlzKTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlbWFwIChrZXkpIHtcbiAgcmV0dXJuIG5ldyBCYXNlbWFwKGtleSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2VtYXA7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IHJlcXVlc3QsIFV0aWwgfSBmcm9tICdlc3JpLWxlYWZsZXQnO1xuaW1wb3J0IHsgZmV0Y2hNZXRhZGF0YSwgZm9ybWF0U3R5bGUgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdmFyIExheWVyID0gTC5MYXllci5leHRlbmQoe1xuICBzdGF0aWNzOiB7XG4gICAgVVJMUFJFRklYOiAnaHR0cHM6Ly93d3cuYXJjZ2lzLmNvbS9zaGFyaW5nL3Jlc3QvY29udGVudC9pdGVtcy8nXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAvLyBMLkxheWVyIGV4cGVjdHMgYSBKU09OIG9iamVjdCBsaXRlcmFsIHRvIGJlIHBhc3NlZCBpbiBjb25zdHJ1Y3RvclxuICAgIG9wdGlvbnMgPSB7XG4gICAgICBpZDogb3B0aW9uc1xuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgaXRlbU1ldGFkYXRhVXJsID0gTGF5ZXIuVVJMUFJFRklYICsgb3B0aW9ucy5pZDtcbiAgICAgIHZhciB0aWxlVXJsO1xuICAgICAgdmFyIHN0eWxlVXJsO1xuXG4gICAgICByZXF1ZXN0KGl0ZW1NZXRhZGF0YVVybCwge30sIGZ1bmN0aW9uIChlcnJvciwgbWV0YWRhdGEpIHtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHRpbGVVcmwgPSBtZXRhZGF0YS51cmw7XG5cbiAgICAgICAgICAvLyBjdXN0b20gdGlsZXNldCBwdWJsaXNoZWQgdXNpbmcgQXJjR0lTIFByb1xuICAgICAgICAgIGlmICh0aWxlVXJsLmluZGV4T2YoJ2Jhc2VtYXBzLmFyY2dpcy5jb20nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbVRpbGVzZXQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gaWYgY29weXJpZ2h0IGluZm8gd2FzIHB1Ymxpc2hlZCwgZGlzcGxheSBpdC5cbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5hY2Nlc3NJbmZvcm1hdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLl9jb3B5cmlnaHRUZXh0ID0gbWV0YWRhdGEuYWNjZXNzSW5mb3JtYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXF1ZXN0KHRpbGVVcmwsIHt9LCBmdW5jdGlvbiAoZXJyb3IsIHRpbGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gcmlnaHQgbm93IEFyY0dJUyBQcm8gcHVibGlzaGVkIHZlY3RvciBzZXJ2aWNlcyBoYXZlIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHNpZ25hdHVyZVxuICAgICAgICAgICAgICAgIGlmICh0aWxlTWV0YWRhdGEuZGVmYXVsdFN0eWxlcy5jaGFyQXQoMCkgIT09ICcvJykge1xuICAgICAgICAgICAgICAgICAgdGlsZU1ldGFkYXRhLmRlZmF1bHRTdHlsZXMgPSAnLycgKyB0aWxlTWV0YWRhdGEuZGVmYXVsdFN0eWxlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdHlsZVVybCA9IHRpbGVVcmwgKyB0aWxlTWV0YWRhdGEuZGVmYXVsdFN0eWxlcyArICcvcm9vdC5qc29uJztcbiAgICAgICAgICAgICAgICByZXF1ZXN0KHN0eWxlVXJsLCB7fSwgZnVuY3Rpb24gKGVycm9yLCBzdHlsZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXRTdHlsZShzdHlsZSwgdGlsZU1ldGFkYXRhLCBzdHlsZVVybCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwYm94R0wgPSBMLm1hcGJveEdMKHtcbiAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogJ2V6cmVlJyxcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ3JlYWR5Jywge30sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY3VzdG9tIHN5bWJvbG9neSBhcHBsaWVkIHRvIGhvc3RlZCBiYXNlbWFwIHRpbGVzXG4gICAgICAgICAgICBmZXRjaE1ldGFkYXRhKGl0ZW1NZXRhZGF0YVVybCArICcvcmVzb3VyY2VzL3N0eWxlcy9yb290Lmpzb24nLCB0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0wuZXNyaS5WZWN0b3IuTGF5ZXI6IEludmFsaWQgcGFyYW1ldGVyLiBVc2UgdGhlIGlkIG9mIGFuIEFyY0dJUyBPbmxpbmUgdmVjdG9yIHRpbGUgaXRlbScpO1xuICAgIH1cbiAgfSxcblxuICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xuICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICBVdGlsLnNldEVzcmlBdHRyaWJ1dGlvbihtYXApO1xuXG4gICAgaWYgKHRoaXMuX3JlYWR5KSB7XG4gICAgICB0aGlzLl9hc3luY0FkZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uY2UoJ3JlYWR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9hc3luY0FkZCgpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICB9LFxuXG4gIG9uUmVtb3ZlOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgbWFwLm9mZignbW92ZWVuZCcsIFV0aWwuX3VwZGF0ZU1hcEF0dHJpYnV0aW9uKTtcbiAgICBtYXAucmVtb3ZlTGF5ZXIodGhpcy5fbWFwYm94R0wpO1xuXG4gICAgaWYgKG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wpIHtcbiAgICAgIHZhciB2ZWN0b3JBdHRyaWJ1dGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VzcmktZHluYW1pYy1hdHRyaWJ1dGlvbicpWzBdLm91dGVySFRNTDtcbiAgICAgIC8vIHRoaXMgZG9lc24ndCB3b3JrLCBub3Qgc3VyZSB3aHkuXG4gICAgICBtYXAuYXR0cmlidXRpb25Db250cm9sLnJlbW92ZUF0dHJpYnV0aW9uKHZlY3RvckF0dHJpYnV0aW9uKTtcbiAgICB9XG4gIH0sXG5cbiAgX2FzeW5jQWRkOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1hcCA9IHRoaXMuX21hcDtcbiAgICBpZiAobWFwLmF0dHJpYnV0aW9uQ29udHJvbCkge1xuICAgICAgaWYgKHRoaXMuX2N1c3RvbVRpbGVzZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvcHlyaWdodFRleHQpIHtcbiAgICAgICAgICAvLyBwdWxsIHN0YXRpYyBjb3B5cmlnaHQgdGV4dCBmb3Igc2VydmljZXMgcHVibGlzaGVkIHdpdGggUHJvXG4gICAgICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5hZGRBdHRyaWJ1dGlvbignPHNwYW4gY2xhc3M9XCJlc3JpLWR5bmFtaWMtYXR0cmlidXRpb25cIj4nICsgdGhpcy5fY29weXJpZ2h0VGV4dCArICc8L3NwYW4+Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHByb3ZpZGUgZHluYW1pYyBhdHRyaWJ1dGlvbiBmb3IgRXNyaSBiYXNlbWFwc1xuICAgICAgICBVdGlsLl9nZXRBdHRyaWJ1dGlvbkRhdGEoJ2h0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vV29ybGRfU3RyZWV0X01hcCcsIG1hcCk7XG4gICAgICAgIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuYWRkQXR0cmlidXRpb24oJzxzcGFuIGNsYXNzPVwiZXNyaS1keW5hbWljLWF0dHJpYnV0aW9uXCI+VVNHUywgTk9BQTwvc3Bhbj4nKTtcbiAgICAgICAgbWFwLm9uKCdtb3ZlZW5kJywgVXRpbC5fdXBkYXRlTWFwQXR0cmlidXRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgbWFwIHRvIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSB0aWxlc1xuICAgIG1hcC5nZXRDb250YWluZXIoKS5zdHlsZS5iYWNrZ3JvdW5kID0gdGhpcy5fbWFwYm94R0wub3B0aW9ucy5zdHlsZS5sYXllcnNbMF0ucGFpbnRbJ2JhY2tncm91bmQtY29sb3InXTtcbiAgICB0aGlzLl9tYXBib3hHTC5hZGRUbyhtYXAsIHRoaXMpO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGxheWVyIChpZCkge1xuICByZXR1cm4gbmV3IExheWVyKGlkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTGF5ZXI7XG4iXSwibmFtZXMiOlsicmVxdWVzdCIsIkwiLCJVdGlsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0NDQUEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxPQUFPLEdBQUcsUUFBUSxFQUFFLE9BQU8sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLE9BQU8sTUFBTSxHQUFHLFVBQVUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxPQUFPLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxPQUFPLElBQUksR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMvMEIsQ0FBQSxZQUFZLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFN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QUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdmYsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvaEIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMVUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3NUIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoNUIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdFksQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3bEIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RSxDQUFBLFlBQVksQ0FBQyxTQUFTLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pYLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDNUUsQ0FBQSxZQUFZLENBQUMsU0FBUyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xaLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDNUUsQ0FBQSxZQUFZLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2oyQixDQUFBLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMvRCxDQUFBLFlBQVksQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBQ2hwQyxDQUFBLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2xOLENBQUEsWUFBWSxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9tQixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsU0FBUyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8saUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM3RHLENBQUEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQy9HLENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzU0QixDQUFBLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMvRCxDQUFBLFlBQVksQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxdkcsQ0FBQSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDL0QsQ0FBQSxZQUFZLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMscUVBQXFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5a1AsQ0FBQSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbFYsQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3RlLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQSxZQUFZLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdmUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzVELENBQUEsWUFBWSxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFlBQVksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbnJDLENBQUEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN4RCxDQUFBLFlBQVksQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pwSyxDQUFBLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1SixDQUFBLFlBQVksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzdvTyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUMsUUFB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QUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUN4bEQsQ0FBQSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pELENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUM1MUIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDakUsQ0FBQSxZQUFZLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztBQUM5ckIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxDQUFBLFlBQVksQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUMvZ0MsQ0FBQSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3BGLENBQUEsWUFBWSxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0FBQ2pzRixDQUFBLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzlFLENBQUEsWUFBWSxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4bUcsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM5RSxDQUFBLFlBQVksQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUNwNUQsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzVELENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BrRyxDQUFBLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxRyxDQUFBLFlBQVksQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0FBQ3Q3QixDQUFBLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzlFLENBQUEsWUFBWSxDQUFDLFNBQVMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyw2REFBNkQsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdmdDLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQSxZQUFZLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFBRSxPQUFPLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbjhELENBQUEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNFLENBQUEsWUFBWSxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbnJFLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQSxZQUFZLENBQUMsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFB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QUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNStFLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN0SSxDQUFBLFlBQVksQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztBQUM1L0IsQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNoRixDQUFBLFlBQVksQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsakUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN6SixDQUFBLFlBQVksQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsL0QsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZJLENBQUEsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzkzRSxDQUFBLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDaFIsQ0FBQSxZQUFZLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbDFELENBQUEsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxRyxDQUFBLFlBQVksQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9xRSxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2dkksQ0FBQSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZJLENBQUEsWUFBWSxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcnFGLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2xILENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3YzRSxDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pKLENBQUEsWUFBWSxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcDNFLENBQUEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxTSxDQUFBLFlBQVksQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcmlHLENBQUEsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFKLENBQUEsWUFBWSxDQUFDLFNBQVMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4YyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsRUFBRSxFQUFFLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQztBQUMxNEMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNILENBQUEsWUFBWSxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3UixDQUFBLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUQsQ0FBQSxZQUFZLENBQUMsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqWCxDQUFBLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQy9FLENBQUEsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7QUFDN0UsQ0FBQSxDQUFDLENBQUMsQ0FBQyx1Q0FBdUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDckYsQ0FBQSxZQUFZLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLDBDQUEwQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDanBNLENBQUEsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2xaLENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFDeGlILENBQUEsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbEYsQ0FBQSxZQUFZLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDO0FBQ2p1QyxDQUFBLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxRyxDQUFBLFlBQVksQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0c0MsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3RHLENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsdkcsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNsSyxDQUFBLFlBQVksQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2hrQyxDQUFBLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3RGLENBQUEsWUFBWSxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN4UyxDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM5RCxDQUFBLFlBQVksQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzk4QixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDemUsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxDQUFBLFlBQVksQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7QUFDOXdCLENBQUEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzlELENBQUEsWUFBWSxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUMvTSxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUM3MkIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ25GLENBQUEsWUFBWSxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pwQyxDQUFBLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDckQsQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0FBQ2owQixDQUFBLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2hILENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5d0YsQ0FBQSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pELENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM2hELENBQUEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDL0csQ0FBQSxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3h0QixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLEVBQUUsQ0FBQztBQUN4K0QsQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDOUQsQ0FBQSxZQUFZLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUMvTyxDQUFBLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDN0QsQ0FBQSxZQUFZLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0FBQy9tQixDQUFBLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDN0QsQ0FBQSxZQUFZLENBQUMsU0FBUyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4aEQsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxDQUFBLFlBQVksQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BwSSxDQUFBLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDekQsQ0FBQSxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZvTixDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMvSyxDQUFBLFlBQVksQ0FBQyxTQUFTLFdBQVcsRUFBRSxFQUFFLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxD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SUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNXJFLENBQUEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2xHLENBQUEsWUFBWSxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3AxRCxDQUFBLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2pILENBQUEsWUFBWSxDQUFDLFNBQVMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeFgsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxDQUFBLFlBQVksQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxD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LENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMTJDLENBQUEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDeEcsQ0FBQSxZQUFZLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqMkIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxDQUFBLFlBQVksQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3Z0QyxDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbkYsQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2h0RCxDQUFBLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNHLENBQUEsWUFBWSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sTUFBTSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxH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Q0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMs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QUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFdBQVcsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxNQUFNLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMs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LElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3B1RixDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZILENBQUEsWUFBWSxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcDBCLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDLy9DLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQSxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQywyQkFBMkIsRUFBRSxNQUFNLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMsMEJBQTBCLEVBQUUsTUFBTSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLFdBQVcsRUFBRSxPQUFPLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLFdBQVcsRUFBRSxPQUFPLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxPQUFPLEdBQUcsSUFBSSxFQUFFLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN3lELENBQUEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN2RCxDQUFBLFlBQVksQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLHlCQUF5QixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzM0MsQ0FBQSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZELENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFwQixDQUFBLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDakcsQ0FBQSxZQUFZLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUNwbkMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDOUQsQ0FBQSxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZGLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsQ0FBQSxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUMveEIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZELENBQUEsWUFBWSxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNybEIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FB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QUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZFLENBQUEsWUFBWSxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNucEIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUMxSixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsWUFBWSxDQUFDLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4K0UsQ0FBQSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNsRixDQUFBLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sY0FBYyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLGVBQWUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxjQUFjLENBQUMsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUMxcUssQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksc0JBQXNCLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsMkRBQTJELENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2gwQyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsWUFBWSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUMxckMsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2oxRCxDQUFBLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0QsQ0FBQSxZQUFZLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyREFBMkQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcHFILENBQUEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ25ILENBQUEsWUFBWSxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUMvYyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUM1MEIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztBQUMxZ0IsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQy9zQixDQUFBLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDdkQsQ0FBQSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUNwWixDQUFBLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZSLENBQUEsSUFBSSxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLE9BQU8sWUFBWSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUNwUyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUN6cUQsQ0FBQSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzVELENBQUEsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ2g4RCxDQUFBLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDNUQsQ0FBQSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDcCtILENBQUEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RCxDQUFBLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDaDJWLENBQUEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RCxDQUFBLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUNsdEcsQ0FBQSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzVHLENBQUEsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQzFzRixDQUFBLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDNUQsQ0FBQSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDamlKLENBQUEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RCxDQUFBLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDdjNHLENBQUEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RCxDQUFBLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqM0IsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFVBQVUsRUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25ULENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsQ0FBQSxZQUFZLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3J5QixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsWUFBWSxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQzFKLENBQUEsQ0FBQyxDQUFDLENBQUMsK0JBQStCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDN0YsQ0FBQSxZQUFZLENBQUMsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxNQUFNLEVBQUUsQ0FBQyxZQUFZLE1BQU0sRUFBRSxDQUFDLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUNBQXlDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHlDQUF5QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHlDQUF5QyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0VBQWdFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMscURBQXFELENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBDQUEwQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9EQUFvRCxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMENBQTBDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscURBQXFELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLCtDQUErQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0VBQWdFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1dE0sQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxRSxDQUFBLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3BDLENB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Q0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGdMQUFnTCxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsa0dBQWtHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyw0RUFBNEUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsbUtBQW1LLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsK0ZBQStGLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLHVHQUF1RyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxnSEFBZ0gsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsb0dBQW9HLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGdIQUFnSCxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyx1RUFBdUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsdUhBQXVILENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMERBQTBELENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHlKQUF5SixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsb01BQW9NLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLDBGQUEwRixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLHVFQUF1RSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLHVFQUF1RSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsb0VBQW9FLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLDJHQUEyRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGlHQUFpRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLDRFQUE0RSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyw4RUFBOEUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxnR0FBZ0csQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLDhPQUE4TyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyw0RkFBNEYsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsMkVBQTJFLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQywrSEFBK0gsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLGdFQUFnRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLDhFQUE4RSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxnR0FBZ0csQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsaUZBQWlGLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLCtIQUErSCxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsMENBQTBDLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlHQUFpRyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsbURBQW1ELENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsNkJBQTZCLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLGdHQUFnRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyw0RkFBNEYsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUZBQWlGLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQywrSEFBK0gsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsNEZBQTRGLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLDJFQUEyRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsK0hBQStILENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxtT0FBbU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxrRkFBa0YsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLDhGQUE4RixDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLHFGQUFxRixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9KQUFvSixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLDhGQUE4RixDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLHFGQUFxRixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGtHQUFrRyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx1TkFBdU4sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMseU5BQXlOLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHlJQUF5SSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsK0ZBQStGLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsOEZBQThGLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMscUZBQXFGLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLLENBQUMsOENBQThDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQywyRUFBMkUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsd0NBQXdDLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsNEpBQTRKLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsc0ZBQXNGLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDBFQUEwRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsb0ZBQW9GLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZ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TSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUMsbUJBQW1CLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztBQUMvcWMsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUMvd0UsQ0FBQSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3hELENBQUEsQ0FBQyxVQUFVLE1BQU0sQ0FBQztBQUNsQixDQUFBLFlBQVksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeHhRLENBQUEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLE1BQU0sS0FBSyxXQUFXLEdBQUcsTUFBTSxHQUFHLE9BQU8sSUFBSSxLQUFLLFdBQVcsR0FBRyxJQUFJLEdBQUcsT0FBTyxNQUFNLEtBQUssV0FBVyxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7O0FBRXZJLENBQUEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN6RCxDQUFBLFlBQVksQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzdkQsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFNBQVMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsU0FBUyxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDaHpDLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsQ0FBQSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNybU0sQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25pQixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaDhCLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDL0ksQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLENBQUMsVUFBVSxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQzFCLENBQUEsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxZQUFZLENBQUMsUUFBUSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sVUFBVSxDQUFDLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDMXJPLENBQUEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxNQUFNLEtBQUssV0FBVyxHQUFHLE1BQU0sR0FBRyxPQUFPLElBQUksS0FBSyxXQUFXLEdBQUcsSUFBSSxHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVcsR0FBRyxNQUFNLEdBQUcsRUFBRSxDQUFDOztBQUUzSixDQUFBLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDakcsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBQ25NLENBQUEsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDcEksQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUN2USxDQUFBLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNsRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1bkssQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDL0QsQ0FBQSxZQUFZLENBQUMsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUN4a0UsQ0FBQSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pGLENBQUEsWUFBWSxDQUFDLFNBQVMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUMvakMsQ0FBQSxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDdkUsQ0FBQSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFT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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-google-mutant.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,439 @@
+// Based on https://github.com/shramov/leaflet-plugins
+// GridLayer like https://avinmathew.com/leaflet-and-google-maps/ , but using MutationObserver instead of jQuery
+
+
+// 🍂class GridLayer.GoogleMutant
+// 🍂extends GridLayer
+L.GridLayer.GoogleMutant = L.GridLayer.extend({
+	includes: L.Mixin.Events,
+
+	options: {
+		minZoom: 0,
+		maxZoom: 18,
+		tileSize: 256,
+		subdomains: 'abc',
+		errorTileUrl: '',
+		attribution: '',	// The mutant container will add its own attribution anyways.
+		opacity: 1,
+		continuousWorld: false,
+		noWrap: false,
+		// 🍂option type: String = 'roadmap'
+		// Google's map type. Valid values are 'roadmap', 'satellite' or 'terrain'. 'hybrid' is not really supported.
+		type: 'roadmap',
+		maxNativeZoom: 21
+	},
+
+	initialize: function (options) {
+		L.GridLayer.prototype.initialize.call(this, options);
+
+		this._ready = !!window.google && !!window.google.maps && !!window.google.maps.Map;
+
+		this._GAPIPromise = this._ready ? Promise.resolve(window.google) : new Promise(function (resolve, reject) {
+			var checkCounter = 0;
+			var intervalId = null;
+			intervalId = setInterval(function () {
+				if (checkCounter >= 10) {
+					clearInterval(intervalId);
+					return reject(new Error('window.google not found after 10 attempts'));
+				}
+				if (!!window.google && !!window.google.maps && !!window.google.maps.Map) {
+					clearInterval(intervalId);
+					return resolve(window.google);
+				}
+				checkCounter++;
+			}, 500);
+		});
+
+		// Couple data structures indexed by tile key
+		this._tileCallbacks = {};	// Callbacks for promises for tiles that are expected
+		this._freshTiles = {};	// Tiles from the mutant which haven't been requested yet
+
+		this._imagesPerTile = (this.options.type === 'hybrid') ? 2 : 1;
+	},
+
+	onAdd: function (map) {
+		L.GridLayer.prototype.onAdd.call(this, map);
+		this._initMutantContainer();
+
+		this._GAPIPromise.then(function () {
+			this._ready = true;
+			this._map = map;
+
+			this._initMutant();
+
+			map.on('viewreset', this._reset, this);
+			map.on('move', this._update, this);
+			map.on('zoomend', this._handleZoomAnim, this);
+			map.on('resize', this._resize, this);
+
+			//handle layer being added to a map for which there are no Google tiles at the given zoom
+			google.maps.event.addListenerOnce(this._mutant, 'idle', function () {
+				this._checkZoomLevels();
+				this._mutantIsReady = true;
+			}.bind(this));
+
+			//20px instead of 1em to avoid a slight overlap with google's attribution
+			map._controlCorners.bottomright.style.marginBottom = '20px';
+			map._controlCorners.bottomleft.style.marginBottom = '20px';
+
+			this._reset();
+			this._update();
+
+			if (this._subLayers) {
+				//restore previously added google layers
+				for (var layerName in this._subLayers) {
+					this._subLayers[layerName].setMap(this._mutant);
+				}
+			}
+		}.bind(this));
+	},
+
+	onRemove: function (map) {
+		L.GridLayer.prototype.onRemove.call(this, map);
+		map._container.removeChild(this._mutantContainer);
+		this._mutantContainer = undefined;
+
+		map.off('viewreset', this._reset, this);
+		map.off('move', this._update, this);
+		map.off('zoomend', this._handleZoomAnim, this);
+		map.off('resize', this._resize, this);
+
+		map._controlCorners.bottomright.style.marginBottom = '0em';
+		map._controlCorners.bottomleft.style.marginBottom = '0em';
+	},
+
+	getAttribution: function () {
+		return this.options.attribution;
+	},
+
+	setOpacity: function (opacity) {
+		this.options.opacity = opacity;
+		if (opacity < 1) {
+			L.DomUtil.setOpacity(this._mutantContainer, opacity);
+		}
+	},
+
+	setElementSize: function (e, size) {
+		e.style.width = size.x + 'px';
+		e.style.height = size.y + 'px';
+	},
+
+
+	addGoogleLayer: function (googleLayerName, options) {
+		if (!this._subLayers) this._subLayers = {};
+		return this._GAPIPromise.then(function () {
+			var Constructor = google.maps[googleLayerName];
+			var googleLayer = new Constructor(options);
+			googleLayer.setMap(this._mutant);
+			this._subLayers[googleLayerName] = googleLayer;
+			return googleLayer;
+		}.bind(this));
+	},
+
+	removeGoogleLayer: function (googleLayerName) {
+		var googleLayer = this._subLayers && this._subLayers[googleLayerName];
+		if (!googleLayer) return;
+
+		googleLayer.setMap(null);
+		delete this._subLayers[googleLayerName];
+	},
+
+
+	_initMutantContainer: function () {
+		if (!this._mutantContainer) {
+			this._mutantContainer = L.DomUtil.create('div', 'leaflet-google-mutant leaflet-top leaflet-left');
+			this._mutantContainer.id = '_MutantContainer_' + L.Util.stamp(this._mutantContainer);
+			this._mutantContainer.style.zIndex = '800'; //leaflet map pane at 400, controls at 1000
+			this._mutantContainer.style.pointerEvents = 'none';
+
+			this._map.getContainer().appendChild(this._mutantContainer);
+		}
+
+		this.setOpacity(this.options.opacity);
+		this.setElementSize(this._mutantContainer, this._map.getSize());
+
+		this._attachObserver(this._mutantContainer);
+	},
+
+	_initMutant: function () {
+		if (!this._ready || !this._mutantContainer) return;
+		this._mutantCenter = new google.maps.LatLng(0, 0);
+
+		var map = new google.maps.Map(this._mutantContainer, {
+			center: this._mutantCenter,
+			zoom: 0,
+			tilt: 0,
+			mapTypeId: this.options.type,
+			disableDefaultUI: true,
+			keyboardShortcuts: false,
+			draggable: false,
+			disableDoubleClickZoom: true,
+			scrollwheel: false,
+			streetViewControl: false,
+			styles: this.options.styles || {},
+			backgroundColor: 'transparent'
+		});
+
+		this._mutant = map;
+
+		google.maps.event.addListenerOnce(map, 'idle', function () {
+			var nodes = this._mutantContainer.querySelectorAll('a');
+			for (var i = 0; i < nodes.length; i++) {
+				nodes[i].style.pointerEvents = 'auto';
+			}
+		}.bind(this));
+
+		// 🍂event spawned
+		// Fired when the mutant has been created.
+		this.fire('spawned', {mapObject: map});
+	},
+
+	_attachObserver: function _attachObserver (node) {
+// 		console.log('Gonna observe', node);
+
+		var observer = new MutationObserver(this._onMutations.bind(this));
+
+		// pass in the target node, as well as the observer options
+		observer.observe(node, { childList: true, subtree: true });
+	},
+
+	_onMutations: function _onMutations (mutations) {
+		for (var i = 0; i < mutations.length; ++i) {
+			var mutation = mutations[i];
+			for (var j = 0; j < mutation.addedNodes.length; ++j) {
+				var node = mutation.addedNodes[j];
+
+				if (node instanceof HTMLImageElement) {
+					this._onMutatedImage(node);
+				} else if (node instanceof HTMLElement) {
+					Array.prototype.forEach.call(node.querySelectorAll('img'), this._onMutatedImage.bind(this));
+				}
+			}
+		}
+	},
+
+	// Only images which 'src' attrib match this will be considered for moving around.
+	// Looks like some kind of string-based protobuf, maybe??
+	// Only the roads (and terrain, and vector-based stuff) match this pattern
+	_roadRegexp: /!1i(\d+)!2i(\d+)!3i(\d+)!/,
+
+	// On the other hand, raster imagery matches this other pattern
+	_satRegexp: /x=(\d+)&y=(\d+)&z=(\d+)/,
+
+	// On small viewports, when zooming in/out, a static image is requested
+	// This will not be moved around, just removed from the DOM.
+	_staticRegExp: /StaticMapService\.GetMapImage/,
+
+	_onMutatedImage: function _onMutatedImage (imgNode) {
+// 		if (imgNode.src) {
+// 			console.log('caught mutated image: ', imgNode.src);
+// 		}
+
+		var coords;
+		var match = imgNode.src.match(this._roadRegexp);
+		var sublayer = 0;
+
+		if (match) {
+			coords = {
+				z: match[1],
+				x: match[2],
+				y: match[3]
+			};
+			if (this._imagesPerTile > 1) { 
+				imgNode.style.zIndex = 1;
+				sublayer = 1;
+			}
+		} else {
+			match = imgNode.src.match(this._satRegexp);
+			if (match) {
+				coords = {
+					x: match[1],
+					y: match[2],
+					z: match[3]
+				};
+			}
+// 			imgNode.style.zIndex = 0;
+			sublayer = 0;
+		}
+
+		if (coords) {
+			var tileKey = this._tileCoordsToKey(coords);
+			imgNode.style.position = 'absolute';
+			var cloneImgNode = imgNode.cloneNode(true);
+			cloneImgNode.style.visibility = 'visible';
+			imgNode.style.visibility = 'hidden';
+
+			var key = tileKey + '/' + sublayer;
+			if (key in this._tileCallbacks && this._tileCallbacks[key]) {
+// console.log('Fullfilling callback ', key);
+				this._tileCallbacks[key].shift()(cloneImgNode);
+				if (!this._tileCallbacks[key].length) { delete this._tileCallbacks[key]; }
+			} else {
+// console.log('Caching for later', key);
+
+				if (this._tiles[tileKey]) {
+					//we already have a tile in this position (mutation is probably a google layer being added)
+					//replace it
+					var c = this._tiles[tileKey].el;
+					var oldImg = (sublayer === 0) ? c.firstChild : c.firstChild.nextSibling;
+					c.replaceChild(cloneImgNode, oldImg);
+				} else if (key in this._freshTiles) {
+					this._freshTiles[key].push(cloneImgNode);
+				} else {
+					this._freshTiles[key] = [cloneImgNode];
+				}
+			}
+		} else if (imgNode.src.match(this._staticRegExp)) {
+			imgNode.style.visibility = 'hidden';
+		}
+	},
+
+
+	createTile: function (coords, done) {
+		var key = this._tileCoordsToKey(coords);
+
+		var tileContainer = L.DomUtil.create('div');
+		tileContainer.dataset.pending = this._imagesPerTile;
+		done = done.bind(this, null, tileContainer);
+
+		for (var i = 0; i < this._imagesPerTile; i++) {
+			var key2 = key + '/' + i;
+			if (key2 in this._freshTiles) {
+				tileContainer.appendChild(this._freshTiles[key2].pop());
+				if (!this._freshTiles[key2].length) { delete this._freshTiles[key2]; }
+				tileContainer.dataset.pending--;
+// 				console.log('Got ', key2, ' from _freshTiles');
+			} else {
+				this._tileCallbacks[key2] = this._tileCallbacks[key2] || [];
+				this._tileCallbacks[key2].push( (function (c/*, k2*/) {
+					return function (cloneImgNode) {
+						c.appendChild(cloneImgNode);
+						c.dataset.pending--;
+						if (!parseInt(c.dataset.pending)) { done(); }
+// 						console.log('Sent ', k2, ' to _tileCallbacks, still ', c.dataset.pending, ' images to go');
+					}.bind(this);
+				}.bind(this))(tileContainer/*, key2*/) );
+			}
+		}
+
+		if (!parseInt(tileContainer.dataset.pending)) {
+			L.Util.requestAnimFrame(done);
+		}
+		return tileContainer;
+	},
+
+	_checkZoomLevels: function () {
+		//setting the zoom level on the Google map may result in a different zoom level than the one requested
+		//(it won't go beyond the level for which they have data).
+		var zoomLevel = this._map.getZoom();
+		var gMapZoomLevel = this._mutant.getZoom();
+		if (!zoomLevel || !gMapZoomLevel) return;
+
+
+		if ((gMapZoomLevel !== zoomLevel) || //zoom levels are out of sync, Google doesn't have data
+			(gMapZoomLevel > this.options.maxNativeZoom)) { //at current location, Google does have data (contrary to maxNativeZoom)
+			//Update maxNativeZoom
+			this._setMaxNativeZoom(gMapZoomLevel);
+		}
+	},
+
+	_setMaxNativeZoom: function (zoomLevel) {
+		if (zoomLevel != this.options.maxNativeZoom) {
+			this.options.maxNativeZoom = zoomLevel;
+			this._resetView();
+		}
+	},
+
+	_reset: function () {
+		this._initContainer();
+	},
+
+	_update: function () {
+		// zoom level check needs to happen before super's implementation (tile addition/creation)
+		// otherwise tiles may be missed if maxNativeZoom is not yet correctly determined
+		if (this._mutant) {
+			var center = this._map.getCenter();
+			var _center = new google.maps.LatLng(center.lat, center.lng);
+
+			this._mutant.setCenter(_center);
+			var zoom = this._map.getZoom();
+			var fractionalLevel = zoom !== Math.round(zoom);
+			var mutantZoom = this._mutant.getZoom();
+
+			//ignore fractional zoom levels
+			if (!fractionalLevel && (zoom != mutantZoom)) {
+				this._mutant.setZoom(zoom);
+							
+				if (this._mutantIsReady) this._checkZoomLevels();
+				//else zoom level check will be done later by 'idle' handler
+			}
+		}
+
+		L.GridLayer.prototype._update.call(this);
+	},
+
+	_resize: function () {
+		var size = this._map.getSize();
+		if (this._mutantContainer.style.width === size.x &&
+			this._mutantContainer.style.height === size.y)
+			return;
+		this.setElementSize(this._mutantContainer, size);
+		if (!this._mutant) return;
+		google.maps.event.trigger(this._mutant, 'resize');
+	},
+
+	_handleZoomAnim: function () {
+		if (!this._mutant) return;
+		var center = this._map.getCenter();
+		var _center = new google.maps.LatLng(center.lat, center.lng);
+
+		this._mutant.setCenter(_center);
+		this._mutant.setZoom(Math.round(this._map.getZoom()));
+	},
+
+	// Agressively prune _freshtiles when a tile with the same key is removed,
+	// this prevents a problem where Leaflet keeps a loaded tile longer than
+	// GMaps, so that GMaps makes two requests but Leaflet only consumes one,
+	// polluting _freshTiles with stale data.
+	_removeTile: function (key) {
+		if (!this._mutant) return;
+
+		for (var i=0; i<this._imagesPerTile; i++) {
+			var key2 = key + '/' + i;
+			if (key2 in this._freshTiles) { delete this._freshTiles[key2]; }
+// 				console.log('Pruned spurious hybrid _freshTiles');
+		}
+
+		//if the tile is still visible in the google map, keep it.
+		//In this situation, if the tile is later required, there won't be a mutation event (since tile is already in gMap) 
+		//and there will be no other way to refetch the tile.
+		//this situation where GMaps keeps a tile longer than Leaflet can happen when the map goes past 
+		//self's maxNativeZoom
+		var gZoom = this._mutant.getZoom();
+		var zoom = key.split(':')[2];
+		if (zoom == gZoom && gZoom == this.options.maxNativeZoom) {
+			var imgs = this._tiles[key].el.querySelectorAll('img');
+			if (imgs.length) {
+				for (var j=0; j<this._imagesPerTile;j++) {
+					var keyJ = key + '/' + j;
+					var imgNode = imgs[j];
+					if (keyJ in this._freshTiles) {
+						this._freshTiles[keyJ].push(imgNode);
+					} else {
+						this._freshTiles[keyJ] = [imgNode];
+					}				
+				}
+			}
+		}
+
+
+		return L.GridLayer.prototype._removeTile.call(this, key);
+	}
+});
+
+
+// 🍂factory gridLayer.googleMutant(options)
+// Returns a new `GridLayer.GoogleMutant` given its options
+L.gridLayer.googleMutant = function (options) {
+	return new L.GridLayer.GoogleMutant(options);
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-gp-3.0.2.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,25289 @@
+/*!
+ * @brief Geoportal Extension for Leaflet
+ *
+ * This software is released under the licence CeCILL-B (Free BSD compatible)
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
+ * @see http://www.cecill.info/
+ *
+ * copyright CeCILL-B
+ * copyright IGN
+ * @author IGN
+ * @version 0.8.1
+ * @date 2016-12-02
+ *
+ */
+/*!
+ * @overview es6-promise - a tiny implementation of Promises/A+.
+ * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and cont  ributors (Conversion to ES6 API by Jake Archibald)
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/jakearchibald/es6-promise/  master/LICENSE
+ * @version   3.0.2
+ */
+/*!
+ * Sortable -- minimalist JavaScript library for reorderable drag-and-drop lists
+ *
+ * Released under MIT LICENSE
+ * 
+ * Copyright 2013-2016 Lebedev Konstantin <ibnRubaXa@gmail.com>
+ * http://rubaxa.github.io/Sortable/
+ * 
+ * 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.
+ */
+/*!
+ * Proj4js - Javascript reprojection library. 
+ * 
+ * Authors:
+ * 
+ * - Mike Adair madairATdmsolutions.ca
+ * - Richard Greenwood richATgreenwoodmap.com
+ * - Didier Richard didier.richardATign.fr
+ * - Stephen Irons stephen.ironsATclear.net.nz
+ * - Olivier Terral oterralATgmail.com
+ * - Calvin Metcalf cmetcalfATappgeo.com
+ * 
+ * Copyright (c) 2014, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons, Olivier Terral and Calvin Metcalf
+ * 
+ *  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._
+ * 
+ */
+/*!
+ * Copyright 2012-2016 Jacob Toye and Leaflet
+ *
+ * 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.
+ */
+/*!
+ * Proj4Leaflet --  Smooth Proj4js integration with Leaflet
+ * 
+ * Copyright (c) 2012, Kartena AB
+ * 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 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.
+ */
+;(function(root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    define(['leaflet'], factory);
+  } else if (typeof exports === 'object') {
+    module.exports = factory(require('leaflet'));
+  } else {
+    root.Gp = factory(root.L);
+  }
+}(this, function(leaflet) {
+
+var gp, CommonUtilsAutoLoadConfig, leafletDraw, sortable, CommonControlsLayerSwitcherDOM, LeafletControlsLayerSwitcher, CommonUtilsConfig, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, CommonControlsLocationSelectorDOM, LeafletControlsUtilsPositionFormater, LeafletControlsUtilsIconDefault, LeafletControlsLocationSelector, CommonControlsIsoDOM, LeafletControlsIsocurve, CommonControlsMousePositionDOM, proj4, proj4leaflet07x, proj4leaflet10x, LeafletCRSProj4Leaflet, CommonUtilsRegister, LeafletCRSEPSG2154, LeafletCRSEPSG27572, LeafletCRSEPSG4326, LeafletCRSCRS, LeafletControlsMousePosition, CommonControlsReverseGeocodingDOM, LeafletControlsReverseGeocoding, CommonControlsRouteDOM, LeafletControlsRoute, CommonControlsSearchEngineDOM, CommonControlsSearchEngineUtils, LeafletControlsSearchEngine, CommonControlsElevationPathDOM, LeafletControlsElevationPath, LeafletControlsLogo, LeafletControlsControls, CommonUtilsLayerUtils, LeafletLayersLayerConfig, LeafletLayersLayerEvent, LeafletLayersWMS, LeafletLayersWMTS, LeafletLayersLayers, LeafletGpPluginLeaflet;
+(function (root, factory) {
+    if (true) {
+        gp = function () {
+            return typeof factory === 'function' ? factory() : factory;
+        }();
+    } else if (typeof exports === 'object') {
+        module.exports = factory();
+    } else {
+        root.Gp = factory();
+    }
+}(this, function () {
+    var log4js, loggerCfg, UtilsLoggerByDefault, UtilsHelper, promise, ProtocolsXHR, UtilsMessagesResources, ExceptionsErrorService, ProtocolsJSONP, ProtocolsProtocol, ServicesDefaultUrlService, ServicesCommonService, ServicesAltiRequestModelAltiRequest, ServicesAltiRequestModelAltiElevationRequest, ServicesAltiRequestModelAltiProfilRequest, ServicesAltiRequestAltiRequestREST, FormatsWPS, ServicesAltiRequestAltiRequestWPS, ServicesAltiRequestAltiRequestFactory, FormatsXML, ServicesAltiResponseModelAltiResponse, ServicesAltiResponseModelElevation, ServicesAltiFormatsAltiResponseReader, ServicesAltiResponseAltiResponseFactory, ServicesAltiAlti, ServicesAutoConfResponseModelAutoConfResponse, ServicesAutoConfResponseModelConstraint, ServicesAutoConfResponseModelFormat, ServicesAutoConfResponseModelLayer, ServicesAutoConfResponseModelLegend, ServicesAutoConfResponseModelMetadata, ServicesAutoConfResponseModelOriginator, ServicesAutoConfResponseModelService, ServicesAutoConfResponseModelStyle, ServicesAutoConfResponseModelTerritory, ServicesAutoConfResponseModelThematic, ServicesAutoConfResponseModelTileMatrixSet, ServicesAutoConfResponseModelTileMatrix, ServicesAutoConfResponseModelTileMatrixLimit, ServicesAutoConfFormatsAutoConfResponseReader, ServicesAutoConfResponseAutoConfResponseFactory, ServicesAutoConfAutoConf, FormatsXLSRequestHeader, FormatsXLSRequest, FormatsXLSAbstractService, FormatsXLS, FormatsXLSLocationUtilityServiceModelAddress, FormatsXLSLocationUtilityServiceGeocodeFilterExtension, FormatsXLSLocationUtilityServiceGeocodeRequest, FormatsXLSLocationUtilityServiceModelPosition, FormatsXLSLocationUtilityServiceModelPreference, FormatsXLSLocationUtilityServiceReverseGeocodeRequest, FormatsXLSLocationUtilityService, ServicesGeocodeRequestGeocodeLocation, ServicesGeocodeRequestModelStreetAddress, ServicesGeocodeRequestModelPositionOfInterest, ServicesGeocodeRequestModelCadastralParcel, ServicesGeocodeRequestModelAdministratif, ServicesGeocodeRequestDirectGeocodeRequestFactory, ServicesGeocodeResponseModelGeocodeResponse, ServicesGeocodeResponseModelGeocodedLocation, ServicesGeocodeResponseModelDirectGeocodedLocation, ServicesGeocodeFormatsDirectGeocodeResponseReader, ServicesGeocodeResponseDirectGeocodeResponseFactory, ServicesGeocodeGeocode, ServicesGeocodeRequestReverseGeocodeRequestFactory, ServicesGeocodeResponseModelReverseGeocodedLocation, ServicesGeocodeFormatsReverseGeocodeResponseReader, ServicesGeocodeResponseReverseGeocodeResponseFactory, ServicesGeocodeReverseGeocode, ServicesAutoCompleteResponseModelAutoCompleteResponse, ServicesAutoCompleteResponseModelSuggestedLocation, ServicesAutoCompleteResponseAutoCompleteResponseFactory, ServicesAutoCompleteAutoComplete, FormatsXLSRouteServiceModelRoutePlan, FormatsXLSRouteServiceDetermineRouteRequest, FormatsXLSRouteServiceRouteRequestExtension, FormatsXLSRouteService, ServicesRouteRequestRouteRequestOLS, ServicesRouteRequestModelRouteParamREST, ServicesRouteRequestRouteRequestREST, ServicesRouteRequestRouteRequestFactory, FormatsWKT, ServicesRouteResponseModelRouteResponse, ServicesRouteResponseModelRouteInstruction, ServicesRouteFormatsRouteResponseRESTReader, ServicesRouteFormatsRouteResponseOLSReader, ServicesRouteResponseRouteResponseFactory, ServicesRouteRoute, ServicesProcessIsoCurveRequestModelProcessIsoCurveParam, ServicesProcessIsoCurveRequestProcessIsoCurveRequest, ServicesProcessIsoCurveResponseModelProcessIsoCurveResponse, ServicesProcessIsoCurveFormatsProcessIsoCurveResponseReader, ServicesProcessIsoCurveResponseProcessIsoCurveResponseFactory, ServicesProcessIsoCurveProcessIsoCurve, ServicesServices, Gp;
+    log4js = undefined;
+    loggerCfg = {
+        loggers: [{
+                root: true,
+                level: 'all',
+                appenders: [{
+                        type: 'Console',
+                        layout: {
+                            type: 'PatternLayout',
+                            pattern: '%d{yyyy-MM-dd HH:mm:ss} [%p] %c - %m%n'
+                        }
+                    }]
+            }]
+    };
+    UtilsLoggerByDefault = function (Log4js, Config) {
+        var LoggerByDefault = {
+            getLogger: function (name) {
+                Log4js.load(Config, function (error) {
+                    if (error) {
+                        throw error;
+                    }
+                });
+                var logname = name || 'default';
+                return Log4js.getLogger(logname);
+            }
+        };
+        return LoggerByDefault;
+    }(log4js, loggerCfg);
+    UtilsHelper = function () {
+        var Helper = {
+            normalyzeParameters: function (params) {
+                var myParams = null;
+                if (params) {
+                    var tabParams = [];
+                    for (var key in params) {
+                        if (params.hasOwnProperty(key)) {
+                            var value = params[key];
+                            if (!value) {
+                                value = '';
+                            }
+                            tabParams.push(key + '=' + value);
+                        }
+                    }
+                    myParams = tabParams.join('&');
+                }
+                return myParams;
+            },
+            normalyzeUrl: function (url, params, encode) {
+                var myUrl = url;
+                if (url) {
+                    var k = url.indexOf('?');
+                    if (k === -1) {
+                        myUrl += '?';
+                    }
+                    if (k !== -1 && k !== url.length - 1) {
+                        myUrl += '&';
+                    }
+                }
+                if (params) {
+                    if (typeof params === 'string') {
+                        myUrl += params;
+                    } else {
+                        myUrl += this.normalyzeParameters(params);
+                    }
+                }
+                if (encode) {
+                    myUrl = encodeURIComponent(myUrl);
+                }
+                return myUrl;
+            },
+            indent: function (n, msg) {
+                var num = n || 0;
+                return new Array(num + 1).join('\t') + msg;
+            }
+        };
+        return Helper;
+    }();
+    (function () {
+        'use strict';
+        function lib$es6$promise$utils$$objectOrFunction(x) {
+            return typeof x === 'function' || typeof x === 'object' && x !== null;
+        }
+        function lib$es6$promise$utils$$isFunction(x) {
+            return typeof x === 'function';
+        }
+        function lib$es6$promise$utils$$isMaybeThenable(x) {
+            return typeof x === 'object' && x !== null;
+        }
+        var lib$es6$promise$utils$$_isArray;
+        if (!Array.isArray) {
+            lib$es6$promise$utils$$_isArray = function (x) {
+                return Object.prototype.toString.call(x) === '[object Array]';
+            };
+        } else {
+            lib$es6$promise$utils$$_isArray = Array.isArray;
+        }
+        var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray;
+        var lib$es6$promise$asap$$len = 0;
+        var lib$es6$promise$asap$$toString = {}.toString;
+        var lib$es6$promise$asap$$vertxNext;
+        var lib$es6$promise$asap$$customSchedulerFn;
+        var lib$es6$promise$asap$$asap = function asap(callback, arg) {
+            lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback;
+            lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg;
+            lib$es6$promise$asap$$len += 2;
+            if (lib$es6$promise$asap$$len === 2) {
+                if (lib$es6$promise$asap$$customSchedulerFn) {
+                    lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush);
+                } else {
+                    lib$es6$promise$asap$$scheduleFlush();
+                }
+            }
+        };
+        function lib$es6$promise$asap$$setScheduler(scheduleFn) {
+            lib$es6$promise$asap$$customSchedulerFn = scheduleFn;
+        }
+        function lib$es6$promise$asap$$setAsap(asapFn) {
+            lib$es6$promise$asap$$asap = asapFn;
+        }
+        var lib$es6$promise$asap$$browserWindow = typeof window !== 'undefined' ? window : undefined;
+        var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {};
+        var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver;
+        var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
+        var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';
+        function lib$es6$promise$asap$$useNextTick() {
+            return function () {
+                process.nextTick(lib$es6$promise$asap$$flush);
+            };
+        }
+        function lib$es6$promise$asap$$useVertxTimer() {
+            return function () {
+                lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush);
+            };
+        }
+        function lib$es6$promise$asap$$useMutationObserver() {
+            var iterations = 0;
+            var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$asap$$flush);
+            var node = document.createTextNode('');
+            observer.observe(node, { characterData: true });
+            return function () {
+                node.data = iterations = ++iterations % 2;
+            };
+        }
+        function lib$es6$promise$asap$$useMessageChannel() {
+            var channel = new MessageChannel();
+            channel.port1.onmessage = lib$es6$promise$asap$$flush;
+            return function () {
+                channel.port2.postMessage(0);
+            };
+        }
+        function lib$es6$promise$asap$$useSetTimeout() {
+            return function () {
+                setTimeout(lib$es6$promise$asap$$flush, 1);
+            };
+        }
+        var lib$es6$promise$asap$$queue = new Array(1000);
+        function lib$es6$promise$asap$$flush() {
+            for (var i = 0; i < lib$es6$promise$asap$$len; i += 2) {
+                var callback = lib$es6$promise$asap$$queue[i];
+                var arg = lib$es6$promise$asap$$queue[i + 1];
+                callback(arg);
+                lib$es6$promise$asap$$queue[i] = undefined;
+                lib$es6$promise$asap$$queue[i + 1] = undefined;
+            }
+            lib$es6$promise$asap$$len = 0;
+        }
+        function lib$es6$promise$asap$$attemptVertx() {
+            try {
+                var r = require;
+                var vertx = r('vertx');
+                lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext;
+                return lib$es6$promise$asap$$useVertxTimer();
+            } catch (e) {
+                return lib$es6$promise$asap$$useSetTimeout();
+            }
+        }
+        var lib$es6$promise$asap$$scheduleFlush;
+        if (lib$es6$promise$asap$$isNode) {
+            lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick();
+        } else if (lib$es6$promise$asap$$BrowserMutationObserver) {
+            lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver();
+        } else if (lib$es6$promise$asap$$isWorker) {
+            lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel();
+        } else if (lib$es6$promise$asap$$browserWindow === undefined && typeof require === 'function') {
+            lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertx();
+        } else {
+            lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout();
+        }
+        function lib$es6$promise$$internal$$noop() {
+        }
+        var lib$es6$promise$$internal$$PENDING = void 0;
+        var lib$es6$promise$$internal$$FULFILLED = 1;
+        var lib$es6$promise$$internal$$REJECTED = 2;
+        var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject();
+        function lib$es6$promise$$internal$$selfFulfillment() {
+            return new TypeError('You cannot resolve a promise with itself');
+        }
+        function lib$es6$promise$$internal$$cannotReturnOwn() {
+            return new TypeError('A promises callback cannot return that same promise.');
+        }
+        function lib$es6$promise$$internal$$getThen(promise) {
+            try {
+                return promise.then;
+            } catch (error) {
+                lib$es6$promise$$internal$$GET_THEN_ERROR.error = error;
+                return lib$es6$promise$$internal$$GET_THEN_ERROR;
+            }
+        }
+        function lib$es6$promise$$internal$$tryThen(then, value, fulfillmentHandler, rejectionHandler) {
+            try {
+                then.call(value, fulfillmentHandler, rejectionHandler);
+            } catch (e) {
+                return e;
+            }
+        }
+        function lib$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) {
+            lib$es6$promise$asap$$asap(function (promise) {
+                var sealed = false;
+                var error = lib$es6$promise$$internal$$tryThen(then, thenable, function (value) {
+                    if (sealed) {
+                        return;
+                    }
+                    sealed = true;
+                    if (thenable !== value) {
+                        lib$es6$promise$$internal$$resolve(promise, value);
+                    } else {
+                        lib$es6$promise$$internal$$fulfill(promise, value);
+                    }
+                }, function (reason) {
+                    if (sealed) {
+                        return;
+                    }
+                    sealed = true;
+                    lib$es6$promise$$internal$$reject(promise, reason);
+                }, 'Settle: ' + (promise._label || ' unknown promise'));
+                if (!sealed && error) {
+                    sealed = true;
+                    lib$es6$promise$$internal$$reject(promise, error);
+                }
+            }, promise);
+        }
+        function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) {
+            if (thenable._state === lib$es6$promise$$internal$$FULFILLED) {
+                lib$es6$promise$$internal$$fulfill(promise, thenable._result);
+            } else if (thenable._state === lib$es6$promise$$internal$$REJECTED) {
+                lib$es6$promise$$internal$$reject(promise, thenable._result);
+            } else {
+                lib$es6$promise$$internal$$subscribe(thenable, undefined, function (value) {
+                    lib$es6$promise$$internal$$resolve(promise, value);
+                }, function (reason) {
+                    lib$es6$promise$$internal$$reject(promise, reason);
+                });
+            }
+        }
+        function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable) {
+            if (maybeThenable.constructor === promise.constructor) {
+                lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable);
+            } else {
+                var then = lib$es6$promise$$internal$$getThen(maybeThenable);
+                if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) {
+                    lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error);
+                } else if (then === undefined) {
+                    lib$es6$promise$$internal$$fulfill(promise, maybeThenable);
+                } else if (lib$es6$promise$utils$$isFunction(then)) {
+                    lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then);
+                } else {
+                    lib$es6$promise$$internal$$fulfill(promise, maybeThenable);
+                }
+            }
+        }
+        function lib$es6$promise$$internal$$resolve(promise, value) {
+            if (promise === value) {
+                lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFulfillment());
+            } else if (lib$es6$promise$utils$$objectOrFunction(value)) {
+                lib$es6$promise$$internal$$handleMaybeThenable(promise, value);
+            } else {
+                lib$es6$promise$$internal$$fulfill(promise, value);
+            }
+        }
+        function lib$es6$promise$$internal$$publishRejection(promise) {
+            if (promise._onerror) {
+                promise._onerror(promise._result);
+            }
+            lib$es6$promise$$internal$$publish(promise);
+        }
+        function lib$es6$promise$$internal$$fulfill(promise, value) {
+            if (promise._state !== lib$es6$promise$$internal$$PENDING) {
+                return;
+            }
+            promise._result = value;
+            promise._state = lib$es6$promise$$internal$$FULFILLED;
+            if (promise._subscribers.length !== 0) {
+                lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, promise);
+            }
+        }
+        function lib$es6$promise$$internal$$reject(promise, reason) {
+            if (promise._state !== lib$es6$promise$$internal$$PENDING) {
+                return;
+            }
+            promise._state = lib$es6$promise$$internal$$REJECTED;
+            promise._result = reason;
+            lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publishRejection, promise);
+        }
+        function lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection) {
+            var subscribers = parent._subscribers;
+            var length = subscribers.length;
+            parent._onerror = null;
+            subscribers[length] = child;
+            subscribers[length + lib$es6$promise$$internal$$FULFILLED] = onFulfillment;
+            subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection;
+            if (length === 0 && parent._state) {
+                lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, parent);
+            }
+        }
+        function lib$es6$promise$$internal$$publish(promise) {
+            var subscribers = promise._subscribers;
+            var settled = promise._state;
+            if (subscribers.length === 0) {
+                return;
+            }
+            var child, callback, detail = promise._result;
+            for (var i = 0; i < subscribers.length; i += 3) {
+                child = subscribers[i];
+                callback = subscribers[i + settled];
+                if (child) {
+                    lib$es6$promise$$internal$$invokeCallback(settled, child, callback, detail);
+                } else {
+                    callback(detail);
+                }
+            }
+            promise._subscribers.length = 0;
+        }
+        function lib$es6$promise$$internal$$ErrorObject() {
+            this.error = null;
+        }
+        var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject();
+        function lib$es6$promise$$internal$$tryCatch(callback, detail) {
+            try {
+                return callback(detail);
+            } catch (e) {
+                lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e;
+                return lib$es6$promise$$internal$$TRY_CATCH_ERROR;
+            }
+        }
+        function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) {
+            var hasCallback = lib$es6$promise$utils$$isFunction(callback), value, error, succeeded, failed;
+            if (hasCallback) {
+                value = lib$es6$promise$$internal$$tryCatch(callback, detail);
+                if (value === lib$es6$promise$$internal$$TRY_CATCH_ERROR) {
+                    failed = true;
+                    error = value.error;
+                    value = null;
+                } else {
+                    succeeded = true;
+                }
+                if (promise === value) {
+                    lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn());
+                    return;
+                }
+            } else {
+                value = detail;
+                succeeded = true;
+            }
+            if (promise._state !== lib$es6$promise$$internal$$PENDING) {
+            } else if (hasCallback && succeeded) {
+                lib$es6$promise$$internal$$resolve(promise, value);
+            } else if (failed) {
+                lib$es6$promise$$internal$$reject(promise, error);
+            } else if (settled === lib$es6$promise$$internal$$FULFILLED) {
+                lib$es6$promise$$internal$$fulfill(promise, value);
+            } else if (settled === lib$es6$promise$$internal$$REJECTED) {
+                lib$es6$promise$$internal$$reject(promise, value);
+            }
+        }
+        function lib$es6$promise$$internal$$initializePromise(promise, resolver) {
+            try {
+                resolver(function resolvePromise(value) {
+                    lib$es6$promise$$internal$$resolve(promise, value);
+                }, function rejectPromise(reason) {
+                    lib$es6$promise$$internal$$reject(promise, reason);
+                });
+            } catch (e) {
+                lib$es6$promise$$internal$$reject(promise, e);
+            }
+        }
+        function lib$es6$promise$enumerator$$Enumerator(Constructor, input) {
+            var enumerator = this;
+            enumerator._instanceConstructor = Constructor;
+            enumerator.promise = new Constructor(lib$es6$promise$$internal$$noop);
+            if (enumerator._validateInput(input)) {
+                enumerator._input = input;
+                enumerator.length = input.length;
+                enumerator._remaining = input.length;
+                enumerator._init();
+                if (enumerator.length === 0) {
+                    lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);
+                } else {
+                    enumerator.length = enumerator.length || 0;
+                    enumerator._enumerate();
+                    if (enumerator._remaining === 0) {
+                        lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);
+                    }
+                }
+            } else {
+                lib$es6$promise$$internal$$reject(enumerator.promise, enumerator._validationError());
+            }
+        }
+        lib$es6$promise$enumerator$$Enumerator.prototype._validateInput = function (input) {
+            return lib$es6$promise$utils$$isArray(input);
+        };
+        lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function () {
+            return new Error('Array Methods must be provided an Array');
+        };
+        lib$es6$promise$enumerator$$Enumerator.prototype._init = function () {
+            this._result = new Array(this.length);
+        };
+        var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator;
+        lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function () {
+            var enumerator = this;
+            var length = enumerator.length;
+            var promise = enumerator.promise;
+            var input = enumerator._input;
+            for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {
+                enumerator._eachEntry(input[i], i);
+            }
+        };
+        lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function (entry, i) {
+            var enumerator = this;
+            var c = enumerator._instanceConstructor;
+            if (lib$es6$promise$utils$$isMaybeThenable(entry)) {
+                if (entry.constructor === c && entry._state !== lib$es6$promise$$internal$$PENDING) {
+                    entry._onerror = null;
+                    enumerator._settledAt(entry._state, i, entry._result);
+                } else {
+                    enumerator._willSettleAt(c.resolve(entry), i);
+                }
+            } else {
+                enumerator._remaining--;
+                enumerator._result[i] = entry;
+            }
+        };
+        lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function (state, i, value) {
+            var enumerator = this;
+            var promise = enumerator.promise;
+            if (promise._state === lib$es6$promise$$internal$$PENDING) {
+                enumerator._remaining--;
+                if (state === lib$es6$promise$$internal$$REJECTED) {
+                    lib$es6$promise$$internal$$reject(promise, value);
+                } else {
+                    enumerator._result[i] = value;
+                }
+            }
+            if (enumerator._remaining === 0) {
+                lib$es6$promise$$internal$$fulfill(promise, enumerator._result);
+            }
+        };
+        lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function (promise, i) {
+            var enumerator = this;
+            lib$es6$promise$$internal$$subscribe(promise, undefined, function (value) {
+                enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value);
+            }, function (reason) {
+                enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason);
+            });
+        };
+        function lib$es6$promise$promise$all$$all(entries) {
+            return new lib$es6$promise$enumerator$$default(this, entries).promise;
+        }
+        var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all;
+        function lib$es6$promise$promise$race$$race(entries) {
+            var Constructor = this;
+            var promise = new Constructor(lib$es6$promise$$internal$$noop);
+            if (!lib$es6$promise$utils$$isArray(entries)) {
+                lib$es6$promise$$internal$$reject(promise, new TypeError('You must pass an array to race.'));
+                return promise;
+            }
+            var length = entries.length;
+            function onFulfillment(value) {
+                lib$es6$promise$$internal$$resolve(promise, value);
+            }
+            function onRejection(reason) {
+                lib$es6$promise$$internal$$reject(promise, reason);
+            }
+            for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {
+                lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);
+            }
+            return promise;
+        }
+        var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race;
+        function lib$es6$promise$promise$resolve$$resolve(object) {
+            var Constructor = this;
+            if (object && typeof object === 'object' && object.constructor === Constructor) {
+                return object;
+            }
+            var promise = new Constructor(lib$es6$promise$$internal$$noop);
+            lib$es6$promise$$internal$$resolve(promise, object);
+            return promise;
+        }
+        var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve;
+        function lib$es6$promise$promise$reject$$reject(reason) {
+            var Constructor = this;
+            var promise = new Constructor(lib$es6$promise$$internal$$noop);
+            lib$es6$promise$$internal$$reject(promise, reason);
+            return promise;
+        }
+        var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject;
+        var lib$es6$promise$promise$$counter = 0;
+        function lib$es6$promise$promise$$needsResolver() {
+            throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
+        }
+        function lib$es6$promise$promise$$needsNew() {
+            throw new TypeError('Failed to construct \'Promise\': Please use the \'new\' operator, this object constructor cannot be called as a function.');
+        }
+        var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise;
+        function lib$es6$promise$promise$$Promise(resolver) {
+            this._id = lib$es6$promise$promise$$counter++;
+            this._state = undefined;
+            this._result = undefined;
+            this._subscribers = [];
+            if (lib$es6$promise$$internal$$noop !== resolver) {
+                if (!lib$es6$promise$utils$$isFunction(resolver)) {
+                    lib$es6$promise$promise$$needsResolver();
+                }
+                if (!(this instanceof lib$es6$promise$promise$$Promise)) {
+                    lib$es6$promise$promise$$needsNew();
+                }
+                lib$es6$promise$$internal$$initializePromise(this, resolver);
+            }
+        }
+        lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default;
+        lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default;
+        lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default;
+        lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default;
+        lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler;
+        lib$es6$promise$promise$$Promise._setAsap = lib$es6$promise$asap$$setAsap;
+        lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$asap;
+        lib$es6$promise$promise$$Promise.prototype = {
+            constructor: lib$es6$promise$promise$$Promise,
+            then: function (onFulfillment, onRejection) {
+                var parent = this;
+                var state = parent._state;
+                if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) {
+                    return this;
+                }
+                var child = new this.constructor(lib$es6$promise$$internal$$noop);
+                var result = parent._result;
+                if (state) {
+                    var callback = arguments[state - 1];
+                    lib$es6$promise$asap$$asap(function () {
+                        lib$es6$promise$$internal$$invokeCallback(state, child, callback, result);
+                    });
+                } else {
+                    lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection);
+                }
+                return child;
+            },
+            'catch': function (onRejection) {
+                return this.then(null, onRejection);
+            }
+        };
+        function lib$es6$promise$polyfill$$polyfill() {
+            var local;
+            if (typeof global !== 'undefined') {
+                local = global;
+            } else if (typeof self !== 'undefined') {
+                local = self;
+            } else {
+                try {
+                    local = Function('return this')();
+                } catch (e) {
+                    throw new Error('polyfill failed because global object is unavailable in this environment');
+                }
+            }
+            var P = local.Promise;
+            if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) {
+                return;
+            }
+            local.Promise = lib$es6$promise$promise$$default;
+        }
+        var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill;
+        var lib$es6$promise$umd$$ES6Promise = {
+            'Promise': lib$es6$promise$promise$$default,
+            'polyfill': lib$es6$promise$polyfill$$default
+        };
+        if (true) {
+            promise = function () {
+                return lib$es6$promise$umd$$ES6Promise;
+            }();
+        } else if (typeof module !== 'undefined' && module['exports']) {
+            module['exports'] = lib$es6$promise$umd$$ES6Promise;
+        } else if (typeof this !== 'undefined') {
+            this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise;
+        }
+        lib$es6$promise$polyfill$$default();
+    }.call(this));
+    ProtocolsXHR = function (Logger, Helper, ES6Promise) {
+        var XHR = {
+            call: function (settings) {
+                ES6Promise.polyfill();
+                if (!settings.url) {
+                    throw new Error('missing parameter : url is not defined !');
+                }
+                if (!settings.method) {
+                    throw new Error('missing parameter : method is not defined !');
+                }
+                if (!settings.format) {
+                    settings.format = 'text';
+                }
+                var options = {};
+                options.url = settings.url;
+                options.data = settings.data ? settings.data : null;
+                options.method = settings.method;
+                options.timeOut = settings.timeOut || 0;
+                options.scope = settings.scope || this;
+                switch (settings.method) {
+                case 'DELETE':
+                case 'GET':
+                    break;
+                case 'PUT':
+                case 'POST':
+                    options.content = settings.content ? settings.content : 'application/x-www-form-urlencoded';
+                    options.headers = settings.headers ? settings.headers : { referer: 'http://localhost' };
+                    break;
+                case 'HEAD':
+                case 'OPTIONS':
+                    throw new Error('HTTP method not yet supported !');
+                default:
+                    throw new Error('HTTP method unknown !');
+                }
+                switch (settings.format) {
+                case 'text':
+                    this.__call(options).then(function (response) {
+                        settings.onResponse.call(this, response);
+                    }).catch(function (error) {
+                        settings.onFailure.call(this, error);
+                    });
+                    break;
+                case 'json':
+                    this.__callJSON(options).then(function (response) {
+                        settings.onResponse.call(this, response);
+                    }).catch(function (error) {
+                        settings.onFailure.call(this, error);
+                    });
+                    break;
+                case 'xml':
+                    this.__callXML(options).then(function (response) {
+                        settings.onResponse.call(this, response);
+                    }).catch(function (error) {
+                        settings.onFailure.call(this, error);
+                    });
+                    break;
+                default:
+                    throw new Error('This output Format is not yet supported !');
+                }
+            },
+            __call: function (options) {
+                var promise = new Promise(function (resolve, reject) {
+                    var corps = options.method === 'POST' || options.method === 'PUT' ? true : false;
+                    if (options.data && !corps) {
+                        options.url = Helper.normalyzeUrl(options.url, options.data);
+                    }
+                    var hXHR = null;
+                    if (window.XMLHttpRequest) {
+                        hXHR = new XMLHttpRequest();
+                        hXHR.open(options.method, options.url, true);
+                        hXHR.overrideMimeType = options.content;
+                        var onTimeOutTrigger = null;
+                        if (options.timeOut > 0) {
+                            onTimeOutTrigger = window.setTimeout(function () {
+                                var message = 'TimeOut Occured on Http Request with XMLHttpRequest !';
+                                reject({
+                                    message: message,
+                                    status: -1
+                                });
+                            }, options.timeOut);
+                        }
+                        if (corps) {
+                            hXHR.setRequestHeader('Content-type', options.content);
+                        }
+                        hXHR.onerror = function (e) {
+                            console.log(e);
+                            reject(new Error('Errors Occured on Http Request with XMLHttpRequest !'));
+                        };
+                        hXHR.ontimeout = function () {
+                            reject(new Error('TimeOut Occured on Http Request with XMLHttpRequest !'));
+                        };
+                        hXHR.onreadystatechange = function () {
+                            if (hXHR.readyState == 4) {
+                                if (hXHR.status == 200) {
+                                    window.clearTimeout(onTimeOutTrigger);
+                                    resolve(hXHR.response);
+                                } else {
+                                    var message = 'Errors Occured on Http Request (status : \'' + hXHR.status + '\' | response : \'' + hXHR.response + '\')';
+                                    var status = hXHR.status;
+                                    reject({
+                                        message: message,
+                                        status: status
+                                    });
+                                }
+                            }
+                        };
+                        var data4xhr = options.data && corps ? options.data : null;
+                        hXHR.send(data4xhr);
+                    } else if (window.XDomainRequest) {
+                        hXHR = new XDomainRequest();
+                        hXHR.open(options.method, options.url);
+                        hXHR.overrideMimeType = options.content;
+                        if (options.timeOut > 0) {
+                            hXHR.timeout = options.timeout;
+                        }
+                        if (corps) {
+                            hXHR.setRequestHeader('Content-type', options.content);
+                        }
+                        hXHR.onerror = function () {
+                            reject(new Error('Errors Occured on Http Request with XMLHttpRequest !'));
+                        };
+                        hXHR.ontimeout = function () {
+                            reject(new Error('TimeOut Occured on Http Request with XMLHttpRequest !'));
+                        };
+                        hXHR.onload = function () {
+                            if (hXHR.status == 200) {
+                                resolve(hXHR.responseText);
+                            } else {
+                                var message = 'Errors Occured on Http Request (status : \'' + hXHR.status + '\' | response : \'' + hXHR.responseText + '\')';
+                                var status = hXHR.status;
+                                reject({
+                                    message: message,
+                                    status: status
+                                });
+                            }
+                        };
+                        var data4xdr = options.data && corps ? options.data : null;
+                        hXHR.send(data4xdr);
+                    } else {
+                        throw new Error('CORS not supported');
+                    }
+                });
+                return promise;
+            },
+            __callJSON: function (options) {
+                return this.__call(options).then(JSON.parse).catch(function (error) {
+                    console.log('_callJSON failed on : ', options.url, error);
+                    throw error;
+                });
+            },
+            __callXML: function (options) {
+                return this.__call(options).then(function (response) {
+                    var xmlDoc;
+                    if (window.DOMParser) {
+                        var parser = new DOMParser();
+                        xmlDoc = parser.parseFromString(response, 'text/xml');
+                    } else {
+                        xmlDoc = new window.ActiveXObject('Microsoft.XMLDOM');
+                        xmlDoc.async = false;
+                        xmlDoc.loadXML(response);
+                    }
+                    return xmlDoc;
+                }).catch(function (error) {
+                    console.log('__callXML failed on : ', options.url, error);
+                    throw error;
+                });
+            }
+        };
+        return XHR;
+    }(UtilsLoggerByDefault, UtilsHelper, promise);
+    UtilsMessagesResources = function () {
+        var MessagesResources = {
+            PARAM_MISSING: 'Parameter(s) \'%var%\' missing',
+            PARAM_EMPTY: 'Parameter(s) \'%var%\' empty',
+            PARAM_TYPE: 'Wrong type(s) for parameter(s) \'%var%\'',
+            PARAM_FORMAT: 'Parameter(s) \'%var%\' not correctly formatted',
+            PARAM_NOT_SUPPORT: 'Value(s) for parameter(s) \'%var%\' not supported',
+            PARAM_UNKNOWN: 'Value(s) for parameter(s) \'%var%\' unknown',
+            SERVICE_REQUEST_BUILD: 'An error occurred during the request building of the service',
+            SERVICE_REQUEST_EMPTY: 'The request sent to the service is empty',
+            SERVICE_RESPONSE_EXCEPTION: 'The service returned an exception : \'%var%\'',
+            SERVICE_RESPONSE_EXCEPTION_2: 'The service returned an exception',
+            SERVICE_RESPONSE_ANALYSE: 'An error occurred while parsing the response \'%var%\' of the service',
+            SERVICE_RESPONSE_ANALYSE_2: 'An unknown error occurred while parsing the response',
+            SERVICE_RESPONSE_EMPTY: 'The response of the service is empty',
+            SERVICE_RESPONSE_EMPTY_2: 'The response from the service could not be analyzed or is empty',
+            SERVICE_RESPONSE_FORMAT: 'The format of the service response is not supported (handled format(s) : \'%var%\')',
+            SERVICE_RESPONSE_FORMAT_2: 'The format of the service response is not supported',
+            SERVICE_RESPONSE_FORMAT_3: 'No suggestion matching the search',
+            CLASS_CONSTRUCTOR: '\'%var%\' constructor cannot be called as a function.',
+            getMessage: function (clef, parametres) {
+                if (!arguments) {
+                    return 'Message indefined !';
+                }
+                var params = Array.prototype.slice.call(arguments);
+                var key = params.shift();
+                var args = params;
+                var message = this[key];
+                try {
+                    if (Array.isArray(args) && args.length > 0) {
+                        message = message.replace('%var%', args.join(' - '));
+                    } else {
+                        message = message.replace('%var%', '%var% (not specified)');
+                    }
+                } catch (e) {
+                }
+                return message;
+            }
+        };
+        return MessagesResources;
+    }();
+    ExceptionsErrorService = function () {
+        function ErrorService(error) {
+            if (!(this instanceof ErrorService)) {
+                throw new TypeError('ErrorService constructor cannot be called as a function.');
+            }
+            var e = error;
+            if (typeof error === 'string' || error instanceof String) {
+                this.message = error;
+                this.status = -1;
+                this.type = ErrorService.TYPE_UNKERR;
+            } else {
+                this.message = e.message || 'undefined!?';
+                this.type = e.type;
+                this.status = e.status || -1;
+            }
+            this.name = 'ErrorService';
+            this.stack = new Error().stack;
+        }
+        ErrorService.TYPE_SRVERR = 'SERVICE_ERROR';
+        ErrorService.TYPE_USEERR = 'USAGE_ERROR';
+        ErrorService.TYPE_UNKERR = 'UNKNOWN_ERROR';
+        ErrorService.prototype = Object.create(Error.prototype, {
+            constructor: {
+                value: ErrorService,
+                writable: true,
+                configurable: true
+            }
+        });
+        return ErrorService;
+    }();
+    ProtocolsJSONP = function (Logger) {
+        var JSONP = {
+            uuid: function () {
+                var id = Math.floor(Date.now());
+                return function () {
+                    return id++;
+                };
+            }(),
+            call: function (options) {
+                if (!options) {
+                    throw new Error('missing parameter : options !');
+                }
+                if (!options.url) {
+                    throw new Error('missing parameter : options.url !');
+                }
+                if (!options.timeOut) {
+                    options.timeOut = 0;
+                }
+                if (!options.onResponse) {
+                    throw new Error('missing parameter : options.onResponse !');
+                }
+                var callbackId = typeof options.callbackSuffix === 'string' ? options.callbackSuffix : this.uuid();
+                var urlHasCallbackKey = false;
+                var urlHasCallbackName = false;
+                var idx = options.url.indexOf('callback=');
+                if (idx != -1) {
+                    urlHasCallbackKey = true;
+                    var j = options.url.indexOf('&', idx);
+                    if (j === -1) {
+                        j = options.url.length;
+                    }
+                    var callbackName = options.url.substring(idx + 9, j);
+                    if (callbackName) {
+                        urlHasCallbackName = true;
+                        options.callbackName = callbackName;
+                    }
+                }
+                if (!urlHasCallbackKey) {
+                    var k = options.url.indexOf('?');
+                    if (k === -1) {
+                        options.url = options.url + '?' + 'callback=';
+                    } else if (k === options.url.length) {
+                        options.url = options.url + 'callback=';
+                    } else {
+                        options.url = options.url + '&' + 'callback=';
+                    }
+                }
+                var HasCallbackName = options.callbackName ? true : urlHasCallbackName;
+                if (!urlHasCallbackName) {
+                    if (!options.callbackName) {
+                        options.callbackName = 'callback';
+                        if (callbackId || callbackId === '') {
+                            options.callbackName += callbackId;
+                        }
+                    }
+                    options.url = options.url.replace('callback=', 'callback=' + options.callbackName);
+                }
+                if (!options.onTimeOut) {
+                    options.onTimeOut = function () {
+                        console.log('TimeOut while invoking url : ' + options.url);
+                    };
+                }
+                if (!HasCallbackName) {
+                    var self = this;
+                    var onTimeOutTrigger = null;
+                    if (options.timeOut > 0) {
+                        onTimeOutTrigger = window.setTimeout(function () {
+                            window[options.callbackName] = function () {
+                            };
+                            options.onTimeOut();
+                            self._deleteScript(callbackId);
+                        }, options.timeOut);
+                    }
+                    window[options.callbackName] = function (data) {
+                        window.clearTimeout(onTimeOutTrigger);
+                        options.onResponse(data);
+                        self._deleteScript(callbackId);
+                    };
+                }
+                this._createScript(callbackId, options.url);
+            },
+            _createScript: function (callbackId, url) {
+                var scriptu;
+                var scripto = document.getElementById('results' + callbackId);
+                scriptu = document.createElement('script');
+                scriptu.setAttribute('type', 'text/javascript');
+                scriptu.setAttribute('src', url);
+                scriptu.setAttribute('charset', 'UTF-8');
+                scriptu.setAttribute('id', 'results' + callbackId);
+                scriptu.setAttribute('async', 'true');
+                var node = document.documentElement || document.getElementsByTagName('head')[0];
+                if (scripto === null) {
+                    node.appendChild(scriptu);
+                } else {
+                    node.replaceChild(scriptu, scripto);
+                }
+            },
+            _deleteScript: function (callbackId) {
+                var script = document.getElementById('results' + callbackId);
+                if (script) {
+                    var node = script.parentNode || document.documentElement;
+                    if (!node) {
+                        return;
+                    }
+                    node.removeChild(script);
+                }
+            }
+        };
+        return JSONP;
+    }(UtilsLoggerByDefault);
+    ProtocolsProtocol = function (Helper, XHR, JSONP) {
+        var Protocol = {
+            send: function (options) {
+                var settings = options || {
+                    method: 'GET',
+                    protocol: 'JSONP',
+                    timeOut: 0,
+                    format: null,
+                    wrap: true,
+                    nocache: true,
+                    output: 'json',
+                    callback: null,
+                    callbackSuffix: null
+                };
+                if (options.protocol === 'XHR' || options.format === 'json') {
+                    settings.wrap = false;
+                } else if (options.protocol === 'JSONP' && options.format === 'xml') {
+                    settings.wrap = true;
+                }
+                settings.callback = options.protocol == 'JSONP' ? null : null;
+                settings.output = settings.wrap ? 'json' : null;
+                if (settings.wrap) {
+                    var params = {};
+                    params.output = settings.output;
+                    params.callback = settings.callback;
+                    delete params.callback;
+                    settings.url = Helper.normalyzeUrl(options.url, params);
+                }
+                switch (settings.protocol) {
+                case 'XHR':
+                    if (options.method === 'GET' && options.nocache) {
+                        settings.url = Helper.normalyzeUrl(settings.url, { t: new Date().getTime() });
+                    }
+                    XHR.call(settings);
+                    break;
+                case 'JSONP':
+                    if (settings.data) {
+                        settings.url = Helper.normalyzeUrl(settings.url, settings.data);
+                    }
+                    JSONP.call(settings);
+                    break;
+                default:
+                    throw new Error('protocol not supported (XHR|JSONP) !');
+                }
+            }
+        };
+        return Protocol;
+    }(UtilsHelper, ProtocolsXHR, ProtocolsJSONP);
+    ServicesDefaultUrlService = function () {
+        var protocol = location && location.protocol && location.protocol.indexOf('https:') === 0 ? 'https://' : 'http://';
+        var hostname = 'wxs.ign.fr';
+        var keyname = '%KEY%';
+        var url = protocol + hostname.concat('/', keyname);
+        var fkey = function (key) {
+            return this._key.replace(key ? keyname : null, key);
+        };
+        var DefaultUrlService = {
+            Alti: {
+                _key: {
+                    'elevation-json': url + '/alti/rest/elevation.json',
+                    'elevation-xml': url + '/alti/rest/elevation.xml',
+                    'profil-json': url + '/alti/rest/elevationLine.json',
+                    'profil-xml': url + '/alti/rest/elevationLine.xml',
+                    wps: url + '/alti/wps'
+                },
+                url: function (key) {
+                    return {
+                        'elevation-json': this._key['elevation-json'].replace(key ? keyname : null, key),
+                        'elevation-xml': this._key['elevation-xml'].replace(key ? keyname : null, key),
+                        'profil-json': this._key['profil-json'].replace(key ? keyname : null, key),
+                        'profil-xml': this._key['profil-xml'].replace(key ? keyname : null, key),
+                        wps: this._key.wps.replace(key ? keyname : null, key)
+                    };
+                }
+            },
+            ProcessIsoCurve: {
+                _key: {
+                    'iso-json': url + '/isochrone/isochrone.json',
+                    'iso-xml': url + '/isochrone/isochrone.xml'
+                },
+                url: function (key) {
+                    return {
+                        'iso-json': this._key['iso-json'].replace(key ? keyname : null, key),
+                        'iso-xml': this._key['iso-xml'].replace(key ? keyname : null, key)
+                    };
+                }
+            },
+            AutoComplete: {
+                _key: url + '/ols/apis/completion',
+                url: fkey
+            },
+            ReverseGeocode: {
+                _key: url + '/geoportail/ols',
+                url: fkey
+            },
+            AutoConf: {
+                _key: {
+                    apiKey: url + '/autoconf',
+                    apiKeys: url + '/autoconf?keys=%KEYS%'
+                },
+                url: function (key) {
+                    var keys = '';
+                    if (Array.isArray(key) && key.length > 0) {
+                        keys = key[0];
+                        for (var i = 1; i < key.length; i++) {
+                            keys += ',' + key[i];
+                        }
+                    }
+                    return {
+                        apiKey: this._key['apiKey'].replace(key ? keyname : null, key),
+                        apiKeys: this._key['apiKeys'].replace(keyname, key[0]).replace('%KEYS%', keys),
+                        aggregate: protocol + hostname.concat('/') + key + '/autoconf/id/'
+                    };
+                }
+            },
+            Geocode: {
+                _key: url + '/geoportail/ols',
+                url: fkey
+            },
+            Route: {
+                _key: {
+                    ols: url + '/itineraire/ols',
+                    'route-json': url + '/itineraire/rest/route.json',
+                    'route-xml': url + '/itineraire/rest/route.xml'
+                },
+                url: function (key) {
+                    return {
+                        ols: this._key.ols.replace(key ? keyname : null, key),
+                        'route-json': this._key['route-json'].replace(key ? keyname : null, key),
+                        'route-xml': this._key['route-xml'].replace(key ? keyname : null, key)
+                    };
+                }
+            }
+        };
+        return DefaultUrlService;
+    }();
+    ServicesCommonService = function (Logger, Helper, _, Protocol, ErrorService, DefaultUrlService) {
+        function CommonService(options) {
+            if (!(this instanceof CommonService)) {
+                throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR'));
+            }
+            this.options = {
+                protocol: 'JSONP',
+                proxyURL: '',
+                callbackSuffix: null,
+                httpMethod: 'GET',
+                timeOut: 0,
+                rawResponse: false,
+                scope: this,
+                onSuccess: function (response) {
+                    console.log('onSuccess - la reponse est la suivante : ', response);
+                },
+                onFailure: function (error) {
+                    if (error.status === 200 || !error.status) {
+                        console.log('onFailure : ', error.message);
+                    } else {
+                        console.log('onFailure - Erreur (', error.status, ') : ', error.message);
+                    }
+                }
+            };
+            for (var opt in options) {
+                if (options.hasOwnProperty(opt)) {
+                    this.options[opt] = options[opt];
+                }
+            }
+            if (!this.options.apiKey && !this.options.serverUrl) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'apiKey', 'serverUrl'));
+            }
+            if (this.options.rawResponse && !this.options.onSuccess) {
+                this.options.onSuccess = function (response) {
+                    console.log('onSuccess - la réponse brute du service est la suivante : ', response);
+                };
+            }
+            var bOnSuccess = this.options.onSuccess !== null && typeof this.options.onSuccess === 'function' ? true : false;
+            if (!bOnSuccess) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'onSuccess()'));
+            }
+            if (!this.options.serverUrl) {
+                var urlByDefault = DefaultUrlService[this.CLASSNAME].url(this.options.apiKey);
+                if (typeof urlByDefault === 'string') {
+                    this.options.serverUrl = urlByDefault;
+                } else {
+                }
+            }
+            if (this.options.serverUrl) {
+                var urlsource = this.options.serverUrl;
+                var urlparts = urlsource.split('?');
+                this.options.serverUrl = urlparts[0];
+            }
+            this.options.httpMethod = typeof options.httpMethod === 'string' ? options.httpMethod.toUpperCase() : 'GET';
+            switch (this.options.httpMethod) {
+            case 'POST':
+            case 'GET':
+                break;
+            case 'PUT':
+            case 'DELETE':
+            case 'HEAD':
+            case 'OPTIONS':
+                throw new Error(_.getMessage('PARAM_NOT_SUPPORT', 'httpMethod'));
+            default:
+                throw new Error(_.getMessage('PARAM_UNKNOWN', 'httpMethod'));
+            }
+            this.options.protocol = typeof options.protocol === 'string' ? options.protocol.toUpperCase() : 'JSONP';
+            switch (this.options.protocol) {
+            case 'JSONP':
+            case 'XHR':
+                break;
+            default:
+                throw new Error(_.getMessage('PARAM_UNKNOWN', 'protocol'));
+            }
+            if (this.options.protocol === 'JSONP') {
+                this.options.httpMethod = 'GET';
+            }
+            this.options.nocache = options.nocache || false;
+            this.options.outputFormat = null;
+            this.request = null;
+            this.response = null;
+        }
+        CommonService.prototype = {
+            constructor: CommonService,
+            call: function () {
+                function run() {
+                    this.buildRequest.call(this, onError, onBuildRequest);
+                }
+                run.call(this);
+                function onBuildRequest(result) {
+                    this.callService.call(this, onError, onCallService);
+                }
+                function onCallService(result) {
+                    this.analyzeResponse.call(this, onError, onAnalyzeResponse);
+                }
+                function onAnalyzeResponse(result) {
+                    if (result) {
+                        this.options.onSuccess.call(this, result);
+                    } else {
+                        return onError.call(this, new ErrorService('Analyse de la reponse en échec !?'));
+                    }
+                }
+                function onError(error) {
+                    var e = error;
+                    if (!(e instanceof ErrorService)) {
+                        e = new ErrorService(error.message);
+                    }
+                    this.options.onFailure.call(this, e);
+                }
+            },
+            buildRequest: function (error, success) {
+            },
+            callService: function (error, success) {
+                var strUrlProxified = null;
+                var strData = this.request;
+                var bUrlProxified = this.options.proxyURL && this.options.protocol === 'XHR' ? true : false;
+                this.options.serverUrl = Helper.normalyzeUrl(this.options.serverUrl, { 'gp-access-lib': '1.0.0-beta3' }, false);
+                if (bUrlProxified) {
+                    if (this.options.httpMethod === 'GET') {
+                        strUrlProxified = this.options.proxyURL + Helper.normalyzeUrl(this.options.serverUrl, this.request, true);
+                        strData = null;
+                    }
+                    if (this.options.httpMethod === 'POST') {
+                        strUrlProxified = this.options.proxyURL + Helper.normalyzeUrl(this.options.serverUrl, null, true);
+                        strData = this.request;
+                    }
+                }
+                var self = this;
+                var options = {
+                    url: strUrlProxified || this.options.serverUrl,
+                    method: this.options.httpMethod,
+                    protocol: this.options.protocol,
+                    timeOut: this.options.timeOut || 0,
+                    format: this.options.outputFormat,
+                    nocache: this.options.nocache || false,
+                    wrap: this.options.protocol === 'XHR' ? false : true,
+                    callbackSuffix: this.options.callbackSuffix,
+                    data: strData,
+                    headers: null,
+                    content: this.options.contentType || 'application/xml',
+                    scope: this.options.scope || this,
+                    onResponse: function (response) {
+                        var content = null;
+                        if (self.options.protocol == 'XHR') {
+                            content = response;
+                        }
+                        if (self.options.protocol == 'JSONP') {
+                            if (response) {
+                                if (response.http) {
+                                    if (response.http.status !== 200) {
+                                        error.call(self, new ErrorService({
+                                            status: response.http.status,
+                                            message: response.http.error,
+                                            type: ErrorService.TYPE_SRVERR
+                                        }));
+                                        return;
+                                    } else {
+                                        content = response.xml;
+                                    }
+                                } else {
+                                    content = response;
+                                }
+                            } else {
+                                error.call(self, new ErrorService('Le contenu de la reponse est vide !?'));
+                                return;
+                            }
+                        }
+                        self.response = content;
+                        success.call(self, content);
+                    },
+                    onFailure: function (e) {
+                        e.type = ErrorService.TYPE_SRVERR;
+                        error.call(self, new ErrorService(e));
+                    },
+                    onTimeOut: function () {
+                        error.call(self, new ErrorService('TimeOut!'));
+                    }
+                };
+                Protocol.send(options);
+            },
+            analyzeResponse: function (error, success) {
+            }
+        };
+        return CommonService;
+    }(UtilsLoggerByDefault, UtilsHelper, UtilsMessagesResources, ProtocolsProtocol, ExceptionsErrorService, ServicesDefaultUrlService);
+    ServicesAltiRequestModelAltiRequest = function (Logger) {
+        function AltiRequest(options) {
+            if (!(this instanceof AltiRequest)) {
+                throw new TypeError('AltiRequest constructor cannot be called as a function.');
+            }
+            this.options = options || {};
+            this.positions = this.options.positions || [];
+            this.delimiter = this.options.delimiter || '|';
+            this.indent = this.options.indent || false;
+            this.crs = this.options.crs || 'CRS:84';
+            this.format = this.options.format || 'json';
+        }
+        AltiRequest.CLASSNAME = 'AltiRequest';
+        AltiRequest.prototype = {
+            constructor: AltiRequest,
+            setPositions: function (lstPosition) {
+                var positions = [];
+                for (var i = 0; i < lstPosition.length; i++) {
+                    var o = lstPosition[i];
+                    if (o.lon && o.lat) {
+                        positions.push(o);
+                    }
+                }
+                this.positions = positions;
+            },
+            getPositions: function (pos) {
+                if (!pos) {
+                    return this.positions;
+                }
+                var index = this.positions.length - 1;
+                if (pos > index || pos < index) {
+                    return this.positions;
+                }
+                return this.positions[pos];
+            },
+            addPositions: function (lstPosition) {
+                for (var i = 0; i < lstPosition.length; i++) {
+                    var o = lstPosition[i];
+                    if (o.lon && o.lat) {
+                        this.positions.push(lstPosition[i]);
+                    }
+                }
+            },
+            getLon: function () {
+                var lstLon = [];
+                for (var i = 0; i < this.positions.length; i++) {
+                    lstLon.push(this.positions[i].lon);
+                }
+                return lstLon.join(this.delimiter);
+            },
+            getLat: function () {
+                var lstLat = [];
+                for (var i = 0; i < this.positions.length; i++) {
+                    lstLat.push(this.positions[i].lat);
+                }
+                return lstLat.join(this.delimiter);
+            }
+        };
+        AltiRequest.prototype.getData = function () {
+            var map = [];
+            map.push({
+                k: 'lon',
+                v: this.getLon()
+            });
+            map.push({
+                k: 'lat',
+                v: this.getLat()
+            });
+            map.push({
+                k: 'delimiter',
+                v: this.delimiter
+            });
+            map.push({
+                k: 'indent',
+                v: this.indent
+            });
+            map.push({
+                k: 'crs',
+                v: this.crs
+            });
+            map.push({
+                k: 'format',
+                v: this.format
+            });
+            return map;
+        };
+        return AltiRequest;
+    }(UtilsLoggerByDefault);
+    ServicesAltiRequestModelAltiElevationRequest = function (Logger, AltiRequest) {
+        function AltiElevationRequest(options) {
+            if (!(this instanceof AltiElevationRequest)) {
+                throw new TypeError('AltiElevationRequest constructor cannot be called as a function.');
+            }
+            this.CLASSNAME = 'AltiElevationRequest';
+            AltiRequest.apply(this, arguments);
+            this.zonly = this.options.zonly || false;
+        }
+        AltiElevationRequest.prototype = Object.create(AltiRequest.prototype, {
+            zonly: {
+                get: function () {
+                    return this._zonly;
+                },
+                set: function (z) {
+                    this._zonly = z;
+                }
+            }
+        });
+        AltiElevationRequest.prototype.constructor = AltiElevationRequest;
+        AltiElevationRequest.prototype.getData = function () {
+            var map = [];
+            map.push({
+                k: 'lon',
+                v: this.getLon()
+            });
+            map.push({
+                k: 'lat',
+                v: this.getLat()
+            });
+            map.push({
+                k: 'indent',
+                v: this.indent
+            });
+            map.push({
+                k: 'crs',
+                v: this.crs
+            });
+            map.push({
+                k: 'zonly',
+                v: this.zonly
+            });
+            map.push({
+                k: 'format',
+                v: this.format
+            });
+            return map;
+        };
+        return AltiElevationRequest;
+    }(UtilsLoggerByDefault, ServicesAltiRequestModelAltiRequest);
+    ServicesAltiRequestModelAltiProfilRequest = function (Logger, AltiRequest) {
+        function AltiProfilRequest(options) {
+            if (!(this instanceof AltiProfilRequest)) {
+                throw new TypeError('AltiProfilRequest constructor cannot be called as a function.');
+            }
+            this.CLASSNAME = 'AltiProfilRequest';
+            AltiRequest.apply(this, arguments);
+            this.sampling = this.options.sampling || 3;
+        }
+        AltiProfilRequest.prototype = Object.create(AltiRequest.prototype, {
+            sampling: {
+                get: function () {
+                    return this._sampling;
+                },
+                set: function (value) {
+                    this._sampling = value;
+                }
+            }
+        });
+        AltiProfilRequest.prototype.constructor = AltiProfilRequest;
+        AltiProfilRequest.prototype.getData = function () {
+            var map = [];
+            map.push({
+                k: 'lon',
+                v: this.getLon()
+            });
+            map.push({
+                k: 'lat',
+                v: this.getLat()
+            });
+            map.push({
+                k: 'indent',
+                v: this.indent
+            });
+            map.push({
+                k: 'crs',
+                v: this.crs
+            });
+            map.push({
+                k: 'sampling',
+                v: this.sampling
+            });
+            map.push({
+                k: 'format',
+                v: this.format
+            });
+            return map;
+        };
+        return AltiProfilRequest;
+    }(UtilsLoggerByDefault, ServicesAltiRequestModelAltiRequest);
+    ServicesAltiRequestAltiRequestREST = function (Logger, _, AltiElevationRequest, AltiProfilRequest) {
+        function AltiRequestREST(options) {
+            if (!(this instanceof AltiRequestREST)) {
+                throw new TypeError('AltiRequestREST constructor cannot be called as a function.');
+            }
+            this.options = options || {};
+            if (!this.options) {
+                throw new Error(_.getMessage('PARAM_EMPTY', 'options'));
+            }
+            if (!this.options.type) {
+                throw new Error(_.getMessage('PARAM_EMPTY', 'type (Elevation or Profil)'));
+            }
+            this.DataObject = null;
+            switch (this.options.type) {
+            case 'Elevation':
+                this.DataObject = new AltiElevationRequest(this.options.param);
+                break;
+            case 'Profil':
+                this.DataObject = new AltiProfilRequest(this.options.param);
+                break;
+            default:
+                throw new Error(_.getMessage('PARAM_TYPE', 'type (Elevation or Profil)'));
+            }
+            this.method = this.options.method || 'GET';
+        }
+        AltiRequestREST.prototype = {
+            requestString: null,
+            constructor: AltiRequestREST,
+            template: {
+                get: {
+                    value: 'lon=__LON__&lat=__LAT__&indent=__INDENT__&crs=\'__CRS__\'',
+                    input: {
+                        point: '&zonly=__ZONLY__',
+                        profil: '&sampling=__SAMPLING__'
+                    }
+                },
+                post: {
+                    value: 'lon=__LON__\n' + 'lat=__LAT__\n' + 'indent=__INDENT__\n' + 'crs=\'__CRS__\'\n',
+                    input: {
+                        point: 'zonly=__ZONLY__',
+                        profil: 'sampling=__SAMPLING__'
+                    }
+                }
+            },
+            processRequestString: function () {
+                var template = '';
+                if (this.method == 'POST') {
+                    template = this.template.post.value;
+                } else if (this.method == 'GET') {
+                    template = this.template.get.value;
+                }
+                template = template.replace(/__LON__/g, this.DataObject.getLon());
+                template = template.replace(/__LAT__/g, this.DataObject.getLat());
+                template = template.replace(/__INDENT__/g, this.DataObject.indent);
+                template = template.replace(/__CRS__/g, this.DataObject.crs);
+                template = template + this.__addDataInputs();
+                this.requestString = template;
+                return this.requestString;
+            },
+            __addDataInputs: function () {
+                var myTemplate;
+                if (this.method == 'POST') {
+                    myTemplate = this.template.post;
+                } else if (this.method == 'GET') {
+                    myTemplate = this.template.get;
+                } else {
+                    throw new Error('No other HTTP method supported by the service !');
+                }
+                var tmpl = null;
+                if (this.DataObject.CLASSNAME == 'AltiElevationRequest') {
+                    tmpl = myTemplate.input.point;
+                    return tmpl.replace(/__ZONLY__/g, this.DataObject.zonly);
+                } else if (this.DataObject.CLASSNAME == 'AltiProfilRequest') {
+                    tmpl = myTemplate.input.profil;
+                    return tmpl.replace(/__SAMPLING__/g, this.DataObject.sampling);
+                } else {
+                    throw new Error('No other object supported than elevation or profil !?');
+                }
+            }
+        };
+        return AltiRequestREST;
+    }(UtilsLoggerByDefault, UtilsMessagesResources, ServicesAltiRequestModelAltiElevationRequest, ServicesAltiRequestModelAltiProfilRequest);
+    FormatsWPS = function (Logger) {
+        function WPS(options) {
+            if (!(this instanceof WPS)) {
+                throw new TypeError('WPS constructor cannot be called as a function.');
+            }
+            this.options = options || {};
+            this.DataObject = this.options.data;
+            if (!this.DataObject) {
+                throw new TypeError('This data object is not defined !');
+            }
+            this.paramservice = this.options.param.service || 'WPS';
+            this.paramversion = this.options.param.version || '1.0.0';
+            this.paramidentifier = this.options.param.identifier || 'gs:WPS';
+            this.paramrawdataoutput = this.options.param.rawdataoutput || 'result';
+            this.paramrequest = this.options.param.request || 'Execute';
+            this.method = this.options.method || 'GET';
+        }
+        WPS.prototype = {
+            requestString: null,
+            constructor: WPS,
+            template: {
+                get: {
+                    value: 'service=__SERVICE__' + '&version=__VERSION__' + '&rawdataoutput=__RAWDATAOUTPUT__' + '&identifier=__IDENTIFIER__' + '&request=__REQUEST__' + '&datainputs=<!-- __DATAINPUTS__ -->',
+                    input: '__KEY__=__DATA__'
+                },
+                post: {
+                    value: '<?xml version="1.0" encoding="UTF-8"?>' + '<wps:__REQUEST__ version="__VERSION__" service="__SERVICE__" ' + '__NAMESPACE__ __SCHEMALOCATION__>' + '<ows:Identifier>__IDENTIFIER__</ows:Identifier>' + '<wps:DataInputs>' + '<!-- __DATAINPUTS__ -->' + '</wps:DataInputs>' + '<wps:ResponseForm>' + '<wps:RawDataOutput>' + '<ows:Identifier>__RAWDATAOUTPUT__</ows:Identifier>' + '</wps:RawDataOutput>' + '</wps:ResponseForm>' + '</wps:__REQUEST__>',
+                    input: '<wps:Input>' + '<ows:Identifier>__KEY__</ows:Identifier>' + '<wps:Data>' + '<wps:LiteralData>__DATA__</wps:LiteralData>' + '</wps:Data>' + '</wps:Input>'
+                }
+            },
+            namespaceByDefault: function () {
+                var ns = [
+                    'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"',
+                    'xmlns="http://www.opengis.net/wps/1.0.0"',
+                    'xmlns:wfs="http://www.opengis.net/wfs"',
+                    'xmlns:wps="http://www.opengis.net/wps/1.0.0"',
+                    'xmlns:ows="http://www.opengis.net/ows/1.1"',
+                    'xmlns:gml="http://www.opengis.net/gml"',
+                    'xmlns:ogc="http://www.opengis.net/ogc"',
+                    'xmlns:wcs="http://www.opengis.net/wcs/1.1.1"',
+                    'xmlns:xlink="http://www.w3.org/1999/xlink"'
+                ];
+                return ns.join(' ');
+            },
+            schemaLocationByDefault: function () {
+                return 'xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd"';
+            },
+            processRequestString: function () {
+                var template = '';
+                if (this.method == 'POST') {
+                    template = this.template.post.value;
+                } else if (this.method == 'GET') {
+                    template = this.template.get.value;
+                } else {
+                    return false;
+                }
+                template = template.replace(/__SERVICE__/g, this.paramservice);
+                template = template.replace(/__VERSION__/g, this.paramversion);
+                template = template.replace(/__RAWDATAOUTPUT__/g, this.paramrawdataoutput);
+                template = template.replace(/__IDENTIFIER__/g, this.paramidentifier);
+                template = template.replace(/__REQUEST__/g, this.paramrequest);
+                if (this.method == 'POST') {
+                    template = template.replace(/__NAMESPACE__/g, this.namespaceByDefault);
+                    template = template.replace(/__SCHEMALOCATION__/g, this.schemaLocationByDefault);
+                }
+                template = template.replace(/<!-- __DATAINPUTS__ -->/g, this.__addDataInputs());
+                if (!template) {
+                    return false;
+                }
+                this.requestString = template;
+                return true;
+            },
+            __addDataInputs: function () {
+                var tmpl = this.method == 'GET' ? this.template.get.input : this.template.post.input;
+                var sep = this.method == 'GET' ? ';' : '';
+                var result = '';
+                var that = this;
+                var map = this.DataObject.getData();
+                for (var i = 0; i < map.length; i++) {
+                    (function (j) {
+                        if (sep) {
+                            sep = j == map.length - 1 ? '' : ';';
+                        }
+                        result = result.concat(that.__addDataInput(tmpl, map[j].k, map[j].v), sep);
+                    }(i));
+                }
+                return result;
+            },
+            __addDataInput: function (tmpl, key, data) {
+                var tmp = tmpl;
+                tmp = tmp.replace(/__KEY__/g, key);
+                tmp = tmp.replace(/__DATA__/g, data);
+                return tmp;
+            },
+            setMethod: function (method) {
+                if (method == 'GET' || method == 'POST') {
+                    this.method = method;
+                } else {
+                }
+            },
+            getMethod: function () {
+                return this.method;
+            }
+        };
+        return WPS;
+    }(UtilsLoggerByDefault);
+    ServicesAltiRequestAltiRequestWPS = function (Logger, _, WPS, AltiElevationRequest, AltiProfilRequest) {
+        var AltiRequestWPS = {
+            build: function (options) {
+                if (!options) {
+                    throw new Error(_.getMessage('PARAM_EMPTY', 'options'));
+                }
+                if (!options.type) {
+                    throw new Error(_.getMessage('PARAM_EMPTY', 'type (Elevation or Profil)'));
+                }
+                var DataObject = null;
+                switch (options.type) {
+                case 'Elevation':
+                    options.wps.identifier = 'gs:WPSElevation';
+                    DataObject = new AltiElevationRequest(options.param);
+                    break;
+                case 'Profil':
+                    options.wps.identifier = 'gs:WPSLineElevation';
+                    DataObject = new AltiProfilRequest(options.param);
+                    break;
+                default:
+                    throw new Error(_.getMessage('PARAM_TYPE', 'type (Elevation or Profil)'));
+                }
+                var settings = {
+                    data: DataObject,
+                    method: options.method,
+                    param: options.wps
+                };
+                var rqstWPS = new WPS(settings);
+                if (!rqstWPS.processRequestString()) {
+                    throw new Error('Enable to process request !');
+                }
+                return rqstWPS.requestString;
+            }
+        };
+        return AltiRequestWPS;
+    }(UtilsLoggerByDefault, UtilsMessagesResources, FormatsWPS, ServicesAltiRequestModelAltiElevationRequest, ServicesAltiRequestModelAltiProfilRequest);
+    ServicesAltiRequestAltiRequestFactory = function (Logger, ErrorService, AltiRequestREST, AltiRequestWPS) {
+        var AltiRequestFactory = {
+            build: function (options) {
+                var request = null;
+                var settings = {
+                    type: options.sampling ? 'Profil' : 'Elevation',
+                    method: options.httpMethod,
+                    param: {
+                        positions: null,
+                        delimiter: null,
+                        indent: null,
+                        crs: null,
+                        format: null,
+                        sampling: null,
+                        zonly: null
+                    }
+                };
+                settings.param.positions = options.positions;
+                settings.param.format = options.outputFormat;
+                settings.param.sampling = options.sampling;
+                settings.param.zonly = options.zonly;
+                var bOnError = options.onError !== null && typeof options.onError === 'function' ? true : false;
+                var bOnSuccess = options.onSuccess !== null && typeof options.onSuccess === 'function' ? true : false;
+                var message = null;
+                switch (options.api) {
+                case 'REST':
+                    var myReq = new AltiRequestREST(settings);
+                    if (!myReq.processRequestString()) {
+                        message = 'Error in process request (rest) !';
+                        if (bOnError) {
+                            options.onError.call(options.scope, new ErrorService(message));
+                            return;
+                        }
+                        throw new Error(message);
+                    }
+                    request = myReq.requestString;
+                    break;
+                case 'WPS':
+                    settings.wps = {
+                        service: null,
+                        version: null,
+                        identifier: null,
+                        rawdataoutput: null,
+                        request: null
+                    };
+                    request = AltiRequestWPS.build(settings);
+                    if (!request) {
+                        message = 'Error in process request (wps) !';
+                        if (bOnError) {
+                            options.onError.call(options.scope, new ErrorService(message));
+                            return;
+                        }
+                        throw new Error(message);
+                    }
+                    break;
+                default:
+                    message = 'Type of API is not supported by service (REST or WPS) !';
+                    if (bOnError) {
+                        options.onError.call(options.scope, new ErrorService(message));
+                        return;
+                    }
+                    throw new Error(message);
+                }
+                if (bOnSuccess) {
+                    options.onSuccess.call(options.scope, request);
+                }
+                return request;
+            }
+        };
+        return AltiRequestFactory;
+    }(UtilsLoggerByDefault, ExceptionsErrorService, ServicesAltiRequestAltiRequestREST, ServicesAltiRequestAltiRequestWPS);
+    FormatsXML = function (Logger) {
+        function XML(options) {
+            if (!(this instanceof XML)) {
+                throw new TypeError('XML constructor cannot be called as a function.');
+            }
+            this.xmlString = null;
+            this.xmlDoc = null;
+            this.reader = null;
+            if (options) {
+                if (options.xmlString && typeof options.xmlString === 'string') {
+                    this.xmlString = options.xmlString;
+                    this.xmlDoc = __getXMLDOC(options.xmlString);
+                }
+                if (options.reader) {
+                    this.setReader(options.reader);
+                }
+            }
+        }
+        XML.prototype = {
+            constructor: XML,
+            getXMLString: function () {
+                return this.xmlString;
+            },
+            setXMLString: function (xmlString) {
+                if (xmlString && typeof xmlString === 'string') {
+                    this.xmlString = xmlString;
+                    this.xmlDoc = __getXMLDOC(xmlString);
+                }
+            },
+            getReader: function () {
+                return this.reader;
+            },
+            setReader: function (reader) {
+                if (reader && reader.read && typeof reader.read === 'function') {
+                    this.reader = reader;
+                }
+            },
+            getXMLDoc: function () {
+                return this.xmlDoc;
+            },
+            setXMLDoc: function (doc) {
+                this.xmlDoc = doc;
+            },
+            parse: function () {
+                if (!this.xmlDoc && this.xmlString) {
+                    this.xmlDoc = __getXMLDOC(this.xmlString);
+                }
+                if (this.xmlDoc) {
+                    var root = __getRootNode(this.xmlDoc);
+                    if (root) {
+                        var parserOutput;
+                        if (this.reader && this.reader.read) {
+                            parserOutput = this.reader.read(root);
+                        } else {
+                            parserOutput = {};
+                            parserOutput[root.nodeName] = __readDefault(root);
+                        }
+                        return parserOutput;
+                    } else {
+                        return {};
+                    }
+                }
+            }
+        };
+        function __getXMLDOC(xmlString) {
+            if (typeof exports === 'object') {
+                var DOMParser = xmldom.DOMParser;
+                return new DOMParser().parseFromString(xmlString, 'text/xml');
+            } else {
+                var parser;
+                var xmlDoc;
+                var errorMsg = 'Erreur lors du parsing de la réponse du service : XML non conforme';
+                if (window.ActiveXObject) {
+                    xmlDoc = new window.ActiveXObject('Microsoft.XMLDOM');
+                    xmlDoc.async = false;
+                    xmlDoc.loadXML(xmlString);
+                    var parseError = xmlDoc.parseError;
+                    if (parseError.errorCode) {
+                        if (parseError.line && parseError.linepos) {
+                            errorMsg += '( ligne ' + parseError.line + ', colonne ' + parseError.linepos;
+                        }
+                        if (parseError.reason) {
+                            errorMsg += ':  ' + parseError.reason + ')';
+                        }
+                        throw new Error(errorMsg);
+                    }
+                    return xmlDoc;
+                } else if (window.DOMParser) {
+                    parser = new window.DOMParser();
+                    try {
+                        xmlDoc = parser.parseFromString(xmlString, 'text/xml');
+                    } catch (e) {
+                        if (e.message === 'SyntaxError') {
+                            throw new Error(errorMsg);
+                        } else {
+                            throw new Error('Erreur lors du parsing de la réponse du service : ' + e.message);
+                        }
+                    }
+                    if (xmlDoc.getElementsByTagName('parsererror').length > 0) {
+                        var parsererror = xmlDoc.getElementsByTagName('parsererror');
+                        for (var i = 0; i < parsererror.length; i++) {
+                            var content = parsererror[i].innerHTML;
+                            if (content.indexOf('Huge input lookup') == -1) {
+                                errorMsg += '(' + content + ')';
+                                throw new Error(errorMsg);
+                            }
+                        }
+                    } else if (!xmlDoc.documentElement) {
+                        throw new Error(errorMsg);
+                    }
+                    return xmlDoc;
+                } else {
+                    throw new Error('Incompatible DOM Parser pour ce navigateur !');
+                }
+            }
+        }
+        function __getRootNode(xmlDoc) {
+            var root;
+            if (xmlDoc.nodeType === 9) {
+                root = xmlDoc.documentElement;
+            } else if (xmlDoc.nodeType === 1) {
+                root = xmlDoc;
+            }
+            return root;
+        }
+        function __readDefault(node) {
+            var data = {};
+            if (node.attributes.length > 0) {
+                var dataAttributes = __getAttributes(node);
+                data['attributes'] = dataAttributes;
+            }
+            if (node.hasChildNodes()) {
+                var childData = {};
+                var child;
+                var children = node.childNodes;
+                for (var i = 0; i < children.length; i++) {
+                    child = children[i];
+                    if (child.nodeType === 3) {
+                        data['textContent'] = child.nodeValue;
+                    } else if (child.nodeType === 1) {
+                        childData = __readDefault(child);
+                        if (!data[child.nodeName]) {
+                            data[child.nodeName] = childData;
+                        } else {
+                            if (!Array.isArray(data[child.nodeName])) {
+                                var old = data[child.nodeName];
+                                data[child.nodeName] = [];
+                                data[child.nodeName].push(old);
+                            }
+                            data[child.nodeName].push(childData);
+                        }
+                    }
+                }
+            }
+            return data;
+        }
+        function __getAttributes(node) {
+            if (node.attributes.length > 0) {
+                var nodeAttributes = {};
+                var attributes = node.attributes;
+                for (var i = 0; i < attributes.length; i++) {
+                    var attribute = attributes[i];
+                    nodeAttributes[attribute.nodeName] = attribute.nodeValue;
+                }
+                return nodeAttributes;
+            }
+        }
+        return XML;
+    }(UtilsLoggerByDefault);
+    ServicesAltiResponseModelAltiResponse = function () {
+        function AltiResponse() {
+            if (!(this instanceof AltiResponse)) {
+                throw new TypeError('AltiResponse constructor cannot be called as a function.');
+            }
+            this.elevations = [];
+        }
+        AltiResponse.prototype = { constructor: AltiResponse };
+        return AltiResponse;
+    }();
+    ServicesAltiResponseModelElevation = function () {
+        function Elevation() {
+            if (!(this instanceof Elevation)) {
+                throw new TypeError('Elevation constructor cannot be called as a function.');
+            }
+            this.z = null;
+        }
+        Elevation.prototype = { constructor: Elevation };
+        return Elevation;
+    }();
+    ServicesAltiFormatsAltiResponseReader = function (Logger, AltiResponse, Elevation) {
+        var AltiResponseReader = {};
+        AltiResponseReader.READERS = {
+            elevations: function (root) {
+                var altiResponse = new AltiResponse();
+                if (root.hasChildNodes()) {
+                    var children = root.childNodes;
+                    var child;
+                    var elevation;
+                    for (var i = 0; i < children.length; i++) {
+                        child = children[i];
+                        if (AltiResponseReader.READERS[child.nodeName]) {
+                            elevation = AltiResponseReader.READERS[child.nodeName](child);
+                            altiResponse.elevations.push(elevation);
+                        }
+                    }
+                }
+                return altiResponse;
+            },
+            elevation: function (node) {
+                var elevation = new Elevation();
+                if (node.hasChildNodes()) {
+                    var children = node.childNodes;
+                    var child;
+                    for (var i = 0; i < children.length; i++) {
+                        child = children[i];
+                        if (AltiResponseReader.READERS[child.nodeName]) {
+                            AltiResponseReader.READERS[child.nodeName](child, elevation);
+                        }
+                    }
+                }
+                return elevation;
+            },
+            lat: function (node, elevation) {
+                var textNode = node.firstChild;
+                if (textNode && textNode.nodeType === 3) {
+                    elevation.lat = parseFloat(textNode.nodeValue);
+                } else {
+                    throw new Error('Erreur dans la lecture de la réponse du service: latitude attendue mais absente');
+                }
+            },
+            lon: function (node, elevation) {
+                var textNode = node.firstChild;
+                if (textNode && textNode.nodeType === 3) {
+                    elevation.lon = parseFloat(textNode.nodeValue);
+                } else {
+                    throw new Error('Erreur dans la lecture de la réponse du service: longitude attendue mais absente');
+                }
+            },
+            z: function (node, elevation) {
+                var textNode = node.firstChild;
+                if (textNode && textNode.nodeType === 3) {
+                    if (elevation) {
+                        elevation.z = parseFloat(textNode.nodeValue);
+                    } else {
+                        elevation = new Elevation();
+                        elevation.z = parseFloat(textNode.nodeValue);
+                        return elevation;
+                    }
+                } else {
+                    throw new Error('Erreur dans la lecture de la réponse du service: altitude attendue mais absente');
+                }
+            },
+            acc: function (node, elevation) {
+                var textNode = node.firstChild;
+                if (textNode && textNode.nodeType === 3) {
+                    elevation.acc = parseFloat(textNode.nodeValue);
+                } else {
+                    throw new Error('Erreur dans la lecture de la réponse du service: précision (acc) attendue mais absente');
+                }
+            },
+            exceptionreport: function (node) {
+                var response = {};
+                if (node.hasChildNodes()) {
+                    var children = node.childNodes;
+                    var child;
+                    for (var i = 0; i < children.length; i++) {
+                        child = children[i];
+                        if (child.nodeName === 'Exception') {
+                            response.exceptionReport = AltiResponseReader.READERS.exception(child);
+                        }
+                    }
+                }
+                return response;
+            },
+            exception: function (node) {
+                var exceptionReport = {};
+                var exceptionCode = node.getAttribute('exceptionCode');
+                if (exceptionCode) {
+                    exceptionReport.exceptionCode = exceptionCode;
+                }
+                var textNode = node.firstChild;
+                if (textNode && textNode.nodeType === 3) {
+                    exceptionReport.exception = textNode.nodeValue;
+                }
+                return exceptionReport;
+            },
+            error: function (node) {
+                var response = { error: {} };
+                if (node.hasChildNodes()) {
+                    var children = node.childNodes;
+                    var child;
+                    for (var i = 0; i < children.length; i++) {
+                        child = children[i];
+                        var textNode;
+                        if (child.nodeType === 1 && child.nodeName === 'code') {
+                            textNode = child.firstChild;
+                            if (textNode && textNode.nodeType === 3) {
+                                response.error.code = textNode.nodeValue;
+                            }
+                        }
+                        if (child.nodeType === 1 && child.nodeName === 'description') {
+                            textNode = child.firstChild;
+                            if (textNode && textNode.nodeType === 3) {
+                                response.error.description = textNode.nodeValue;
+                            }
+                        }
+                    }
+                }
+                return response;
+            }
+        };
+        AltiResponseReader.read = function (root) {
+            if (root.nodeName === 'elevations') {
+                var altiResponse = AltiResponseReader.READERS.elevations(root);
+                return altiResponse;
+            } else if (root.nodeName === 'ExceptionReport') {
+                var exceptionReport = AltiResponseReader.READERS.exceptionreport(root);
+                return exceptionReport;
+            } else if (root.nodeName === 'error') {
+                var error = AltiResponseReader.READERS.error(root);
+                return error;
+            } else {
+                throw new Error('Erreur lors de la lecture de la réponse : elle n\'est pas au format attendu.');
+            }
+        };
+        return AltiResponseReader;
+    }(UtilsLoggerByDefault, ServicesAltiResponseModelAltiResponse, ServicesAltiResponseModelElevation);
+    ServicesAltiResponseAltiResponseFactory = function (Logger, ErrorService, MRes, XML, AltiResponseReader, AltiResponse, Elevation) {
+        var AltiResponseFactory = {
+            build: function (options) {
+                var data = null;
+                if (options.response) {
+                    if (options.rawResponse) {
+                        data = options.response;
+                    } else {
+                        switch (options.outputFormat) {
+                        case 'xml':
+                            try {
+                                var p = new XML({ reader: AltiResponseReader });
+                                if (typeof options.response === 'string') {
+                                    p.setXMLString(options.response);
+                                } else {
+                                    p.setXMLDoc(options.response);
+                                }
+                                data = p.parse();
+                                if (!data) {
+                                    throw new Error(MRes.getMessage('SERVICE_RESPONSE_EXCEPTION_2'));
+                                }
+                            } catch (e) {
+                                var message = e.message;
+                                options.onError.call(options.scope, new ErrorService({
+                                    message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', message),
+                                    status: 200,
+                                    type: ErrorService.TYPE_SRVERR
+                                }));
+                                return;
+                            }
+                            break;
+                        case 'json':
+                            var JSONResponse;
+                            if (typeof options.response === 'string') {
+                                JSONResponse = window.JSON.parse(options.response);
+                            } else {
+                                JSONResponse = options.response;
+                            }
+                            if (JSONResponse.error) {
+                                options.onError.call(options.scope, new ErrorService({
+                                    message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', JSONResponse.error.description),
+                                    status: 200,
+                                    type: ErrorService.TYPE_SRVERR
+                                }));
+                                return;
+                            }
+                            if (JSONResponse) {
+                                var elevations = JSONResponse.elevations;
+                                var altiResponse = new AltiResponse();
+                                var elevation;
+                                if (Array.isArray(elevations) && elevations.length) {
+                                    for (var i = 0; i < elevations.length; i++) {
+                                        elevation = new Elevation();
+                                        if (typeof elevations[i] === 'object') {
+                                            if (elevations[i].lon) {
+                                                elevation.lon = elevations[i].lon;
+                                            }
+                                            if (elevations[i].lat) {
+                                                elevation.lat = elevations[i].lat;
+                                            }
+                                            if (elevations[i].z) {
+                                                elevation.z = elevations[i].z;
+                                            }
+                                            if (elevations[i].acc) {
+                                                elevation.acc = elevations[i].acc;
+                                            }
+                                        } else if (typeof elevations[i] === 'number') {
+                                            elevation.z = elevations[i];
+                                        }
+                                        if (Array.isArray(altiResponse.elevations)) {
+                                            altiResponse.elevations.push(elevation);
+                                        }
+                                    }
+                                }
+                                data = altiResponse;
+                            }
+                            if (!data) {
+                                options.onError.call(options.scope, new ErrorService({
+                                    message: MRes.getMessage('SERVICE_RESPONSE_ANALYSE_2'),
+                                    type: ErrorService.TYPE_UNKERR,
+                                    status: -1
+                                }));
+                                return;
+                            }
+                            break;
+                        default:
+                            options.onError.call(options.scope, new ErrorService({
+                                message: MRes.getMessage('SERVICE_RESPONSE_FORMAT_2'),
+                                type: ErrorService.TYPE_UNKERR,
+                                status: -1
+                            }));
+                            return;
+                        }
+                        if (data.exceptionReport) {
+                            options.onError.call(options.scope, new ErrorService({
+                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport),
+                                type: ErrorService.TYPE_SRVERR,
+                                status: 200
+                            }));
+                            return;
+                        } else if (data.error) {
+                            var errorMess = data.error.description;
+                            options.onError.call(options.scope, new ErrorService({
+                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', errorMess),
+                                type: ErrorService.TYPE_SRVERR,
+                                status: 200
+                            }));
+                            return;
+                        }
+                    }
+                } else {
+                    options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY')));
+                    return;
+                }
+                options.onSuccess.call(options.scope, data);
+                return;
+            }
+        };
+        return AltiResponseFactory;
+    }(UtilsLoggerByDefault, ExceptionsErrorService, UtilsMessagesResources, FormatsXML, ServicesAltiFormatsAltiResponseReader, ServicesAltiResponseModelAltiResponse, ServicesAltiResponseModelElevation);
+    ServicesAltiAlti = function (Logger, _, ErrorService, CommonService, DefaultUrlService, AltiRequestFactory, AltiResponseFactory) {
+        function Alti(options) {
+            if (!(this instanceof Alti)) {
+                throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'Alti'));
+            }
+            this.CLASSNAME = 'Alti';
+            CommonService.apply(this, arguments);
+            if (!options.positions) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'positions'));
+            }
+            if (options.positions.length === 0) {
+                throw new Error(_.getMessage('PARAM_EMPTY', 'positions'));
+            }
+            this.options.positions = options.positions;
+            this.options.outputFormat = typeof options.outputFormat === 'string' ? options.outputFormat.toLowerCase() : 'xml';
+            this.options.sampling = options.sampling || null;
+            this.options.api = typeof options.api === 'string' ? options.api.toUpperCase() : 'REST';
+            if (this.options.api === 'REST') {
+                this.options.httpMethod = 'GET';
+            }
+            this.options.zonly = options.zonly || false;
+            if (!this.options.serverUrl) {
+                var lstUrlByDefault = DefaultUrlService.Alti.url(this.options.apiKey);
+                var urlFound = null;
+                switch (this.options.api) {
+                case 'WPS':
+                    urlFound = lstUrlByDefault.wps;
+                    break;
+                case 'REST':
+                    var key = (options.sampling ? 'profil' : 'elevation') + '-' + this.options.outputFormat;
+                    urlFound = lstUrlByDefault[key];
+                    break;
+                default:
+                    throw new Error(_.getMessage('PARAM_UNKNOWN', 'api'));
+                }
+                if (!urlFound) {
+                    throw new Error('Url by default not found !');
+                }
+                this.options.serverUrl = urlFound;
+            }
+            var idx = this.options.serverUrl.lastIndexOf('.');
+            if (idx !== -1) {
+                var extension = this.options.serverUrl.substring(idx + 1);
+                if (extension && extension.length < 5) {
+                    switch (extension.toLowerCase()) {
+                    case 'json':
+                    case 'xml':
+                        this.options.outputFormat = extension.toLowerCase();
+                        break;
+                    default:
+                        throw new Error('type of service : unknown or unsupported (json or xml) !');
+                    }
+                }
+            }
+        }
+        Alti.prototype = Object.create(CommonService.prototype, {});
+        Alti.prototype.constructor = Alti;
+        Alti.prototype.buildRequest = function (error, success) {
+            var options = {
+                httpMethod: this.options.httpMethod,
+                onSuccess: function (result) {
+                    this.request = result;
+                    success.call(this, this.request);
+                },
+                onError: error,
+                scope: this,
+                positions: this.options.positions,
+                outputFormat: this.options.outputFormat,
+                sampling: this.options.sampling,
+                api: this.options.api,
+                zonly: this.options.zonly
+            };
+            AltiRequestFactory.build(options);
+        };
+        Alti.prototype.analyzeResponse = function (error, success) {
+            if (this.response) {
+                var options = {
+                    response: this.response,
+                    outputFormat: this.options.outputFormat,
+                    rawResponse: this.options.rawResponse,
+                    onError: error,
+                    onSuccess: success,
+                    scope: this
+                };
+                AltiResponseFactory.build(options);
+            } else {
+                error.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY')));
+            }
+        };
+        return Alti;
+    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesCommonService, ServicesDefaultUrlService, ServicesAltiRequestAltiRequestFactory, ServicesAltiResponseAltiResponseFactory);
+    ServicesAutoConfResponseModelAutoConfResponse = function () {
+        function AutoConfResponse() {
+            if (!(this instanceof AutoConfResponse)) {
+                throw new TypeError('AutoConfResponse constructor cannot be called as a function.');
+            }
+            this.generalOptions = {
+                apiKeys: {},
+                title: null,
+                defaultGMLGFIStyle: null,
+                theme: null,
+                wgs84Resolutions: []
+            };
+            this.layers = {};
+            this.territories = {};
+            this.tileMatrixSets = {};
+            this.services = {};
+        }
+        AutoConfResponse.prototype = {
+            constructor: AutoConfResponse,
+            isConfLoaded: function (apiKey) {
+                if (!apiKey) {
+                    return;
+                }
+                if (this.generalOptions.apiKeys[apiKey]) {
+                    return true;
+                }
+                return false;
+            },
+            getLayersId: function (apiKey) {
+                return this.generalOptions.apiKeys[apiKey];
+            },
+            getLayersConf: function (apiKey) {
+                var layers = {};
+                var layersIdArray = this.getLayersId(apiKey);
+                if (layersIdArray) {
+                    for (var i = 0; i < layersIdArray.length; i++) {
+                        var lyrId = layersIdArray[i];
+                        layers[lyrId] = this.layers[lyrId];
+                    }
+                }
+                return layers;
+            },
+            getLayerConf: function (layerId) {
+                if (!this.layers) {
+                    return;
+                }
+                return this.layers[layerId];
+            },
+            getTileMatrixSets: function () {
+                return this.tileMatrixSets;
+            },
+            getTMSConf: function (tmsID) {
+                if (!this.tileMatrixSets) {
+                    return;
+                }
+                return this.tileMatrixSets[tmsID];
+            },
+            getTerritories: function () {
+                return this.territories;
+            },
+            getTerritoryConf: function (territoryID) {
+                if (!this.territories) {
+                    return;
+                }
+                return this.territories[territoryID];
+            },
+            getServices: function () {
+                return this.services;
+            },
+            getServiceConf: function (serviceID) {
+                if (!this.services) {
+                    return;
+                }
+                return this.services[serviceID];
+            }
+        };
+        return AutoConfResponse;
+    }();
+    ServicesAutoConfResponseModelConstraint = function () {
+        function Constraint() {
+            if (!(this instanceof Constraint)) {
+                throw new TypeError('Constraint constructor cannot be called as a function.');
+            }
+            this.crs = null;
+            this.bbox = {
+                left: null,
+                right: null,
+                top: null,
+                bottom: null
+            };
+            this.minScaleDenominator = null;
+            this.maxScaleDenominator = null;
+            this.temporalExtent = [
+                null,
+                null
+            ];
+        }
+        Constraint.prototype = { constructor: Constraint };
+        return Constraint;
+    }();
+    ServicesAutoConfResponseModelFormat = function () {
+        function Format() {
+            if (!(this instanceof Format)) {
+                throw new TypeError('Format constructor cannot be called as a function.');
+            }
+            this.current = null;
+            this.name = null;
+        }
+        Format.prototype = { constructor: Format };
+        return Format;
+    }();
+    ServicesAutoConfResponseModelLayer = function () {
+        function Layer() {
+            if (!(this instanceof Layer)) {
+                throw new TypeError('Layer constructor cannot be called as a function.');
+            }
+        }
+        Layer.prototype = {
+            constructor: Layer,
+            getName: function () {
+                return this.name;
+            },
+            getTitle: function () {
+                return this.title;
+            },
+            getDescription: function () {
+                return this.description;
+            },
+            getLayerId: function () {
+                return this.layerId;
+            },
+            getQuicklookUrl: function () {
+                return this.quicklookUrl;
+            },
+            getDefaultProjection: function () {
+                return this.defaultProjection;
+            },
+            getProjections: function () {
+                var projections = [];
+                projections.push(this.defaultProjection);
+                var proj = projections.concat(this.additionalProjections);
+                return proj;
+            },
+            getBBOX: function () {
+                if (!this.globalConstraint) {
+                    return;
+                }
+                return this.globalConstraint.bbox;
+            },
+            getMinScaleDenominator: function () {
+                if (!this.globalConstraint) {
+                    return;
+                }
+                return this.globalConstraint.minScaleDenominator;
+            },
+            getMaxScaleDenominator: function () {
+                if (!this.globalConstraint) {
+                    return;
+                }
+                return this.globalConstraint.maxScaleDenominator;
+            },
+            getTMSID: function () {
+                if (this.wmtsOptions) {
+                    return this.wmtsOptions.tileMatrixSetLink;
+                }
+                return;
+            },
+            getServiceParams: function () {
+                return this.serviceParams;
+            },
+            getServerUrl: function (apiKey) {
+                if (!apiKey || !this.serviceParams || !this.serviceParams.serverUrl) {
+                    return;
+                }
+                return this.serviceParams.serverUrl[apiKey];
+            },
+            getLegends: function () {
+                return this.legends;
+            },
+            getMetadata: function () {
+                return this.metadata;
+            },
+            getStyles: function () {
+                return this.styles;
+            },
+            getDefaultStyle: function () {
+                if (!this.styles) {
+                    return;
+                }
+                var style;
+                var s = this.styles;
+                for (var i = 0; i < s.length; i++) {
+                    if (s[i].current === true) {
+                        style = s[i].name;
+                        break;
+                    }
+                }
+                return style;
+            },
+            getThematics: function () {
+                return this.thematics;
+            },
+            getDefaultFormat: function () {
+                if (!this.formats) {
+                    return;
+                }
+                var format;
+                var f = this.formats;
+                for (var i = 0; i < f.length; i++) {
+                    if (f[i].current === true) {
+                        format = f[i].name;
+                        break;
+                    }
+                }
+                return format;
+            },
+            getConstraints: function () {
+                return this.constraints;
+            },
+            getOriginators: function () {
+                return this.originators;
+            },
+            getDimensions: function () {
+                return this.dimensions;
+            },
+            getAggregatedLayers: function () {
+                if (this.isAggregate) {
+                    return this.aggregatedLayers;
+                } else {
+                    return;
+                }
+            }
+        };
+        return Layer;
+    }();
+    ServicesAutoConfResponseModelLegend = function () {
+        function Legend() {
+            if (!(this instanceof Legend)) {
+                throw new TypeError('Legend constructor cannot be called as a function.');
+            }
+            this.format = null;
+            this.url = null;
+            this.minScaleDenominator = null;
+        }
+        Legend.prototype = { constructor: Legend };
+        return Legend;
+    }();
+    ServicesAutoConfResponseModelMetadata = function () {
+        function Metadata() {
+            if (!(this instanceof Metadata)) {
+                throw new TypeError('Metadata constructor cannot be called as a function.');
+            }
+            this.format = null;
+            this.url = null;
+        }
+        Metadata.prototype = { constructor: Metadata };
+        return Metadata;
+    }();
+    ServicesAutoConfResponseModelOriginator = function () {
+        function Originator() {
+            if (!(this instanceof Originator)) {
+                throw new TypeError('Originator constructor cannot be called as a function.');
+            }
+            this.name = null;
+            this.attribution = null;
+            this.logo = null;
+            this.url = null;
+            this.constraints = [];
+        }
+        Originator.prototype = { constructor: Originator };
+        return Originator;
+    }();
+    ServicesAutoConfResponseModelService = function () {
+        function Service() {
+            if (!(this instanceof Service)) {
+                throw new TypeError('Service constructor cannot be called as a function.');
+            }
+            this.title = null;
+            this.serverUrl = null;
+            this.version = null;
+        }
+        Service.prototype = { constructor: Service };
+        return Service;
+    }();
+    ServicesAutoConfResponseModelStyle = function () {
+        function Style() {
+            if (!(this instanceof Style)) {
+                throw new TypeError('Style constructor cannot be called as a function.');
+            }
+            this.name = null;
+            this.title = null;
+            this.current = null;
+        }
+        Style.prototype = { constructor: Style };
+        return Style;
+    }();
+    ServicesAutoConfResponseModelTerritory = function () {
+        function Territory() {
+            if (!(this instanceof Territory)) {
+                throw new TypeError('Territory constructor cannot be called as a function.');
+            }
+            this.isDefault = null;
+            this.defaultCRS = null;
+            this.additionalCRS = [];
+            this.geoBBOX = {
+                left: null,
+                right: null,
+                top: null,
+                bottom: null
+            };
+            this.geoCenter = {
+                lon: null,
+                lat: null
+            };
+            this.defaultOptions = {
+                resolution: null,
+                minScaleDenominator: null,
+                maxScaleDenominator: null
+            };
+            this.defaultLayers = [];
+        }
+        Territory.prototype = { constructor: Territory };
+        return Territory;
+    }();
+    ServicesAutoConfResponseModelThematic = function () {
+        function Thematic() {
+            if (!(this instanceof Thematic)) {
+                throw new TypeError('Thematic constructor cannot be called as a function.');
+            }
+            this.inspire = null;
+            this.name = null;
+        }
+        Thematic.prototype = { constructor: Thematic };
+        return Thematic;
+    }();
+    ServicesAutoConfResponseModelTileMatrixSet = function () {
+        function TileMatrixSet() {
+            if (!(this instanceof TileMatrixSet)) {
+                throw new TypeError('TileMatrixSet constructor cannot be called as a function.');
+            }
+            this.projection = null;
+            this.nativeResolutions = [];
+            this.matrixIds = [];
+            this.tileMatrices = {};
+        }
+        TileMatrixSet.prototype = {
+            constructor: TileMatrixSet,
+            getResolutions: function () {
+                return this.nativeResolutions;
+            },
+            getMatrixIds: function () {
+                return this.matrixIds;
+            },
+            getProjection: function () {
+                return this.projection;
+            },
+            getTileMatrices: function () {
+                return this.tileMatrices;
+            },
+            getTopLeftCorner: function () {
+                var topLeftCorner;
+                var matrices = this.getTileMatrices();
+                if (matrices) {
+                    for (var id in matrices) {
+                        if (matrices.hasOwnProperty(id)) {
+                            topLeftCorner = matrices[id].topLeftCorner;
+                            break;
+                        }
+                    }
+                }
+                return topLeftCorner;
+            }
+        };
+        return TileMatrixSet;
+    }();
+    ServicesAutoConfResponseModelTileMatrix = function () {
+        function TileMatrix() {
+            if (!(this instanceof TileMatrix)) {
+                throw new TypeError('TileMatrix constructor cannot be called as a function.');
+            }
+            this.matrixId = null;
+            this.matrixHeight = null;
+            this.matrixWidth = null;
+            this.scaleDenominator = null;
+            this.tileHeight = null;
+            this.tileWidth = null;
+            this.topLeftCorner = null;
+        }
+        TileMatrix.prototype = {
+            constructor: TileMatrix,
+            getTopLeftCorner: function () {
+                return this.topLeftCorner;
+            },
+            getScaleDenominator: function () {
+                return this.scaleDenominator;
+            },
+            getTileHeight: function () {
+                return this.tileHeight;
+            },
+            getTileWidth: function () {
+                return this.tileWidth;
+            },
+            getMatrixHeight: function () {
+                return this.matrixHeight;
+            },
+            getMatrixWidth: function () {
+                return this.matrixWidth;
+            }
+        };
+        return TileMatrix;
+    }();
+    ServicesAutoConfResponseModelTileMatrixLimit = function () {
+        function TileMatrixLimit() {
+            if (!(this instanceof TileMatrixLimit)) {
+                throw new TypeError('TileMatrixLimit constructor cannot be called as a function.');
+            }
+            this.minTileRow = null;
+            this.maxTileRow = null;
+            this.minTileCol = null;
+            this.maxTileCol = null;
+        }
+        TileMatrixLimit.prototype = { constructor: TileMatrixLimit };
+        return TileMatrixLimit;
+    }();
+    ServicesAutoConfFormatsAutoConfResponseReader = function (Logger, AutoConfResponse, Constraint, Format, Layer, Legend, Metadata, Originator, Service, Style, Territory, Thematic, TileMatrixSet, TileMatrix, TileMatrixLimit) {
+        var AutoConfResponseReader = {};
+        AutoConfResponseReader.VERSION = '1.1.0';
+        AutoConfResponseReader.NAMESPACES = {
+            xmlns: 'http://www.opengis.net/context',
+            gpp: 'http://api.ign.fr/geoportail',
+            ows: 'http://www.opengis.net/ows/1.1',
+            sld: 'http://www.opengis.net/sld',
+            wmts: 'http://www.opengis.net/wmts/1.0',
+            xlink: 'http://www.w3.org/1999/xlink',
+            xsi: 'http://www.w3.org/2001/XMLSchema-instance'
+        };
+        AutoConfResponseReader.SCHEMALOCATION = [
+            'http://www.opengis.net/context http://gpp3-wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://wxs.ign.fr/schemas/autoconf/autoconf.xsd',
+            'http://www.opengis.net/context http://gpp3-wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://gpp3-wxs.ign.fr/schemas/autoconf.xsd'
+        ];
+        AutoConfResponseReader.DEFAULTPREFIX = 'context';
+        AutoConfResponseReader.READERS = {
+            context: {
+                ViewContext: function (viewContextNode) {
+                    __checkServiceAttributes(viewContextNode);
+                    var config = new AutoConfResponse();
+                    __getChildNodes(viewContextNode, config);
+                    return config;
+                },
+                Title: function (titleNode, data) {
+                    if (data && data.generalOptions) {
+                        data.generalOptions.title = __getChildValue(titleNode);
+                    } else if (data && data.lyr) {
+                        data.lyr.title = __getChildValue(titleNode);
+                    }
+                },
+                Abstract: function (node, data) {
+                    if (data && data.lyr) {
+                        data.lyr.description = __getChildValue(node);
+                    }
+                },
+                Server: function (node, data) {
+                    var serverId = node.getAttribute('service');
+                    var title = node.getAttribute('title');
+                    var version = node.getAttribute('version');
+                    if (serverId) {
+                        if (data && data.services && typeof data.services === 'object' && !data.services[serverId]) {
+                            var s = new Service();
+                            s.title = title;
+                            s.version = version;
+                            __getChildNodes(node, s);
+                            data.services[serverId] = s;
+                        } else if (data && data.lyr) {
+                            if (!data.lyr.serviceParams) {
+                                data.lyr.serviceParams = {};
+                            }
+                            data.lyr.serviceParams.id = serverId;
+                            data.lyr.serviceParams.version = version;
+                        }
+                    }
+                },
+                OnlineResource: function (node, service) {
+                    if (service && service.hasOwnProperty('serverUrl')) {
+                        service.serverUrl = node.getAttribute('xlink:href');
+                    }
+                },
+                LayerList: function (layerListNode, config) {
+                    __getChildNodes(layerListNode, config);
+                    if (config && config.layers && config.generalOptions && config.services) {
+                        for (var lyr in config.layers) {
+                            if (config.layers.hasOwnProperty(lyr)) {
+                                var layerConfig = config.layers[lyr];
+                                var apiKeys = layerConfig.apiKeys;
+                                if (apiKeys && Array.isArray(apiKeys)) {
+                                    for (var i = 0; i < apiKeys.length; i++) {
+                                        var key = apiKeys[i];
+                                        if (config.generalOptions.apiKeys) {
+                                            if (!config.generalOptions.apiKeys[key] || !Array.isArray(config.generalOptions.apiKeys[key])) {
+                                                config.generalOptions.apiKeys[key] = [];
+                                            }
+                                            config.generalOptions.apiKeys[key].push(lyr);
+                                        }
+                                    }
+                                }
+                                var serviceParams = layerConfig.serviceParams;
+                                if (serviceParams && serviceParams.id) {
+                                    if (!config.services[serviceParams.id]) {
+                                        var s = new Service();
+                                        if (serviceParams.serverUrl) {
+                                            s.serverUrl = serviceParams.serverUrl;
+                                        }
+                                        if (serviceParams.version) {
+                                            s.version = serviceParams.version;
+                                        }
+                                        config.services[serviceParams.id] = s;
+                                    }
+                                }
+                                if (layerConfig.wmtsOptions && layerConfig.wmtsOptions.tileMatrixSetLink && config.tileMatrixSets) {
+                                    var tmsLink = layerConfig.wmtsOptions.tileMatrixSetLink;
+                                    var tileMatrixSets = config.tileMatrixSets;
+                                    for (var tms in tileMatrixSets) {
+                                        if (tileMatrixSets.hasOwnProperty(tms) && tms === tmsLink) {
+                                            layerConfig.defaultProjection = tileMatrixSets[tms].projection;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                },
+                Layer: function (layerNode, config) {
+                    if (config && config.layers) {
+                        var lyrData = {
+                            lyr: new Layer(),
+                            lyrId: null
+                        };
+                        var hidden = layerNode.getAttribute('hidden');
+                        if (hidden === '1') {
+                            lyrData.lyr.hidden = true;
+                        } else {
+                            lyrData.lyr.hidden = false;
+                        }
+                        var queryable = layerNode.getAttribute('queryable');
+                        if (queryable === '1') {
+                            lyrData.lyr.queryable = true;
+                        } else {
+                            lyrData.lyr.queryable = false;
+                        }
+                        __getChildNodes(layerNode, lyrData);
+                        if (lyrData.lyrId) {
+                            if (lyrData.lyr.serviceParams && lyrData.lyr.serviceParams.id) {
+                                var serviceid = lyrData.lyr.serviceParams.id;
+                                if (serviceid.toUpperCase().indexOf('OPENLS') !== -1 || serviceid.toUpperCase().indexOf('ELEVATION') !== -1) {
+                                    var resourceId = lyrData.lyrId.split('$')[0];
+                                    lyrData.lyrId = resourceId + '$' + serviceid;
+                                }
+                            }
+                            lyrData.lyr.layerId = lyrData.lyrId;
+                            config.layers[lyrData.lyrId] = lyrData.lyr;
+                        }
+                    }
+                },
+                Name: function (node, lyrData) {
+                    if (lyrData && lyrData.lyr) {
+                        lyrData.lyr.name = __getChildValue(node);
+                    }
+                },
+                SRS: function (node, lyrData) {
+                    if (lyrData && lyrData.lyr) {
+                        lyrData.lyr.defaultProjection = __getChildValue(node);
+                    }
+                },
+                Format: function (node, lyrData) {
+                    if (lyrData && lyrData.lyr) {
+                        var f = new Format();
+                        var current = node.getAttribute('current');
+                        if (current === '1') {
+                            f.current = true;
+                        } else {
+                            f.current = false;
+                        }
+                        f.name = __getChildValue(node);
+                        if (!lyrData.lyr.formats || !Array.isArray(lyrData.lyr.formats)) {
+                            lyrData.lyr.formats = [];
+                        }
+                        lyrData.lyr.formats.push(f);
+                    }
+                },
+                Style: function (node, lyrData) {
+                    if (lyrData && lyrData.lyr) {
+                        var s = new Style();
+                        var current = node.getAttribute('current');
+                        if (current === '1' || current === 1) {
+                            s.current = true;
+                        } else {
+                            s.current = false;
+                        }
+                        if (node.hasChildNodes) {
+                            var children = node.childNodes;
+                            var child;
+                            var childName;
+                            for (var i = 0; i < children.length; i++) {
+                                child = children[i];
+                                if (child.nodeType === 1) {
+                                    childName = child.localName || child.baseName || child.nodeName;
+                                    if (childName === 'Name') {
+                                        s.name = __getChildValue(child);
+                                    } else if (childName === 'Title') {
+                                        s.title = __getChildValue(child);
+                                    }
+                                }
+                            }
+                        }
+                        if (!lyrData.lyr.styles || !Array.isArray(lyrData.lyr.styles)) {
+                            lyrData.lyr.styles = [];
+                        }
+                        lyrData.lyr.styles.push(s);
+                    }
+                },
+                Dimension: function (node, lyrData) {
+                    var name = node.getAttribute('name');
+                    var dim = __getChildValue(node);
+                    if (lyrData && lyrData.lyr) {
+                        if (!lyrData.lyr.dimensions) {
+                            lyrData.lyr.dimensions = {};
+                        }
+                        if (name === 'Type') {
+                            lyrData.lyr.dimensions.type = dim;
+                        } else if (name === 'VisibilityRange') {
+                            lyrData.lyr.dimensions.visibilityRange = dim;
+                        } else if (name === 'VisibilityMode ') {
+                            lyrData.lyr.dimensions.visibilityMode = dim;
+                        } else if (name === 'GeometricType') {
+                            lyrData.lyr.dimensions.geometricType = dim;
+                        } else if (name === 'NoDataValue') {
+                            lyrData.lyr.dimensions.noDataValue = dim;
+                        }
+                    }
+                }
+            },
+            gpp: {
+                Theme: function (themeNode, config) {
+                    if (config && config.generalOptions && config.generalOptions.hasOwnProperty('theme')) {
+                        config.generalOptions.theme = __getChildValue(themeNode);
+                    }
+                },
+                defaultGMLGFIStyleUrl: function (node, config) {
+                    if (config && config.generalOptions && config.generalOptions.hasOwnProperty('defaultGMLGFIStyle')) {
+                        config.generalOptions.defaultGMLGFIStyle = __getChildValue(node);
+                    }
+                },
+                Territory: function (territoryNode, config) {
+                    var tid = territoryNode.getAttribute('id');
+                    if (tid) {
+                        var t = new Territory();
+                        var isDefault = territoryNode.getAttribute('default');
+                        if (isDefault === '1') {
+                            t.isDefault = true;
+                        } else {
+                            t.isDefault = false;
+                        }
+                        __getChildNodes(territoryNode, t);
+                        if (config && config.territories && typeof config.territories === 'object') {
+                            config.territories[tid] = t;
+                        }
+                    }
+                },
+                defaultCRS: function (node, territory) {
+                    if (territory && territory.hasOwnProperty('defaultCRS')) {
+                        territory.defaultCRS = __getChildValue(node);
+                    }
+                },
+                AdditionalCRS: function (node, data) {
+                    var addCRS = __getChildValue(node);
+                    if (addCRS && data) {
+                        if (Array.isArray(data.additionalCRS)) {
+                            data.additionalCRS.push(addCRS);
+                        } else {
+                            if (!data.additionalProjections || !Array.isArray(data.additionalProjections)) {
+                                data.additionalProjections = [];
+                            }
+                            data.additionalProjections.push(addCRS);
+                        }
+                    }
+                },
+                DefaultLayer: function (node, territory) {
+                    var lyr = node.getAttribute('layerId');
+                    if (lyr && territory && Array.isArray(territory.defaultLayers)) {
+                        territory.defaultLayers.push(lyr);
+                    }
+                },
+                BoundingBox: function (node, data) {
+                    if (data) {
+                        var values = __getChildValue(node).split(',');
+                        if (values.length === 4) {
+                            var bbox = {
+                                left: parseFloat(values[0]),
+                                right: parseFloat(values[2]),
+                                top: parseFloat(values[3]),
+                                bottom: parseFloat(values[1])
+                            };
+                            var minT = node.getAttribute('minT');
+                            var maxT = node.getAttribute('maxT');
+                            if (data.hasOwnProperty('geoBBOX')) {
+                                data.geoBBOX = bbox;
+                            } else if (data.hasOwnProperty('bbox')) {
+                                if (data.bbox.left || data.bbox.right || data.bbox.top || data.bbox.bottom) {
+                                    if (!data.multiConstraints) {
+                                        data.multiConstraints = [];
+                                    }
+                                    var newConstraint = new Constraint();
+                                    newConstraint.bbox = bbox;
+                                    newConstraint.temporalExtent = [
+                                        minT,
+                                        maxT
+                                    ];
+                                    data.multiConstraints.push(newConstraint);
+                                } else {
+                                    data.bbox = bbox;
+                                    data.temporalExtent = [
+                                        minT,
+                                        maxT
+                                    ];
+                                }
+                            } else {
+                                if (!data.globalConstraint) {
+                                    data.globalConstraint = new Constraint();
+                                }
+                                data.globalConstraint.bbox = bbox;
+                                data.globalConstraint.temporalExtent = [
+                                    minT,
+                                    maxT
+                                ];
+                            }
+                        }
+                    }
+                },
+                Resolution: function (node, territory) {
+                    var res = __getChildValue(node);
+                    if (res && territory && territory.defaultOptions && territory.defaultOptions.hasOwnProperty('resolution')) {
+                        territory.defaultOptions.resolution = parseFloat(res);
+                    }
+                },
+                x: function (node, territory) {
+                    var lon = __getChildValue(node);
+                    if (lon && territory && territory.geoCenter && territory.geoCenter.hasOwnProperty('lon')) {
+                        territory.geoCenter.lon = parseFloat(lon);
+                    }
+                },
+                y: function (node, territory) {
+                    var lat = __getChildValue(node);
+                    if (lat && territory && territory.geoCenter && territory.geoCenter.hasOwnProperty('lat')) {
+                        territory.geoCenter.lat = parseFloat(lat);
+                    }
+                },
+                Resolutions: function (resNode, config) {
+                    if (config && config.generalOptions && config.generalOptions.hasOwnProperty('wgs84Resolutions')) {
+                        config.generalOptions.wgs84Resolutions = __getChildValue(resNode).split(',');
+                    }
+                },
+                Layer: function (node, lyrData) {
+                    if (lyrData && lyrData.hasOwnProperty('lyrId') && lyrData.lyr) {
+                        lyrData.lyrId = node.getAttribute('id');
+                        var aggregate = node.getAttribute('aggregate');
+                        var more = node.getAttribute('more');
+                        if (aggregate || more) {
+                            lyrData.lyr.isAggregate = true;
+                        }
+                        __getChildNodes(node, lyrData.lyr);
+                    }
+                },
+                Constraint: function (node, data) {
+                    var c = new Constraint();
+                    __getChildNodes(node, c);
+                    if (data) {
+                        if (!data.constraints || !Array.isArray(data.constraints)) {
+                            data.constraints = [];
+                        }
+                        if (c.multiConstraints && Array.isArray(c.multiConstraints)) {
+                            var constraint = new Constraint();
+                            constraint.crs = c.crs;
+                            constraint.bbox = c.bbox;
+                            constraint.minScaleDenominator = c.minScaleDenominator;
+                            constraint.maxScaleDenominator = c.maxScaleDenominator;
+                            constraint.temporalExtent = c.temporalExtent;
+                            data.constraints.push(constraint);
+                            for (var i = 0; i < c.multiConstraints.length; i++) {
+                                constraint = new Constraint();
+                                constraint.crs = c.crs;
+                                constraint.minScaleDenominator = c.minScaleDenominator;
+                                constraint.maxScaleDenominator = c.maxScaleDenominator;
+                                constraint.bbox = c.multiConstraints[i].bbox;
+                                constraint.temporalExtent = c.multiConstraints[i].temporalExtent;
+                                data.constraints.push(constraint);
+                            }
+                        } else {
+                            data.constraints.push(c);
+                        }
+                    }
+                },
+                CRS: function (node, data) {
+                    if (data && data.hasOwnProperty('crs')) {
+                        data.crs = __getChildValue(node);
+                    }
+                },
+                Thematic: function (node, lyr) {
+                    if (lyr) {
+                        var t = new Thematic();
+                        t.inspire = false;
+                        t.name = __getChildValue(node);
+                        if (!lyr.thematics || !Array.isArray(lyr.thematics)) {
+                            lyr.thematics = [];
+                        }
+                        lyr.thematics.push(t);
+                    }
+                },
+                InspireThematic: function (node, lyr) {
+                    if (lyr) {
+                        var t = new Thematic();
+                        t.inspire = true;
+                        t.name = __getChildValue(node);
+                        if (!lyr.thematics || !Array.isArray(lyr.thematics)) {
+                            lyr.thematics = [];
+                        }
+                        lyr.thematics.push(t);
+                    }
+                },
+                Originator: function (node, lyr) {
+                    if (lyr) {
+                        var o = new Originator();
+                        o.name = node.getAttribute('name');
+                        __getChildNodes(node, o);
+                        if (!lyr.originators || !Array.isArray(lyr.originators)) {
+                            lyr.originators = [];
+                        }
+                        lyr.originators.push(o);
+                    }
+                },
+                Attribution: function (node, originator) {
+                    if (originator && originator.hasOwnProperty('attribution')) {
+                        originator.attribution = __getChildValue(node);
+                    }
+                },
+                Logo: function (node, originator) {
+                    if (originator && originator.hasOwnProperty('logo')) {
+                        originator.logo = __getChildValue(node);
+                    }
+                },
+                URL: function (node, originator) {
+                    if (originator && originator.hasOwnProperty('url')) {
+                        originator.url = __getChildValue(node);
+                    }
+                },
+                Legend: function (node, lyr) {
+                    var l = new Legend();
+                    __getChildNodes(node, l);
+                    if (lyr) {
+                        if (!lyr.legends || !Array.isArray(lyr.legends)) {
+                            lyr.legends = [];
+                        }
+                        lyr.legends.push(l);
+                    }
+                },
+                LegendURL: function (node, legend) {
+                    if (legend && legend.hasOwnProperty('format')) {
+                        legend.format = node.getAttribute('format');
+                        if (node.hasChildNodes) {
+                            var child = node.childNodes[0];
+                            var childName = child.localName || child.baseName || child.nodeName;
+                            if (childName === 'OnlineResource' && legend.hasOwnProperty('url')) {
+                                legend.url = child.getAttribute('xlink:href');
+                            }
+                        }
+                    }
+                },
+                QuickLook: function (node, lyr) {
+                    if (node.hasChildNodes) {
+                        var child = node.childNodes[0];
+                        var childName = child.localName || child.baseName || child.nodeName;
+                        if (childName === 'OnlineResource' && lyr) {
+                            lyr.quicklookUrl = child.getAttribute('xlink:href');
+                        }
+                    }
+                },
+                MetadataURL: function (node, lyr) {
+                    if (lyr) {
+                        var m = new Metadata();
+                        m.format = node.getAttribute('format');
+                        if (node.hasChildNodes) {
+                            var child = node.childNodes[0];
+                            var childName = child.localName || child.baseName || child.nodeName;
+                            if (childName === 'OnlineResource') {
+                                m.url = child.getAttribute('xlink:href');
+                            }
+                        }
+                        if (!lyr.metadata && !Array.isArray(lyr.metadata)) {
+                            lyr.metadata = [];
+                        }
+                        lyr.metadata.push(m);
+                    }
+                },
+                Key: function (node, lyr) {
+                    if (lyr) {
+                        var key = node.getAttribute('id');
+                        if (!lyr.apiKeys || !Array.isArray(lyr.apiKeys)) {
+                            lyr.apiKeys = [];
+                        }
+                        lyr.apiKeys.push(key);
+                        var serverUrl = __getChildValue(node);
+                        if (!lyr.serviceParams) {
+                            lyr.serviceParams = {};
+                        }
+                        if (!lyr.serviceParams.serverUrl) {
+                            lyr.serviceParams.serverUrl = {};
+                        }
+                        if (!lyr.serviceParams.serverUrl[key]) {
+                            lyr.serviceParams.serverUrl[key] = serverUrl;
+                        }
+                    }
+                }
+            },
+            ows: {
+                Identifier: function (node, data) {
+                    if (data && data.hasOwnProperty('TMS')) {
+                        data.identifier = __getChildValue(node);
+                    } else if (data && data.hasOwnProperty('matrixId')) {
+                        data.matrixId = __getChildValue(node);
+                    }
+                },
+                SupportedCRS: function (node, tmsData) {
+                    if (tmsData && tmsData.TMS && tmsData.TMS.hasOwnProperty('projection')) {
+                        tmsData.TMS.projection = __getChildValue(node);
+                    }
+                }
+            },
+            sld: {
+                MinScaleDenominator: function (node, data) {
+                    var minScale = __getChildValue(node);
+                    if (minScale && data) {
+                        if (data.hasOwnProperty('defaultOptions')) {
+                            data.defaultOptions.minScaleDenominator = parseFloat(minScale);
+                        } else if (data.lyr) {
+                            if (!data.lyr.globalConstraint) {
+                                data.lyr.globalConstraint = new Constraint();
+                            }
+                            data.lyr.globalConstraint.minScaleDenominator = parseFloat(minScale);
+                        } else if (data.hasOwnProperty('minScaleDenominator')) {
+                            data.minScaleDenominator = parseFloat(minScale);
+                        }
+                    }
+                },
+                MaxScaleDenominator: function (node, data) {
+                    var maxScale = __getChildValue(node);
+                    if (maxScale && data) {
+                        if (data.hasOwnProperty('defaultOptions')) {
+                            data.defaultOptions.maxScaleDenominator = parseFloat(maxScale);
+                        } else if (data.lyr) {
+                            if (!data.lyr.globalConstraint) {
+                                data.lyr.globalConstraint = new Constraint();
+                            }
+                            data.lyr.globalConstraint.maxScaleDenominator = parseFloat(maxScale);
+                        } else if (data.hasOwnProperty('maxScaleDenominator')) {
+                            data.maxScaleDenominator = parseFloat(maxScale);
+                        }
+                    }
+                }
+            },
+            wmts: {
+                TileMatrixSetLimits: function (node, lyr) {
+                    if (lyr) {
+                        var limits = {};
+                        __getChildNodes(node, limits);
+                        if (!lyr.wmtsOptions) {
+                            lyr.wmtsOptions = {};
+                        }
+                        lyr.wmtsOptions.tileMatrixSetLimits = limits;
+                    }
+                },
+                TileMatrixLimits: function (node, limits) {
+                    var limit = new TileMatrixLimit();
+                    var limitId;
+                    if (node.hasChildNodes) {
+                        var children = node.childNodes;
+                        for (var i = 0; i < children.length; i++) {
+                            var child = children[i];
+                            var childName = child.localName || child.baseName || child.nodeName;
+                            if (childName === 'TileMatrix') {
+                                limitId = __getChildValue(child);
+                            } else if (childName === 'MinTileRow') {
+                                limit.minTileRow = __getChildValue(child);
+                            } else if (childName === 'MaxTileRow') {
+                                limit.maxTileRow = __getChildValue(child);
+                            } else if (childName === 'MinTileCol') {
+                                limit.minTileCol = __getChildValue(child);
+                            } else if (childName === 'MaxTileCol') {
+                                limit.maxTileCol = __getChildValue(child);
+                            }
+                        }
+                        if (limitId && limits && !limits[limitId]) {
+                            limits[limitId] = limit;
+                        }
+                    }
+                },
+                TileMatrixSet: function (node, data) {
+                    if (data && data.tileMatrixSets) {
+                        var tmsData = {};
+                        tmsData.TMS = new TileMatrixSet();
+                        tmsData.resolutions = [];
+                        __getChildNodes(node, tmsData);
+                        var tileMatrices = tmsData.TMS.tileMatrices;
+                        for (var tm in tileMatrices) {
+                            if (tileMatrices.hasOwnProperty(tm)) {
+                                tmsData.TMS.matrixIds.push(tm);
+                            }
+                        }
+                        if (tmsData.TMS.getProjection() === 'IGNF:WGS84G' || tmsData.TMS.getProjection() === 'EPSG:4326') {
+                            if (data.generalOptions && Array.isArray(data.generalOptions.wgs84Resolutions)) {
+                                var wgs84Resolutions = data.generalOptions.wgs84Resolutions;
+                                for (var i = 0; i < wgs84Resolutions.length; i++) {
+                                    tmsData.resolutions[i] = parseFloat(wgs84Resolutions[i]);
+                                }
+                            }
+                        }
+                        if (Array.isArray(tmsData.resolutions) && tmsData.resolutions.sort !== undefined) {
+                            tmsData.resolutions.sort(function (x, y) {
+                                return y - x;
+                            });
+                        }
+                        tmsData.TMS.nativeResolutions = tmsData.resolutions;
+                        data.tileMatrixSets[tmsData.identifier] = tmsData.TMS;
+                    } else {
+                        if (data && !data.wmtsOptions) {
+                            data.wmtsOptions = {};
+                        }
+                        data.wmtsOptions.tileMatrixSetLink = __getChildValue(node);
+                    }
+                },
+                TileMatrix: function (node, tmsData) {
+                    if (tmsData) {
+                        var tileMatrix = new TileMatrix();
+                        __getChildNodes(node, tileMatrix);
+                        if (tmsData.TMS && tmsData.TMS.getProjection()) {
+                            var proj = tmsData.TMS.getProjection();
+                            if (proj === 'EPSG:3857' || proj === 'EPSG:2154') {
+                                var r = tileMatrix.scaleDenominator * 0.00028;
+                                if (tmsData.resolutions && Array.isArray(tmsData.resolutions)) {
+                                    tmsData.resolutions.push(r);
+                                }
+                            }
+                        }
+                        if (tmsData.TMS && tmsData.TMS.tileMatrices) {
+                            tmsData.TMS.tileMatrices[tileMatrix.matrixId] = tileMatrix;
+                        }
+                    }
+                },
+                ScaleDenominator: function (node, tileMatrix) {
+                    var scale = __getChildValue(node);
+                    if (scale && tileMatrix && tileMatrix.hasOwnProperty('scaleDenominator')) {
+                        tileMatrix.scaleDenominator = parseFloat(scale);
+                    }
+                },
+                TopLeftCorner: function (node, tileMatrix) {
+                    var values = __getChildValue(node).split(' ');
+                    if (values && tileMatrix) {
+                        tileMatrix.topLeftCorner = {};
+                        tileMatrix.topLeftCorner.x = parseFloat(values[0]);
+                        tileMatrix.topLeftCorner.y = parseFloat(values[1]);
+                    }
+                },
+                TileWidth: function (node, tileMatrix) {
+                    var value = __getChildValue(node);
+                    if (value && tileMatrix && tileMatrix.hasOwnProperty('tileWidth')) {
+                        tileMatrix.tileWidth = parseInt(value, 10);
+                    }
+                },
+                TileHeight: function (node, tileMatrix) {
+                    var value = __getChildValue(node);
+                    if (value && tileMatrix && tileMatrix.hasOwnProperty('tileHeight')) {
+                        tileMatrix.tileHeight = parseInt(value, 10);
+                    }
+                },
+                MatrixWidth: function (node, tileMatrix) {
+                    var value = __getChildValue(node);
+                    if (value && tileMatrix && tileMatrix.hasOwnProperty('matrixWidth')) {
+                        tileMatrix.matrixWidth = parseInt(value, 10);
+                    }
+                },
+                MatrixHeight: function (node, tileMatrix) {
+                    var value = __getChildValue(node);
+                    if (value && tileMatrix && tileMatrix.hasOwnProperty('matrixHeight')) {
+                        tileMatrix.matrixHeight = parseInt(value, 10);
+                    }
+                }
+            },
+            serviceException: function (node) {
+                var response = {};
+                if (node.hasChildNodes()) {
+                    var children = node.childNodes;
+                    var child;
+                    for (var i = 0; i < children.length; i++) {
+                        child = children[i];
+                        if (child.nodeName === 'exception') {
+                            response.exceptionReport = AutoConfResponseReader.READERS['exception'](child);
+                        }
+                    }
+                }
+                return response;
+            },
+            exception: function (node) {
+                var exceptionReport = {};
+                var exceptionCode = node.getAttribute('code');
+                if (exceptionCode) {
+                    exceptionReport.exceptionCode = exceptionCode;
+                }
+                var textNode = node.firstChild;
+                if (textNode && textNode.nodeType === 3) {
+                    exceptionReport.exception = textNode.nodeValue;
+                }
+                return exceptionReport;
+            }
+        };
+        AutoConfResponseReader.read = function (root) {
+            if (root.nodeName === 'ViewContext') {
+                var nsPrefix = root.prefix || AutoConfResponseReader.DEFAULTPREFIX;
+                var config = AutoConfResponseReader.READERS[nsPrefix][root.nodeName](root);
+                return config;
+            } else if (root.nodeName === 'serviceException') {
+                var exceptionReport = AutoConfResponseReader.READERS[root.nodeName](root);
+                return exceptionReport;
+            } else {
+                throw new Error('Erreur lors de la lecture de la réponse : elle n\'est pas au format attendu.');
+            }
+        };
+        function __getAttributes(node) {
+            if (node.attributes.length > 0) {
+                var nodeAttributes = {};
+                var attributes = node.attributes;
+                for (var i = 0; i < attributes.length; i++) {
+                    var attribute = attributes[i];
+                    nodeAttributes[attribute.nodeName] = attribute.nodeValue;
+                }
+                return nodeAttributes;
+            }
+        }
+        function __getChildNodes(node, data) {
+            if (node.hasChildNodes()) {
+                var children = node.childNodes;
+                var child;
+                var childName;
+                var childPrefix;
+                for (var i = 0; i < children.length; i++) {
+                    child = children[i];
+                    if (child.nodeType === 1) {
+                        childName = child.localName || child.baseName || child.nodeName;
+                        childPrefix = child.prefix || AutoConfResponseReader.DEFAULTPREFIX;
+                        if (AutoConfResponseReader.READERS[childPrefix][childName]) {
+                            var reader = AutoConfResponseReader.READERS[childPrefix][childName];
+                            reader(child, data);
+                        } else {
+                            __getChildNodes(child, data);
+                        }
+                    }
+                }
+            }
+        }
+        function __getChildValue(node) {
+            var textNode;
+            var value = '';
+            if (node.hasChildNodes()) {
+                textNode = node.firstChild;
+                if (textNode.nodeType === 3 || textNode.nodeType === 4) {
+                    value = textNode.nodeValue;
+                }
+            }
+            return value;
+        }
+        function __checkServiceAttributes(viewContextNode) {
+            if (viewContextNode.attributes.length > 0) {
+                var xlsAttributes = __getAttributes(viewContextNode);
+                for (var att in xlsAttributes) {
+                    if (xlsAttributes.hasOwnProperty(att)) {
+                        if (att === 'version') {
+                            if (xlsAttributes['version'] !== AutoConfResponseReader.VERSION) {
+                                console.log('[AutoConfResponseReader] autoconf version is not the expected one : there may be errors in parsing');
+                                return;
+                            }
+                        }
+                        if (att === 'xmlns') {
+                            if (xlsAttributes[att] !== AutoConfResponseReader.NAMESPACES.xmlns) {
+                                console.log('[AutoConfResponseReader] autoconf response default namespace is not the expected one');
+                                return;
+                            }
+                            continue;
+                        }
+                        var prefix = att.split(':')[0];
+                        var ns = att.split(':')[1];
+                        if (prefix === 'xmlns' && ns) {
+                            if (AutoConfResponseReader.NAMESPACES[ns]) {
+                                if (AutoConfResponseReader.NAMESPACES[ns] !== xlsAttributes[att]) {
+                                    console.log('[AutoConfResponseReader] autoconf response ' + att + ' namespace is not the expected one');
+                                    return;
+                                }
+                            }
+                        }
+                        if (ns === 'schemaLocation') {
+                            if (xlsAttributes[att] !== AutoConfResponseReader.SCHEMALOCATION[0] && xlsAttributes[att] !== AutoConfResponseReader.SCHEMALOCATION[1]) {
+                                console.log('[AutoConfResponseReader] autoconf response schema location is not the expected one');
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return AutoConfResponseReader;
+    }(UtilsLoggerByDefault, ServicesAutoConfResponseModelAutoConfResponse, ServicesAutoConfResponseModelConstraint, ServicesAutoConfResponseModelFormat, ServicesAutoConfResponseModelLayer, ServicesAutoConfResponseModelLegend, ServicesAutoConfResponseModelMetadata, ServicesAutoConfResponseModelOriginator, ServicesAutoConfResponseModelService, ServicesAutoConfResponseModelStyle, ServicesAutoConfResponseModelTerritory, ServicesAutoConfResponseModelThematic, ServicesAutoConfResponseModelTileMatrixSet, ServicesAutoConfResponseModelTileMatrix, ServicesAutoConfResponseModelTileMatrixLimit);
+    ServicesAutoConfResponseAutoConfResponseFactory = function (Logger, ErrorService, MRes, XML, AutoConfResponseReader) {
+        var AutoConfReponseFactory = {
+            build: function (options) {
+                var data = null;
+                if (options.response) {
+                    if (options.rawResponse) {
+                        data = options.response;
+                    } else {
+                        try {
+                            var p = new XML({ reader: AutoConfResponseReader });
+                            if (typeof options.response === 'string') {
+                                p.setXMLString(options.response);
+                            } else {
+                                p.setXMLDoc(options.response);
+                            }
+                            data = p.parse();
+                        } catch (e) {
+                            var message = e.message;
+                            if (typeof options.response === 'string') {
+                                message += '\n(raw response service\'' + options.response + '\')';
+                            } else {
+                                message += '\n(raw response service\'' + options.response.documentElement.innerHTML + '\')';
+                            }
+                            options.onError.call(options.scope, new ErrorService({
+                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', message),
+                                status: 200,
+                                type: ErrorService.TYPE_SRVERR
+                            }));
+                            return;
+                        }
+                        var isEmpty = true;
+                        for (var key in data) {
+                            if (data.hasOwnProperty(key)) {
+                                isEmpty = false;
+                            }
+                        }
+                        if (isEmpty) {
+                            options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY_2')));
+                            return;
+                        }
+                        if (data.exceptionReport) {
+                            options.onError.call(options.scope, new ErrorService({
+                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport),
+                                type: ErrorService.TYPE_SRVERR,
+                                status: 200
+                            }));
+                            return;
+                        }
+                    }
+                } else {
+                    options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY')));
+                    return;
+                }
+                var scope = typeof window !== 'undefined' ? window : {};
+                if (!scope.Gp) {
+                    scope.Gp = {};
+                }
+                if (!scope.Gp.Config) {
+                    scope.Gp.Config = data;
+                } else {
+                    this.mergeConfig(scope.Gp.Config, data, options.layerId);
+                }
+                options.onSuccess.call(options.scope, scope.Gp.Config);
+                return;
+            },
+            mergeConfig: function (GpConfig, data, layerId) {
+                if (data && GpConfig) {
+                    for (var prop in data) {
+                        if (data.hasOwnProperty(prop)) {
+                            if (prop == 'generalOptions') {
+                                for (var key in data[prop].apiKeys) {
+                                    if (data[prop].apiKeys.hasOwnProperty(key) && !GpConfig.generalOptions.apiKeys[key]) {
+                                        GpConfig.generalOptions.apiKeys[key] = data[prop].apiKeys[key];
+                                    }
+                                }
+                            } else {
+                                if (GpConfig[prop]) {
+                                    for (var obj in data[prop]) {
+                                        if (data[prop].hasOwnProperty(obj) && !GpConfig[prop][obj]) {
+                                            GpConfig[prop][obj] = data[prop][obj];
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    if (layerId) {
+                        var aggregatedLayers = [];
+                        for (var lyr in data.layers) {
+                            if (data.layers.hasOwnProperty(lyr)) {
+                                aggregatedLayers.push(lyr);
+                            }
+                        }
+                        if (GpConfig.layers[layerId]) {
+                            GpConfig.layers[layerId].aggregatedLayers = aggregatedLayers;
+                        }
+                    }
+                }
+            }
+        };
+        return AutoConfReponseFactory;
+    }(UtilsLoggerByDefault, ExceptionsErrorService, UtilsMessagesResources, FormatsXML, ServicesAutoConfFormatsAutoConfResponseReader);
+    ServicesAutoConfAutoConf = function (Logger, _, ErrorService, Helper, DefaultUrlService, CommonService, AutoConfResponseFactory) {
+        function AutoConf(options) {
+            if (!(this instanceof AutoConf)) {
+                throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'AutoConf'));
+            }
+            this.CLASSNAME = 'AutoConf';
+            CommonService.apply(this, arguments);
+            if (!this.options.serverUrl) {
+                if (!this.options.serverUrl) {
+                    var lstUrlByDefault = DefaultUrlService.AutoConf.url(this.options.apiKey);
+                    if (!this.options.layerId) {
+                        if (Array.isArray(this.options.apiKey) && this.options.apiKey.length > 0) {
+                            this.options.serverUrl = lstUrlByDefault.apiKeys;
+                        } else {
+                            this.options.serverUrl = lstUrlByDefault.apiKey;
+                        }
+                    } else {
+                        this.options.serverUrl = lstUrlByDefault.aggregate + this.options.layerId;
+                    }
+                }
+            }
+            if (this.options.protocol === 'XHR' && this.options.httpMethod === 'POST') {
+                this.options.httpMethod = 'GET';
+            }
+            this.options.outputFormat = 'xml';
+        }
+        AutoConf.prototype = Object.create(CommonService.prototype, {});
+        AutoConf.prototype.constructor = AutoConf;
+        AutoConf.prototype.buildRequest = function (error, success) {
+            var scope = typeof window !== 'undefined' ? window : {};
+            if (scope.Gp && scope.Gp.Config && scope.Gp.Config.generalOptions && scope.Gp.Config.layers) {
+                if (scope.Gp.Config.generalOptions.apiKeys[this.options.apiKey]) {
+                    if (this.options.layerId) {
+                        if (scope.Gp.Config.layers[this.options.layerId] && scope.Gp.Config.layers[this.options.layerId].aggregatedLayers) {
+                            this.options.onSuccess.call(this, scope.Gp.Config);
+                            return;
+                        }
+                    } else {
+                        this.options.onSuccess.call(this, scope.Gp.Config);
+                        return;
+                    }
+                }
+            }
+            this.request = '';
+            var bLocal;
+            if (this.options.serverUrl.indexOf('http://') === -1) {
+                bLocal = true;
+            } else {
+                bLocal = false;
+            }
+            if (!bLocal && this.layerId) {
+                this.request = Helper.normalyzeParameters({ layerId: this.layerId });
+            }
+            success.call(this, this.request);
+        };
+        AutoConf.prototype.analyzeResponse = function (error, success) {
+            if (this.response) {
+                var options = {
+                    layerId: this.options.layerId,
+                    response: this.response,
+                    rawResponse: this.options.rawResponse,
+                    onSuccess: success,
+                    onError: error,
+                    scope: this
+                };
+                AutoConfResponseFactory.build(options);
+            } else {
+                error.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY')));
+            }
+        };
+        return AutoConf;
+    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, UtilsHelper, ServicesDefaultUrlService, ServicesCommonService, ServicesAutoConfResponseAutoConfResponseFactory);
+    FormatsXLSRequestHeader = function (Logger) {
+        function RequestHeader(options) {
+            if (!(this instanceof RequestHeader)) {
+                throw new TypeError('RequestHeader constructor cannot be called as a function.');
+            }
+            this.options = options || { srsName: 'EPSG:4326' };
+            for (var opt in options) {
+                if (options.hasOwnProperty(opt)) {
+                    this.options[opt] = options[opt];
+                }
+            }
+        }
+        RequestHeader.prototype = {
+            requestString: null,
+            template: '<RequestHeader srsName="__SRSNAME__"/>',
+            constructor: RequestHeader,
+            toString: function () {
+                var template = null;
+                template = this.template;
+                template = template.replace(/__SRSNAME__/g, this.options.srsName);
+                this.requestString = template;
+                return this.requestString;
+            }
+        };
+        return RequestHeader;
+    }(UtilsLoggerByDefault);
+    FormatsXLSRequest = function (Logger) {
+        function Request(options) {
+            if (!(this instanceof Request)) {
+                throw new TypeError('Request constructor cannot be called as a function.');
+            }
+            this.options = options || {
+                maximumResponses: 25,
+                methodName: null,
+                version: '1.2'
+            };
+            for (var opt in options) {
+                if (options.hasOwnProperty(opt)) {
+                    this.options[opt] = options[opt];
+                }
+            }
+        }
+        Request.prototype = {
+            requestString: null,
+            template: '<Request maximumResponses="__MAXRESPONSES__" methodName="__METHODNAME__" requestID="__UUID__" version="__VERSION__">' + '<!-- __REQUESTSERVICE__ -->' + '</Request>',
+            constructor: Request,
+            guid: function () {
+                return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+                    var r = Math.random() * 16 | 0;
+                    var v = c === 'x' ? r : r & 3 | 8;
+                    return v.toString(16);
+                });
+            },
+            toString: function () {
+                var template = null;
+                template = this.template;
+                template = template.replace(/__MAXRESPONSES__/g, this.options.maximumResponses);
+                template = template.replace(/__METHODNAME__/g, this.options.methodName);
+                template = template.replace(/__UUID__/g, this.guid());
+                template = template.replace(/__VERSION__/g, this.options.version);
+                this.requestString = template;
+                return this.requestString;
+            }
+        };
+        return Request;
+    }(UtilsLoggerByDefault);
+    FormatsXLSAbstractService = function (Logger) {
+        function AbstractService(options) {
+            if (!(this instanceof AbstractService)) {
+                throw new TypeError('AbstractService constructor cannot be called as a function.');
+            }
+            this.options = options || {};
+            for (var opt in options) {
+                if (options.hasOwnProperty(opt)) {
+                    this.options[opt] = options[opt];
+                }
+            }
+        }
+        AbstractService.prototype = {
+            strRequest: null,
+            oRequest: null,
+            oFilter: null,
+            constructor: AbstractService,
+            addRequest: function (oRequest) {
+            },
+            addFilter: function (oFilter) {
+            },
+            toString: function () {
+            }
+        };
+        return AbstractService;
+    }(UtilsLoggerByDefault);
+    FormatsXLS = function (Logger, RequestHeader, Request, AbstractService) {
+        function XLS(options) {
+            if (!(this instanceof XLS)) {
+                throw new TypeError('XLS constructor cannot be called as a function.');
+            }
+            this.options = {
+                srsName: 'EPSG:4326',
+                maximumResponses: 25
+            };
+            for (var opt in options) {
+                if (options.hasOwnProperty(opt)) {
+                    if (options[opt]) {
+                        this.options[opt] = options[opt];
+                    }
+                }
+            }
+        }
+        XLS.VERSION = '1.2';
+        XLS.prototype = {
+            requestString: null,
+            namespace: false,
+            oService: null,
+            constructor: XLS,
+            template: '<?xml version="1.0" encoding="UTF-8"?>\n' + '<XLS version="__VERSION__"\n' + '__NAMESPACE__ \n' + '__SCHEMALOCATION__>\n' + '__REQUESTHEADER__\n' + '__REQUEST__\n' + '</XLS>\n',
+            namespaceByDefault: function () {
+                var ns = [
+                    'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"',
+                    'xmlns:xls="http://www.opengis.net/xls"',
+                    'xmlns:gml="http://www.opengis.net/gml"'
+                ];
+                return ns.join(' ');
+            },
+            schemaLocationByDefault: function () {
+                return 'xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.2/olsAll.xsd"';
+            },
+            setService: function (oService) {
+                if (!oService) {
+                    return;
+                }
+                if (oService instanceof AbstractService) {
+                    this.oService = oService;
+                } else {
+                }
+            },
+            getService: function () {
+                return this.oService;
+            }
+        };
+        XLS.prototype.addNamespace = function (ns, request) {
+            var keyNS = ns.key;
+            var bFound = false;
+            var allNS = this.namespaceByDefault().split(' ');
+            for (var index = 0; index < allNS.length; index++) {
+                var element = allNS[index];
+                var map = element.split('=');
+                var key = map[0];
+                if (key === 'xmlns:' + keyNS) {
+                    bFound = true;
+                    break;
+                }
+            }
+            if (!bFound) {
+                return request;
+            }
+            var regex;
+            var subst;
+            regex = /<(\w+[\s>])/g;
+            subst = '<' + keyNS + ':$1';
+            request = request.replace(regex, subst);
+            regex = /<\/(\w+[\s>])/g;
+            subst = '</' + keyNS + ':$1';
+            request = request.replace(regex, subst);
+            return request;
+        };
+        XLS.prototype.build = function () {
+            var bService = this.getService() ? true : false;
+            var template = '';
+            template = this.template;
+            template = template.replace(/__VERSION__/g, XLS.VERSION);
+            template = template.replace(/__NAMESPACE__/g, this.namespaceByDefault);
+            template = template.replace(/__SCHEMALOCATION__/g, this.schemaLocationByDefault);
+            var oHeader = new RequestHeader({ srsName: this.options.srsName });
+            template = template.replace(/__REQUESTHEADER__/g, oHeader.toString());
+            var oRequest = new Request({
+                maximumResponses: this.options.maximumResponses,
+                version: XLS.VERSION,
+                methodName: bService ? this.getService().CLASSTYPE : null
+            });
+            template = template.replace(/__REQUEST__/g, oRequest.toString());
+            if (bService) {
+                template = template.replace(/<!-- __REQUESTSERVICE__ -->/g, this.getService().toString());
+            }
+            if (!template) {
+                return;
+            }
+            if (this.namespace) {
+                template = this.addNamespace({
+                    key: 'xls',
+                    url: 'http://www.opengis.net/xls'
+                }, template);
+            }
+            this.requestString = template;
+            return this.requestString;
+        };
+        return XLS;
+    }(UtilsLoggerByDefault, FormatsXLSRequestHeader, FormatsXLSRequest, FormatsXLSAbstractService);
+    FormatsXLSLocationUtilityServiceModelAddress = function (Gp, Logger) {
+        function Address(options) {
+            if (!(this instanceof Address)) {
+                throw new TypeError('Address constructor cannot be called as a function.');
+            }
+            this.options = options || {
+                location: {},
+                type: ['StreetAddress'],
+                filter: {}
+            };
+            if (!options.location) {
+                throw new Error('l\'option \'location\' n\'est pas renseignée !');
+            }
+            for (var opt in options) {
+                if (options.hasOwnProperty(opt)) {
+                    this.options[opt] = options[opt];
+                }
+            }
+        }
+        Address.prototype = {
+            constructor: Address,
+            requestString: null,
+            template: {
+                address: '<Address countryCode="__COUNTRYCODE__">' + '__LOCATION__' + '__PLACE__' + '__POSTALCODE__' + '__ENVELOPE__' + '</Address>',
+                location: {
+                    freeFormAddress: '<freeFormAddress>__FREEFORMADDRESSVALUE__</freeFormAddress>',
+                    streetAddress: {
+                        container: '<StreetAddress>' + '__STREET__' + '__BUILDING__' + '</StreetAddress>',
+                        building: '<Building number="__BUILDINGVALUE__"/>',
+                        street: '<Street>__STREETVALUE__</Street>'
+                    }
+                },
+                place: '<Place type="__PLACETYPE__">__PLACEVALUE__</Place>',
+                postalCode: '<PostalCode>__POSTALCODEVALUE__</PostalCode>',
+                envelope: '<gml:Envelope>' + '<gml:lowerCorner>__LEFT__ __BOTTOM__</gml:lowerCorner>' + '<gml:upperCorner>__RIGHT__ __TOP__</gml:upperCorner>' + '</gml:Envelope>'
+            }
+        };
+        Address.prototype.toString = function () {
+            var template = null;
+            template = this.template.address;
+            template = template.replace(/__COUNTRYCODE__/g, this.options.type);
+            if (typeof this.options.location === 'string') {
+                var tmplFreeFormAddress = this.template.location.freeFormAddress;
+                tmplFreeFormAddress = tmplFreeFormAddress.replace(/__FREEFORMADDRESSVALUE__/g, this.options.location);
+                template = template.replace(/__LOCATION__/g, tmplFreeFormAddress);
+            } else {
+                var tmplBuilding = '';
+                var tmplStreet = '';
+                if (this.options.location.number) {
+                    tmplBuilding = this.template.location.streetAddress.building;
+                    tmplBuilding = tmplBuilding.replace(/__BUILDINGVALUE__/g, this.options.location.number);
+                }
+                if (this.options.location.street) {
+                    tmplStreet = this.template.location.streetAddress.street;
+                    tmplStreet = tmplStreet.replace(/__STREETVALUE__/g, this.options.location.street);
+                }
+                var tmplStreetAddress = this.template.location.streetAddress.container;
+                tmplStreetAddress = tmplStreetAddress.replace(/__STREET__/g, tmplStreet);
+                tmplStreetAddress = tmplStreetAddress.replace(/__BUILDING__/g, tmplBuilding);
+                template = template.replace(/__LOCATION__/g, tmplStreetAddress);
+            }
+            var tmplPostalCode = '';
+            if (this.options.location.postalCode) {
+                tmplPostalCode = this.template.postalCode;
+                tmplPostalCode = tmplPostalCode.replace(/__POSTALCODEVALUE__/g, this.options.location.postalCode);
+            }
+            var tmplEnvelope = '';
+            if (this.options.filter) {
+                var bbox = this.options.filter.bbox;
+                if (bbox) {
+                    tmplEnvelope = this.template.envelope;
+                    tmplEnvelope = tmplEnvelope.replace(/__LEFT__/g, bbox.left);
+                    tmplEnvelope = tmplEnvelope.replace(/__BOTTOM__/g, bbox.bottom);
+                    tmplEnvelope = tmplEnvelope.replace(/__RIGHT__/g, bbox.right);
+                    tmplEnvelope = tmplEnvelope.replace(/__TOP__/g, bbox.top);
+                }
+            }
+            var Places = [];
+            var tmplPlace = '';
+            if (this.options.filter) {
+                var filters = this.options.filter;
+                for (var filter in filters) {
+                    if (filter === 'bbox') {
+                        continue;
+                    }
+                    tmplPlace = this.template.place;
+                    tmplPlace = tmplPlace.replace(/__PLACETYPE__/g, filter);
+                    tmplPlace = tmplPlace.replace(/__PLACEVALUE__/g, filters[filter]);
+                    Places.push(tmplPlace);
+                }
+            }
+            var tmplPlaceCity = '';
+            if (this.options.location.city) {
+                tmplPlaceCity = this.template.place;
+                tmplPlaceCity = tmplPlaceCity.replace(/__PLACETYPE__/g, 'Municipality');
+                tmplPlaceCity = tmplPlaceCity.replace(/__PLACEVALUE__/g, this.options.location.city);
+                Places.push(tmplPlaceCity);
+            }
+            template = template.replace(/__POSTALCODE__/g, tmplPostalCode);
+            template = template.replace(/__PLACE__/g, Places.join('\n'));
+            template = template.replace(/__ENVELOPE__/g, tmplEnvelope);
+            this.requestString = template;
+            return this.requestString;
+        };
+        return Address;
+    }(Gp, UtilsLoggerByDefault);
+    FormatsXLSLocationUtilityServiceGeocodeFilterExtension = function (Logger) {
+        function GeocodeFilterExtension() {
+            if (!(this instanceof GeocodeFilterExtension)) {
+                throw new TypeError('GeocodeFilterExtension constructor cannot be called as a function.');
+            }
+            this.filters = [];
+        }
+        GeocodeFilterExtension.prototype = {
+            constructor: GeocodeFilterExtension,
+            addFilterExtensions: function (oGeocodeLocation) {
+                if (oGeocodeLocation) {
+                    this.filters.push(oGeocodeLocation);
+                }
+            },
+            getNames: function () {
+                var names = [];
+                for (var idx in this.filters) {
+                    names.push(this.filters[idx].CLASSNAME);
+                }
+                return names;
+            },
+            getFilter: function (name) {
+                var filter = null;
+                for (var idx in this.filters) {
+                    if (this.filters[idx].CLASSNAME == name) {
+                        filter = this.filters[idx];
+                    }
+                }
+                return filter;
+            },
+            getFilters: function () {
+                return this.filters;
+            },
+            getAttributs: function (name) {
+                var attributs = [];
+                for (var idx in this.filters) {
+                    if (this.filters[idx].CLASSNAME == name) {
+                        attributs = this.filters[idx].attributesList;
+                    }
+                }
+                return attributs;
+            },
+            setPlaceAttributs: function (name, options) {
+                var filter = this.getFilter(name);
+                var attributs = this.getAttributs(name);
+                for (var idx in attributs) {
+                    var value = attributs[idx];
+                    if (options[value]) {
+                        filter.placeAttributes[value] = options[value];
+                    }
+                }
+            },
+            getPlaceAttributs: function (name) {
+                var places = {};
+                for (var idx in this.filters) {
+                    if (this.filters[idx].CLASSNAME == name) {
+                        places = this.filters[idx].placeAttributes;
+                    }
+                }
+                return places;
+            }
+        };
+        return GeocodeFilterExtension;
+    }(UtilsLoggerByDefault);
+    FormatsXLSLocationUtilityServiceGeocodeRequest = function (Logger, Address, GeocodeFilterExtension) {
+        function GeocodeRequest(options) {
+            if (!(this instanceof GeocodeRequest)) {
+                throw new TypeError('GeocodeRequest constructor cannot be called as a function.');
+            }
+            this.options = options || {};
+            for (var opt in options) {
+                if (options.hasOwnProperty(opt)) {
+                    this.options[opt] = options[opt];
+                }
+            }
+            this.CLASSNAME = 'GeocodeRequest';
+        }
+        GeocodeRequest.prototype = {
+            strRequest: null,
+            oAddress: null,
+            oFilter: null,
+            template: '<GeocodeRequest returnFreeForm="__RETURNFREEFORM__">' + '__ADDRESS__' + '</GeocodeRequest>',
+            addAddress: function (oAddress) {
+                if (oAddress instanceof Address) {
+                    this.oAddress = oAddress;
+                }
+            },
+            addFilter: function (oFilter) {
+                if (oFilter instanceof GeocodeFilterExtension) {
+                    this.oFilter = oFilter;
+                }
+            },
+            constructor: GeocodeRequest,
+            toString: function () {
+                var template = '';
+                template = this.template;
+                if (!this.oAddress) {
+                    var settings = {};
+                    settings.location = this.options.location;
+                    settings.type = this.options.filterOptions.type || ['StreetAddress'];
+                    settings.filter = this.options.filterOptions;
+                    delete settings.filter.type;
+                    if (this.oFilter) {
+                        settings.filter = {};
+                        for (var idx in settings.type) {
+                            var filter = settings.type[idx];
+                            var oFilter = this.oFilter.getFilter(filter);
+                            if (!oFilter) {
+                                continue;
+                            }
+                            var mFilter = this.options.filterOptions;
+                            var attributs = oFilter.attributesList;
+                            for (var idxe = 0; idxe < attributs.length; idxe++) {
+                                var key = attributs[idxe];
+                                if (mFilter[key]) {
+                                    var matchingKey = oFilter.serviceAttributes[idxe];
+                                    oFilter.placeAttributes[matchingKey] = mFilter[key];
+                                }
+                            }
+                            var places = oFilter.placeAttributes;
+                            for (var kplace in places) {
+                                if (places.hasOwnProperty(kplace)) {
+                                    settings.filter[kplace] = places[kplace];
+                                }
+                            }
+                        }
+                    }
+                    this.oAddress = new Address(settings);
+                    if (!this.oAddress) {
+                        throw new Error('La construction de l\'adresse n\'est pas correctement definie !?');
+                    }
+                }
+                template = template.replace(/__ADDRESS__/g, this.oAddress.toString());
+                template = template.replace(/__RETURNFREEFORM__/g, this.options.returnFreeForm ? 'true' : 'false');
+                this.strRequest = template;
+                return this.strRequest;
+            }
+        };
+        return GeocodeRequest;
+    }(UtilsLoggerByDefault, FormatsXLSLocationUtilityServiceModelAddress, FormatsXLSLocationUtilityServiceGeocodeFilterExtension);
+    FormatsXLSLocationUtilityServiceModelPosition = function (Logger) {
+        function Position(options) {
+            if (!(this instanceof Position)) {
+                throw new TypeError('Position constructor cannot be called as a function.');
+            }
+            this.options = options || {};
+            if (!options.position) {
+                throw new Error('l\'option \'position\' n\'est pas renseignée !');
+            }
+            for (var opt in options) {
+                if (options.hasOwnProperty(opt)) {
+                    this.options[opt] = options[opt];
+                }
+            }
+        }
+        Position.prototype = {
+            constructor: Position,
+            requestString: null,
+            template: {
+                position: '<Position>' + '__GMLPOINT__' + '__GMLFILTER__' + '</Position>',
+                gml: {
+                    point: '<gml:Point xmlns:gml="http://www.opengis.net/gml"><gml:pos>__X__ __Y__</gml:pos></gml:Point>',
+                    pos: null,
+                    filter: {
+                        bbox: '<gml:Envelope xmlns:gml="http://www.opengis.net/gml">' + '<gml:lowerCorner>__LEFT__ __BOTTOM__</gml:lowerCorner>' + '<gml:upperCorner>__RIGHT__ __TOP__</gml:upperCorner>' + '</gml:Envelope>',
+                        circle: '<gml:CircleByCenterPoint xmlns:gml="http://www.opengis.net/gml"><gml:pos>__X__ __Y__</gml:pos><gml:radius>__RADIUS__</gml:radius></gml:CircleByCenterPoint>',
+                        polygon: '<gml:Polygon xmlns:gml="http://www.opengis.net/gml"><gml:exterior><gml:LinearRing><gml:posList>__XY__</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>',
+                        multipolygon: null
+                    }
+                }
+            }
+        };
+        Position.prototype.toString = function () {
+            var template = this.template.position;
+            var tmplGmlPoint = this.template.gml.point;
+            tmplGmlPoint = tmplGmlPoint.replace(/__X__/g, this.options.position.x);
+            tmplGmlPoint = tmplGmlPoint.replace(/__Y__/g, this.options.position.y);
+            var tmplGmlFilter = '';
+            if (this.options.filter) {
+                var filter = this.options.filter;
+                for (var name in filter) {
+                    switch (name) {
+                    case 'circle':
+                        tmplGmlFilter = this.template.gml.filter[name];
+                        tmplGmlFilter = tmplGmlFilter.replace(/__X__/g, filter[name].x);
+                        tmplGmlFilter = tmplGmlFilter.replace(/__Y__/g, filter[name].y);
+                        tmplGmlFilter = tmplGmlFilter.replace(/__RADIUS__/g, filter[name].radius);
+                        break;
+                    case 'bbox':
+                        tmplGmlFilter = this.template.gml.filter[name];
+                        tmplGmlFilter = tmplGmlFilter.replace(/__LEFT__/g, filter[name].left);
+                        tmplGmlFilter = tmplGmlFilter.replace(/__BOTTOM__/g, filter[name].bottom);
+                        tmplGmlFilter = tmplGmlFilter.replace(/__RIGHT__/g, filter[name].right);
+                        tmplGmlFilter = tmplGmlFilter.replace(/__TOP__/g, filter[name].top);
+                        break;
+                    case 'polygon':
+                        tmplGmlFilter = this.template.gml.filter[name];
+                        var strPoints = '';
+                        var lstPoints = filter[name];
+                        for (var i = 0; i < lstPoints.length; i++) {
+                            var coord = lstPoints[i];
+                            if (Array.isArray(coord)) {
+                                break;
+                            }
+                            if (coord.x && coord.y || (coord.x === 0 || coord.y === 0)) {
+                                strPoints += coord.x + ' ' + coord.y;
+                            }
+                            if (lstPoints.length !== i + 1) {
+                                strPoints += ' ';
+                            }
+                        }
+                        tmplGmlFilter = tmplGmlFilter.replace(/__XY__/g, strPoints);
+                        break;
+                    case 'multipolygon':
+                        break;
+                    default:
+                    }
+                }
+            }
+            template = template.replace(/__GMLPOINT__/g, tmplGmlPoint);
+            template = template.replace(/__GMLFILTER__/g, tmplGmlFilter);
+            this.requestString = template;
+            return this.requestString;
+        };
+        return Position;
+    }(UtilsLoggerByDefault);
+    FormatsXLSLocationUtilityServiceModelPreference = function (Logger) {
+        function Preference(type) {
+            if (!(this instanceof Preference)) {
+                throw new TypeError('Preference constructor cannot be called as a function.');
+            }
+            this.type = type;
+        }
+        Preference.prototype = {
+            constructor: Preference,
+            requestString: null,
+            template: '<ReverseGeocodePreference>__TYPE__</ReverseGeocodePreference>'
+        };
+        Preference.prototype.toString = function () {
+            var Preferences = [];
+            var tmplPreference = '';
+            for (var idx = 0; idx < this.type.length; idx++) {
+                tmplPreference = this.template;
+                tmplPreference = tmplPreference.replace(/__TYPE__/g, this.type[idx]);
+                Preferences.push(tmplPreference);
+            }
+            this.strRequest = Preferences.join('\n');
+            return this.strRequest;
+        };
+        return Preference;
+    }(UtilsLoggerByDefault);
+    FormatsXLSLocationUtilityServiceReverseGeocodeRequest = function (Logger, Position, Preference) {
+        function ReverseGeocodeRequest(options) {
+            if (!(this instanceof ReverseGeocodeRequest)) {
+                throw new TypeError('ReverseGeocodeRequest constructor cannot be called as a function.');
+            }
+            this.options = options || {};
+            for (var opt in options) {
+                if (options.hasOwnProperty(opt)) {
+                    this.options[opt] = options[opt];
+                }
+            }
+            this.CLASSNAME = 'ReverseGeocodeRequest';
+        }
+        ReverseGeocodeRequest.prototype = {
+            strRequest: null,
+            oPosition: null,
+            oPreference: null,
+            constructor: ReverseGeocodeRequest,
+            template: '<ReverseGeocodeRequest returnFreeForm="__RETURNFREEFORM__">' + '__POSITION__' + '__PREFERENCE__' + '</ReverseGeocodeRequest>',
+            addPosition: function (oPosition) {
+                if (oPosition instanceof Position) {
+                    this.oPosition = oPosition;
+                }
+            },
+            addPreferences: function (oPreference) {
+                if (oPreference instanceof Preference) {
+                    this.oPreference = oPreference;
+                }
+            },
+            toString: function () {
+                var template = '';
+                template = this.template;
+                if (!this.oPreference) {
+                    this.oPreference = new Preference(this.options.filterOptions.type || ['StreetAddress']);
+                    if (!this.oPreference) {
+                        throw new Error('Les preferences ne sont pas definies !?');
+                    }
+                }
+                template = template.replace(/__PREFERENCE__/g, this.oPreference.toString());
+                if (!this.oPosition) {
+                    var settings = {
+                        position: this.options.position,
+                        filter: {}
+                    };
+                    if (this.options.filterOptions) {
+                        settings.filter = this.options.filterOptions;
+                        delete settings.filter.type;
+                    }
+                    this.oPosition = new Position(settings);
+                    if (!this.oPosition) {
+                        throw new Error('La position et ses filtres ne sont pas definis !?');
+                    }
+                }
+                template = template.replace(/__POSITION__/g, this.oPosition.toString());
+                template = template.replace(/__RETURNFREEFORM__/g, this.options.returnFreeForm ? 'true' : 'false');
+                this.strRequest = template;
+                return this.strRequest;
+            }
+        };
+        return ReverseGeocodeRequest;
+    }(UtilsLoggerByDefault, FormatsXLSLocationUtilityServiceModelPosition, FormatsXLSLocationUtilityServiceModelPreference);
+    FormatsXLSLocationUtilityService = function (Logger, AbstractService, GeocodeRequest, ReverseGeocodeRequest, GeocodeFilterExtension) {
+        function LocationUtilityService(options) {
+            if (!(this instanceof LocationUtilityService)) {
+                throw new TypeError('LocationUtilityService constructor cannot be called as a function.');
+            }
+            this.CLASSNAME = 'LocationUtilityService';
+            this.CLASSTYPE = null;
+            AbstractService.apply(this, arguments);
+            if (this.options) {
+                this.CLASSTYPE = this.options.location ? 'GeocodeRequest' : this.options.position ? 'ReverseGeocodeRequest' : null;
+            }
+        }
+        LocationUtilityService.prototype = Object.create(AbstractService.prototype, {});
+        LocationUtilityService.prototype.constructor = LocationUtilityService;
+        LocationUtilityService.prototype.addRequest = function (oLUSRequest) {
+            this.CLASSTYPE = oLUSRequest.CLASSNAME;
+            switch (this.CLASSTYPE) {
+            case 'GeocodeRequest':
+            case 'ReverseGeocodeRequest':
+                this.oRequest = oLUSRequest;
+                break;
+            default:
+                throw new Error('Ce n\'est pas un objet de type \'LUS Request\' !?');
+            }
+        };
+        LocationUtilityService.prototype.addFilter = function (oFilter) {
+            if (oFilter instanceof GeocodeFilterExtension) {
+                this.oFilter = oFilter;
+            }
+        };
+        LocationUtilityService.prototype.toString = function () {
+            if (!this.oRequest) {
+                if (!this.options) {
+                    throw new Error('Les options ne sont pas renseignées, impossible de construire la requête !');
+                }
+                if (this.CLASSTYPE === 'GeocodeRequest') {
+                    var settingsDirect = {
+                        location: this.options.location,
+                        returnFreeForm: this.options.returnFreeForm,
+                        filterOptions: this.options.filterOptions || {}
+                    };
+                    this.oRequest = new GeocodeRequest(settingsDirect);
+                    if (this.oFilter) {
+                        this.oRequest.addFilter(this.oFilter);
+                    }
+                } else if (this.CLASSTYPE === 'ReverseGeocodeRequest') {
+                    var settingsInv = {
+                        position: this.options.position,
+                        returnFreeForm: this.options.returnFreeForm,
+                        filterOptions: this.options.filterOptions || {}
+                    };
+                    this.oRequest = new ReverseGeocodeRequest(settingsInv);
+                } else {
+                }
+            }
+            if (!this.oRequest) {
+                throw new Error('Type de Geocodage indefini !');
+            }
+            this.strRequest = this.oRequest.toString();
+            return this.strRequest;
+        };
+        return LocationUtilityService;
+    }(UtilsLoggerByDefault, FormatsXLSAbstractService, FormatsXLSLocationUtilityServiceGeocodeRequest, FormatsXLSLocationUtilityServiceReverseGeocodeRequest, FormatsXLSLocationUtilityServiceGeocodeFilterExtension);
+    ServicesGeocodeRequestGeocodeLocation = function () {
+        function GeocodeLocation() {
+            if (!(this instanceof GeocodeLocation)) {
+                throw new TypeError('GeocodeLocation constructor cannot be called as a function.');
+            }
+            this.placeAttributes = {};
+            this.attributesList = [];
+            this.serviceAttributes = [];
+        }
+        GeocodeLocation.prototype = { constructor: GeocodeLocation };
+        return GeocodeLocation;
+    }();
+    ServicesGeocodeRequestModelStreetAddress = function (GeocodeLocation) {
+        function StreetAddress() {
+            if (!(this instanceof StreetAddress)) {
+                throw new TypeError('StreetAddress constructor cannot be called as a function.');
+            }
+            GeocodeLocation.apply(this, arguments);
+            this.CLASSNAME = 'StreetAddress';
+            this.attributesList = [
+                'bbox',
+                'ID',
+                'IDTR',
+                'quality',
+                'territory',
+                'commune',
+                'department',
+                'insee',
+                'municipality'
+            ];
+            this.serviceAttributes = [
+                'bbox',
+                'ID',
+                'IDTR',
+                'Qualite',
+                'Territoire',
+                'Commune',
+                'Departement',
+                'INSEE',
+                'Municipality'
+            ];
+        }
+        StreetAddress.prototype = Object.create(GeocodeLocation.prototype);
+        StreetAddress.prototype.constructor = StreetAddress;
+        return StreetAddress;
+    }(ServicesGeocodeRequestGeocodeLocation);
+    ServicesGeocodeRequestModelPositionOfInterest = function (GeocodeLocation) {
+        function PositionOfInterest() {
+            if (!(this instanceof PositionOfInterest)) {
+                throw new TypeError('PositionOfInterest constructor cannot be called as a function.');
+            }
+            GeocodeLocation.apply(this, arguments);
+            this.CLASSNAME = 'PositionOfInterest';
+            this.attributesList = [
+                'bbox',
+                'importance',
+                'nature',
+                'territory',
+                'commune',
+                'department',
+                'insee',
+                'municipality'
+            ];
+            this.serviceAttributes = [
+                'bbox',
+                'Importance',
+                'Nature',
+                'Territoire',
+                'Commune',
+                'Departement',
+                'INSEE',
+                'Municipality'
+            ];
+        }
+        PositionOfInterest.prototype = Object.create(GeocodeLocation.prototype);
+        PositionOfInterest.prototype.constructor = PositionOfInterest;
+        return PositionOfInterest;
+    }(ServicesGeocodeRequestGeocodeLocation);
+    ServicesGeocodeRequestModelCadastralParcel = function (GeocodeLocation) {
+        function CadastralParcel() {
+            if (!(this instanceof CadastralParcel)) {
+                throw new TypeError('CadastralParcel constructor cannot be called as a function.');
+            }
+            GeocodeLocation.apply(this, arguments);
+            this.CLASSNAME = 'CadastralParcel';
+            this.attributesList = [
+                'absorbedCity',
+                'sheet',
+                'number',
+                'section',
+                'commune',
+                'department',
+                'insee',
+                'municipality',
+                'origin'
+            ];
+            this.serviceAttributes = [
+                'CommuneAbsorbee',
+                'Feuille',
+                'Numero',
+                'Section',
+                'Commune',
+                'Departement',
+                'INSEE',
+                'Municipality',
+                'Type'
+            ];
+        }
+        CadastralParcel.prototype = Object.create(GeocodeLocation.prototype);
+        CadastralParcel.prototype.constructor = CadastralParcel;
+        return CadastralParcel;
+    }(ServicesGeocodeRequestGeocodeLocation);
+    ServicesGeocodeRequestModelAdministratif = function (GeocodeLocation) {
+        function Administratif() {
+            if (!(this instanceof Administratif)) {
+                throw new TypeError('Administratif constructor cannot be called as a function.');
+            }
+            GeocodeLocation.apply(this, arguments);
+            this.CLASSNAME = 'Administratif';
+            this.attributesList = [
+                'bbox',
+                'prefecture',
+                'inseeRegion',
+                'inseeDepartment',
+                'municipality'
+            ];
+            this.serviceAttributes = [
+                'bbox',
+                'Prefecture',
+                'InseeRegion',
+                'InseeDepartement',
+                'Municipality'
+            ];
+        }
+        Administratif.prototype = Object.create(GeocodeLocation.prototype);
+        Administratif.prototype.constructor = Administratif;
+        return Administratif;
+    }(ServicesGeocodeRequestGeocodeLocation);
+    ServicesGeocodeRequestDirectGeocodeRequestFactory = function (Logger, XLS, LocationUtilityService, GeocodeFilterExtension, StreetAddress, PositionOfInterest, CadastralParcel, Administratif) {
+        var DirectGeocodeRequestFactory = {
+            build: function (options) {
+                var request = null;
+                var oFilter = new GeocodeFilterExtension();
+                oFilter.addFilterExtensions(new Administratif());
+                oFilter.addFilterExtensions(new StreetAddress());
+                oFilter.addFilterExtensions(new PositionOfInterest());
+                oFilter.addFilterExtensions(new CadastralParcel());
+                var oLUS = new LocationUtilityService({
+                    location: options.location,
+                    returnFreeForm: options.returnFreeForm,
+                    filterOptions: options.filterOptions
+                });
+                oLUS.addFilter(oFilter);
+                var oXLS = new XLS({
+                    srsName: options.srs,
+                    maximumResponses: options.maximumResponses
+                });
+                oXLS.namespace = true;
+                oXLS.setService(oLUS);
+                request = oXLS.build();
+                if (options.httpMethod == 'GET') {
+                    var myRequest = 'qxml=' + encodeURIComponent(request).replace(/\-/g, '%2D').replace(/\_/g, '%5F').replace(/\./g, '%2E').replace(/\!/g, '%21').replace(/\~/g, '%7E').replace(/\*/g, '%2A').replace(/\'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29');
+                    request = myRequest;
+                }
+                return request;
+            }
+        };
+        return DirectGeocodeRequestFactory;
+    }(UtilsLoggerByDefault, FormatsXLS, FormatsXLSLocationUtilityService, FormatsXLSLocationUtilityServiceGeocodeFilterExtension, ServicesGeocodeRequestModelStreetAddress, ServicesGeocodeRequestModelPositionOfInterest, ServicesGeocodeRequestModelCadastralParcel, ServicesGeocodeRequestModelAdministratif);
+    ServicesGeocodeResponseModelGeocodeResponse = function () {
+        function GeocodeResponse() {
+            if (!(this instanceof GeocodeResponse)) {
+                throw new TypeError('GeocodeResponse constructor cannot be called as a function.');
+            }
+            this.locations = [];
+        }
+        GeocodeResponse.prototype = { constructor: GeocodeResponse };
+        return GeocodeResponse;
+    }();
+    ServicesGeocodeResponseModelGeocodedLocation = function () {
+        function GeocodedLocation() {
+            if (!(this instanceof GeocodedLocation)) {
+                throw new TypeError('GeocodedLocation constructor cannot be called as a function.');
+            }
+            this.position = {
+                x: null,
+                y: null
+            };
+            this.matchType = null;
+            this.placeAttributes = {};
+            this.type = null;
+        }
+        GeocodedLocation.prototype = { constructor: GeocodedLocation };
+        return GeocodedLocation;
+    }();
+    ServicesGeocodeResponseModelDirectGeocodedLocation = function (GeocodedLocation) {
+        function DirectGeocodedLocation() {
+            if (!(this instanceof DirectGeocodedLocation)) {
+                throw new TypeError('DirectGeocodedLocation constructor cannot be called as a function.');
+            }
+            GeocodedLocation.apply(this, arguments);
+            this.CLASSNAME = 'DirectGeocodedLocation';
+            this.accuracy = null;
+        }
+        DirectGeocodedLocation.prototype = Object.create(GeocodedLocation.prototype);
+        DirectGeocodedLocation.prototype.constructor = DirectGeocodedLocation;
+        return DirectGeocodedLocation;
+    }(ServicesGeocodeResponseModelGeocodedLocation);
+    ServicesGeocodeFormatsDirectGeocodeResponseReader = function (Logger, MR, ErrSrv, GeocodeResponse, DirectGeocodedLocation) {
+        var DirectGeocodeResponseReader = {};
+        DirectGeocodeResponseReader.VERSION = '1.2';
+        DirectGeocodeResponseReader.NAMESPACES = {
+            xmlns: 'http://www.opengis.net/xls',
+            gml: 'http://www.opengis.net/gml',
+            xls: 'http://www.opengis.net/xls',
+            xlsext: 'http://www.opengis.net/xlsext',
+            xsi: 'http://www.w3.org/2001/XMLSchema-instance'
+        };
+        DirectGeocodeResponseReader.SCHEMALOCATION = 'http://wxs.ign.fr/schemas/olsAll.xsd';
+        DirectGeocodeResponseReader.DEFAULTPREFIX = 'xls';
+        DirectGeocodeResponseReader.READERS = {
+            xls: {
+                XLS: function (root) {
+                    var geocodeResponse = new GeocodeResponse();
+                    __checkServiceAttributes(root);
+                    __getChildNodes(root, geocodeResponse);
+                    return geocodeResponse;
+                },
+                GeocodedAddress: function (node, geocodeResponse) {
+                    var geocodedLocation = new DirectGeocodedLocation();
+                    __getChildNodes(node, geocodedLocation);
+                    if (geocodeResponse && Array.isArray(geocodeResponse.locations)) {
+                        geocodeResponse.locations.push(geocodedLocation);
+                    }
+                },
+                GeocodeMatchCode: function (node, geocodedLocation) {
+                    var acc = node.getAttribute('accuracy');
+                    if (acc && geocodedLocation) {
+                        geocodedLocation.accuracy = parseFloat(acc);
+                    }
+                    var matchType = node.getAttribute('matchType');
+                    if (matchType && geocodedLocation) {
+                        geocodedLocation.matchType = matchType;
+                    }
+                },
+                Address: function (node, geocodedLocation) {
+                    var countrycode = node.getAttribute('countryCode');
+                    if (geocodedLocation && countrycode) {
+                        geocodedLocation.type = countrycode;
+                    }
+                    __getChildNodes(node, geocodedLocation);
+                },
+                freeFormAddress: function (node, geocodedLocation) {
+                    if (geocodedLocation && geocodedLocation.hasOwnProperty('placeAttributes')) {
+                        geocodedLocation.placeAttributes.freeform = __getChildValue(node);
+                    }
+                },
+                Building: function (node, geocodedLocation) {
+                    var num = node.getAttribute('number');
+                    if (geocodedLocation && geocodedLocation.hasOwnProperty('placeAttributes')) {
+                        if (num) {
+                            geocodedLocation.placeAttributes.number = num;
+                        } else if (node.getAttribute('buildingName')) {
+                            geocodedLocation.placeAttributes.number = node.getAttribute('buildingName');
+                        } else if (node.getAttribute('subdivision')) {
+                            geocodedLocation.placeAttributes.number = node.getAttribute('subdivision');
+                        }
+                    }
+                },
+                Street: function (node, geocodedLocation) {
+                    if (geocodedLocation && geocodedLocation.hasOwnProperty('placeAttributes')) {
+                        if (geocodedLocation.type === 'StreetAddress') {
+                            geocodedLocation.placeAttributes.street = __getChildValue(node);
+                        } else if (geocodedLocation.type === 'CadastralParcel') {
+                            geocodedLocation.placeAttributes.cadastralParcel = __getChildValue(node);
+                        }
+                    }
+                },
+                Place: function (node, geocodedLocation) {
+                    var placeType = node.getAttribute('type');
+                    var placeName = __getChildValue(node);
+                    if (geocodedLocation && geocodedLocation.hasOwnProperty('placeAttributes')) {
+                        if (placeType === 'Municipality') {
+                            geocodedLocation.placeAttributes.municipality = placeName;
+                        } else if (placeType === 'Bbox') {
+                            var values = placeName.split(';');
+                            if (values.length === 4) {
+                                geocodedLocation.placeAttributes.bbox = {
+                                    left: parseFloat(values[0]),
+                                    right: parseFloat(values[2]),
+                                    top: parseFloat(values[1]),
+                                    bottom: parseFloat(values[3])
+                                };
+                            }
+                        } else if (placeType === 'Commune') {
+                            geocodedLocation.placeAttributes.commune = placeName;
+                        } else if (placeType === 'Departement') {
+                            geocodedLocation.placeAttributes.department = placeName;
+                        } else if (placeType === 'INSEE') {
+                            geocodedLocation.placeAttributes.insee = placeName;
+                        } else if (placeType === 'Qualite') {
+                            geocodedLocation.placeAttributes.quality = placeName;
+                        } else if (placeType === 'Territoire') {
+                            geocodedLocation.placeAttributes.territory = placeName;
+                        } else if (placeType === 'ID') {
+                            geocodedLocation.placeAttributes.ID = placeName;
+                        } else if (placeType === 'ID_TR') {
+                            geocodedLocation.placeAttributes.IDTR = placeName;
+                        } else if (placeType === 'Importance') {
+                            geocodedLocation.placeAttributes.importance = parseInt(placeName, 10);
+                        } else if (placeType === 'Nature') {
+                            geocodedLocation.placeAttributes.nature = placeName;
+                        } else if (placeType === 'Numero') {
+                            geocodedLocation.placeAttributes.number = placeName;
+                        } else if (placeType === 'Feuille') {
+                            geocodedLocation.placeAttributes.sheet = placeName;
+                        } else if (placeType === 'Section') {
+                            geocodedLocation.placeAttributes.section = placeName;
+                        } else if (placeType === 'CommuneAbsorbee') {
+                            geocodedLocation.placeAttributes.absorbedCity = placeName;
+                        } else if (placeType === 'Arrondissement') {
+                            if (placeName) {
+                                geocodedLocation.placeAttributes.arrondissement = placeName;
+                            }
+                        } else if (placeType === 'Type') {
+                            geocodedLocation.placeAttributes.origin = placeName;
+                        } else if (placeType === 'Prefecture') {
+                            geocodedLocation.placeAttributes.prefecture = placeName;
+                        } else if (placeType === 'InseeRegion') {
+                            geocodedLocation.placeAttributes.inseeRegion = placeName;
+                        } else if (placeType === 'InseeDepartment') {
+                            geocodedLocation.placeAttributes.inseeDepartment = placeName;
+                        }
+                    }
+                },
+                PostalCode: function (node, geocodedLocation) {
+                    if (geocodedLocation && geocodedLocation.hasOwnProperty('placeAttributes')) {
+                        geocodedLocation.placeAttributes.postalCode = __getChildValue(node);
+                    }
+                },
+                Error: function (node) {
+                    var srvMess = node.getAttribute('message');
+                    var errorCode = node.getAttribute('errorCode');
+                    var message = MR.getMessage('SERVICE_RESPONSE_EXCEPTION', '(' + errorCode + ') : ' + srvMess);
+                    throw new ErrSrv({
+                        message: message,
+                        type: ErrSrv.TYPE_SRVERR
+                    });
+                }
+            },
+            gml: {
+                pos: function (node, geocodedLocation) {
+                    var pos = __getChildValue(node);
+                    if (geocodedLocation && pos) {
+                        geocodedLocation.position = {
+                            x: parseFloat(pos.split(' ')[0]),
+                            y: parseFloat(pos.split(' ')[1])
+                        };
+                    }
+                }
+            },
+            ExceptionReport: function (node) {
+                var response = {};
+                if (node.hasChildNodes()) {
+                    var children = node.childNodes;
+                    var child;
+                    for (var i = 0; i < children.length; i++) {
+                        child = children[i];
+                        if (child.nodeName === 'Exception') {
+                            response.exceptionReport = DirectGeocodeResponseReader.READERS['Exception'](child);
+                        }
+                    }
+                }
+                return response;
+            },
+            Exception: function (node) {
+                var exceptionReport = {};
+                var exceptionCode = node.getAttribute('exceptionCode');
+                if (exceptionCode) {
+                    exceptionReport.exceptionCode = exceptionCode;
+                }
+                var textNode = node.firstChild;
+                if (textNode && textNode.nodeType === 3) {
+                    exceptionReport.exception = textNode.nodeValue;
+                }
+                return exceptionReport;
+            }
+        };
+        DirectGeocodeResponseReader.read = function (root) {
+            if (root.nodeName === 'XLS') {
+                var nsPrefix = root.prefix;
+                if (!nsPrefix) {
+                    nsPrefix = DirectGeocodeResponseReader.DEFAULTPREFIX;
+                }
+                var geocodeResponse = DirectGeocodeResponseReader.READERS[nsPrefix][root.nodeName](root);
+                return geocodeResponse;
+            } else if (root.nodeName === 'ExceptionReport') {
+                var exceptionReport = DirectGeocodeResponseReader.READERS[root.nodeName](root);
+                return exceptionReport;
+            } else {
+                var mess = MR.getMessage('SERVICE_RESPONSE_ANALYSE', root.nodeName);
+                throw new ErrSrv({
+                    message: mess,
+                    type: ErrSrv.TYPE_UNKERR,
+                    status: 200
+                });
+            }
+        };
+        function __getAttributes(node) {
+            if (node.attributes.length > 0) {
+                var nodeAttributes = {};
+                var attributes = node.attributes;
+                for (var i = 0; i < attributes.length; i++) {
+                    var attribute = attributes[i];
+                    nodeAttributes[attribute.nodeName] = attribute.nodeValue;
+                }
+                return nodeAttributes;
+            }
+        }
+        function __getChildNodes(node, data) {
+            if (node.hasChildNodes()) {
+                var children = node.childNodes;
+                var child;
+                var childName;
+                var childPrefix;
+                for (var i = 0; i < children.length; i++) {
+                    child = children[i];
+                    if (child.nodeType === 1) {
+                        childName = child.localName || child.baseName || child.nodeName;
+                        childPrefix = child.prefix || DirectGeocodeResponseReader.DEFAULTPREFIX;
+                        if (DirectGeocodeResponseReader.READERS[childPrefix][childName]) {
+                            var reader = DirectGeocodeResponseReader.READERS[childPrefix][childName];
+                            reader(child, data);
+                        } else {
+                            __getChildNodes(child, data);
+                        }
+                    }
+                }
+            }
+        }
+        function __getChildValue(node) {
+            var textNode;
+            var value = '';
+            if (node.hasChildNodes()) {
+                textNode = node.firstChild;
+                if (textNode.nodeType === 3) {
+                    value = textNode.nodeValue;
+                }
+            }
+            return value;
+        }
+        function __checkServiceAttributes(XLSNode) {
+            if (XLSNode.attributes.length > 0) {
+                var xlsAttributes = __getAttributes(XLSNode);
+                for (var att in xlsAttributes) {
+                    if (xlsAttributes.hasOwnProperty(att)) {
+                        if (att === 'version') {
+                            if (xlsAttributes['version'] !== DirectGeocodeResponseReader.VERSION) {
+                                console.log('[DirectGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing');
+                                return;
+                            }
+                        }
+                        if (att === 'xmlns') {
+                            if (xlsAttributes[att] !== DirectGeocodeResponseReader.NAMESPACES[DirectGeocodeResponseReader.DEFAULTPREFIX]) {
+                                console.log('[DirectGeocodeResponseReader] geocode response default namespace is not the expected one');
+                                return;
+                            }
+                            continue;
+                        }
+                        var prefix = att.split(':')[0];
+                        var ns = att.split(':')[1];
+                        if (prefix === 'xmlns' && ns) {
+                            if (DirectGeocodeResponseReader.NAMESPACES[ns]) {
+                                if (DirectGeocodeResponseReader.NAMESPACES[ns] !== xlsAttributes[att]) {
+                                    console.log('[DirectGeocodeResponseReader] geocode response ' + att + ' namespace is not the expected one');
+                                    return;
+                                }
+                            }
+                        }
+                        if (ns === 'schemaLocation') {
+                            if (DirectGeocodeResponseReader.SCHEMALOCATION !== xlsAttributes[att]) {
+                                console.log('[DirectGeocodeResponseReader] geocode response schema location is not the expected one');
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return DirectGeocodeResponseReader;
+    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesGeocodeResponseModelGeocodeResponse, ServicesGeocodeResponseModelDirectGeocodedLocation);
+    ServicesGeocodeResponseDirectGeocodeResponseFactory = function (Logger, ErrorService, MRes, XML, DirectGeocodeResponseReader) {
+        var DirectGeocodeReponseFactory = {
+            build: function (options) {
+                var data = null;
+                if (options.response) {
+                    if (options.rawResponse) {
+                        data = options.response;
+                    } else {
+                        try {
+                            var p = new XML({ reader: DirectGeocodeResponseReader });
+                            if (typeof options.response === 'string') {
+                                p.setXMLString(options.response);
+                            } else {
+                                p.setXMLDoc(options.response);
+                            }
+                            data = p.parse();
+                            if (!data) {
+                                throw new Error('L\'analyse de la réponse du service !?');
+                            }
+                        } catch (e) {
+                            var message = e.message;
+                            if (typeof options.response === 'string') {
+                                message += '(\'' + options.response + '\')';
+                            } else {
+                                message += '(\'' + options.response.documentElement.innerHTML + '\')';
+                            }
+                            options.onError.call(options.scope, new ErrorService({
+                                message: MRes.getMessage('SERVICE_RESPONSE_ANALYSE', message),
+                                type: ErrorService.TYPE_UNKERR,
+                                status: -1
+                            }));
+                            return;
+                        }
+                        if (data.exceptionReport) {
+                            options.onError.call(options.scope, new ErrorService({
+                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport),
+                                type: ErrorService.TYPE_SRVERR,
+                                status: 200
+                            }));
+                            return;
+                        }
+                    }
+                } else {
+                    options.onError.call(options.scope, new ErrorService({
+                        message: MRes.getMessage('SERVICE_RESPONSE_EMPTY'),
+                        type: ErrorService.TYPE_SRVERR,
+                        status: -1
+                    }));
+                    return;
+                }
+                options.onSuccess.call(options.scope, data);
+                return;
+            }
+        };
+        return DirectGeocodeReponseFactory;
+    }(UtilsLoggerByDefault, ExceptionsErrorService, UtilsMessagesResources, FormatsXML, ServicesGeocodeFormatsDirectGeocodeResponseReader);
+    ServicesGeocodeGeocode = function (Logger, _, ErrorService, CommonService, DirectGeocodeRequestFactory, DirectGeocodeResponseFactory) {
+        function Geocode(options) {
+            if (!(this instanceof Geocode)) {
+                throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'Geocode'));
+            }
+            this.CLASSNAME = 'Geocode';
+            CommonService.apply(this, arguments);
+            if (!options.location) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'location'));
+            }
+            if (typeof options.location === 'object' && Object.keys(options.location).length === 0) {
+                throw new Error(_.getMessage('PARAM_EMPTY', 'location'));
+            } else if (typeof options.location === 'string' && options.location.length === 0) {
+                throw new Error(_.getMessage('PARAM_EMPTY', 'location'));
+            }
+            this.options.location = options.location;
+            if (!options.filterOptions || typeof options.filterOptions !== 'object') {
+                this.options.filterOptions = options.filterOptions = { type: ['StreetAddress'] };
+            }
+            if (Object.keys(options.filterOptions).length === 0) {
+                this.options.filterOptions = { type: ['StreetAddress'] };
+            }
+            var filter = Object.keys(options.filterOptions);
+            for (var i = 0; i < filter.length; i++) {
+                var key = filter[i];
+                var filtersCouldBeNumberList = [
+                    'department',
+                    'number',
+                    'postalCode',
+                    'insee',
+                    'importance',
+                    'ID',
+                    'IDTR',
+                    'absorbedCity',
+                    'sheet',
+                    'section',
+                    'inseeRegion',
+                    'inseeDepartment'
+                ];
+                if (filtersCouldBeNumberList.indexOf(key) !== -1 && typeof options.filterOptions[key] !== 'string') {
+                    options.filterOptions[key] = options.filterOptions[key].toString();
+                }
+                if (!options.filterOptions[key]) {
+                    delete this.options.filterOptions[key];
+                }
+            }
+            this.options.filterOptions.type = options.filterOptions.type || ['StreetAddress'];
+            this.options.maximumResponses = options.maximumResponses || 25;
+            this.options.returnFreeForm = options.returnFreeForm || false;
+            this.options.srs = options.srs || 'EPSG:4326';
+            this.options.outputFormat = 'xml';
+        }
+        Geocode.prototype = Object.create(CommonService.prototype, {});
+        Geocode.prototype.constructor = Geocode;
+        Geocode.prototype.buildRequest = function (error, success) {
+            var options = {
+                httpMethod: this.options.httpMethod,
+                location: this.options.location,
+                returnFreeForm: this.options.returnFreeForm,
+                filterOptions: this.options.filterOptions,
+                srs: this.options.srs,
+                maximumResponses: this.options.maximumResponses
+            };
+            this.request = DirectGeocodeRequestFactory.build(options);
+            if (!this.request) {
+                error.call(this, new ErrorService(_.getMessage('SERVICE_REQUEST_BUILD')));
+            } else {
+                success.call(this, this.request);
+            }
+        };
+        Geocode.prototype.analyzeResponse = function (error, success) {
+            if (this.response) {
+                var options = {
+                    response: this.response,
+                    rawResponse: this.options.rawResponse,
+                    onError: error,
+                    onSuccess: success,
+                    scope: this
+                };
+                DirectGeocodeResponseFactory.build(options);
+            } else {
+                error.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY')));
+            }
+        };
+        return Geocode;
+    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesCommonService, ServicesGeocodeRequestDirectGeocodeRequestFactory, ServicesGeocodeResponseDirectGeocodeResponseFactory);
+    ServicesGeocodeRequestReverseGeocodeRequestFactory = function (Logger, XLS, LocationUtilityService) {
+        var ReverseGeocodeRequestFactory = {
+            build: function (options) {
+                var settings = options || {};
+                var request = null;
+                var oLUS = new LocationUtilityService({
+                    position: settings.position,
+                    returnFreeForm: settings.returnFreeForm,
+                    filterOptions: settings.filterOptions
+                });
+                var oXLS = new XLS({
+                    srsName: settings.srs,
+                    maximumResponses: settings.maximumResponses
+                });
+                oXLS.namespace = true;
+                oXLS.setService(oLUS);
+                request = oXLS.build();
+                if (settings.httpMethod == 'GET') {
+                    var myRequest = 'qxml=' + encodeURIComponent(request).replace(/\-/g, '%2D').replace(/\_/g, '%5F').replace(/\./g, '%2E').replace(/\!/g, '%21').replace(/\~/g, '%7E').replace(/\*/g, '%2A').replace(/\'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29');
+                    request = myRequest;
+                }
+                return request;
+            }
+        };
+        return ReverseGeocodeRequestFactory;
+    }(UtilsLoggerByDefault, FormatsXLS, FormatsXLSLocationUtilityService);
+    ServicesGeocodeResponseModelReverseGeocodedLocation = function (GeocodedLocation) {
+        function ReverseGeocodedLocation() {
+            if (!(this instanceof ReverseGeocodedLocation)) {
+                throw new TypeError('ReverseGeocodedLocation constructor cannot be called as a function.');
+            }
+            GeocodedLocation.apply(this, arguments);
+            this.CLASSNAME = 'ReverseGeocodedLocation';
+            this.searchCenterDistance = null;
+        }
+        ReverseGeocodedLocation.prototype = Object.create(GeocodedLocation.prototype);
+        ReverseGeocodedLocation.prototype.constructor = ReverseGeocodedLocation;
+        return ReverseGeocodedLocation;
+    }(ServicesGeocodeResponseModelGeocodedLocation);
+    ServicesGeocodeFormatsReverseGeocodeResponseReader = function (Logger, MR, ErrSrv, ReverseGeocodeResponse, ReverseGeocodedLocation) {
+        var ReverseGeocodeResponseReader = {};
+        ReverseGeocodeResponseReader.VERSION = '1.2';
+        ReverseGeocodeResponseReader.NAMESPACES = {
+            xmlns: 'http://www.opengis.net/xls',
+            gml: 'http://www.opengis.net/gml',
+            xls: 'http://www.opengis.net/xls',
+            xlsext: 'http://www.opengis.net/xlsext',
+            xsi: 'http://www.w3.org/2001/XMLSchema-instance'
+        };
+        ReverseGeocodeResponseReader.SCHEMALOCATION = 'http://wxs.ign.fr/schemas/olsAll.xsd';
+        ReverseGeocodeResponseReader.DEFAULTPREFIX = 'xls';
+        ReverseGeocodeResponseReader.READERS = {
+            xls: {
+                XLS: function (root) {
+                    var reverseGeocodeResponse = new ReverseGeocodeResponse();
+                    __checkServiceAttributes(root);
+                    __getChildNodes(root, reverseGeocodeResponse);
+                    return reverseGeocodeResponse;
+                },
+                ReverseGeocodedLocation: function (node, reverseGeocodeResponse) {
+                    var reverseGeocodedLocation = new ReverseGeocodedLocation();
+                    __getChildNodes(node, reverseGeocodedLocation);
+                    if (reverseGeocodeResponse && Array.isArray(reverseGeocodeResponse.locations)) {
+                        reverseGeocodeResponse.locations.push(reverseGeocodedLocation);
+                    }
+                },
+                Address: function (node, reverseGeocodedLocation) {
+                    var countrycode = node.getAttribute('countryCode');
+                    if (reverseGeocodedLocation && countrycode) {
+                        reverseGeocodedLocation.type = countrycode;
+                    }
+                    __getChildNodes(node, reverseGeocodedLocation);
+                },
+                Building: function (node, reverseGeocodedLocation) {
+                    var num = node.getAttribute('number');
+                    if (reverseGeocodedLocation && reverseGeocodedLocation.hasOwnProperty('placeAttributes')) {
+                        if (num) {
+                            reverseGeocodedLocation.placeAttributes.number = num;
+                        } else if (node.getAttribute('buildingName')) {
+                            reverseGeocodedLocation.placeAttributes.number = node.getAttribute('buildingName');
+                        } else if (node.getAttribute('subdivision')) {
+                            reverseGeocodedLocation.placeAttributes.number = node.getAttribute('subdivision');
+                        }
+                    }
+                },
+                Street: function (node, reverseGeocodedLocation) {
+                    if (reverseGeocodedLocation.type === 'StreetAddress') {
+                        reverseGeocodedLocation.placeAttributes.street = __getChildValue(node);
+                    } else if (reverseGeocodedLocation.type === 'CadastralParcel') {
+                        reverseGeocodedLocation.placeAttributes.cadastralParcel = __getChildValue(node);
+                    }
+                },
+                Place: function (node, reverseGeocodedLocation) {
+                    var placeType = node.getAttribute('type');
+                    var placeName = __getChildValue(node);
+                    if (reverseGeocodedLocation && reverseGeocodedLocation.hasOwnProperty('placeAttributes')) {
+                        if (placeType === 'Municipality') {
+                            reverseGeocodedLocation.placeAttributes.municipality = placeName;
+                        } else if (placeType === 'Bbox') {
+                            var values = placeName.split(';');
+                            if (values.length === 4) {
+                                reverseGeocodedLocation.placeAttributes.bbox = {
+                                    left: parseFloat(values[0]),
+                                    right: parseFloat(values[2]),
+                                    top: parseFloat(values[1]),
+                                    bottom: parseFloat(values[3])
+                                };
+                            }
+                        } else if (placeType === 'Commune') {
+                            reverseGeocodedLocation.placeAttributes.commune = placeName;
+                        } else if (placeType === 'Departement') {
+                            reverseGeocodedLocation.placeAttributes.department = placeName;
+                        } else if (placeType === 'INSEE') {
+                            reverseGeocodedLocation.placeAttributes.insee = placeName;
+                        } else if (placeType === 'Qualite') {
+                            reverseGeocodedLocation.placeAttributes.quality = placeName;
+                        } else if (placeType === 'Territoire') {
+                            reverseGeocodedLocation.placeAttributes.territory = placeName;
+                        } else if (placeType === 'ID') {
+                            reverseGeocodedLocation.placeAttributes.ID = placeName;
+                        } else if (placeType === 'ID_TR') {
+                            reverseGeocodedLocation.placeAttributes.IDTR = placeName;
+                        } else if (placeType === 'Importance') {
+                            reverseGeocodedLocation.placeAttributes.importance = parseInt(placeName, 10);
+                        } else if (placeType === 'Nature') {
+                            reverseGeocodedLocation.placeAttributes.nature = placeName;
+                        } else if (placeType === 'Numero') {
+                            reverseGeocodedLocation.placeAttributes.number = placeName;
+                        } else if (placeType === 'Feuille') {
+                            reverseGeocodedLocation.placeAttributes.sheet = placeName;
+                        } else if (placeType === 'Section') {
+                            reverseGeocodedLocation.placeAttributes.section = placeName;
+                        } else if (placeType === 'CommuneAbsorbee') {
+                            reverseGeocodedLocation.placeAttributes.absorbedCity = placeName;
+                        } else if (placeType === 'Arrondissement') {
+                            if (placeName) {
+                                reverseGeocodedLocation.placeAttributes.arrondissement = placeName;
+                            }
+                        } else if (placeType === 'Type') {
+                            reverseGeocodedLocation.placeAttributes.origin = placeName;
+                        } else if (placeType === 'Prefecture') {
+                            reverseGeocodedLocation.placeAttributes.prefecture = placeName;
+                        } else if (placeType === 'InseeRegion') {
+                            reverseGeocodedLocation.placeAttributes.inseeRegion = placeName;
+                        } else if (placeType === 'InseeDepartment') {
+                            reverseGeocodedLocation.placeAttributes.inseeDepartment = placeName;
+                        }
+                    }
+                },
+                PostalCode: function (node, reverseGeocodedLocation) {
+                    if (reverseGeocodedLocation && reverseGeocodedLocation.hasOwnProperty('placeAttributes')) {
+                        reverseGeocodedLocation.placeAttributes.postalCode = __getChildValue(node);
+                    }
+                },
+                SearchCentreDistance: function (node, reverseGeocodedLocation) {
+                    if (reverseGeocodedLocation) {
+                        reverseGeocodedLocation.searchCenterDistance = parseFloat(node.getAttribute('value'));
+                    }
+                },
+                Error: function (node) {
+                    var srvMess = node.getAttribute('message');
+                    var errorCode = node.getAttribute('errorCode');
+                    var message = MR.getMessage('SERVICE_RESPONSE_EXCEPTION', '(' + errorCode + ') : ' + srvMess);
+                    throw new ErrSrv({
+                        message: message,
+                        type: ErrSrv.TYPE_SRVERR
+                    });
+                }
+            },
+            gml: {
+                pos: function (node, reverseGeocodedLocation) {
+                    var pos = __getChildValue(node);
+                    if (reverseGeocodedLocation && pos) {
+                        reverseGeocodedLocation.position = {
+                            x: parseFloat(pos.split(' ')[0]),
+                            y: parseFloat(pos.split(' ')[1])
+                        };
+                    }
+                }
+            },
+            xlsext: {
+                ExtendedGeocodeMatchCode: function (node, reverseGeocodedLocation) {
+                    if (reverseGeocodedLocation) {
+                        reverseGeocodedLocation.matchType = __getChildValue(node);
+                    }
+                }
+            },
+            ExceptionReport: function (node) {
+                var response = {};
+                if (node.hasChildNodes()) {
+                    var children = node.childNodes;
+                    var child;
+                    for (var i = 0; i < children.length; i++) {
+                        child = children[i];
+                        if (child.nodeName === 'Exception') {
+                            response.exceptionReport = ReverseGeocodeResponseReader.READERS['Exception'](child);
+                        }
+                    }
+                }
+                return response;
+            },
+            Exception: function (node) {
+                var exceptionReport = {};
+                var exceptionCode = node.getAttribute('exceptionCode');
+                if (exceptionCode) {
+                    exceptionReport.exceptionCode = exceptionCode;
+                }
+                var textNode = node.firstChild;
+                if (textNode && textNode.nodeType === 3) {
+                    exceptionReport.exception = textNode.nodeValue;
+                }
+                return exceptionReport;
+            }
+        };
+        ReverseGeocodeResponseReader.read = function (root) {
+            if (root.nodeName === 'XLS') {
+                var nsPrefix = root.prefix;
+                if (!nsPrefix) {
+                    nsPrefix = ReverseGeocodeResponseReader.DEFAULTPREFIX;
+                }
+                var geocodeResponse = ReverseGeocodeResponseReader.READERS[nsPrefix][root.nodeName](root);
+                return geocodeResponse;
+            } else if (root.nodeName === 'ExceptionReport') {
+                var exceptionReport = ReverseGeocodeResponseReader.READERS[root.nodeName](root);
+                return exceptionReport;
+            } else {
+                throw new Error('Erreur lors de la lecture de la réponse : elle n\'est pas au format attendu.');
+            }
+        };
+        function __getAttributes(node) {
+            if (node.attributes.length > 0) {
+                var nodeAttributes = {};
+                var attributes = node.attributes;
+                for (var i = 0; i < attributes.length; i++) {
+                    var attribute = attributes[i];
+                    nodeAttributes[attribute.nodeName] = attribute.nodeValue;
+                }
+                return nodeAttributes;
+            }
+        }
+        function __getChildNodes(node, data) {
+            if (node.hasChildNodes()) {
+                var children = node.childNodes;
+                var child;
+                var childName;
+                var childPrefix;
+                for (var i = 0; i < children.length; i++) {
+                    child = children[i];
+                    if (child.nodeType === 1) {
+                        childName = child.localName || child.baseName || child.nodeName;
+                        childPrefix = child.prefix || ReverseGeocodeResponseReader.DEFAULTPREFIX;
+                        if (ReverseGeocodeResponseReader.READERS[childPrefix][childName]) {
+                            var reader = ReverseGeocodeResponseReader.READERS[childPrefix][childName];
+                            reader(child, data);
+                        } else {
+                            __getChildNodes(child, data);
+                        }
+                    }
+                }
+            }
+        }
+        function __getChildValue(node) {
+            var textNode;
+            var value = '';
+            if (node.hasChildNodes()) {
+                textNode = node.firstChild;
+                if (textNode.nodeType === 3) {
+                    value = textNode.nodeValue;
+                }
+            }
+            return value;
+        }
+        function __checkServiceAttributes(XLSNode) {
+            if (XLSNode.attributes.length > 0) {
+                var xlsAttributes = __getAttributes(XLSNode);
+                for (var att in xlsAttributes) {
+                    if (xlsAttributes.hasOwnProperty(att)) {
+                        if (att === 'version') {
+                            if (xlsAttributes['version'] !== ReverseGeocodeResponseReader.VERSION) {
+                                console.log('[ReverseGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing');
+                                return;
+                            }
+                        }
+                        if (att === 'xmlns') {
+                            if (xlsAttributes[att] !== ReverseGeocodeResponseReader.NAMESPACES[ReverseGeocodeResponseReader.DEFAULTPREFIX]) {
+                                console.log('[ReverseGeocodeResponseReader] geocode response default namespace is not the expected one');
+                                return;
+                            }
+                            continue;
+                        }
+                        var prefix = att.split(':')[0];
+                        var ns = att.split(':')[1];
+                        if (prefix === 'xmlns' && ns) {
+                            if (ReverseGeocodeResponseReader.NAMESPACES[ns]) {
+                                if (ReverseGeocodeResponseReader.NAMESPACES[ns] !== xlsAttributes[att]) {
+                                    console.log('[ReverseGeocodeResponseReader] geocode response ' + att + ' namespace is not the expected one');
+                                    return;
+                                }
+                            }
+                        }
+                        if (ns === 'schemaLocation') {
+                            if (ReverseGeocodeResponseReader.SCHEMALOCATION !== xlsAttributes[att]) {
+                                console.log('[ReverseGeocodeResponseReader] geocode response schema location is not the expected one');
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return ReverseGeocodeResponseReader;
+    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesGeocodeResponseModelGeocodeResponse, ServicesGeocodeResponseModelReverseGeocodedLocation);
+    ServicesGeocodeResponseReverseGeocodeResponseFactory = function (Logger, MRes, ErrorService, XML, ReverseGeocodeResponseReader) {
+        var ReverseGeocodeReponseFactory = {
+            build: function (options) {
+                var data = null;
+                if (options.response) {
+                    if (options.rawResponse) {
+                        data = options.response;
+                    } else {
+                        try {
+                            var p = new XML({ reader: ReverseGeocodeResponseReader });
+                            if (typeof options.response === 'string') {
+                                p.setXMLString(options.response);
+                            } else {
+                                p.setXMLDoc(options.response);
+                            }
+                            data = p.parse();
+                            if (!data) {
+                                throw new Error('L\'analyse de la réponse du service !?');
+                            }
+                        } catch (e) {
+                            e.status = 200;
+                            options.onError.call(options.scope, e);
+                            return;
+                        }
+                        if (data.exceptionReport) {
+                            options.onError.call(options.scope, new ErrorService({
+                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport),
+                                type: ErrorService.TYPE_SRVERR,
+                                status: 200
+                            }));
+                            return;
+                        }
+                        if (options.scope && options.scope.options && options.scope.options.srs && options.scope.options.srs !== 'EPSG:4326') {
+                            var location;
+                            var pos;
+                            if (data || data.locations || data.locations.length) {
+                                for (var i = 0; i < data.locations.length; i++) {
+                                    location = data.locations[i];
+                                    if (location) {
+                                        pos = location.position;
+                                        if (pos) {
+                                            location.position = {
+                                                x: pos.y,
+                                                y: pos.x
+                                            };
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                } else {
+                    options.onError.call(options.scope, new ErrorService({
+                        message: MRes.getMessage('SERVICE_RESPONSE_EMPTY'),
+                        type: ErrorService.TYPE_SRVERR,
+                        status: -1
+                    }));
+                    return;
+                }
+                options.onSuccess.call(options.scope, data);
+                return;
+            }
+        };
+        return ReverseGeocodeReponseFactory;
+    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, FormatsXML, ServicesGeocodeFormatsReverseGeocodeResponseReader);
+    ServicesGeocodeReverseGeocode = function (Logger, _, ErrorService, CommonService, ReverseGeocodeRequestFactory, ReverseGeocodeResponseFactory) {
+        function ReverseGeocode(options) {
+            if (!(this instanceof ReverseGeocode)) {
+                throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'ReverseGeocode'));
+            }
+            this.CLASSNAME = 'ReverseGeocode';
+            CommonService.apply(this, arguments);
+            if (!options.position) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'position'));
+            }
+            if (options.position.x == null) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'position.x'));
+            }
+            if (options.position.y == null) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'position.y'));
+            }
+            this.options.position = options.position;
+            if (!options.filterOptions || typeof options.filterOptions !== 'object') {
+                this.options.filterOptions = options.filterOptions = { type: ['StreetAddress'] };
+            }
+            if (Object.keys(options.filterOptions).length === 0) {
+                this.options.filterOptions = { type: ['StreetAddress'] };
+            }
+            var filter = Object.keys(options.filterOptions);
+            for (var i = 0; i < filter.length; i++) {
+                var key = filter[i];
+                if (!options.filterOptions[key] || Object.keys(options.filterOptions[key]).length === 0) {
+                    delete this.options.filterOptions[key];
+                }
+            }
+            this.options.filterOptions.type = options.filterOptions.type || ['StreetAddress'];
+            if (!Array.isArray(this.options.filterOptions.type)) {
+                throw new Error(_.getMessage('PARAM_TYPE', 'filterOptions.type'));
+            }
+            this.options.maximumResponses = options.maximumResponses || 25;
+            this.options.returnFreeForm = options.returnFreeForm || false;
+            this.options.srs = options.srs || 'CRS:84';
+            if (ReverseGeocode.geoEPSG.indexOf(this.options.srs) === -1) {
+                this.options.position = {
+                    x: this.options.position.y,
+                    y: this.options.position.x
+                };
+                if (this.options.filterOptions && this.options.filterOptions.circle) {
+                    var circle = this.options.filterOptions.circle;
+                    this.options.filterOptions.circle = {
+                        x: circle.y,
+                        y: circle.x,
+                        radius: circle.radius
+                    };
+                }
+                if (this.options.filterOptions && this.options.filterOptions.polygon) {
+                    var polygon = this.options.filterOptions.polygon;
+                    for (i = 0; i < polygon.length; i++) {
+                        var coords = polygon[i];
+                        this.options.filterOptions.polygon[i] = {
+                            x: coords.y,
+                            y: coords.x
+                        };
+                    }
+                }
+            }
+            this.options.outputFormat = 'xml';
+        }
+        ReverseGeocode.prototype = Object.create(CommonService.prototype, {});
+        ReverseGeocode.prototype.constructor = ReverseGeocode;
+        ReverseGeocode.prototype.buildRequest = function (error, success) {
+            var options = {
+                httpMethod: this.options.httpMethod,
+                position: this.options.position,
+                returnFreeForm: this.options.returnFreeForm,
+                filterOptions: this.options.filterOptions,
+                srs: 'EPSG:4326',
+                maximumResponses: this.options.maximumResponses
+            };
+            this.request = ReverseGeocodeRequestFactory.build(options);
+            if (!this.request) {
+                error.call(this, new ErrorService(_.getMessage('SERVICE_REQUEST_BUILD')));
+            } else {
+                success.call(this, this.request);
+            }
+        };
+        ReverseGeocode.prototype.analyzeResponse = function (error, success) {
+            if (this.response) {
+                var options = {
+                    response: this.response,
+                    rawResponse: this.options.rawResponse,
+                    onError: error,
+                    onSuccess: success,
+                    scope: this
+                };
+                ReverseGeocodeResponseFactory.build(options);
+            } else {
+                error.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY')));
+            }
+        };
+        ReverseGeocode.geoEPSG = ['EPSG:4326'];
+        return ReverseGeocode;
+    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesCommonService, ServicesGeocodeRequestReverseGeocodeRequestFactory, ServicesGeocodeResponseReverseGeocodeResponseFactory);
+    ServicesAutoCompleteResponseModelAutoCompleteResponse = function () {
+        function AutoCompleteResponse() {
+            if (!(this instanceof AutoCompleteResponse)) {
+                throw new TypeError('AutoCompleteResponse constructor cannot be called as a function.');
+            }
+            this.suggestedLocations = [];
+        }
+        AutoCompleteResponse.prototype = { constructor: AutoCompleteResponse };
+        return AutoCompleteResponse;
+    }();
+    ServicesAutoCompleteResponseModelSuggestedLocation = function () {
+        function SuggestedLocation() {
+            if (!(this instanceof SuggestedLocation)) {
+                throw new TypeError('SuggestedLocation constructor cannot be called as a function.');
+            }
+            this.type = null;
+            this.position = {
+                x: null,
+                y: null
+            };
+            this.commune = null;
+            this.fullText = null;
+            this.postalCode = null;
+            this.classification = null;
+            this.street = null;
+            this.poi = null;
+            this.kind = null;
+        }
+        SuggestedLocation.prototype = { constructor: SuggestedLocation };
+        return SuggestedLocation;
+    }();
+    ServicesAutoCompleteResponseAutoCompleteResponseFactory = function (Logger, ErrorService, MRes, XML, AutoCompleteResponse, SuggestedLocation) {
+        var AutoCompleteResponseFactory = {
+            build: function (options) {
+                var data = null;
+                if (options.response) {
+                    if (options.rawResponse) {
+                        data = options.response;
+                    } else {
+                        var JSONResponse;
+                        if (typeof options.response === 'string') {
+                            JSONResponse = window.JSON.parse(options.response);
+                        } else {
+                            JSONResponse = options.response;
+                        }
+                        if (JSONResponse) {
+                            if (JSONResponse.error) {
+                                options.onError.call(options.scope, new ErrorService({
+                                    message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', JSONResponse.error.description),
+                                    status: JSONResponse.error.code,
+                                    type: ErrorService.TYPE_SRVERR
+                                }));
+                                return;
+                            }
+                            data = new AutoCompleteResponse();
+                            if (JSONResponse.results && Array.isArray(JSONResponse.results)) {
+                                var suggestedLocation;
+                                for (var i = 0; i < JSONResponse.results.length; i++) {
+                                    var result = JSONResponse.results[i];
+                                    suggestedLocation = new SuggestedLocation();
+                                    if (suggestedLocation) {
+                                        if (result && result.country === 'StreetAddress') {
+                                            suggestedLocation.street = result.street;
+                                            suggestedLocation.type = 'StreetAddress';
+                                        } else if (result && result.country === 'PositionOfInterest') {
+                                            suggestedLocation.poi = result.street;
+                                            suggestedLocation.kind = result.kind;
+                                            suggestedLocation.type = 'PositionOfInterest';
+                                        }
+                                        if (suggestedLocation.position) {
+                                            suggestedLocation.position.x = result.x;
+                                            suggestedLocation.position.y = result.y;
+                                        }
+                                        suggestedLocation.commune = result.city;
+                                        suggestedLocation.fullText = result.fulltext;
+                                        suggestedLocation.postalCode = result.zipcode;
+                                        suggestedLocation.classification = result.classification;
+                                    }
+                                    data.suggestedLocations.push(suggestedLocation);
+                                }
+                            } else {
+                                options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_FORMAT_3')));
+                                return;
+                            }
+                            if (!data.suggestedLocations.length) {
+                                options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_FORMAT_3')));
+                                return;
+                            }
+                        }
+                        if (!data) {
+                            options.onError.call(options.scope, new ErrorService({
+                                message: MRes.getMessage('SERVICE_RESPONSE_ANALYSE_2'),
+                                type: ErrorService.TYPE_UNKERR,
+                                status: -1
+                            }));
+                            return;
+                        }
+                        if (data.exceptionReport) {
+                            options.onError.call(options.scope, new ErrorService({
+                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport),
+                                type: ErrorService.TYPE_SRVERR,
+                                status: 200
+                            }));
+                            return;
+                        }
+                    }
+                } else {
+                    options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY')));
+                    return;
+                }
+                options.onSuccess.call(options.scope, data);
+                return;
+            }
+        };
+        return AutoCompleteResponseFactory;
+    }(UtilsLoggerByDefault, ExceptionsErrorService, UtilsMessagesResources, FormatsXML, ServicesAutoCompleteResponseModelAutoCompleteResponse, ServicesAutoCompleteResponseModelSuggestedLocation);
+    ServicesAutoCompleteAutoComplete = function (CommonService, AutoCompleteResponseFactory, Logger, MR, ErrorService, Helper) {
+        function AutoComplete(options) {
+            if (!(this instanceof AutoComplete)) {
+                throw new TypeError(MR.getMessage('CLASS_CONSTRUCTOR', 'AutoComplete'));
+            }
+            this.CLASSNAME = 'AutoComplete';
+            CommonService.apply(this, arguments);
+            if (!options.text) {
+                throw new Error(MR.getMessage('PARAM_MISSING', 'text'));
+            }
+            this.options.text = options.text;
+            if (!options.filterOptions || typeof options.filterOptions !== 'object') {
+                this.options.filterOptions = options.filterOptions = {
+                    territory: [],
+                    type: ['StreetAddress']
+                };
+            }
+            if (Object.keys(options.filterOptions).length === 0) {
+                this.options.filterOptions = {
+                    territory: [],
+                    type: ['StreetAddress']
+                };
+            }
+            this.options.filterOptions.type = options.filterOptions.type || ['StreetAddress'];
+            this.options.filterOptions.territory = options.filterOptions.territory || [];
+            this.options.maximumResponses = options.maximumResponses || 10;
+            if (this.options.protocol === 'XHR' && this.options.httpMethod === 'POST') {
+                this.options.httpMethod = 'GET';
+            }
+            this.options.outputFormat = 'json';
+        }
+        AutoComplete.prototype = Object.create(CommonService.prototype, {});
+        AutoComplete.prototype.constructor = AutoComplete;
+        AutoComplete.prototype.buildRequest = function (error, success) {
+            var territories = '';
+            if (this.options.filterOptions.territory) {
+                territories = this.options.filterOptions.territory.join(';');
+            }
+            var types = '';
+            if (this.options.filterOptions.type) {
+                types = this.options.filterOptions.type.join(',');
+            }
+            this.request = Helper.normalyzeParameters({
+                text: encodeURIComponent(this.options.text),
+                type: types,
+                terr: territories,
+                maximumResponses: this.options.maximumResponses
+            });
+            success.call(this, this.request);
+        };
+        AutoComplete.prototype.analyzeResponse = function (error, success) {
+            if (this.response) {
+                var options = {
+                    response: this.response,
+                    rawResponse: this.options.rawResponse,
+                    onSuccess: success,
+                    onError: error,
+                    scope: this
+                };
+                AutoCompleteResponseFactory.build(options);
+            } else {
+                error.call(this, new ErrorService(MR.getMessage('SERVICE_RESPONSE_EMPTY')));
+            }
+        };
+        return AutoComplete;
+    }(ServicesCommonService, ServicesAutoCompleteResponseAutoCompleteResponseFactory, UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, UtilsHelper);
+    FormatsXLSRouteServiceModelRoutePlan = function (Logger) {
+        function RoutePlan(options) {
+            if (!(this instanceof RoutePlan)) {
+                throw new TypeError('RoutePlan constructor cannot be called as a function.');
+            }
+            this.options = options || {};
+            if (!options.startPoint) {
+                throw new Error('l\'option \'startPoint\' n\'est pas renseignée !');
+            }
+            if (!options.endPoint) {
+                throw new Error('l\'option \'endPoint\' n\'est pas renseignée !');
+            }
+            for (var opt in options) {
+                if (options.hasOwnProperty(opt)) {
+                    this.options[opt] = options[opt];
+                }
+            }
+        }
+        RoutePlan.prototype = {
+            constructor: RoutePlan,
+            requestString: null,
+            template: {
+                routePlan: '<RoutePlan>' + '__ROUTEPREFERENCE__' + '__GRAPH__' + '__WAYPOINTLIST__' + '__AVOIDLIST__' + '</RoutePlan>',
+                routePreference: '<RoutePreference>__VALUEROUTEPREFERENCE__</RoutePreference>',
+                graph: '<xlsext:graphName xmlns:xlsext="http://www.opengis.net/xlsext" name="__VALUEGRAPH__"/>',
+                wayPointList: {
+                    container: '<WayPointList>' + '__STARTPOINT__' + '__VIAPOINT__' + '__ENDPOINT__' + '</WayPointList>',
+                    point: '<Position><gml:Point xmlns:gml="http://www.opengis.net/gml"><gml:pos>__X__ __Y__</gml:pos></gml:Point></Position>',
+                    startPoint: '<StartPoint>' + '__POINT__' + '</StartPoint>',
+                    endPoint: '<EndPoint>' + '__POINT__' + '</EndPoint>',
+                    viaPoint: '<ViaPoint>' + '__POINT__' + '</ViaPoint>'
+                },
+                avoidList: {
+                    container: '<AvoidList>' + '__AVOIDFEATURE__' + '</AvoidList>',
+                    avoidFeature: '<AvoidFeature>__VALUEAVOIDFEATURE__</AvoidFeature>'
+                }
+            },
+            toString: function () {
+                var template = '';
+                template = this.template.routePlan;
+                if (this.options.routePreference) {
+                    var tmplPreference = this.template.routePreference;
+                    tmplPreference = tmplPreference.replace(/__VALUEROUTEPREFERENCE__/, this.options.routePreference);
+                    template = template.replace(/__ROUTEPREFERENCE__/g, tmplPreference);
+                }
+                template = template.replace(/__ROUTEPREFERENCE__/g, '');
+                if (this.options.avoidFeature) {
+                    var tmplAvoidList = this.template.avoidList.container;
+                    var avoidFeatures = [];
+                    for (var i = 0; i < this.options.avoidFeature.length; i++) {
+                        var tmplAvoidFeature = this.template.avoidList.avoidFeature;
+                        tmplAvoidFeature = tmplAvoidFeature.replace(/__VALUEAVOIDFEATURE__/, this.options.avoidFeature[i]);
+                        avoidFeatures.push(tmplAvoidFeature);
+                    }
+                    tmplAvoidList = tmplAvoidList.replace(/__AVOIDFEATURE__/, avoidFeatures.join('\n'));
+                    template = template.replace(/__AVOIDLIST__/g, tmplAvoidList);
+                }
+                template = template.replace(/__AVOIDLIST__/g, '');
+                if (this.options.graph) {
+                    var tmplVehicle = this.template.graph;
+                    tmplVehicle = tmplVehicle.replace(/__VALUEGRAPH__/, this.options.graph);
+                    template = template.replace(/__GRAPH__/g, tmplVehicle);
+                }
+                template = template.replace(/__GRAPH__/g, '');
+                var tmplWayPointList = this.template.wayPointList.container;
+                var tmplPoint = '';
+                tmplPoint = this.template.wayPointList.point;
+                tmplPoint = tmplPoint.replace(/__X__/, this.options.startPoint.x);
+                tmplPoint = tmplPoint.replace(/__Y__/, this.options.startPoint.y);
+                tmplWayPointList = tmplWayPointList.replace(/__STARTPOINT__/, this.template.wayPointList.startPoint.replace(/__POINT__/, tmplPoint));
+                tmplPoint = this.template.wayPointList.point;
+                tmplPoint = tmplPoint.replace(/__X__/, this.options.endPoint.x);
+                tmplPoint = tmplPoint.replace(/__Y__/, this.options.endPoint.y);
+                tmplWayPointList = tmplWayPointList.replace(/__ENDPOINT__/, this.template.wayPointList.endPoint.replace(/__POINT__/, tmplPoint));
+                if (this.options.viaPoint) {
+                    var points = [];
+                    for (var j = 0; j < this.options.viaPoint.length; j++) {
+                        var p = this.options.viaPoint[j];
+                        tmplPoint = this.template.wayPointList.point;
+                        tmplPoint = tmplPoint.replace(/__X__/, p.x);
+                        tmplPoint = tmplPoint.replace(/__Y__/, p.y);
+                        points.push(tmplPoint);
+                    }
+                    tmplWayPointList = tmplWayPointList.replace(/__VIAPOINT__/, this.template.wayPointList.viaPoint.replace(/__POINT__/, points.join('\n')));
+                } else {
+                    tmplWayPointList = tmplWayPointList.replace(/__VIAPOINT__/, '');
+                }
+                template = template.replace(/__WAYPOINTLIST__/g, tmplWayPointList);
+                this.requestString = template;
+                return this.requestString;
+            }
+        };
+        return RoutePlan;
+    }(UtilsLoggerByDefault);
+    FormatsXLSRouteServiceDetermineRouteRequest = function (Logger, RoutePlan) {
+        function DetermineRouteRequest(options) {
+            if (!(this instanceof DetermineRouteRequest)) {
+                throw new TypeError('DetermineRouteRequest constructor cannot be called as a function.');
+            }
+            this.options = options || {};
+            for (var opt in options) {
+                if (options.hasOwnProperty(opt)) {
+                    this.options[opt] = options[opt];
+                }
+            }
+            this.CLASSNAME = 'DetermineRouteRequest';
+        }
+        DetermineRouteRequest.prototype = {
+            strRequest: null,
+            oRoutePlan: null,
+            template: {
+                determineRouteRequest: '<DetermineRouteRequest distanceUnit="__DISTANCEUNIT__">' + '__ROUTEPLAN__' + '__ROUTEINSTRUCTIONREQUEST__' + '__ROUTEGEOMETRYREQUEST__' + '__ROUTEMAPREQUEST__' + '</DetermineRouteRequest>',
+                routeInstructionRequest: '<RouteInstructionsRequest ' + 'provideGeometry="__PROVIDEGEOMETRY__" ' + 'provideBoundingBox="__PROVIDEBBOX__" />',
+                routeGeometryRequest: '<RouteGeometryRequest />',
+                routeMapRequest: ''
+            },
+            addRoute: function (oRoutePlan) {
+                if (oRoutePlan instanceof RoutePlan) {
+                    this.oRoutePlan = oRoutePlan;
+                }
+            },
+            constructor: DetermineRouteRequest,
+            toString: function () {
+                var template = '';
+                template = this.template.determineRouteRequest;
+                template = template.replace(/__DISTANCEUNIT__/g, this.options.distanceUnit || 'KM');
+                if (!this.oRoutePlan) {
+                    var settings = this.options.route;
+                    this.oRoutePlan = new RoutePlan(settings);
+                    if (!this.oRoutePlan) {
+                        throw new Error('La construction du calcul d\'initineraire n\'est pas correctement definie !?');
+                    }
+                }
+                template = template.replace(/__ROUTEPLAN__/g, this.oRoutePlan.toString());
+                var tmplInstruction = this.template.routeInstructionRequest;
+                tmplInstruction = tmplInstruction.replace(/__PROVIDEGEOMETRY__/g, this.options.provideGeometry || false);
+                tmplInstruction = tmplInstruction.replace(/__PROVIDEBBOX__/g, this.options.provideBoundingBox || false);
+                template = template.replace(/__ROUTEINSTRUCTIONREQUEST__/g, tmplInstruction);
+                var tmplGeometry = this.template.routeGeometryRequest;
+                template = template.replace(/__ROUTEGEOMETRYREQUEST__/g, tmplGeometry);
+                var tmplMap = this.template.routeMapRequest;
+                template = template.replace(/__ROUTEMAPREQUEST__/g, tmplMap);
+                this.strRequest = template;
+                return this.strRequest;
+            }
+        };
+        return DetermineRouteRequest;
+    }(UtilsLoggerByDefault, FormatsXLSRouteServiceModelRoutePlan);
+    FormatsXLSRouteServiceRouteRequestExtension = undefined;
+    FormatsXLSRouteService = function (Logger, AbstractService, DetermineRouteRequest, RouteRequestExtension) {
+        function RouteService(options) {
+            if (!(this instanceof RouteService)) {
+                throw new TypeError('RouteService constructor cannot be called as a function.');
+            }
+            this.CLASSNAME = 'RouteService';
+            this.CLASSTYPE = 'RouteRequest';
+            AbstractService.apply(this, arguments);
+        }
+        RouteService.prototype = Object.create(AbstractService.prototype, {});
+        RouteService.prototype.constructor = RouteService;
+        RouteService.prototype.addRequest = function (oRequest) {
+            if (oRequest.CLASSNAME === 'DetermineRouteRequest') {
+                this.oRequest = oRequest;
+            } else {
+                throw new Error('Ce n\'est pas un objet de type \'Route Request\' !?');
+            }
+        };
+        RouteService.prototype.addFilter = function (oFilter) {
+            if (oFilter instanceof RouteRequestExtension) {
+                this.oFilter = oFilter;
+            }
+        };
+        RouteService.prototype.toString = function () {
+            if (!this.oRequest) {
+                if (!this.options) {
+                    throw new Error('Les options ne sont pas renseignées, impossible de construire la requête !');
+                }
+                if (this.CLASSTYPE === 'RouteRequest') {
+                    var settings = {
+                        distanceUnit: this.options.distanceUnit || null,
+                        provideGeometry: this.options.provideGeometry || null,
+                        provideBoundingBox: this.options.provideBoundingBox || null,
+                        route: {
+                            routePreference: this.options.routePreference || null,
+                            startPoint: this.options.startPoint,
+                            viaPoint: this.options.viaPoint || null,
+                            endPoint: this.options.endPoint,
+                            avoidFeature: this.options.avoidFeature || null,
+                            graph: this.options.graph || null,
+                            expectedStartTime: this.options.expectedStartTime || null
+                        }
+                    };
+                    this.oRequest = new DetermineRouteRequest(settings);
+                    if (this.oFilter) {
+                        this.oRequest.addFilter(this.oFilter);
+                    }
+                }
+            }
+            if (!this.oRequest) {
+                throw new Error('Type de requête indefini !');
+            }
+            this.strRequest = this.oRequest.toString();
+            return this.strRequest;
+        };
+        return RouteService;
+    }(UtilsLoggerByDefault, FormatsXLSAbstractService, FormatsXLSRouteServiceDetermineRouteRequest, FormatsXLSRouteServiceRouteRequestExtension);
+    ServicesRouteRequestRouteRequestOLS = function (Logger, XLS, RouteService) {
+        var RouteRequestOLS = {
+            build: function (options) {
+                var request = null;
+                var settings = {
+                    startPoint: options.startPoint,
+                    endPoint: options.endPoint,
+                    viaPoint: options.viaPoints,
+                    provideBoundingBox: options.provideBbox,
+                    avoidFeature: options.exclusions,
+                    expectedStartTime: options.expectedStartTime,
+                    distanceUnit: options.distanceUnit,
+                    graph: options.graph,
+                    provideGeometry: options.geometryInInstructions,
+                    routePreference: options.routePreference
+                };
+                var oRS = new RouteService(settings);
+                var oXLS = new XLS({
+                    srsName: options.srs,
+                    maximumResponses: options.maximumResponses
+                });
+                oXLS.namespace = true;
+                oXLS.setService(oRS);
+                request = oXLS.build();
+                if (options.httpMethod == 'GET') {
+                    var myRequest = 'qxml=' + encodeURIComponent(request).replace(/\-/g, '%2D').replace(/\_/g, '%5F').replace(/\./g, '%2E').replace(/\!/g, '%21').replace(/\~/g, '%7E').replace(/\*/g, '%2A').replace(/\'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29');
+                    request = myRequest;
+                }
+                return request;
+            }
+        };
+        return RouteRequestOLS;
+    }(UtilsLoggerByDefault, FormatsXLS, FormatsXLSRouteService);
+    ServicesRouteRequestModelRouteParamREST = function (Logger) {
+        function RouteParamREST(options) {
+            if (!(this instanceof RouteParamREST)) {
+                throw new TypeError('RouteParamREST constructor cannot be called as a function.');
+            }
+            this.options = options || {};
+            this.origin = this.options.startPoint.x + ',' + this.options.startPoint.y;
+            this.destination = this.options.endPoint.x + ',' + this.options.endPoint.y;
+            this.waypoints = this.options.viaPoints || null;
+            this.startDateTime = this.options.expectedStartTime || null;
+            this.graphName = this.options.graph;
+            this.srs = this.options.srs;
+            this.exclusions = this.options.exclusions;
+            this.method = 'TIME';
+            if (this.options.routePreference) {
+                var value = this.options.routePreference;
+                switch (value) {
+                case 'fastest':
+                    this.method = 'TIME';
+                    break;
+                case 'shortest':
+                    this.method = 'DISTANCE';
+                    break;
+                default:
+                    this.method = 'TIME';
+                }
+            }
+            this.format = this.options.geometryInInstructions ? 'STANDARDEXT' : 'STANDARD';
+            this.tolerance = 10;
+            this.profileId = null;
+            this.profileName = null;
+        }
+        RouteParamREST.CLASSNAME = 'RouteParamREST';
+        RouteParamREST.prototype = {
+            constructor: RouteParamREST,
+            getWaypoints: function () {
+                if (!this.waypoints) {
+                    return;
+                }
+                var array = [];
+                for (var i = 0; i < this.waypoints.length; i++) {
+                    var obj = this.waypoints[i];
+                    array.push(obj.x + ',' + obj.y);
+                }
+                return array.join(';');
+            },
+            getExclusions: function () {
+                return this.exclusions.join(';');
+            }
+        };
+        RouteParamREST.prototype.getParams = function () {
+            var map = [];
+            map.push({
+                k: 'origin',
+                v: this.origin
+            });
+            map.push({
+                k: 'destination',
+                v: this.destination
+            });
+            map.push({
+                k: 'method',
+                v: this.method
+            });
+            if (this.waypoints) {
+                map.push({
+                    k: 'waypoints',
+                    v: this.getWaypoints()
+                });
+            }
+            if (this.startDateTime) {
+                map.push({
+                    k: 'startDateTime',
+                    v: this.startDateTime
+                });
+            }
+            if (this.graphName) {
+                map.push({
+                    k: 'graphName',
+                    v: this.graphName
+                });
+            }
+            if (this.exclusions) {
+                map.push({
+                    k: 'exclusions',
+                    v: this.getExclusions()
+                });
+            }
+            if (this.srs) {
+                map.push({
+                    k: 'srs',
+                    v: this.srs
+                });
+            }
+            if (this.format) {
+                map.push({
+                    k: 'format',
+                    v: this.format
+                });
+            }
+            return map;
+        };
+        return RouteParamREST;
+    }(UtilsLoggerByDefault);
+    ServicesRouteRequestRouteRequestREST = function (Logger, _, RouteParamREST) {
+        function RouteRequestREST(options) {
+            if (!(this instanceof RouteRequestREST)) {
+                throw new TypeError('RouteRequestREST constructor cannot be called as a function.');
+            }
+            if (!options) {
+                throw new Error(_.getMessage('PARAM_EMPTY', 'options'));
+            }
+            this.settings = options;
+        }
+        RouteRequestREST.prototype = {
+            requestString: null,
+            constructor: RouteRequestREST,
+            processRequestString: function () {
+                var oParams = new RouteParamREST(this.settings);
+                var params = oParams.getParams();
+                var request = '';
+                for (var i = 0; i < params.length; i++) {
+                    var o = params[i];
+                    if (request) {
+                        request += '&';
+                    }
+                    request += o.k + '=' + o.v;
+                }
+                this.requestString = request;
+                return this.requestString;
+            }
+        };
+        return RouteRequestREST;
+    }(UtilsLoggerByDefault, UtilsMessagesResources, ServicesRouteRequestModelRouteParamREST);
+    ServicesRouteRequestRouteRequestFactory = function (Logger, ErrorService, RouteRequestOLS, RouteRequestREST) {
+        var RouteRequestFactory = {
+            build: function (options) {
+                var request = null;
+                var settings = options || {};
+                var bOnError = options.onError !== null && typeof options.onError === 'function' ? true : false;
+                var message = null;
+                switch (options.api) {
+                case 'REST':
+                    var myReq = new RouteRequestREST(settings);
+                    if (!myReq.processRequestString()) {
+                        message = 'Error process request (rest) !';
+                        if (bOnError) {
+                            options.onError.call(options.scope, new ErrorService(message));
+                            return;
+                        }
+                        throw new Error(message);
+                    }
+                    request = myReq.requestString;
+                    break;
+                case 'OLS':
+                    request = RouteRequestOLS.build(settings);
+                    if (!request) {
+                        message = 'Error process request (ols) !';
+                        if (bOnError) {
+                            options.onError.call(options.scope, new ErrorService(message));
+                            return;
+                        }
+                        throw new Error(message);
+                    }
+                    break;
+                default:
+                    message = 'Type of API is not supported by service (REST or OLS) !';
+                    if (bOnError) {
+                        options.onError.call(options.scope, new ErrorService(message));
+                        return;
+                    }
+                    throw new Error(message);
+                }
+                return request;
+            }
+        };
+        return RouteRequestFactory;
+    }(UtilsLoggerByDefault, ExceptionsErrorService, ServicesRouteRequestRouteRequestOLS, ServicesRouteRequestRouteRequestREST);
+    FormatsWKT = function (Logger) {
+        var WKT = {
+            toJson: function (strWkt, success, error) {
+                var json = null;
+                try {
+                    if (!strWkt) {
+                        throw new Error('La chaine WKT n\'est pas renseignée !');
+                    }
+                    if (!success) {
+                        success = function (json) {
+                            console.log(json);
+                        };
+                    }
+                    if (!error) {
+                        error = function (e) {
+                            console.log(e);
+                        };
+                    }
+                    var regex;
+                    var subst;
+                    var result;
+                    regex = /(-?\d+\.?[0-9]*)\s(-?\d+\.?[0-9]+)/g;
+                    subst = '[$1,$2]';
+                    strWkt = strWkt.replace(regex, subst);
+                    regex = /^(\w+)/;
+                    result = regex.exec(strWkt);
+                    if (RegExp.$1 === 'POLYGON') {
+                        subst = '{"type" : "Polygon",';
+                        strWkt = strWkt.replace(RegExp.$1, subst);
+                        regex = /(\({2}?)/;
+                        subst = '"coordinates" : [[';
+                        strWkt = strWkt.replace(regex, subst);
+                        regex = /(\){2}?)/;
+                        subst = ']]}';
+                        strWkt = strWkt.replace(regex, subst);
+                        regex = /(\()/g;
+                        subst = '[';
+                        strWkt = strWkt.replace(regex, subst);
+                        regex = /(\))/g;
+                        subst = ']';
+                        strWkt = strWkt.replace(regex, subst);
+                    } else if (RegExp.$1 === 'LINESTRING') {
+                        subst = '{"type" : "LineString",';
+                        strWkt = strWkt.replace(RegExp.$1, subst);
+                        regex = /(\(\(?)/;
+                        subst = '"coordinates" : [';
+                        strWkt = strWkt.replace(regex, subst);
+                        regex = /(\)\)?)/;
+                        subst = ']}';
+                        strWkt = strWkt.replace(regex, subst);
+                    }
+                    json = JSON.parse(strWkt);
+                    if (!json) {
+                        throw new Error('Le JSON est vide !');
+                    }
+                    if (!json.type) {
+                        throw new Error('Le type de geometrie n\'est pas connu !');
+                    }
+                    if (!json.coordinates) {
+                        throw new Error('La liste des points est vide !');
+                    }
+                    success.call(this, json);
+                } catch (e) {
+                    if (e.name === 'SyntaxError') {
+                        error.call(this, 'Erreur de parsing JSON !');
+                        return;
+                    }
+                    error.call(this, e);
+                }
+            }
+        };
+        return WKT;
+    }(UtilsLoggerByDefault);
+    ServicesRouteResponseModelRouteResponse = function () {
+        function RouteResponse() {
+            if (!(this instanceof RouteResponse)) {
+                throw new TypeError('RouteResponse constructor cannot be called as a function.');
+            }
+            this.totalTime = null;
+            this.totalDistance = null;
+            this.bbox = {
+                left: null,
+                right: null,
+                top: null,
+                bottom: null
+            };
+            this.routeGeometry = null;
+            this.routeInstructions = [];
+        }
+        RouteResponse.prototype = { constructor: RouteResponse };
+        return RouteResponse;
+    }();
+    ServicesRouteResponseModelRouteInstruction = function () {
+        function RouteInstruction() {
+            if (!(this instanceof RouteInstruction)) {
+                throw new TypeError('RouteInstruction constructor cannot be called as a function.');
+            }
+            this.duration = null;
+            this.distance = null;
+            this.code = null;
+            this.instruction = null;
+            this.geometry = null;
+        }
+        RouteInstruction.prototype = { constructor: RouteInstruction };
+        return RouteInstruction;
+    }();
+    ServicesRouteFormatsRouteResponseRESTReader = function (Logger, WKT, MessagesResources, ErrSrv, RouteResponse, RouteInstruction) {
+        var RouteResponseRESTReader = {};
+        RouteResponseRESTReader.READERS = {
+            routeResult: function (node) {
+                var response = new RouteResponse();
+                __getChildNodes(node, response);
+                if (response.status === 'error') {
+                    var message = MessagesResources.getMessage('SERVICE_RESPONSE_EXCEPTION', response.message);
+                    throw new ErrSrv({
+                        message: message,
+                        type: ErrSrv.TYPE_SRVERR
+                    });
+                }
+                return response;
+            },
+            status: function (node, response) {
+                var status = __getChildValue(node);
+                if (status === 'ERROR' || status === 'error') {
+                    if (response) {
+                        response.status = 'error';
+                    }
+                }
+            },
+            message: function (node, response) {
+                if (response) {
+                    response.message = __getChildValue(node);
+                }
+            },
+            distance: function (node, response) {
+                if (response) {
+                    response.totalDistance = __getChildValue(node);
+                }
+            },
+            durationSeconds: function (node, response) {
+                if (response) {
+                    response.totalTime = parseFloat(__getChildValue(node));
+                }
+            },
+            bounds: function (node, response) {
+                if (response && response.bbox) {
+                    var coords = __getChildValue(node).split(/[,;]/);
+                    response.bbox.left = parseFloat(coords[0]);
+                    response.bbox.bottom = parseFloat(coords[1]);
+                    response.bbox.right = parseFloat(coords[2]);
+                    response.bbox.top = parseFloat(coords[3]);
+                }
+            },
+            geometryWkt: function (node, response) {
+                if (response) {
+                    var geomWkt = node.innerHTML;
+                    var onWKTSuccess = function (json) {
+                        response.routeGeometry = json;
+                    };
+                    var onWKTError = function () {
+                        var msg = MessagesResources.getMessage('PARAM_FORMAT', ['geometryWkt']);
+                        throw new Error(msg);
+                    };
+                    WKT.toJson(geomWkt, onWKTSuccess, onWKTError);
+                }
+            },
+            step: function (node, response) {
+                var routeInstruction = new RouteInstruction();
+                var name;
+                if (node.hasChildNodes) {
+                    var children = node.childNodes;
+                    var child;
+                    var childName;
+                    for (var i = 0; i < children.length; i++) {
+                        child = children[i];
+                        if (child.nodeType === 1) {
+                            childName = child.localName || child.baseName || child.nodeName;
+                            if (childName === 'durationSeconds') {
+                                routeInstruction.duration = __getChildValue(child);
+                            } else if (childName === 'distance') {
+                                routeInstruction.distance = __getChildValue(child);
+                            } else if (childName === 'navInstruction') {
+                                routeInstruction.code = __getChildValue(child);
+                            } else if (childName === 'name') {
+                                name = __getChildValue(child);
+                            }
+                        }
+                    }
+                }
+                if (routeInstruction.code) {
+                    switch (routeInstruction.code) {
+                    case 'F':
+                        if (name != 'Valeur non renseignée') {
+                            routeInstruction.instruction = 'Tout droit ' + name;
+                        } else {
+                            routeInstruction.instruction = 'Continuer tout droit ';
+                        }
+                        break;
+                    case 'B':
+                        routeInstruction.instruction = 'Demi-tour ' + name;
+                        break;
+                    case 'L':
+                        routeInstruction.instruction = 'Tourner à gauche ' + name;
+                        break;
+                    case 'R':
+                        routeInstruction.instruction = 'Tourner à droite ' + name;
+                        break;
+                    case 'BL':
+                        routeInstruction.instruction = 'Tourner très à gauche ' + name;
+                        break;
+                    case 'BR':
+                        routeInstruction.instruction = 'Tourner très à droite ' + name;
+                        break;
+                    case 'FL':
+                        routeInstruction.instruction = 'Tourner légèrement à gauche ' + name;
+                        break;
+                    case 'FR':
+                        routeInstruction.instruction = 'Tourner légèrement à droite ' + name;
+                        break;
+                    case 'round_about_entry':
+                        routeInstruction.instruction = 'Entrée rond-point ' + name;
+                        break;
+                    case 'round_about_exit':
+                        routeInstruction.instruction = 'Sortie rond-point ' + name;
+                        break;
+                    case null:
+                        routeInstruction.instruction = 'Prendre ' + name;
+                        break;
+                    default:
+                        routeInstruction.instruction = '?' + routeInstruction.code + '? ' + name;
+                        break;
+                    }
+                }
+                if (Array.isArray(response.routeInstructions)) {
+                    response.routeInstructions.push(routeInstruction);
+                }
+            }
+        };
+        RouteResponseRESTReader.read = function (root) {
+            var response;
+            if (root.nodeName === 'routeResult') {
+                response = RouteResponseRESTReader.READERS['routeResult'](root);
+                return response;
+            } else {
+                throw new Error('Erreur lors de la lecture de la réponse : elle n\'est pas au format attendu.');
+            }
+        };
+        function __getChildValue(node) {
+            var textNode;
+            var value = '';
+            if (node.hasChildNodes()) {
+                textNode = node.firstChild;
+                if (textNode && textNode.nodeType === 3) {
+                    value = textNode.nodeValue;
+                }
+            }
+            return value;
+        }
+        function __getChildNodes(node, data) {
+            if (node.hasChildNodes()) {
+                var children = node.childNodes;
+                var child;
+                var childName;
+                for (var i = 0; i < children.length; i++) {
+                    child = children[i];
+                    if (child.nodeType === 1) {
+                        childName = child.localName || child.baseName || child.nodeName;
+                        if (RouteResponseRESTReader.READERS[childName]) {
+                            var reader = RouteResponseRESTReader.READERS[childName];
+                            reader(child, data);
+                        } else {
+                            __getChildNodes(child, data);
+                        }
+                    }
+                }
+            }
+        }
+        return RouteResponseRESTReader;
+    }(UtilsLoggerByDefault, FormatsWKT, UtilsMessagesResources, ExceptionsErrorService, ServicesRouteResponseModelRouteResponse, ServicesRouteResponseModelRouteInstruction);
+    ServicesRouteFormatsRouteResponseOLSReader = function (Logger) {
+        var RouteResponseOLSReader = {};
+        RouteResponseOLSReader.READERS = {};
+        RouteResponseOLSReader.read = function (root) {
+        };
+        return RouteResponseOLSReader;
+    }(UtilsLoggerByDefault);
+    ServicesRouteResponseRouteResponseFactory = function (Logger, ErrorService, XML, WKT, MRes, RouteResponseRESTReader, RouteResponseOLSReader, RouteResponse, RouteInstruction) {
+        var RouteResponseFactory = {
+            build: function (options) {
+                var data = null;
+                if (options.response) {
+                    if (options.rawResponse) {
+                        data = options.response;
+                    } else {
+                        switch (options.outputFormat) {
+                        case 'xml':
+                            var routeReader = options.api === 'REST' ? RouteResponseRESTReader : RouteResponseOLSReader;
+                            try {
+                                var p = new XML({ reader: routeReader });
+                                if (typeof options.response === 'string') {
+                                    p.setXMLString(options.response);
+                                } else {
+                                    p.setXMLDoc(options.response);
+                                }
+                                data = p.parse();
+                                if (!data) {
+                                    throw new ErrorService(MRes.getMessage('SERVICE_RESPONSE_FORMAT', 'xml'));
+                                }
+                            } catch (e) {
+                                options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_ANALYSE', options.response)));
+                                return;
+                            }
+                            break;
+                        case 'json':
+                            var JSONResponse;
+                            if (typeof options.response === 'string') {
+                                JSONResponse = window.JSON.parse(options.response);
+                            } else {
+                                JSONResponse = options.response;
+                            }
+                            if (JSONResponse.message) {
+                                options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', JSONResponse.message)));
+                                return;
+                            }
+                            if (JSONResponse) {
+                                var legs = [];
+                                var legSteps = [];
+                                var steps = [];
+                                data = new RouteResponse();
+                                if (data.hasOwnProperty('totalTime')) {
+                                    data.totalTime = parseFloat(JSONResponse.durationSeconds);
+                                }
+                                if (data.hasOwnProperty('totalDistance')) {
+                                    data.totalDistance = options.distanceUnit === 'm' ? JSONResponse.distanceMeters : JSONResponse.distance;
+                                }
+                                if (data.hasOwnProperty('bbox')) {
+                                    var coords = JSONResponse.bounds.split(/[,;]/);
+                                    data.bbox.left = parseFloat(coords[0]);
+                                    data.bbox.bottom = parseFloat(coords[1]);
+                                    data.bbox.right = parseFloat(coords[2]);
+                                    data.bbox.top = parseFloat(coords[3]);
+                                }
+                                var onWKTSuccess = function (json) {
+                                    data.routeGeometry = json;
+                                };
+                                var onWKTError = function (e) {
+                                    console.log(e);
+                                    options.onError.call(options.scope, new ErrorService(MRes.getMessage('PARAM_FORMAT', ['geometryWkt'])));
+                                };
+                                if (data.hasOwnProperty('routeGeometry')) {
+                                    var geometry = JSONResponse.geometryWkt || JSONResponse.simplifiedWkt;
+                                    if (geometry) {
+                                        WKT.toJson(geometry, onWKTSuccess, onWKTError);
+                                        if (!data.routeGeometry) {
+                                            return;
+                                        }
+                                    }
+                                }
+                                if (data.hasOwnProperty('routeInstructions')) {
+                                    var legList = JSONResponse.legs;
+                                    var i;
+                                    if (Array.isArray(legList) && legList.length) {
+                                        for (i = 0; i < legList.length; i++) {
+                                            legs.push(legList[i]);
+                                        }
+                                    }
+                                    if (Array.isArray(legs) && legs.length) {
+                                        for (i = 0; i < legs.length; i++) {
+                                            legSteps.push(legs[i].steps);
+                                        }
+                                    }
+                                    if (Array.isArray(legSteps) && legSteps.length) {
+                                        for (i = 0; i < legSteps.length; i++) {
+                                            steps = steps.concat(legSteps[i]);
+                                        }
+                                    }
+                                    steps.forEach(function (step) {
+                                        data.routeInstructions.push(new RouteInstruction());
+                                        data.routeInstructions[data.routeInstructions.length - 1].duration = step.durationSeconds;
+                                        data.routeInstructions[data.routeInstructions.length - 1].distance = options.distanceUnit === 'm' ? step.distanceMeters : step.distance;
+                                        data.routeInstructions[data.routeInstructions.length - 1].code = step.navInstruction;
+                                        var points = [];
+                                        for (var i = 0; i < step.points.length; i++) {
+                                            var point = step.points[i].split(',');
+                                            if (point) {
+                                                points.push(point);
+                                            }
+                                        }
+                                        if (points && points.length !== 0) {
+                                            data.routeInstructions[data.routeInstructions.length - 1].geometry = {
+                                                coordinates: points,
+                                                type: 'LineString'
+                                            };
+                                        } else {
+                                            data.routeInstructions[data.routeInstructions.length - 1].geometry = null;
+                                        }
+                                        if (step.name == 'Valeur non renseignée') {
+                                            step.name = '';
+                                        }
+                                        switch (step.navInstruction) {
+                                        case 'F':
+                                            if (step.name) {
+                                                data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tout droit ' + step.name;
+                                            } else {
+                                                data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Continuer tout droit ';
+                                            }
+                                            break;
+                                        case 'B':
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Demi-tour ' + step.name;
+                                            break;
+                                        case 'L':
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner à gauche ' + step.name;
+                                            break;
+                                        case 'R':
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner à droite ' + step.name;
+                                            break;
+                                        case 'BL':
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner très à gauche ' + step.name;
+                                            break;
+                                        case 'BR':
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner très à droite ' + step.name;
+                                            break;
+                                        case 'FL':
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner légèrement à gauche ' + step.name;
+                                            break;
+                                        case 'FR':
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner légèrement à droite ' + step.name;
+                                            break;
+                                        case 'round_about_entry':
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Entrée rond-point ' + step.name;
+                                            break;
+                                        case 'round_about_exit':
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Sortie rond-point ' + step.name;
+                                            break;
+                                        case null:
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Prendre tout droit ' + step.name;
+                                            break;
+                                        default:
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = '?' + step.navInstruction + '? ' + step.name;
+                                            break;
+                                        }
+                                    });
+                                }
+                            }
+                            if (!data) {
+                                options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_ANALYSE', 'json')));
+                                return;
+                            }
+                            break;
+                        default:
+                            options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_FORMAT', 'json', 'xml')));
+                            return;
+                        }
+                        if (data && data.exceptionReport) {
+                            options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EXCEPTION_2')));
+                            return;
+                        }
+                    }
+                } else {
+                    options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY')));
+                    return;
+                }
+                options.onSuccess.call(options.scope, data);
+                return;
+            }
+        };
+        return RouteResponseFactory;
+    }(UtilsLoggerByDefault, ExceptionsErrorService, FormatsXML, FormatsWKT, UtilsMessagesResources, ServicesRouteFormatsRouteResponseRESTReader, ServicesRouteFormatsRouteResponseOLSReader, ServicesRouteResponseModelRouteResponse, ServicesRouteResponseModelRouteInstruction);
+    ServicesRouteRoute = function (Logger, _, ErrorService, CommonService, DefaultUrlService, RouteRequestFactory, RouteResponseFactory) {
+        function Route(options) {
+            if (!(this instanceof Route)) {
+                throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'Route'));
+            }
+            this.CLASSNAME = 'Route';
+            CommonService.apply(this, arguments);
+            if (!options.startPoint) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'startPoint'));
+            }
+            if (options.startPoint.x == null) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'startPoint.x'));
+            }
+            if (options.startPoint.y == null) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'startPoint.y'));
+            }
+            if (!options.endPoint) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'endPoint'));
+            }
+            if (options.endPoint.x == null) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'endPoint.x'));
+            }
+            if (options.endPoint.y == null) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'endPoint.y'));
+            }
+            this.options.api = typeof options.api == 'string' ? options.api.toUpperCase() : 'REST';
+            this.options.outputFormat = typeof options.outputFormat == 'string' ? options.outputFormat.toLowerCase() : 'json';
+            this.options.startPoint = options.startPoint;
+            this.options.endPoint = options.endPoint;
+            this.options.viaPoints = options.viaPoints || null;
+            this.options.exclusions = options.exclusions || null;
+            this.options.routePreference = options.routePreference || 'fastest';
+            this.options.graph = options.graph || 'Voiture';
+            this.options.geometryInInstructions = options.geometryInInstructions || false;
+            this.options.provideBbox = options.provideBbox || true;
+            this.options.distanceUnit = options.distanceUnit || 'km';
+            this.options.expectedStartTime = null;
+            this.options.srs = options.srs || 'EPSG:4326';
+            this.options.api = 'REST';
+            if (this.options.protocol === 'XHR') {
+                this.options.httpMethod = 'GET';
+            }
+            if (!this.options.serverUrl) {
+                var lstUrlByDefault = DefaultUrlService.Route.url(this.options.apiKey);
+                var urlFound = null;
+                switch (this.options.api) {
+                case 'OLS':
+                    urlFound = lstUrlByDefault.ols;
+                    break;
+                case 'REST':
+                    var key = 'route' + '-' + this.options.outputFormat;
+                    urlFound = lstUrlByDefault[key];
+                    break;
+                default:
+                    throw new Error(_.getMessage('PARAM_UNKNOWN', 'api'));
+                }
+                if (!urlFound) {
+                    throw new Error('Url by default not found !');
+                }
+                this.options.serverUrl = urlFound;
+            }
+            var idx = this.options.serverUrl.lastIndexOf('.');
+            if (idx !== -1) {
+                var extension = this.options.serverUrl.substring(idx + 1);
+                if (extension && extension.length < 5) {
+                    switch (extension.toLowerCase()) {
+                    case 'json':
+                    case 'xml':
+                        this.options.outputFormat = extension.toLowerCase();
+                        break;
+                    default:
+                        throw new Error('type of service : unknown or unsupported (json or xml) !');
+                    }
+                }
+            }
+        }
+        Route.prototype = Object.create(CommonService.prototype, {});
+        Route.prototype.constructor = Route;
+        Route.prototype.buildRequest = function (error, success) {
+            var options = {
+                api: this.options.api,
+                startPoint: this.options.startPoint,
+                endPoint: this.options.endPoint,
+                viaPoints: this.options.viaPoints,
+                provideBbox: this.options.provideBbox,
+                exclusions: this.options.exclusions,
+                distanceUnit: this.options.distanceUnit,
+                graph: this.options.graph,
+                geometryInInstructions: this.options.geometryInInstructions,
+                routePreference: this.options.routePreference,
+                srs: this.options.srs
+            };
+            this.request = RouteRequestFactory.build(options);
+            if (!this.request) {
+                error.call(this, new ErrorService(_.getMessage('SERVICE_REQUEST_BUILD')));
+            } else {
+                success.call(this, this.request);
+            }
+        };
+        Route.prototype.analyzeResponse = function (error, success) {
+            if (this.response) {
+                var options = {
+                    distanceUnit: this.options.distanceUnit,
+                    response: this.response,
+                    outputFormat: this.options.outputFormat,
+                    api: this.options.api,
+                    rawResponse: this.options.rawResponse,
+                    onError: error,
+                    onSuccess: success,
+                    scope: this
+                };
+                RouteResponseFactory.build(options);
+            } else {
+                error.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY')));
+            }
+        };
+        return Route;
+    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesCommonService, ServicesDefaultUrlService, ServicesRouteRequestRouteRequestFactory, ServicesRouteResponseRouteResponseFactory);
+    ServicesProcessIsoCurveRequestModelProcessIsoCurveParam = function (Logger) {
+        function ProcessIsoCurveParam(options) {
+            if (!(this instanceof ProcessIsoCurveParam)) {
+                throw new TypeError('ProcessIsoCurveParam constructor cannot be called as a function.');
+            }
+            this.options = options || {};
+            this.id = this.options.id;
+            this.location = this.options.position;
+            this.srs = this.options.srs;
+            this.graphName = this.options.graph;
+            this.profileId = this.options.profileId || null;
+            this.profileName = this.options.profileName || null;
+            this.exclusions = this.options.exclusions;
+            this.reverse = this.options.reverse;
+            this.smoothing = this.options.smoothing;
+            this.holes = this.options.holes;
+            var value = this.options.method;
+            switch (value) {
+            case 'time':
+                this.method = 'time';
+                this.time = this.options.time;
+                break;
+            case 'distance':
+                this.method = 'distance';
+                this.distance = this.options.distance;
+                break;
+            default:
+                this.method = 'time';
+            }
+        }
+        ProcessIsoCurveParam.CLASSNAME = 'ProcessIsoCurveParam';
+        ProcessIsoCurveParam.prototype = {
+            constructor: ProcessIsoCurveParam,
+            getLocation: function () {
+                return this.location.x + ',' + this.location.y;
+            },
+            getExclusions: function () {
+                return this.exclusions.join(';');
+            }
+        };
+        ProcessIsoCurveParam.prototype.getParams = function () {
+            var map = [];
+            map.push({
+                k: 'location',
+                v: this.getLocation()
+            });
+            map.push({
+                k: 'smoothing',
+                v: this.smoothing
+            });
+            map.push({
+                k: 'holes',
+                v: this.holes
+            });
+            map.push({
+                k: 'reverse',
+                v: this.reverse
+            });
+            map.push({
+                k: 'method',
+                v: this.method
+            });
+            if (this.time) {
+                map.push({
+                    k: 'time',
+                    v: this.time
+                });
+            }
+            if (this.distance) {
+                map.push({
+                    k: 'distance',
+                    v: this.distance
+                });
+            }
+            map.push({
+                k: 'graphName',
+                v: this.graphName
+            });
+            if (this.exclusions) {
+                map.push({
+                    k: 'exclusions',
+                    v: this.getExclusions()
+                });
+            }
+            if (this.srs) {
+                map.push({
+                    k: 'srs',
+                    v: this.srs
+                });
+            }
+            return map;
+        };
+        return ProcessIsoCurveParam;
+    }(UtilsLoggerByDefault);
+    ServicesProcessIsoCurveRequestProcessIsoCurveRequest = function (Logger, _, ProcessIsoCurveParam) {
+        function ProcessIsoCurveRequest(options) {
+            if (!(this instanceof ProcessIsoCurveRequest)) {
+                throw new TypeError('ProcessIsoCurveRequest constructor cannot be called as a function.');
+            }
+            if (!options) {
+                throw new Error(_.getMessage('PARAM_EMPTY', 'options'));
+            }
+            this.settings = options;
+            this.mode = this.settings.httpMethod || 'GET';
+        }
+        ProcessIsoCurveRequest.prototype = {
+            requestString: null,
+            constructor: ProcessIsoCurveRequest,
+            template: {
+                container: '<?xml version="1.0" encoding="UTF-8"?>\n' + '<isochroneRequest>\n' + '__ID__' + '\t<location>\n' + '\t\t<x>__X__</x>\n' + '\t\t<y>__Y__</y>\n' + '\t</location>\n' + '\t<srs>__SRS__</srs>\n' + '\t<graphName>__GRAPHNAME__</graphName>\n' + '__PROFIL__' + '__EXCLUSIONS__' + '\t<method>__METHOD__</method>\n' + '__TIME__' + '__DISTANCE__' + '\t<reverse>__REVERSE__</reverse>\n' + '\t<smoothing>__SMOOTHING__</smoothing>\n' + '\t<holes>__HOLES__</holes>\n' + '</isochroneRequest>',
+                id: '\t<id>__IDVALUE__</id>\n',
+                profil: '\t<profileId>__PROFILID__</profileId>\n' + '\t<profileName>__PROFILNAME__</profileName>\n',
+                exclusions: {
+                    container: '\t<exclusions>\n' + '__EXCLUSIONFEATURE__\n' + '\t</exclusions>\n',
+                    feature: '\t\t<exclusion>__EXCLUSIONVALUE__</exclusion>'
+                },
+                time: '\t<time>__TIMEVALUE__</time>\n',
+                distance: '\t<distance>__DISTANCEVALUE__</distance>\n'
+            },
+            processRequestString: function () {
+                var request = '';
+                var i = 0;
+                switch (this.mode) {
+                case 'GET':
+                    var oParams = new ProcessIsoCurveParam(this.settings);
+                    var params = oParams.getParams();
+                    for (i = 0; i < params.length; i++) {
+                        var o = params[i];
+                        if (request) {
+                            request += '&';
+                        }
+                        request += o.k + '=' + o.v;
+                    }
+                    break;
+                case 'POST':
+                    request = this.template.container;
+                    request = request.replace(/__ID__/g, '');
+                    request = request.replace(/__PROFIL__/g, '');
+                    request = request.replace(/__X__/g, this.settings.position.x);
+                    request = request.replace(/__Y__/g, this.settings.position.y);
+                    request = request.replace(/__GRAPHNAME__/g, this.settings.graph);
+                    request = request.replace(/__SRS__/g, this.settings.srs);
+                    request = request.replace(/__SMOOTHING__/g, this.settings.smoothing);
+                    request = request.replace(/__HOLES__/g, this.settings.holes);
+                    request = request.replace(/__REVERSE__/g, this.settings.reverse);
+                    if (this.settings.exclusions) {
+                        var tmplExclusions = this.template.exclusions.container;
+                        var exclusions = [];
+                        for (i = 0; i < this.settings.exclusions.length; i++) {
+                            var tmplFeature = this.template.exclusions.feature;
+                            tmplFeature = tmplFeature.replace(/__EXCLUSIONVALUE__/, this.settings.exclusions[i]);
+                            exclusions.push(tmplFeature);
+                        }
+                        tmplExclusions = tmplExclusions.replace(/__EXCLUSIONFEATURE__/, exclusions.join('\n'));
+                        request = request.replace(/__EXCLUSIONS__/g, tmplExclusions);
+                    }
+                    request = request.replace(/__EXCLUSIONS__/g, '');
+                    if (this.settings.distance) {
+                        var tmplDistance = this.template.distance;
+                        tmplDistance = tmplDistance.replace(/__DISTANCEVALUE__/g, this.settings.distance);
+                        request = request.replace(/__DISTANCE__/g, tmplDistance);
+                        request = request.replace(/__METHOD__/g, 'distance');
+                    }
+                    request = request.replace(/__DISTANCE__/g, '');
+                    if (this.settings.time) {
+                        var tmplTime = this.template.time;
+                        tmplTime = tmplTime.replace(/__TIMEVALUE__/g, this.settings.time);
+                        request = request.replace(/__TIME__/g, tmplTime);
+                        request = request.replace(/__METHOD__/g, 'time');
+                    }
+                    request = request.replace(/__TIME__/g, '');
+                    break;
+                default:
+                }
+                this.requestString = request;
+                return this.requestString;
+            }
+        };
+        return ProcessIsoCurveRequest;
+    }(UtilsLoggerByDefault, UtilsMessagesResources, ServicesProcessIsoCurveRequestModelProcessIsoCurveParam);
+    ServicesProcessIsoCurveResponseModelProcessIsoCurveResponse = function () {
+        function ProcessIsoCurveResponse() {
+            if (!(this instanceof ProcessIsoCurveResponse)) {
+                throw new TypeError('ProcessIsoCurveResponse constructor cannot be called as a function.');
+            }
+            this.message = null;
+            this.id = null;
+            this.location = {};
+            this.location.x = null;
+            this.location.y = null;
+            this.srs = null;
+            this.geometry = null;
+            this.time = null;
+            this.distance = null;
+        }
+        ProcessIsoCurveResponse.prototype = { constructor: ProcessIsoCurveResponse };
+        return ProcessIsoCurveResponse;
+    }();
+    ServicesProcessIsoCurveFormatsProcessIsoCurveResponseReader = function (Logger, WKT, ErrSrv, MessagesResources, ProcessIsoCurveResponse) {
+        var ProcessIsoCurveResponseReader = {};
+        ProcessIsoCurveResponseReader.READERS = {
+            isochronResult: function (root) {
+                var response = new ProcessIsoCurveResponse();
+                if (root.hasChildNodes()) {
+                    var children = root.childNodes;
+                    var child;
+                    for (var i = 0; i < children.length; i++) {
+                        child = children[i];
+                        if (ProcessIsoCurveResponseReader.READERS[child.nodeName]) {
+                            ProcessIsoCurveResponseReader.READERS[child.nodeName](child, response);
+                        }
+                    }
+                }
+                if (response.status === 'error') {
+                    var message = MessagesResources.getMessage('SERVICE_RESPONSE_EXCEPTION', response.message);
+                    throw new ErrSrv({
+                        message: message,
+                        type: ErrSrv.TYPE_SRVERR
+                    });
+                }
+                return response;
+            },
+            message: function (node, response) {
+                if (response) {
+                    response.message = __getChildValue(node);
+                }
+            },
+            status: function (node, response) {
+                var status = __getChildValue(node);
+                if (status === 'ERROR' || status === 'error') {
+                    if (response) {
+                        response.status = 'error';
+                    }
+                }
+            },
+            id: function (node, response) {
+                if (response) {
+                    response.id = __getChildValue(node);
+                }
+            },
+            location: function (node, response) {
+                var coords = __getChildValue(node);
+                if (response && response.location) {
+                    response.location.x = parseFloat(coords.split(',')[0]);
+                    response.location.y = parseFloat(coords.split(',')[1]);
+                }
+            },
+            srs: function (node, response) {
+                if (response) {
+                    response.srs = __getChildValue(node);
+                }
+            },
+            distance: function (node, response) {
+                if (response) {
+                    response.distance = parseFloat(__getChildValue(node));
+                }
+            },
+            time: function (node, response) {
+                if (response) {
+                    response.time = parseFloat(__getChildValue(node));
+                }
+            },
+            wktGeometry: function (node, response) {
+                if (response) {
+                    var wktGeometry = node.innerHTML;
+                    var onWKTSuccess = function (json) {
+                        response.geometry = json;
+                    };
+                    var onWKTError = function () {
+                        var msg = MessagesResources.getMessage('PARAM_FORMAT', ['wktGeometry']);
+                        throw new Error(msg);
+                    };
+                    if (response.hasOwnProperty('geometry')) {
+                        WKT.toJson(wktGeometry, onWKTSuccess, onWKTError);
+                    }
+                }
+            },
+            serviceResult: function (node) {
+                var response = {};
+                if (node.hasChildNodes()) {
+                    var children = node.childNodes;
+                    var child;
+                    for (var i = 0; i < children.length; i++) {
+                        child = children[i];
+                        if (ProcessIsoCurveResponseReader.READERS[child.nodeName]) {
+                            ProcessIsoCurveResponseReader.READERS[child.nodeName](child, response);
+                        }
+                    }
+                }
+                return response;
+            },
+            ExceptionReport: function (node) {
+                var response = {};
+                if (node.hasChildNodes()) {
+                    var children = node.childNodes;
+                    var child;
+                    for (var i = 0; i < children.length; i++) {
+                        child = children[i];
+                        if (child.nodeName === 'Exception') {
+                            response.exceptionReport = ProcessIsoCurveResponseReader.READERS['Exception'](child);
+                        }
+                    }
+                }
+                return response;
+            },
+            Exception: function (node) {
+                var exceptionReport = {};
+                var exceptionCode = node.getAttribute('exceptionCode');
+                if (exceptionCode) {
+                    exceptionReport.exceptionCode = exceptionCode;
+                }
+                var textNode = node.firstChild;
+                if (textNode && textNode.nodeType === 3) {
+                    exceptionReport.exception = textNode.nodeValue;
+                }
+                return exceptionReport;
+            }
+        };
+        ProcessIsoCurveResponseReader.read = function (root) {
+            var response;
+            if (root.nodeName === 'isochronResult' || root.nodeName === 'isochroneResult' || root.nodeName === 'IsochroneResult') {
+                response = ProcessIsoCurveResponseReader.READERS['isochronResult'](root);
+                return response;
+            } else if (root.nodeName === 'ExceptionReport') {
+                response = ProcessIsoCurveResponseReader.READERS[root.nodeName](root);
+                return response;
+            } else if (ProcessIsoCurveResponseReader.READERS[root.nodeName]) {
+                response = ProcessIsoCurveResponseReader.READERS[root.nodeName](root);
+                if (response.status === 'error') {
+                    var errMsg = MessagesResources.getMessage('SERVICE_RESPONSE_EXCEPTION', response.message);
+                    throw new ErrSrv({
+                        message: errMsg,
+                        type: ErrSrv.TYPE_SRVERR
+                    });
+                }
+                return response;
+            } else {
+                throw new ErrSrv({
+                    message: MessagesResources.getMessage('SERVICE_RESPONSE_ANALYSE', root.nodeName),
+                    type: ErrSrv.TYPE_UNKERR
+                });
+            }
+        };
+        function __getChildValue(node) {
+            var textNode;
+            var value = '';
+            if (node.hasChildNodes()) {
+                textNode = node.firstChild;
+                if (textNode && textNode.nodeType === 3) {
+                    value = textNode.nodeValue;
+                }
+            }
+            return value;
+        }
+        return ProcessIsoCurveResponseReader;
+    }(UtilsLoggerByDefault, FormatsWKT, ExceptionsErrorService, UtilsMessagesResources, ServicesProcessIsoCurveResponseModelProcessIsoCurveResponse);
+    ServicesProcessIsoCurveResponseProcessIsoCurveResponseFactory = function (Logger, ErrorService, MRes, XML, WKT, ProcessIsoCurveResponseReader, ProcessIsoCurveResponse) {
+        var ProcessIsoCurveResponseFactory = {
+            build: function (options) {
+                var data = null;
+                if (options.response) {
+                    if (options.rawResponse) {
+                        data = options.response;
+                    } else {
+                        switch (options.outputFormat) {
+                        case 'xml':
+                            try {
+                                var p = new XML({ reader: ProcessIsoCurveResponseReader });
+                                if (typeof options.response === 'string') {
+                                    p.setXMLString(options.response);
+                                } else {
+                                    p.setXMLDoc(options.response);
+                                }
+                                data = p.parse();
+                                if (!data) {
+                                    throw new Error(MRes.getMessage('SERVICE_RESPONSE_EXCEPTION_2'));
+                                }
+                            } catch (e) {
+                                var message = e.message;
+                                message += '\n(raw response service : \'' + options.response + '\')';
+                                options.onError.call(options.scope, new ErrorService({
+                                    message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', message),
+                                    status: 200,
+                                    type: ErrorService.TYPE_SRVERR
+                                }));
+                                return;
+                            }
+                            break;
+                        case 'json':
+                            var JSONResponse;
+                            if (typeof options.response === 'string') {
+                                JSONResponse = window.JSON.parse(options.response);
+                            } else {
+                                JSONResponse = options.response;
+                            }
+                            if (JSONResponse.status === 'OK' || JSONResponse.status === 'ok') {
+                                data = new ProcessIsoCurveResponse();
+                                if (data) {
+                                    data.time = JSONResponse.time;
+                                    data.distance = JSONResponse.distance;
+                                    data.message = JSONResponse.message;
+                                    data.id = JSONResponse.id;
+                                    data.srs = JSONResponse.srs;
+                                    var onWKTSuccess = function (json) {
+                                        data.geometry = json;
+                                    };
+                                    var onWKTError = function () {
+                                        options.onError.call(options.scope, new ErrorService({ message: MRes.getMessage('PARAM_FORMAT', 'wktGeometry') }));
+                                    };
+                                    if (data.hasOwnProperty('geometry')) {
+                                        WKT.toJson(JSONResponse.wktGeometry, onWKTSuccess, onWKTError);
+                                        if (!data.geometry) {
+                                            return;
+                                        }
+                                    }
+                                    var coords = JSONResponse.location.split(',');
+                                    if (data.location) {
+                                        data.location.x = coords[0];
+                                        data.location.y = coords[1];
+                                    }
+                                } else {
+                                    options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_ANALYSE', options.response)));
+                                    return;
+                                }
+                            } else if (JSONResponse.status === 'ERROR' || JSONResponse.status === 'error') {
+                                var mess = JSONResponse.message;
+                                mess += '\n(raw response service : \'' + JSONResponse + '\')';
+                                options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', mess)));
+                                return;
+                            }
+                            break;
+                        default:
+                            options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_FORMAT', 'json', 'xml')));
+                            return;
+                        }
+                        if (data && data.exceptionReport) {
+                            options.onError.call(options.scope, new ErrorService({
+                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport),
+                                type: ErrorService.TYPE_SRVERR,
+                                status: 200
+                            }));
+                            return;
+                        }
+                    }
+                } else {
+                    options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY')));
+                    return;
+                }
+                options.onSuccess.call(options.scope, data);
+                return;
+            }
+        };
+        return ProcessIsoCurveResponseFactory;
+    }(UtilsLoggerByDefault, ExceptionsErrorService, UtilsMessagesResources, FormatsXML, FormatsWKT, ServicesProcessIsoCurveFormatsProcessIsoCurveResponseReader, ServicesProcessIsoCurveResponseModelProcessIsoCurveResponse);
+    ServicesProcessIsoCurveProcessIsoCurve = function (Logger, _, ErrorService, CommonService, DefaultUrlService, ProcessIsoCurveRequest, ProcessIsoCurveResponseFactory) {
+        function ProcessIsoCurve(options) {
+            if (!(this instanceof ProcessIsoCurve)) {
+                throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'ProcessIsoCurve'));
+            }
+            this.CLASSNAME = 'ProcessIsoCurve';
+            CommonService.apply(this, arguments);
+            if (!options.position) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'position'));
+            }
+            if (options.position.x == null) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'position.x'));
+            }
+            if (options.position.y == null) {
+                throw new Error(_.getMessage('PARAM_MISSING', 'position.y'));
+            }
+            if (!options.time && !options.distance) {
+                throw new Error('Parameter(s) \'distance\' missing. Parameter time to calculate an isochrone, parameter distance for an isodistance');
+            }
+            if (!options.time && options.distance) {
+                this.options.method = 'distance';
+                if (this.options.time) {
+                    delete this.options.time;
+                }
+            }
+            if (options.time && !options.distance) {
+                this.options.method = 'time';
+                if (this.options.distance) {
+                    delete this.options.distance;
+                }
+            }
+            this.options.method = this.options.method || 'time';
+            this.options.exclusions = options.exclusions || null;
+            this.options.graph = options.graph || 'Voiture';
+            this.options.reverse = options.reverse || false;
+            this.options.smoothing = options.smoothing || false;
+            this.options.holes = options.holes || false;
+            this.options.srs = options.srs || 'EPSG:4326';
+            this.options.outputFormat = typeof options.outputFormat == 'string' ? options.outputFormat.toLowerCase() : 'json';
+            if (!this.options.serverUrl) {
+                var lstUrlByDefault = DefaultUrlService.ProcessIsoCurve.url(this.options.apiKey);
+                var urlFound = lstUrlByDefault['iso' + '-' + this.options.outputFormat];
+                if (!urlFound) {
+                    throw new Error('Url by default not found !');
+                }
+                this.options.serverUrl = urlFound;
+            }
+            var idx = this.options.serverUrl.lastIndexOf('.');
+            if (idx !== -1) {
+                var extension = this.options.serverUrl.substring(idx + 1);
+                if (extension && extension.length < 5) {
+                    switch (extension.toLowerCase()) {
+                    case 'json':
+                    case 'xml':
+                        this.options.outputFormat = extension.toLowerCase();
+                        break;
+                    default:
+                        throw new Error('type of service : unknown or unsupported (json or xml) !');
+                    }
+                }
+            }
+        }
+        ProcessIsoCurve.prototype = Object.create(CommonService.prototype, {});
+        ProcessIsoCurve.prototype.constructor = ProcessIsoCurve;
+        ProcessIsoCurve.prototype.buildRequest = function (error, success) {
+            try {
+                var oIsoCurve = new ProcessIsoCurveRequest(this.options);
+                if (!oIsoCurve.processRequestString()) {
+                    throw new Error(_.getMessage('SERVICE_REQUEST_BUILD'));
+                }
+                this.request = oIsoCurve.requestString;
+            } catch (e) {
+                error.call(this, new ErrorService(e.message));
+                return;
+            }
+            success.call(this, this.request);
+        };
+        ProcessIsoCurve.prototype.analyzeResponse = function (onError, onSuccess) {
+            if (this.response) {
+                var options = {
+                    response: this.response,
+                    outputFormat: this.options.outputFormat,
+                    rawResponse: this.options.rawResponse,
+                    onSuccess: onSuccess,
+                    onError: onError,
+                    scope: this
+                };
+                ProcessIsoCurveResponseFactory.build(options);
+            } else {
+                onError.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY')));
+            }
+        };
+        return ProcessIsoCurve;
+    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesCommonService, ServicesDefaultUrlService, ServicesProcessIsoCurveRequestProcessIsoCurveRequest, ServicesProcessIsoCurveResponseProcessIsoCurveResponseFactory);
+    ServicesServices = function (Alti, AutoConf, Geocode, ReverseGeocode, AutoComplete, Route, ProcessIsoCurve) {
+        var Services = {
+            getConfig: function (options) {
+                var autoconfService = new AutoConf(options);
+                autoconfService.call();
+            },
+            getAltitude: function (options) {
+                var altiService = new Alti(options);
+                altiService.call();
+            },
+            geocode: function (options) {
+                var geocodeService = new Geocode(options);
+                geocodeService.call();
+            },
+            reverseGeocode: function (options) {
+                var reverseGeocodeService = new ReverseGeocode(options);
+                reverseGeocodeService.call();
+            },
+            autoComplete: function (options) {
+                var autoCompleteService = new AutoComplete(options);
+                autoCompleteService.call();
+            },
+            route: function (options) {
+                var routeService = new Route(options);
+                routeService.call();
+            },
+            isoCurve: function (options) {
+                var processIsoCurveService = new ProcessIsoCurve(options);
+                processIsoCurveService.call();
+            }
+        };
+        var point = {};
+        var circle = {};
+        var bbox = {};
+        return Services;
+    }(ServicesAltiAlti, ServicesAutoConfAutoConf, ServicesGeocodeGeocode, ServicesGeocodeReverseGeocode, ServicesAutoCompleteAutoComplete, ServicesRouteRoute, ServicesProcessIsoCurveProcessIsoCurve);
+    Gp = function (XHR, Services, AltiResponse, Elevation, AutoCompleteResponse, SuggestedLocation, GetConfigResponse, Constraint, Format, Layer, Legend, Metadata, Originator, Service, Style, Territory, Thematic, TM, TMLimit, TMS, GeocodeResponse, GeocodedLocation, DirectGeocodedLocation, ReverseGeocodedLocation, IsoCurveResponse, RouteResponse, RouteInstruction, Error, Helper) {
+        var scope = typeof window !== 'undefined' ? window : {};
+        var Gp = scope.Gp || {
+            servicesVersion: '1.0.0-beta3',
+            servicesDate: '2016-12-01',
+            extend: function (strNS, value) {
+                var parts = strNS.split('.');
+                var parent = this;
+                var pl;
+                pl = parts.length;
+                for (var i = 0; i < pl; i++) {
+                    if (typeof parent[parts[i]] === 'undefined') {
+                        parent[parts[i]] = {};
+                    }
+                    var n = pl - 1;
+                    if (i === n) {
+                        parent[parts[i]] = value;
+                    }
+                    parent = parent[parts[i]];
+                }
+                return this;
+            }
+        };
+        Gp.extend('Protocols', {});
+        Gp.extend('Protocols.XHR', XHR);
+        Gp.extend('Services', Services);
+        Gp.extend('Services.AltiResponse', AltiResponse);
+        Gp.extend('Services.Alti.Elevation', Elevation);
+        Gp.extend('Services.AutoCompleteResponse', AutoCompleteResponse);
+        Gp.extend('Services.AutoComplete.SuggestedLocation', SuggestedLocation);
+        Gp.extend('Services.GetConfigResponse', GetConfigResponse);
+        Gp.extend('Services.Config.Constraint', Constraint);
+        Gp.extend('Services.Config.Format', Format);
+        Gp.extend('Services.Config.Layer', Layer);
+        Gp.extend('Services.Config.Legend', Legend);
+        Gp.extend('Services.Config.Metadata', Metadata);
+        Gp.extend('Services.Config.Originator', Originator);
+        Gp.extend('Services.Config.Service', Service);
+        Gp.extend('Services.Config.Style', Style);
+        Gp.extend('Services.Config.Territory', Territory);
+        Gp.extend('Services.Config.Thematic', SuggestedLocation);
+        Gp.extend('Services.Config.TileMatrix', TM);
+        Gp.extend('Services.Config.TileMatrixLimit', TMLimit);
+        Gp.extend('Services.Config.TileMatrixSet', TMS);
+        Gp.extend('Services.GeocodeResponse', GeocodeResponse);
+        Gp.extend('Services.Geocode.GeocodedLocation', GeocodedLocation);
+        Gp.extend('Services.Geocode.DirectGeocodedLocation', DirectGeocodedLocation);
+        Gp.extend('Services.Geocode.ReverseGeocodedLocation', ReverseGeocodedLocation);
+        Gp.extend('Services.IsoCurveResponse', IsoCurveResponse);
+        Gp.extend('Services.RouteResponse', RouteResponse);
+        Gp.extend('Services.Route.RouteInstruction', RouteInstruction);
+        Gp.extend('Error', Error);
+        Gp.extend('Helper', Helper);
+        scope.Gp = Gp;
+        return scope.Gp;
+    }(ProtocolsXHR, ServicesServices, ServicesAltiResponseModelAltiResponse, ServicesAltiResponseModelElevation, ServicesAutoCompleteResponseModelAutoCompleteResponse, ServicesAutoCompleteResponseModelSuggestedLocation, ServicesAutoConfResponseModelAutoConfResponse, ServicesAutoConfResponseModelConstraint, ServicesAutoConfResponseModelFormat, ServicesAutoConfResponseModelLayer, ServicesAutoConfResponseModelLegend, ServicesAutoConfResponseModelMetadata, ServicesAutoConfResponseModelOriginator, ServicesAutoConfResponseModelService, ServicesAutoConfResponseModelStyle, ServicesAutoConfResponseModelTerritory, ServicesAutoConfResponseModelThematic, ServicesAutoConfResponseModelTileMatrix, ServicesAutoConfResponseModelTileMatrixLimit, ServicesAutoConfResponseModelTileMatrixSet, ServicesGeocodeResponseModelGeocodeResponse, ServicesGeocodeResponseModelGeocodedLocation, ServicesGeocodeResponseModelDirectGeocodedLocation, ServicesGeocodeResponseModelReverseGeocodedLocation, ServicesProcessIsoCurveResponseModelProcessIsoCurveResponse, ServicesRouteResponseModelRouteResponse, ServicesRouteResponseModelRouteInstruction, ExceptionsErrorService, UtilsHelper);
+    return Gp;
+}));
+CommonUtilsAutoLoadConfig = function (Gp) {
+    (function () {
+        var scripts = document.getElementsByTagName('script');
+        var key = scripts[scripts.length - 1].getAttribute('data-key');
+        if (key) {
+            var splitKeys = key.split(/;|,|\|/);
+            if (key && splitKeys.length > 1) {
+                var keys = [];
+                for (var i = 0; i < splitKeys.length; i++) {
+                    keys.push(splitKeys[i]);
+                }
+                key = keys;
+            }
+        }
+        var url = scripts[scripts.length - 1].getAttribute('data-url');
+        var timeout = scripts[scripts.length - 1].getAttribute('data-timeout');
+        var success = function () {
+        };
+        var error = function (e) {
+            throw new Error('Configuration load failed : ' + e.message);
+        };
+        if (!key && !url) {
+            return;
+        }
+        var options = {
+            apiKey: key,
+            onSuccess: success,
+            onFailure: error
+        };
+        if (url) {
+            options.serverUrl = url;
+            options.callbackSuffix = '';
+        }
+        if (timeout) {
+            options.timeOut = timeout;
+        }
+        if (!Gp.Config) {
+            Gp.Services.getConfig(options);
+        }
+    }());
+}(gp);
+(function (window, document, undefined) {
+    L.drawVersion = '0.3.0-dev';
+    L.drawLocal = {
+        draw: {
+            toolbar: {
+                actions: {
+                    title: 'Cancel drawing',
+                    text: 'Cancel'
+                },
+                finish: {
+                    title: 'Finish drawing',
+                    text: 'Finish'
+                },
+                undo: {
+                    title: 'Delete last point drawn',
+                    text: 'Delete last point'
+                },
+                buttons: {
+                    polyline: 'Draw a polyline',
+                    polygon: 'Draw a polygon',
+                    rectangle: 'Draw a rectangle',
+                    circle: 'Draw a circle',
+                    marker: 'Draw a marker'
+                }
+            },
+            handlers: {
+                circle: {
+                    tooltip: { start: 'Click and drag to draw circle.' },
+                    radius: 'Radius'
+                },
+                marker: { tooltip: { start: 'Click map to place marker.' } },
+                polygon: {
+                    tooltip: {
+                        start: 'Click to start drawing shape.',
+                        cont: 'Click to continue drawing shape.',
+                        end: 'Click first point to close this shape.'
+                    }
+                },
+                polyline: {
+                    error: '<strong>Error:</strong> shape edges cannot cross!',
+                    tooltip: {
+                        start: 'Click to start drawing line.',
+                        cont: 'Click to continue drawing line.',
+                        end: 'Click last point to finish line.'
+                    }
+                },
+                rectangle: { tooltip: { start: 'Click and drag to draw rectangle.' } },
+                simpleshape: { tooltip: { end: 'Release mouse to finish drawing.' } }
+            }
+        },
+        edit: {
+            toolbar: {
+                actions: {
+                    save: {
+                        title: 'Save changes.',
+                        text: 'Save'
+                    },
+                    cancel: {
+                        title: 'Cancel editing, discards all changes.',
+                        text: 'Cancel'
+                    }
+                },
+                buttons: {
+                    edit: 'Edit layers.',
+                    editDisabled: 'No layers to edit.',
+                    remove: 'Delete layers.',
+                    removeDisabled: 'No layers to delete.'
+                }
+            },
+            handlers: {
+                edit: {
+                    tooltip: {
+                        text: 'Drag handles, or marker to edit feature.',
+                        subtext: 'Click cancel to undo changes.'
+                    }
+                },
+                remove: { tooltip: { text: 'Click on a feature to remove' } }
+            }
+        }
+    };
+    L.Draw = {};
+    L.Draw.Feature = L.Handler.extend({
+        includes: L.Mixin.Events,
+        initialize: function (map, options) {
+            this._map = map;
+            this._container = map._container;
+            this._overlayPane = map._panes.overlayPane;
+            this._popupPane = map._panes.popupPane;
+            if (options && options.shapeOptions) {
+                options.shapeOptions = L.Util.extend({}, this.options.shapeOptions, options.shapeOptions);
+            }
+            L.setOptions(this, options);
+        },
+        enable: function () {
+            if (this._enabled) {
+                return;
+            }
+            L.Handler.prototype.enable.call(this);
+            this.fire('enabled', { handler: this.type });
+            this._map.fire('draw:drawstart', { layerType: this.type });
+        },
+        disable: function () {
+            if (!this._enabled) {
+                return;
+            }
+            L.Handler.prototype.disable.call(this);
+            this._map.fire('draw:drawstop', { layerType: this.type });
+            this.fire('disabled', { handler: this.type });
+        },
+        addHooks: function () {
+            var map = this._map;
+            if (map) {
+                L.DomUtil.disableTextSelection();
+                map.getContainer().focus();
+                this._tooltip = new L.Tooltip(this._map);
+                L.DomEvent.on(this._container, 'keyup', this._cancelDrawing, this);
+            }
+        },
+        removeHooks: function () {
+            if (this._map) {
+                L.DomUtil.enableTextSelection();
+                this._tooltip.dispose();
+                this._tooltip = null;
+                L.DomEvent.off(this._container, 'keyup', this._cancelDrawing, this);
+            }
+        },
+        setOptions: function (options) {
+            L.setOptions(this, options);
+        },
+        _fireCreatedEvent: function (layer) {
+            this._map.fire('draw:created', {
+                layer: layer,
+                layerType: this.type
+            });
+        },
+        _cancelDrawing: function (e) {
+            if (e.keyCode === 27) {
+                this.disable();
+            }
+        }
+    });
+    L.Draw.Polyline = L.Draw.Feature.extend({
+        statics: { TYPE: 'polyline' },
+        Poly: L.Polyline,
+        options: {
+            allowIntersection: true,
+            repeatMode: false,
+            drawError: {
+                color: '#b00b00',
+                timeout: 2500
+            },
+            icon: new L.DivIcon({
+                iconSize: new L.Point(8, 8),
+                className: 'leaflet-div-icon leaflet-editing-icon'
+            }),
+            touchIcon: new L.DivIcon({
+                iconSize: new L.Point(20, 20),
+                className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon'
+            }),
+            guidelineDistance: 20,
+            maxGuideLineLength: 4000,
+            shapeOptions: {
+                stroke: true,
+                color: '#f06eaa',
+                weight: 4,
+                opacity: 0.5,
+                fill: false,
+                clickable: true
+            },
+            metric: true,
+            feet: true,
+            showLength: true,
+            zIndexOffset: 2000
+        },
+        initialize: function (map, options) {
+            if (L.Browser.touch) {
+                this.options.icon = this.options.touchIcon;
+            }
+            this.options.drawError.message = L.drawLocal.draw.handlers.polyline.error;
+            if (options && options.drawError) {
+                options.drawError = L.Util.extend({}, this.options.drawError, options.drawError);
+            }
+            this.type = L.Draw.Polyline.TYPE;
+            L.Draw.Feature.prototype.initialize.call(this, map, options);
+        },
+        addHooks: function () {
+            L.Draw.Feature.prototype.addHooks.call(this);
+            if (this._map) {
+                this._markers = [];
+                this._markerGroup = new L.LayerGroup();
+                this._map.addLayer(this._markerGroup);
+                this._poly = new L.Polyline([], this.options.shapeOptions);
+                this._tooltip.updateContent(this._getTooltipText());
+                if (!this._mouseMarker) {
+                    this._mouseMarker = L.marker(this._map.getCenter(), {
+                        icon: L.divIcon({
+                            className: 'leaflet-mouse-marker',
+                            iconAnchor: [
+                                20,
+                                20
+                            ],
+                            iconSize: [
+                                40,
+                                40
+                            ]
+                        }),
+                        opacity: 0,
+                        zIndexOffset: this.options.zIndexOffset
+                    });
+                }
+                this._mouseMarker.on('mousedown', this._onMouseDown, this).on('mouseout', this._onMouseOut, this).on('mouseup', this._onMouseUp, this).on('mousemove', this._onMouseMove, this).addTo(this._map);
+                this._map.on('mouseup', this._onMouseUp, this).on('mousemove', this._onMouseMove, this).on('zoomlevelschange', this._onZoomEnd, this).on('click', this._onTouch, this).on('zoomend', this._onZoomEnd, this);
+            }
+        },
+        removeHooks: function () {
+            L.Draw.Feature.prototype.removeHooks.call(this);
+            this._clearHideErrorTimeout();
+            this._cleanUpShape();
+            this._map.removeLayer(this._markerGroup);
+            delete this._markerGroup;
+            delete this._markers;
+            this._map.removeLayer(this._poly);
+            delete this._poly;
+            this._mouseMarker.off('mousedown', this._onMouseDown, this).off('mouseout', this._onMouseOut, this).off('mouseup', this._onMouseUp, this).off('mousemove', this._onMouseMove, this);
+            this._map.removeLayer(this._mouseMarker);
+            delete this._mouseMarker;
+            this._clearGuides();
+            this._map.off('mouseup', this._onMouseUp, this).off('mousemove', this._onMouseMove, this).off('mouseup', this._onMouseUp, this).off('zoomend', this._onZoomEnd, this).off('click', this._onTouch, this);
+        },
+        deleteLastVertex: function () {
+            if (this._markers.length <= 1) {
+                return;
+            }
+            var lastMarker = this._markers.pop(), poly = this._poly, latlng = this._poly.spliceLatLngs(poly.getLatLngs().length - 1, 1)[0];
+            this._markerGroup.removeLayer(lastMarker);
+            if (poly.getLatLngs().length < 2) {
+                this._map.removeLayer(poly);
+            }
+            this._vertexChanged(latlng, false);
+        },
+        addVertex: function (latlng) {
+            var markersLength = this._markers.length;
+            if (markersLength > 0 && !this.options.allowIntersection && this._poly.newLatLngIntersects(latlng)) {
+                this._showErrorTooltip();
+                return;
+            } else if (this._errorShown) {
+                this._hideErrorTooltip();
+            }
+            this._markers.push(this._createMarker(latlng));
+            this._poly.addLatLng(latlng);
+            if (this._poly.getLatLngs().length === 2) {
+                this._map.addLayer(this._poly);
+            }
+            this._vertexChanged(latlng, true);
+        },
+        completeShape: function () {
+            if (this._markers.length <= 1) {
+                return;
+            }
+            this._fireCreatedEvent();
+            this.disable();
+            if (this.options.repeatMode) {
+                this.enable();
+            }
+        },
+        _finishShape: function () {
+            var intersects = this._poly.newLatLngIntersects(this._poly.getLatLngs()[0], true);
+            if (!this.options.allowIntersection && intersects || !this._shapeIsValid()) {
+                this._showErrorTooltip();
+                return;
+            }
+            this._fireCreatedEvent();
+            this.disable();
+            if (this.options.repeatMode) {
+                this.enable();
+            }
+        },
+        _shapeIsValid: function () {
+            return true;
+        },
+        _onZoomEnd: function () {
+            this._updateGuide();
+        },
+        _onMouseMove: function (e) {
+            var newPos = this._map.mouseEventToLayerPoint(e.originalEvent);
+            var latlng = this._map.layerPointToLatLng(newPos);
+            this._currentLatLng = latlng;
+            this._updateTooltip(latlng);
+            this._updateGuide(newPos);
+            this._mouseMarker.setLatLng(latlng);
+            L.DomEvent.preventDefault(e.originalEvent);
+        },
+        _vertexChanged: function (latlng, added) {
+            this._map.fire('draw:drawvertex', { layers: this._markerGroup });
+            this._updateFinishHandler();
+            this._updateRunningMeasure(latlng, added);
+            this._clearGuides();
+            this._updateTooltip();
+        },
+        _onMouseDown: function (e) {
+            var originalEvent = e.originalEvent;
+            this._mouseDownOrigin = L.point(originalEvent.clientX, originalEvent.clientY);
+        },
+        _onMouseUp: function (e) {
+            if (this._mouseDownOrigin) {
+                var distance = L.point(e.originalEvent.clientX, e.originalEvent.clientY).distanceTo(this._mouseDownOrigin);
+                if (Math.abs(distance) < 9 * (window.devicePixelRatio || 1)) {
+                    this.addVertex(e.latlng);
+                }
+            }
+            this._mouseDownOrigin = null;
+        },
+        _onTouch: function (e) {
+            if (L.Browser.touch) {
+                this._onMouseDown(e);
+                this._onMouseUp(e);
+            }
+        },
+        _onMouseOut: function () {
+            if (this._tooltip) {
+                this._tooltip._onMouseOut.call(this._tooltip);
+            }
+        },
+        _updateFinishHandler: function () {
+            var markerCount = this._markers.length;
+            if (markerCount > 1) {
+                this._markers[markerCount - 1].on('click', this._finishShape, this);
+            }
+            if (markerCount > 2) {
+                this._markers[markerCount - 2].off('click', this._finishShape, this);
+            }
+        },
+        _createMarker: function (latlng) {
+            var marker = new L.Marker(latlng, {
+                icon: this.options.icon,
+                zIndexOffset: this.options.zIndexOffset * 2
+            });
+            this._markerGroup.addLayer(marker);
+            return marker;
+        },
+        _updateGuide: function (newPos) {
+            var markerCount = this._markers.length;
+            if (markerCount > 0) {
+                newPos = newPos || this._map.latLngToLayerPoint(this._currentLatLng);
+                this._clearGuides();
+                this._drawGuide(this._map.latLngToLayerPoint(this._markers[markerCount - 1].getLatLng()), newPos);
+            }
+        },
+        _updateTooltip: function (latLng) {
+            var text = this._getTooltipText();
+            if (latLng) {
+                this._tooltip.updatePosition(latLng);
+            }
+            if (!this._errorShown) {
+                this._tooltip.updateContent(text);
+            }
+        },
+        _drawGuide: function (pointA, pointB) {
+            var length = Math.floor(Math.sqrt(Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2))), guidelineDistance = this.options.guidelineDistance, maxGuideLineLength = this.options.maxGuideLineLength, i = length > maxGuideLineLength ? length - maxGuideLineLength : guidelineDistance, fraction, dashPoint, dash;
+            if (!this._guidesContainer) {
+                this._guidesContainer = L.DomUtil.create('div', 'leaflet-draw-guides', this._overlayPane);
+            }
+            for (; i < length; i += this.options.guidelineDistance) {
+                fraction = i / length;
+                dashPoint = {
+                    x: Math.floor(pointA.x * (1 - fraction) + fraction * pointB.x),
+                    y: Math.floor(pointA.y * (1 - fraction) + fraction * pointB.y)
+                };
+                dash = L.DomUtil.create('div', 'leaflet-draw-guide-dash', this._guidesContainer);
+                dash.style.backgroundColor = !this._errorShown ? this.options.shapeOptions.color : this.options.drawError.color;
+                L.DomUtil.setPosition(dash, dashPoint);
+            }
+        },
+        _updateGuideColor: function (color) {
+            if (this._guidesContainer) {
+                for (var i = 0, l = this._guidesContainer.childNodes.length; i < l; i++) {
+                    this._guidesContainer.childNodes[i].style.backgroundColor = color;
+                }
+            }
+        },
+        _clearGuides: function () {
+            if (this._guidesContainer) {
+                while (this._guidesContainer.firstChild) {
+                    this._guidesContainer.removeChild(this._guidesContainer.firstChild);
+                }
+            }
+        },
+        _getTooltipText: function () {
+            var showLength = this.options.showLength, labelText, distanceStr;
+            if (this._markers.length === 0) {
+                labelText = { text: L.drawLocal.draw.handlers.polyline.tooltip.start };
+            } else {
+                distanceStr = showLength ? this._getMeasurementString() : '';
+                if (this._markers.length === 1) {
+                    labelText = {
+                        text: L.drawLocal.draw.handlers.polyline.tooltip.cont,
+                        subtext: distanceStr
+                    };
+                } else {
+                    labelText = {
+                        text: L.drawLocal.draw.handlers.polyline.tooltip.end,
+                        subtext: distanceStr
+                    };
+                }
+            }
+            return labelText;
+        },
+        _updateRunningMeasure: function (latlng, added) {
+            var markersLength = this._markers.length, previousMarkerIndex, distance;
+            if (this._markers.length === 1) {
+                this._measurementRunningTotal = 0;
+            } else {
+                previousMarkerIndex = markersLength - (added ? 2 : 1);
+                distance = latlng.distanceTo(this._markers[previousMarkerIndex].getLatLng());
+                this._measurementRunningTotal += distance * (added ? 1 : -1);
+            }
+        },
+        _getMeasurementString: function () {
+            var currentLatLng = this._currentLatLng, previousLatLng = this._markers[this._markers.length - 1].getLatLng(), distance;
+            distance = this._measurementRunningTotal + currentLatLng.distanceTo(previousLatLng);
+            return L.GeometryUtil.readableDistance(distance, this.options.metric, this.options.feet);
+        },
+        _showErrorTooltip: function () {
+            this._errorShown = true;
+            this._tooltip.showAsError().updateContent({ text: this.options.drawError.message });
+            this._updateGuideColor(this.options.drawError.color);
+            this._poly.setStyle({ color: this.options.drawError.color });
+            this._clearHideErrorTimeout();
+            this._hideErrorTimeout = setTimeout(L.Util.bind(this._hideErrorTooltip, this), this.options.drawError.timeout);
+        },
+        _hideErrorTooltip: function () {
+            this._errorShown = false;
+            this._clearHideErrorTimeout();
+            this._tooltip.removeError().updateContent(this._getTooltipText());
+            this._updateGuideColor(this.options.shapeOptions.color);
+            this._poly.setStyle({ color: this.options.shapeOptions.color });
+        },
+        _clearHideErrorTimeout: function () {
+            if (this._hideErrorTimeout) {
+                clearTimeout(this._hideErrorTimeout);
+                this._hideErrorTimeout = null;
+            }
+        },
+        _cleanUpShape: function () {
+            if (this._markers.length > 1) {
+                this._markers[this._markers.length - 1].off('click', this._finishShape, this);
+            }
+        },
+        _fireCreatedEvent: function () {
+            var poly = new this.Poly(this._poly.getLatLngs(), this.options.shapeOptions);
+            L.Draw.Feature.prototype._fireCreatedEvent.call(this, poly);
+        }
+    });
+    L.Draw.Polygon = L.Draw.Polyline.extend({
+        statics: { TYPE: 'polygon' },
+        Poly: L.Polygon,
+        options: {
+            showArea: false,
+            shapeOptions: {
+                stroke: true,
+                color: '#f06eaa',
+                weight: 4,
+                opacity: 0.5,
+                fill: true,
+                fillColor: null,
+                fillOpacity: 0.2,
+                clickable: true
+            }
+        },
+        initialize: function (map, options) {
+            L.Draw.Polyline.prototype.initialize.call(this, map, options);
+            this.type = L.Draw.Polygon.TYPE;
+        },
+        _updateFinishHandler: function () {
+            var markerCount = this._markers.length;
+            if (markerCount === 1) {
+                this._markers[0].on('click', this._finishShape, this);
+            }
+            if (markerCount > 2) {
+                this._markers[markerCount - 1].on('dblclick', this._finishShape, this);
+                if (markerCount > 3) {
+                    this._markers[markerCount - 2].off('dblclick', this._finishShape, this);
+                }
+            }
+        },
+        _getTooltipText: function () {
+            var text, subtext;
+            if (this._markers.length === 0) {
+                text = L.drawLocal.draw.handlers.polygon.tooltip.start;
+            } else if (this._markers.length < 3) {
+                text = L.drawLocal.draw.handlers.polygon.tooltip.cont;
+            } else {
+                text = L.drawLocal.draw.handlers.polygon.tooltip.end;
+                subtext = this._getMeasurementString();
+            }
+            return {
+                text: text,
+                subtext: subtext
+            };
+        },
+        _getMeasurementString: function () {
+            var area = this._area;
+            if (!area) {
+                return null;
+            }
+            return L.GeometryUtil.readableArea(area, this.options.metric);
+        },
+        _shapeIsValid: function () {
+            return this._markers.length >= 3;
+        },
+        _vertexChanged: function (latlng, added) {
+            var latLngs;
+            if (!this.options.allowIntersection && this.options.showArea) {
+                latLngs = this._poly.getLatLngs();
+                this._area = L.GeometryUtil.geodesicArea(latLngs);
+            }
+            L.Draw.Polyline.prototype._vertexChanged.call(this, latlng, added);
+        },
+        _cleanUpShape: function () {
+            var markerCount = this._markers.length;
+            if (markerCount > 0) {
+                this._markers[0].off('click', this._finishShape, this);
+                if (markerCount > 2) {
+                    this._markers[markerCount - 1].off('dblclick', this._finishShape, this);
+                }
+            }
+        }
+    });
+    L.SimpleShape = {};
+    L.Draw.SimpleShape = L.Draw.Feature.extend({
+        options: { repeatMode: false },
+        initialize: function (map, options) {
+            this._endLabelText = L.drawLocal.draw.handlers.simpleshape.tooltip.end;
+            L.Draw.Feature.prototype.initialize.call(this, map, options);
+        },
+        addHooks: function () {
+            L.Draw.Feature.prototype.addHooks.call(this);
+            if (this._map) {
+                this._mapDraggable = this._map.dragging.enabled();
+                if (this._mapDraggable) {
+                    this._map.dragging.disable();
+                }
+                this._container.style.cursor = 'crosshair';
+                this._tooltip.updateContent({ text: this._initialLabelText });
+                this._map.on('mousedown', this._onMouseDown, this).on('mousemove', this._onMouseMove, this).on('touchstart', this._onMouseDown, this).on('touchmove', this._onMouseMove, this);
+            }
+        },
+        removeHooks: function () {
+            L.Draw.Feature.prototype.removeHooks.call(this);
+            if (this._map) {
+                if (this._mapDraggable) {
+                    this._map.dragging.enable();
+                }
+                this._container.style.cursor = '';
+                this._map.off('mousedown', this._onMouseDown, this).off('mousemove', this._onMouseMove, this).off('touchstart', this._onMouseDown, this).off('touchmove', this._onMouseMove, this);
+                L.DomEvent.off(document, 'mouseup', this._onMouseUp, this);
+                L.DomEvent.off(document, 'touchend', this._onMouseUp, this);
+                if (this._shape) {
+                    this._map.removeLayer(this._shape);
+                    delete this._shape;
+                }
+            }
+            this._isDrawing = false;
+        },
+        _getTooltipText: function () {
+            return { text: this._endLabelText };
+        },
+        _onMouseDown: function (e) {
+            this._isDrawing = true;
+            this._startLatLng = e.latlng;
+            L.DomEvent.on(document, 'mouseup', this._onMouseUp, this).on(document, 'touchend', this._onMouseUp, this).preventDefault(e.originalEvent);
+        },
+        _onMouseMove: function (e) {
+            var latlng = e.latlng;
+            this._tooltip.updatePosition(latlng);
+            if (this._isDrawing) {
+                this._tooltip.updateContent(this._getTooltipText());
+                this._drawShape(latlng);
+            }
+        },
+        _onMouseUp: function () {
+            if (this._shape) {
+                this._fireCreatedEvent();
+            }
+            this.disable();
+            if (this.options.repeatMode) {
+                this.enable();
+            }
+        }
+    });
+    L.Draw.Rectangle = L.Draw.SimpleShape.extend({
+        statics: { TYPE: 'rectangle' },
+        options: {
+            shapeOptions: {
+                stroke: true,
+                color: '#f06eaa',
+                weight: 4,
+                opacity: 0.5,
+                fill: true,
+                fillColor: null,
+                fillOpacity: 0.2,
+                clickable: true
+            },
+            metric: true
+        },
+        initialize: function (map, options) {
+            this.type = L.Draw.Rectangle.TYPE;
+            this._initialLabelText = L.drawLocal.draw.handlers.rectangle.tooltip.start;
+            L.Draw.SimpleShape.prototype.initialize.call(this, map, options);
+        },
+        _drawShape: function (latlng) {
+            if (!this._shape) {
+                this._shape = new L.Rectangle(new L.LatLngBounds(this._startLatLng, latlng), this.options.shapeOptions);
+                this._map.addLayer(this._shape);
+            } else {
+                this._shape.setBounds(new L.LatLngBounds(this._startLatLng, latlng));
+            }
+        },
+        _fireCreatedEvent: function () {
+            var rectangle = new L.Rectangle(this._shape.getBounds(), this.options.shapeOptions);
+            L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, rectangle);
+        },
+        _getTooltipText: function () {
+            var tooltipText = L.Draw.SimpleShape.prototype._getTooltipText.call(this), shape = this._shape, latLngs, area, subtext;
+            if (shape) {
+                latLngs = this._shape.getLatLngs();
+                area = L.GeometryUtil.geodesicArea(latLngs);
+                subtext = L.GeometryUtil.readableArea(area, this.options.metric);
+            }
+            return {
+                text: tooltipText.text,
+                subtext: subtext
+            };
+        }
+    });
+    L.Draw.Circle = L.Draw.SimpleShape.extend({
+        statics: { TYPE: 'circle' },
+        options: {
+            shapeOptions: {
+                stroke: true,
+                color: '#f06eaa',
+                weight: 4,
+                opacity: 0.5,
+                fill: true,
+                fillColor: null,
+                fillOpacity: 0.2,
+                clickable: true
+            },
+            showRadius: true,
+            metric: true,
+            feet: true
+        },
+        initialize: function (map, options) {
+            this.type = L.Draw.Circle.TYPE;
+            this._initialLabelText = L.drawLocal.draw.handlers.circle.tooltip.start;
+            L.Draw.SimpleShape.prototype.initialize.call(this, map, options);
+        },
+        _drawShape: function (latlng) {
+            if (!this._shape) {
+                this._shape = new L.Circle(this._startLatLng, this._startLatLng.distanceTo(latlng), this.options.shapeOptions);
+                this._map.addLayer(this._shape);
+            } else {
+                this._shape.setRadius(this._startLatLng.distanceTo(latlng));
+            }
+        },
+        _fireCreatedEvent: function () {
+            var circle = new L.Circle(this._startLatLng, this._shape.getRadius(), this.options.shapeOptions);
+            L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, circle);
+        },
+        _onMouseMove: function (e) {
+            var latlng = e.latlng, showRadius = this.options.showRadius, useMetric = this.options.metric, radius;
+            this._tooltip.updatePosition(latlng);
+            if (this._isDrawing) {
+                this._drawShape(latlng);
+                radius = this._shape.getRadius().toFixed(1);
+                this._tooltip.updateContent({
+                    text: this._endLabelText,
+                    subtext: showRadius ? L.drawLocal.draw.handlers.circle.radius + ': ' + L.GeometryUtil.readableDistance(radius, useMetric, this.options.feet) : ''
+                });
+            }
+        }
+    });
+    L.Draw.Marker = L.Draw.Feature.extend({
+        statics: { TYPE: 'marker' },
+        options: {
+            icon: new L.Icon.Default(),
+            repeatMode: false,
+            zIndexOffset: 2000
+        },
+        initialize: function (map, options) {
+            this.type = L.Draw.Marker.TYPE;
+            L.Draw.Feature.prototype.initialize.call(this, map, options);
+        },
+        addHooks: function () {
+            L.Draw.Feature.prototype.addHooks.call(this);
+            if (this._map) {
+                this._tooltip.updateContent({ text: L.drawLocal.draw.handlers.marker.tooltip.start });
+                if (!this._mouseMarker) {
+                    this._mouseMarker = L.marker(this._map.getCenter(), {
+                        icon: L.divIcon({
+                            className: 'leaflet-mouse-marker',
+                            iconAnchor: [
+                                20,
+                                20
+                            ],
+                            iconSize: [
+                                40,
+                                40
+                            ]
+                        }),
+                        opacity: 0,
+                        zIndexOffset: this.options.zIndexOffset
+                    });
+                }
+                this._mouseMarker.on('click', this._onClick, this).addTo(this._map);
+                this._map.on('mousemove', this._onMouseMove, this);
+                this._map.on('click', this._onTouch, this);
+            }
+        },
+        removeHooks: function () {
+            L.Draw.Feature.prototype.removeHooks.call(this);
+            if (this._map) {
+                if (this._marker) {
+                    this._marker.off('click', this._onClick, this);
+                    this._map.off('click', this._onClick, this).off('click', this._onTouch, this).removeLayer(this._marker);
+                    delete this._marker;
+                }
+                this._mouseMarker.off('click', this._onClick, this);
+                this._map.removeLayer(this._mouseMarker);
+                delete this._mouseMarker;
+                this._map.off('mousemove', this._onMouseMove, this);
+            }
+        },
+        _onMouseMove: function (e) {
+            var latlng = e.latlng;
+            this._tooltip.updatePosition(latlng);
+            this._mouseMarker.setLatLng(latlng);
+            if (!this._marker) {
+                this._marker = new L.Marker(latlng, {
+                    icon: this.options.icon,
+                    zIndexOffset: this.options.zIndexOffset
+                });
+                this._marker.on('click', this._onClick, this);
+                this._map.on('click', this._onClick, this).addLayer(this._marker);
+            } else {
+                latlng = this._mouseMarker.getLatLng();
+                this._marker.setLatLng(latlng);
+            }
+        },
+        _onClick: function () {
+            this._fireCreatedEvent();
+            this.disable();
+            if (this.options.repeatMode) {
+                this.enable();
+            }
+        },
+        _onTouch: function (e) {
+            this._onMouseMove(e);
+            this._onClick();
+        },
+        _fireCreatedEvent: function () {
+            var marker = new L.Marker.Touch(this._marker.getLatLng(), { icon: this.options.icon });
+            L.Draw.Feature.prototype._fireCreatedEvent.call(this, marker);
+        }
+    });
+    L.Edit = L.Edit || {};
+    L.Edit.Marker = L.Handler.extend({
+        initialize: function (marker, options) {
+            this._marker = marker;
+            L.setOptions(this, options);
+        },
+        addHooks: function () {
+            var marker = this._marker;
+            marker.dragging.enable();
+            marker.on('dragend', this._onDragEnd, marker);
+            this._toggleMarkerHighlight();
+        },
+        removeHooks: function () {
+            var marker = this._marker;
+            marker.dragging.disable();
+            marker.off('dragend', this._onDragEnd, marker);
+            this._toggleMarkerHighlight();
+        },
+        _onDragEnd: function (e) {
+            var layer = e.target;
+            layer.edited = true;
+        },
+        _toggleMarkerHighlight: function () {
+            var icon = this._marker._icon;
+            if (!icon) {
+                return;
+            }
+            icon.style.display = 'none';
+            if (L.DomUtil.hasClass(icon, 'leaflet-edit-marker-selected')) {
+                L.DomUtil.removeClass(icon, 'leaflet-edit-marker-selected');
+                this._offsetMarker(icon, -4);
+            } else {
+                L.DomUtil.addClass(icon, 'leaflet-edit-marker-selected');
+                this._offsetMarker(icon, 4);
+            }
+            icon.style.display = '';
+        },
+        _offsetMarker: function (icon, offset) {
+            var iconMarginTop = parseInt(icon.style.marginTop, 10) - offset, iconMarginLeft = parseInt(icon.style.marginLeft, 10) - offset;
+            icon.style.marginTop = iconMarginTop + 'px';
+            icon.style.marginLeft = iconMarginLeft + 'px';
+        }
+    });
+    L.Marker.addInitHook(function () {
+        if (L.Edit.Marker) {
+            this.editing = new L.Edit.Marker(this);
+            if (this.options.editable) {
+                this.editing.enable();
+            }
+        }
+    });
+    L.Edit = L.Edit || {};
+    L.Edit.Poly = L.Handler.extend({
+        options: {},
+        initialize: function (poly, options) {
+            this.latlngs = [poly._latlngs];
+            if (poly._holes) {
+                this.latlngs = this.latlngs.concat(poly._holes);
+            }
+            this._verticesHandlers = [];
+            for (var i = 0; i < this.latlngs.length; i++) {
+                this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(poly, this.latlngs[i], options));
+            }
+            this._poly = poly;
+            L.setOptions(this, options);
+        },
+        _eachVertexHandler: function (callback) {
+            for (var i = 0; i < this._verticesHandlers.length; i++) {
+                callback(this._verticesHandlers[i]);
+            }
+        },
+        addHooks: function () {
+            this._eachVertexHandler(function (handler) {
+                handler.addHooks();
+            });
+        },
+        removeHooks: function () {
+            this._eachVertexHandler(function (handler) {
+                handler.removeHooks();
+            });
+        },
+        updateMarkers: function () {
+            this._eachVertexHandler(function (handler) {
+                handler.updateMarkers();
+            });
+        }
+    });
+    L.Edit.PolyVerticesEdit = L.Handler.extend({
+        options: {
+            icon: new L.DivIcon({
+                iconSize: new L.Point(8, 8),
+                className: 'leaflet-div-icon leaflet-editing-icon'
+            }),
+            touchIcon: new L.DivIcon({
+                iconSize: new L.Point(20, 20),
+                className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon'
+            })
+        },
+        initialize: function (poly, latlngs, options) {
+            if (L.Browser.touch) {
+                this.options.icon = this.options.touchIcon;
+            }
+            this._poly = poly;
+            this._latlngs = latlngs;
+            L.setOptions(this, options);
+        },
+        addHooks: function () {
+            var poly = this._poly;
+            if (!(poly instanceof L.Polygon)) {
+                poly.options.editing.fill = false;
+            }
+            poly.setStyle(poly.options.editing);
+            if (this._poly._map) {
+                this._map = this._poly._map;
+                if (!this._markerGroup) {
+                    this._initMarkers();
+                }
+                this._poly._map.addLayer(this._markerGroup);
+            }
+        },
+        removeHooks: function () {
+            var poly = this._poly;
+            poly.setStyle(poly.options.original);
+            if (poly._map) {
+                poly._map.removeLayer(this._markerGroup);
+                delete this._markerGroup;
+                delete this._markers;
+            }
+        },
+        updateMarkers: function () {
+            this._markerGroup.clearLayers();
+            this._initMarkers();
+        },
+        _initMarkers: function () {
+            if (!this._markerGroup) {
+                this._markerGroup = new L.LayerGroup();
+            }
+            this._markers = [];
+            var latlngs = this._latlngs, i, j, len, marker;
+            for (i = 0, len = latlngs.length; i < len; i++) {
+                marker = this._createMarker(latlngs[i], i);
+                marker.on('click', this._onMarkerClick, this);
+                this._markers.push(marker);
+            }
+            var markerLeft, markerRight;
+            for (i = 0, j = len - 1; i < len; j = i++) {
+                if (i === 0 && !(L.Polygon && this._poly instanceof L.Polygon)) {
+                    continue;
+                }
+                markerLeft = this._markers[j];
+                markerRight = this._markers[i];
+                this._createMiddleMarker(markerLeft, markerRight);
+                this._updatePrevNext(markerLeft, markerRight);
+            }
+        },
+        _createMarker: function (latlng, index) {
+            var marker = new L.Marker.Touch(latlng, {
+                draggable: true,
+                icon: this.options.icon
+            });
+            marker._origLatLng = latlng;
+            marker._index = index;
+            marker.on('dragstart', this._onMarkerDragStart, this).on('drag', this._onMarkerDrag, this).on('dragend', this._fireEdit, this).on('touchmove', this._onTouchMove, this).on('MSPointerMove', this._onTouchMove, this).on('touchend', this._fireEdit, this).on('MSPointerUp', this._fireEdit, this);
+            this._markerGroup.addLayer(marker);
+            return marker;
+        },
+        _onMarkerDragStart: function () {
+            this._poly.fire('editstart');
+        },
+        _spliceLatLngs: function () {
+            var removed = [].splice.apply(this._latlngs, arguments);
+            this._poly._convertLatLngs(this._latlngs, true);
+            this._poly.redraw();
+            return removed;
+        },
+        _removeMarker: function (marker) {
+            var i = marker._index;
+            this._markerGroup.removeLayer(marker);
+            this._markers.splice(i, 1);
+            this._spliceLatLngs(i, 1);
+            this._updateIndexes(i, -1);
+            marker.off('dragstart', this._onMarkerDragStart, this).off('drag', this._onMarkerDrag, this).off('dragend', this._fireEdit, this).off('touchmove', this._onMarkerDrag, this).off('touchend', this._fireEdit, this).off('click', this._onMarkerClick, this);
+        },
+        _fireEdit: function () {
+            this._poly.edited = true;
+            this._poly.fire('edit');
+            this._poly._map.fire('draw:editvertex', { layers: this._markerGroup });
+        },
+        _onMarkerDrag: function (e) {
+            var marker = e.target;
+            L.extend(marker._origLatLng, marker._latlng);
+            if (marker._middleLeft) {
+                marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
+            }
+            if (marker._middleRight) {
+                marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
+            }
+            this._poly.redraw();
+            this._poly.fire('editdrag');
+        },
+        _onMarkerClick: function (e) {
+            var minPoints = L.Polygon && this._poly instanceof L.Polygon ? 4 : 3, marker = e.target;
+            if (this._latlngs.length < minPoints) {
+                return;
+            }
+            this._removeMarker(marker);
+            this._updatePrevNext(marker._prev, marker._next);
+            if (marker._middleLeft) {
+                this._markerGroup.removeLayer(marker._middleLeft);
+            }
+            if (marker._middleRight) {
+                this._markerGroup.removeLayer(marker._middleRight);
+            }
+            if (marker._prev && marker._next) {
+                this._createMiddleMarker(marker._prev, marker._next);
+            } else if (!marker._prev) {
+                marker._next._middleLeft = null;
+            } else if (!marker._next) {
+                marker._prev._middleRight = null;
+            }
+            this._fireEdit();
+        },
+        _onTouchMove: function (e) {
+            var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]), latlng = this._map.layerPointToLatLng(layerPoint), marker = e.target;
+            L.extend(marker._origLatLng, latlng);
+            if (marker._middleLeft) {
+                marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
+            }
+            if (marker._middleRight) {
+                marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
+            }
+            this._poly.redraw();
+            this.updateMarkers();
+        },
+        _updateIndexes: function (index, delta) {
+            this._markerGroup.eachLayer(function (marker) {
+                if (marker._index > index) {
+                    marker._index += delta;
+                }
+            });
+        },
+        _createMiddleMarker: function (marker1, marker2) {
+            var latlng = this._getMiddleLatLng(marker1, marker2), marker = this._createMarker(latlng), onClick, onDragStart, onDragEnd;
+            marker.setOpacity(0.6);
+            marker1._middleRight = marker2._middleLeft = marker;
+            onDragStart = function () {
+                var i = marker2._index;
+                marker._index = i;
+                marker.off('click', onClick, this).on('click', this._onMarkerClick, this);
+                latlng.lat = marker.getLatLng().lat;
+                latlng.lng = marker.getLatLng().lng;
+                this._spliceLatLngs(i, 0, latlng);
+                this._markers.splice(i, 0, marker);
+                marker.setOpacity(1);
+                this._updateIndexes(i, 1);
+                marker2._index++;
+                this._updatePrevNext(marker1, marker);
+                this._updatePrevNext(marker, marker2);
+                this._poly.fire('editstart');
+            };
+            onDragEnd = function () {
+                marker.off('dragstart', onDragStart, this);
+                marker.off('dragend', onDragEnd, this);
+                marker.off('touchmove', onDragStart, this);
+                this._createMiddleMarker(marker1, marker);
+                this._createMiddleMarker(marker, marker2);
+            };
+            onClick = function () {
+                onDragStart.call(this);
+                onDragEnd.call(this);
+                this._fireEdit();
+            };
+            marker.on('click', onClick, this).on('dragstart', onDragStart, this).on('dragend', onDragEnd, this).on('touchmove', onDragStart, this);
+            this._markerGroup.addLayer(marker);
+        },
+        _updatePrevNext: function (marker1, marker2) {
+            if (marker1) {
+                marker1._next = marker2;
+            }
+            if (marker2) {
+                marker2._prev = marker1;
+            }
+        },
+        _getMiddleLatLng: function (marker1, marker2) {
+            var map = this._poly._map, p1 = map.project(marker1.getLatLng()), p2 = map.project(marker2.getLatLng());
+            return map.unproject(p1._add(p2)._divideBy(2));
+        }
+    });
+    L.Polyline.addInitHook(function () {
+        if (this.editing) {
+            return;
+        }
+        if (L.Edit.Poly) {
+            this.editing = new L.Edit.Poly(this);
+            if (this.options.editable) {
+                this.editing.enable();
+            }
+        }
+        this.on('add', function () {
+            if (this.editing && this.editing.enabled()) {
+                this.editing.addHooks();
+            }
+        });
+        this.on('remove', function () {
+            if (this.editing && this.editing.enabled()) {
+                this.editing.removeHooks();
+            }
+        });
+    });
+    L.Edit = L.Edit || {};
+    L.Edit.SimpleShape = L.Handler.extend({
+        options: {
+            moveIcon: new L.DivIcon({
+                iconSize: new L.Point(8, 8),
+                className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move'
+            }),
+            resizeIcon: new L.DivIcon({
+                iconSize: new L.Point(8, 8),
+                className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize'
+            }),
+            touchMoveIcon: new L.DivIcon({
+                iconSize: new L.Point(20, 20),
+                className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon'
+            }),
+            touchResizeIcon: new L.DivIcon({
+                iconSize: new L.Point(20, 20),
+                className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon'
+            })
+        },
+        initialize: function (shape, options) {
+            if (L.Browser.touch) {
+                this.options.moveIcon = this.options.touchMoveIcon;
+                this.options.resizeIcon = this.options.touchResizeIcon;
+            }
+            this._shape = shape;
+            L.Util.setOptions(this, options);
+        },
+        addHooks: function () {
+            var shape = this._shape;
+            if (this._shape._map) {
+                this._map = this._shape._map;
+                shape.setStyle(shape.options.editing);
+                if (shape._map) {
+                    this._map = shape._map;
+                    if (!this._markerGroup) {
+                        this._initMarkers();
+                    }
+                    this._map.addLayer(this._markerGroup);
+                }
+            }
+        },
+        removeHooks: function () {
+            var shape = this._shape;
+            shape.setStyle(shape.options.original);
+            if (shape._map) {
+                this._unbindMarker(this._moveMarker);
+                for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
+                    this._unbindMarker(this._resizeMarkers[i]);
+                }
+                this._resizeMarkers = null;
+                this._map.removeLayer(this._markerGroup);
+                delete this._markerGroup;
+            }
+            this._map = null;
+        },
+        updateMarkers: function () {
+            this._markerGroup.clearLayers();
+            this._initMarkers();
+        },
+        _initMarkers: function () {
+            if (!this._markerGroup) {
+                this._markerGroup = new L.LayerGroup();
+            }
+            this._createMoveMarker();
+            this._createResizeMarker();
+        },
+        _createMoveMarker: function () {
+        },
+        _createResizeMarker: function () {
+        },
+        _createMarker: function (latlng, icon) {
+            var marker = new L.Marker.Touch(latlng, {
+                draggable: true,
+                icon: icon,
+                zIndexOffset: 10
+            });
+            this._bindMarker(marker);
+            this._markerGroup.addLayer(marker);
+            return marker;
+        },
+        _bindMarker: function (marker) {
+            marker.on('dragstart', this._onMarkerDragStart, this).on('drag', this._onMarkerDrag, this).on('dragend', this._onMarkerDragEnd, this).on('touchstart', this._onTouchStart, this).on('touchmove', this._onTouchMove, this).on('MSPointerMove', this._onTouchMove, this).on('touchend', this._onTouchEnd, this).on('MSPointerUp', this._onTouchEnd, this);
+        },
+        _unbindMarker: function (marker) {
+            marker.off('dragstart', this._onMarkerDragStart, this).off('drag', this._onMarkerDrag, this).off('dragend', this._onMarkerDragEnd, this).off('touchstart', this._onTouchStart, this).off('touchmove', this._onTouchMove, this).off('MSPointerMove', this._onTouchMove, this).off('touchend', this._onTouchEnd, this).off('MSPointerUp', this._onTouchEnd, this);
+        },
+        _onMarkerDragStart: function (e) {
+            var marker = e.target;
+            marker.setOpacity(0);
+            this._shape.fire('editstart');
+        },
+        _fireEdit: function () {
+            this._shape.edited = true;
+            this._shape.fire('edit');
+        },
+        _onMarkerDrag: function (e) {
+            var marker = e.target, latlng = marker.getLatLng();
+            if (marker === this._moveMarker) {
+                this._move(latlng);
+            } else {
+                this._resize(latlng);
+            }
+            this._shape.redraw();
+            this._shape.fire('editdrag');
+        },
+        _onMarkerDragEnd: function (e) {
+            var marker = e.target;
+            marker.setOpacity(1);
+            this._fireEdit();
+        },
+        _onTouchStart: function (e) {
+            L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e);
+            if (typeof this._getCorners === 'function') {
+                var corners = this._getCorners(), marker = e.target, currentCornerIndex = marker._cornerIndex;
+                marker.setOpacity(0);
+                this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];
+                this._toggleCornerMarkers(0, currentCornerIndex);
+            }
+            this._shape.fire('editstart');
+        },
+        _onTouchMove: function (e) {
+            var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]), latlng = this._map.layerPointToLatLng(layerPoint), marker = e.target;
+            if (marker === this._moveMarker) {
+                this._move(latlng);
+            } else {
+                this._resize(latlng);
+            }
+            this._shape.redraw();
+            return false;
+        },
+        _onTouchEnd: function (e) {
+            var marker = e.target;
+            marker.setOpacity(1);
+            this.updateMarkers();
+            this._fireEdit();
+        },
+        _move: function () {
+        },
+        _resize: function () {
+        }
+    });
+    L.Edit = L.Edit || {};
+    L.Edit.Rectangle = L.Edit.SimpleShape.extend({
+        _createMoveMarker: function () {
+            var bounds = this._shape.getBounds(), center = bounds.getCenter();
+            this._moveMarker = this._createMarker(center, this.options.moveIcon);
+        },
+        _createResizeMarker: function () {
+            var corners = this._getCorners();
+            this._resizeMarkers = [];
+            for (var i = 0, l = corners.length; i < l; i++) {
+                this._resizeMarkers.push(this._createMarker(corners[i], this.options.resizeIcon));
+                this._resizeMarkers[i]._cornerIndex = i;
+            }
+        },
+        _onMarkerDragStart: function (e) {
+            L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e);
+            var corners = this._getCorners(), marker = e.target, currentCornerIndex = marker._cornerIndex;
+            this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];
+            this._toggleCornerMarkers(0, currentCornerIndex);
+        },
+        _onMarkerDragEnd: function (e) {
+            var marker = e.target, bounds, center;
+            if (marker === this._moveMarker) {
+                bounds = this._shape.getBounds();
+                center = bounds.getCenter();
+                marker.setLatLng(center);
+            }
+            this._toggleCornerMarkers(1);
+            this._repositionCornerMarkers();
+            L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this, e);
+        },
+        _move: function (newCenter) {
+            var latlngs = this._shape.getLatLngs(), bounds = this._shape.getBounds(), center = bounds.getCenter(), offset, newLatLngs = [];
+            for (var i = 0, l = latlngs.length; i < l; i++) {
+                offset = [
+                    latlngs[i].lat - center.lat,
+                    latlngs[i].lng - center.lng
+                ];
+                newLatLngs.push([
+                    newCenter.lat + offset[0],
+                    newCenter.lng + offset[1]
+                ]);
+            }
+            this._shape.setLatLngs(newLatLngs);
+            this._repositionCornerMarkers();
+        },
+        _resize: function (latlng) {
+            var bounds;
+            this._shape.setBounds(L.latLngBounds(latlng, this._oppositeCorner));
+            bounds = this._shape.getBounds();
+            this._moveMarker.setLatLng(bounds.getCenter());
+        },
+        _getCorners: function () {
+            var bounds = this._shape.getBounds(), nw = bounds.getNorthWest(), ne = bounds.getNorthEast(), se = bounds.getSouthEast(), sw = bounds.getSouthWest();
+            return [
+                nw,
+                ne,
+                se,
+                sw
+            ];
+        },
+        _toggleCornerMarkers: function (opacity) {
+            for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
+                this._resizeMarkers[i].setOpacity(opacity);
+            }
+        },
+        _repositionCornerMarkers: function () {
+            var corners = this._getCorners();
+            for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
+                this._resizeMarkers[i].setLatLng(corners[i]);
+            }
+        }
+    });
+    L.Rectangle.addInitHook(function () {
+        if (L.Edit.Rectangle) {
+            this.editing = new L.Edit.Rectangle(this);
+            if (this.options.editable) {
+                this.editing.enable();
+            }
+        }
+    });
+    L.Edit = L.Edit || {};
+    L.Edit.Circle = L.Edit.SimpleShape.extend({
+        _createMoveMarker: function () {
+            var center = this._shape.getLatLng();
+            this._moveMarker = this._createMarker(center, this.options.moveIcon);
+        },
+        _createResizeMarker: function () {
+            var center = this._shape.getLatLng(), resizemarkerPoint = this._getResizeMarkerPoint(center);
+            this._resizeMarkers = [];
+            this._resizeMarkers.push(this._createMarker(resizemarkerPoint, this.options.resizeIcon));
+        },
+        _getResizeMarkerPoint: function (latlng) {
+            var delta = this._shape._radius * Math.cos(Math.PI / 4), point = this._map.project(latlng);
+            return this._map.unproject([
+                point.x + delta,
+                point.y - delta
+            ]);
+        },
+        _move: function (latlng) {
+            var resizemarkerPoint = this._getResizeMarkerPoint(latlng);
+            this._resizeMarkers[0].setLatLng(resizemarkerPoint);
+            this._shape.setLatLng(latlng);
+        },
+        _resize: function (latlng) {
+            var moveLatLng = this._moveMarker.getLatLng(), radius = moveLatLng.distanceTo(latlng);
+            this._shape.setRadius(radius);
+        }
+    });
+    L.Circle.addInitHook(function () {
+        if (L.Edit.Circle) {
+            this.editing = new L.Edit.Circle(this);
+            if (this.options.editable) {
+                this.editing.enable();
+            }
+        }
+        this.on('add', function () {
+            if (this.editing && this.editing.enabled()) {
+                this.editing.addHooks();
+            }
+        });
+        this.on('remove', function () {
+            if (this.editing && this.editing.enabled()) {
+                this.editing.removeHooks();
+            }
+        });
+    });
+    L.Map.mergeOptions({ touchExtend: true });
+    L.Map.TouchExtend = L.Handler.extend({
+        initialize: function (map) {
+            this._map = map;
+            this._container = map._container;
+            this._pane = map._panes.overlayPane;
+        },
+        addHooks: function () {
+            L.DomEvent.on(this._container, 'touchstart', this._onTouchStart, this);
+            L.DomEvent.on(this._container, 'touchend', this._onTouchEnd, this);
+            L.DomEvent.on(this._container, 'touchmove', this._onTouchMove, this);
+            if (this._detectIE()) {
+                L.DomEvent.on(this._container, 'MSPointerDown', this._onTouchStart, this);
+                L.DomEvent.on(this._container, 'MSPointerUp', this._onTouchEnd, this);
+                L.DomEvent.on(this._container, 'MSPointerMove', this._onTouchMove, this);
+                L.DomEvent.on(this._container, 'MSPointerCancel', this._onTouchCancel, this);
+            } else {
+                L.DomEvent.on(this._container, 'touchcancel', this._onTouchCancel, this);
+                L.DomEvent.on(this._container, 'touchleave', this._onTouchLeave, this);
+            }
+        },
+        removeHooks: function () {
+            L.DomEvent.off(this._container, 'touchstart', this._onTouchStart);
+            L.DomEvent.off(this._container, 'touchend', this._onTouchEnd);
+            L.DomEvent.off(this._container, 'touchmove', this._onTouchMove);
+            if (this._detectIE()) {
+                L.DomEvent.off(this._container, 'MSPointerDowm', this._onTouchStart);
+                L.DomEvent.off(this._container, 'MSPointerUp', this._onTouchEnd);
+                L.DomEvent.off(this._container, 'MSPointerMove', this._onTouchMove);
+                L.DomEvent.off(this._container, 'MSPointerCancel', this._onTouchCancel);
+            } else {
+                L.DomEvent.off(this._container, 'touchcancel', this._onTouchCancel);
+                L.DomEvent.off(this._container, 'touchleave', this._onTouchLeave);
+            }
+        },
+        _touchEvent: function (e, type) {
+            var touchEvent = {};
+            if (typeof e.touches !== 'undefined') {
+                if (!e.touches.length) {
+                    return;
+                }
+                touchEvent = e.touches[0];
+            } else if (e.pointerType === 'touch') {
+                touchEvent = e;
+                if (!this._filterClick(e)) {
+                    return;
+                }
+            } else {
+                return;
+            }
+            var containerPoint = this._map.mouseEventToContainerPoint(touchEvent), layerPoint = this._map.mouseEventToLayerPoint(touchEvent), latlng = this._map.layerPointToLatLng(layerPoint);
+            this._map.fire(type, {
+                latlng: latlng,
+                layerPoint: layerPoint,
+                containerPoint: containerPoint,
+                pageX: touchEvent.pageX,
+                pageY: touchEvent.pageY,
+                originalEvent: e
+            });
+        },
+        _filterClick: function (e) {
+            var timeStamp = e.timeStamp || e.originalEvent.timeStamp, elapsed = L.DomEvent._lastClick && timeStamp - L.DomEvent._lastClick;
+            if (elapsed && elapsed > 100 && elapsed < 500 || e.target._simulatedClick && !e._simulated) {
+                L.DomEvent.stop(e);
+                return false;
+            }
+            L.DomEvent._lastClick = timeStamp;
+            return true;
+        },
+        _onTouchStart: function (e) {
+            if (!this._map._loaded) {
+                return;
+            }
+            var type = 'touchstart';
+            this._touchEvent(e, type);
+        },
+        _onTouchEnd: function (e) {
+            if (!this._map._loaded) {
+                return;
+            }
+            var type = 'touchend';
+            this._touchEvent(e, type);
+        },
+        _onTouchCancel: function (e) {
+            if (!this._map._loaded) {
+                return;
+            }
+            var type = 'touchcancel';
+            if (this._detectIE()) {
+                type = 'pointercancel';
+            }
+            this._touchEvent(e, type);
+        },
+        _onTouchLeave: function (e) {
+            if (!this._map._loaded) {
+                return;
+            }
+            var type = 'touchleave';
+            this._touchEvent(e, type);
+        },
+        _onTouchMove: function (e) {
+            if (!this._map._loaded) {
+                return;
+            }
+            var type = 'touchmove';
+            this._touchEvent(e, type);
+        },
+        _detectIE: function () {
+            var ua = window.navigator.userAgent;
+            var msie = ua.indexOf('MSIE ');
+            if (msie > 0) {
+                return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
+            }
+            var trident = ua.indexOf('Trident/');
+            if (trident > 0) {
+                var rv = ua.indexOf('rv:');
+                return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
+            }
+            var edge = ua.indexOf('Edge/');
+            if (edge > 0) {
+                return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
+            }
+            return false;
+        }
+    });
+    L.Map.addInitHook('addHandler', 'touchExtend', L.Map.TouchExtend);
+    L.Marker.Touch = L.Marker.extend({
+        _initInteraction: function () {
+            if (!this.options.clickable) {
+                return;
+            }
+            var icon = this._icon, events = [
+                    'dblclick',
+                    'mousedown',
+                    'mouseover',
+                    'mouseout',
+                    'contextmenu',
+                    'touchstart',
+                    'touchend',
+                    'touchmove'
+                ];
+            if (this._detectIE) {
+                events.concat([
+                    'MSPointerDown',
+                    'MSPointerUp',
+                    'MSPointerMove',
+                    'MSPointerCancel'
+                ]);
+            } else {
+                events.concat(['touchcancel']);
+            }
+            L.DomUtil.addClass(icon, 'leaflet-clickable');
+            L.DomEvent.on(icon, 'click', this._onMouseClick, this);
+            L.DomEvent.on(icon, 'keypress', this._onKeyPress, this);
+            for (var i = 0; i < events.length; i++) {
+                L.DomEvent.on(icon, events[i], this._fireMouseEvent, this);
+            }
+            if (L.Handler.MarkerDrag) {
+                this.dragging = new L.Handler.MarkerDrag(this);
+                if (this.options.draggable) {
+                    this.dragging.enable();
+                }
+            }
+        },
+        _detectIE: function () {
+            var ua = window.navigator.userAgent;
+            var msie = ua.indexOf('MSIE ');
+            if (msie > 0) {
+                return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
+            }
+            var trident = ua.indexOf('Trident/');
+            if (trident > 0) {
+                var rv = ua.indexOf('rv:');
+                return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
+            }
+            var edge = ua.indexOf('Edge/');
+            if (edge > 0) {
+                return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
+            }
+            return false;
+        }
+    });
+    L.LatLngUtil = {
+        cloneLatLngs: function (latlngs) {
+            var clone = [];
+            for (var i = 0, l = latlngs.length; i < l; i++) {
+                clone.push(this.cloneLatLng(latlngs[i]));
+            }
+            return clone;
+        },
+        cloneLatLng: function (latlng) {
+            return L.latLng(latlng.lat, latlng.lng);
+        }
+    };
+    L.GeometryUtil = L.extend(L.GeometryUtil || {}, {
+        geodesicArea: function (latLngs) {
+            var pointsCount = latLngs.length, area = 0, d2r = L.LatLng.DEG_TO_RAD, p1, p2;
+            if (pointsCount > 2) {
+                for (var i = 0; i < pointsCount; i++) {
+                    p1 = latLngs[i];
+                    p2 = latLngs[(i + 1) % pointsCount];
+                    area += (p2.lng - p1.lng) * d2r * (2 + Math.sin(p1.lat * d2r) + Math.sin(p2.lat * d2r));
+                }
+                area = area * 6378137 * 6378137 / 2;
+            }
+            return Math.abs(area);
+        },
+        readableArea: function (area, isMetric) {
+            var areaStr;
+            if (isMetric) {
+                if (area >= 10000) {
+                    areaStr = (area * 0.0001).toFixed(2) + ' ha';
+                } else {
+                    areaStr = area.toFixed(2) + ' m&sup2;';
+                }
+            } else {
+                area /= 0.836127;
+                if (area >= 3097600) {
+                    areaStr = (area / 3097600).toFixed(2) + ' mi&sup2;';
+                } else if (area >= 4840) {
+                    areaStr = (area / 4840).toFixed(2) + ' acres';
+                } else {
+                    areaStr = Math.ceil(area) + ' yd&sup2;';
+                }
+            }
+            return areaStr;
+        },
+        readableDistance: function (distance, isMetric, useFeet) {
+            var distanceStr;
+            if (isMetric) {
+                if (distance > 1000) {
+                    distanceStr = (distance / 1000).toFixed(2) + ' km';
+                } else {
+                    distanceStr = Math.ceil(distance) + ' m';
+                }
+            } else {
+                distance *= 1.09361;
+                if (distance > 1760) {
+                    distanceStr = (distance / 1760).toFixed(2) + ' miles';
+                } else {
+                    var suffix = ' yd';
+                    if (useFeet) {
+                        distance = distance * 3;
+                        suffix = ' ft';
+                    }
+                    distanceStr = Math.ceil(distance) + suffix;
+                }
+            }
+            return distanceStr;
+        }
+    });
+    L.Util.extend(L.LineUtil, {
+        segmentsIntersect: function (p, p1, p2, p3) {
+            return this._checkCounterclockwise(p, p2, p3) !== this._checkCounterclockwise(p1, p2, p3) && this._checkCounterclockwise(p, p1, p2) !== this._checkCounterclockwise(p, p1, p3);
+        },
+        _checkCounterclockwise: function (p, p1, p2) {
+            return (p2.y - p.y) * (p1.x - p.x) > (p1.y - p.y) * (p2.x - p.x);
+        }
+    });
+    L.Polyline.include({
+        intersects: function () {
+            var points = this._originalPoints, len = points ? points.length : 0, i, p, p1;
+            if (this._tooFewPointsForIntersection()) {
+                return false;
+            }
+            for (i = len - 1; i >= 3; i--) {
+                p = points[i - 1];
+                p1 = points[i];
+                if (this._lineSegmentsIntersectsRange(p, p1, i - 2)) {
+                    return true;
+                }
+            }
+            return false;
+        },
+        newLatLngIntersects: function (latlng, skipFirst) {
+            if (!this._map) {
+                return false;
+            }
+            return this.newPointIntersects(this._map.latLngToLayerPoint(latlng), skipFirst);
+        },
+        newPointIntersects: function (newPoint, skipFirst) {
+            var points = this._originalPoints, len = points ? points.length : 0, lastPoint = points ? points[len - 1] : null, maxIndex = len - 2;
+            if (this._tooFewPointsForIntersection(1)) {
+                return false;
+            }
+            return this._lineSegmentsIntersectsRange(lastPoint, newPoint, maxIndex, skipFirst ? 1 : 0);
+        },
+        _tooFewPointsForIntersection: function (extraPoints) {
+            var points = this._originalPoints, len = points ? points.length : 0;
+            len += extraPoints || 0;
+            return !this._originalPoints || len <= 3;
+        },
+        _lineSegmentsIntersectsRange: function (p, p1, maxIndex, minIndex) {
+            var points = this._originalPoints, p2, p3;
+            minIndex = minIndex || 0;
+            for (var j = maxIndex; j > minIndex; j--) {
+                p2 = points[j - 1];
+                p3 = points[j];
+                if (L.LineUtil.segmentsIntersect(p, p1, p2, p3)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+    });
+    L.Polygon.include({
+        intersects: function () {
+            var polylineIntersects, points = this._originalPoints, len, firstPoint, lastPoint, maxIndex;
+            if (this._tooFewPointsForIntersection()) {
+                return false;
+            }
+            polylineIntersects = L.Polyline.prototype.intersects.call(this);
+            if (polylineIntersects) {
+                return true;
+            }
+            len = points.length;
+            firstPoint = points[0];
+            lastPoint = points[len - 1];
+            maxIndex = len - 2;
+            return this._lineSegmentsIntersectsRange(lastPoint, firstPoint, maxIndex, 1);
+        }
+    });
+    L.Control.Draw = L.Control.extend({
+        options: {
+            position: 'topleft',
+            draw: {},
+            edit: false
+        },
+        initialize: function (options) {
+            if (L.version < '0.7') {
+                throw new Error('Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/');
+            }
+            L.Control.prototype.initialize.call(this, options);
+            var toolbar;
+            this._toolbars = {};
+            if (L.DrawToolbar && this.options.draw) {
+                toolbar = new L.DrawToolbar(this.options.draw);
+                this._toolbars[L.DrawToolbar.TYPE] = toolbar;
+                this._toolbars[L.DrawToolbar.TYPE].on('enable', this._toolbarEnabled, this);
+            }
+            if (L.EditToolbar && this.options.edit) {
+                toolbar = new L.EditToolbar(this.options.edit);
+                this._toolbars[L.EditToolbar.TYPE] = toolbar;
+                this._toolbars[L.EditToolbar.TYPE].on('enable', this._toolbarEnabled, this);
+            }
+            L.toolbar = this;
+        },
+        onAdd: function (map) {
+            var container = L.DomUtil.create('div', 'leaflet-draw'), addedTopClass = false, topClassName = 'leaflet-draw-toolbar-top', toolbarContainer;
+            for (var toolbarId in this._toolbars) {
+                if (this._toolbars.hasOwnProperty(toolbarId)) {
+                    toolbarContainer = this._toolbars[toolbarId].addToolbar(map);
+                    if (toolbarContainer) {
+                        if (!addedTopClass) {
+                            if (!L.DomUtil.hasClass(toolbarContainer, topClassName)) {
+                                L.DomUtil.addClass(toolbarContainer.childNodes[0], topClassName);
+                            }
+                            addedTopClass = true;
+                        }
+                        container.appendChild(toolbarContainer);
+                    }
+                }
+            }
+            return container;
+        },
+        onRemove: function () {
+            for (var toolbarId in this._toolbars) {
+                if (this._toolbars.hasOwnProperty(toolbarId)) {
+                    this._toolbars[toolbarId].removeToolbar();
+                }
+            }
+        },
+        setDrawingOptions: function (options) {
+            for (var toolbarId in this._toolbars) {
+                if (this._toolbars[toolbarId] instanceof L.DrawToolbar) {
+                    this._toolbars[toolbarId].setOptions(options);
+                }
+            }
+        },
+        _toolbarEnabled: function (e) {
+            var enabledToolbar = e.target;
+            for (var toolbarId in this._toolbars) {
+                if (this._toolbars[toolbarId] !== enabledToolbar) {
+                    this._toolbars[toolbarId].disable();
+                }
+            }
+        }
+    });
+    L.Map.mergeOptions({
+        drawControlTooltips: true,
+        drawControl: false
+    });
+    L.Map.addInitHook(function () {
+        if (this.options.drawControl) {
+            this.drawControl = new L.Control.Draw();
+            this.addControl(this.drawControl);
+        }
+    });
+    L.Toolbar = L.Class.extend({
+        includes: [L.Mixin.Events],
+        initialize: function (options) {
+            L.setOptions(this, options);
+            this._modes = {};
+            this._actionButtons = [];
+            this._activeMode = null;
+        },
+        enabled: function () {
+            return this._activeMode !== null;
+        },
+        disable: function () {
+            if (!this.enabled()) {
+                return;
+            }
+            this._activeMode.handler.disable();
+        },
+        addToolbar: function (map) {
+            var container = L.DomUtil.create('div', 'leaflet-draw-section'), buttonIndex = 0, buttonClassPrefix = this._toolbarClass || '', modeHandlers = this.getModeHandlers(map), i;
+            this._toolbarContainer = L.DomUtil.create('div', 'leaflet-draw-toolbar leaflet-bar');
+            this._map = map;
+            for (i = 0; i < modeHandlers.length; i++) {
+                if (modeHandlers[i].enabled) {
+                    this._initModeHandler(modeHandlers[i].handler, this._toolbarContainer, buttonIndex++, buttonClassPrefix, modeHandlers[i].title);
+                }
+            }
+            if (!buttonIndex) {
+                return;
+            }
+            this._lastButtonIndex = --buttonIndex;
+            this._actionsContainer = L.DomUtil.create('ul', 'leaflet-draw-actions');
+            container.appendChild(this._toolbarContainer);
+            container.appendChild(this._actionsContainer);
+            return container;
+        },
+        removeToolbar: function () {
+            for (var handlerId in this._modes) {
+                if (this._modes.hasOwnProperty(handlerId)) {
+                    this._disposeButton(this._modes[handlerId].button, this._modes[handlerId].handler.enable, this._modes[handlerId].handler);
+                    this._modes[handlerId].handler.disable();
+                    this._modes[handlerId].handler.off('enabled', this._handlerActivated, this).off('disabled', this._handlerDeactivated, this);
+                }
+            }
+            this._modes = {};
+            for (var i = 0, l = this._actionButtons.length; i < l; i++) {
+                this._disposeButton(this._actionButtons[i].button, this._actionButtons[i].callback, this);
+            }
+            this._actionButtons = [];
+            this._actionsContainer = null;
+        },
+        _initModeHandler: function (handler, container, buttonIndex, classNamePredix, buttonTitle) {
+            var type = handler.type;
+            this._modes[type] = {};
+            this._modes[type].handler = handler;
+            this._modes[type].button = this._createButton({
+                type: type,
+                title: buttonTitle,
+                className: classNamePredix + '-' + type,
+                container: container,
+                callback: this._modes[type].handler.enable,
+                context: this._modes[type].handler
+            });
+            this._modes[type].buttonIndex = buttonIndex;
+            this._modes[type].handler.on('enabled', this._handlerActivated, this).on('disabled', this._handlerDeactivated, this);
+        },
+        _createButton: function (options) {
+            var link = L.DomUtil.create('a', options.className || '', options.container);
+            link.href = '#';
+            if (options.text) {
+                link.innerHTML = options.text;
+            }
+            if (options.title) {
+                link.title = options.title;
+            }
+            L.DomEvent.on(link, 'click', L.DomEvent.stopPropagation).on(link, 'mousedown', L.DomEvent.stopPropagation).on(link, 'dblclick', L.DomEvent.stopPropagation).on(link, 'click', L.DomEvent.preventDefault).on(link, 'click', options.callback, options.context);
+            return link;
+        },
+        _disposeButton: function (button, callback) {
+            L.DomEvent.off(button, 'click', L.DomEvent.stopPropagation).off(button, 'mousedown', L.DomEvent.stopPropagation).off(button, 'dblclick', L.DomEvent.stopPropagation).off(button, 'click', L.DomEvent.preventDefault).off(button, 'click', callback);
+        },
+        _handlerActivated: function (e) {
+            this.disable();
+            this._activeMode = this._modes[e.handler];
+            L.DomUtil.addClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled');
+            this._showActionsToolbar();
+            this.fire('enable');
+        },
+        _handlerDeactivated: function () {
+            this._hideActionsToolbar();
+            L.DomUtil.removeClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled');
+            this._activeMode = null;
+            this.fire('disable');
+        },
+        _createActions: function (handler) {
+            var container = this._actionsContainer, buttons = this.getActions(handler), l = buttons.length, li, di, dl, button;
+            for (di = 0, dl = this._actionButtons.length; di < dl; di++) {
+                this._disposeButton(this._actionButtons[di].button, this._actionButtons[di].callback);
+            }
+            this._actionButtons = [];
+            while (container.firstChild) {
+                container.removeChild(container.firstChild);
+            }
+            for (var i = 0; i < l; i++) {
+                if ('enabled' in buttons[i] && !buttons[i].enabled) {
+                    continue;
+                }
+                li = L.DomUtil.create('li', '', container);
+                button = this._createButton({
+                    title: buttons[i].title,
+                    text: buttons[i].text,
+                    container: li,
+                    callback: buttons[i].callback,
+                    context: buttons[i].context
+                });
+                this._actionButtons.push({
+                    button: button,
+                    callback: buttons[i].callback
+                });
+            }
+        },
+        _showActionsToolbar: function () {
+            var buttonIndex = this._activeMode.buttonIndex, lastButtonIndex = this._lastButtonIndex, toolbarPosition = this._activeMode.button.offsetTop - 1;
+            this._createActions(this._activeMode.handler);
+            this._actionsContainer.style.top = toolbarPosition + 'px';
+            if (buttonIndex === 0) {
+                L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop');
+                L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-top');
+            }
+            if (buttonIndex === lastButtonIndex) {
+                L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom');
+                L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-bottom');
+            }
+            this._actionsContainer.style.display = 'block';
+        },
+        _hideActionsToolbar: function () {
+            this._actionsContainer.style.display = 'none';
+            L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop');
+            L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom');
+            L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-top');
+            L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-bottom');
+        }
+    });
+    L.Tooltip = L.Class.extend({
+        initialize: function (map) {
+            this._map = map;
+            this._popupPane = map._panes.popupPane;
+            this._container = map.options.drawControlTooltips ? L.DomUtil.create('div', 'leaflet-draw-tooltip', this._popupPane) : null;
+            this._singleLineLabel = false;
+            this._map.on('mouseout', this._onMouseOut, this);
+        },
+        dispose: function () {
+            this._map.off('mouseout', this._onMouseOut, this);
+            if (this._container) {
+                this._popupPane.removeChild(this._container);
+                this._container = null;
+            }
+        },
+        updateContent: function (labelText) {
+            if (!this._container) {
+                return this;
+            }
+            labelText.subtext = labelText.subtext || '';
+            if (labelText.subtext.length === 0 && !this._singleLineLabel) {
+                L.DomUtil.addClass(this._container, 'leaflet-draw-tooltip-single');
+                this._singleLineLabel = true;
+            } else if (labelText.subtext.length > 0 && this._singleLineLabel) {
+                L.DomUtil.removeClass(this._container, 'leaflet-draw-tooltip-single');
+                this._singleLineLabel = false;
+            }
+            this._container.innerHTML = (labelText.subtext.length > 0 ? '<span class="leaflet-draw-tooltip-subtext">' + labelText.subtext + '</span>' + '<br />' : '') + '<span>' + labelText.text + '</span>';
+            return this;
+        },
+        updatePosition: function (latlng) {
+            var pos = this._map.latLngToLayerPoint(latlng), tooltipContainer = this._container;
+            if (this._container) {
+                tooltipContainer.style.visibility = 'inherit';
+                L.DomUtil.setPosition(tooltipContainer, pos);
+            }
+            return this;
+        },
+        showAsError: function () {
+            if (this._container) {
+                L.DomUtil.addClass(this._container, 'leaflet-error-draw-tooltip');
+            }
+            return this;
+        },
+        removeError: function () {
+            if (this._container) {
+                L.DomUtil.removeClass(this._container, 'leaflet-error-draw-tooltip');
+            }
+            return this;
+        },
+        _onMouseOut: function () {
+            if (this._container) {
+                this._container.style.visibility = 'hidden';
+            }
+        }
+    });
+    L.DrawToolbar = L.Toolbar.extend({
+        statics: { TYPE: 'draw' },
+        options: {
+            polyline: {},
+            polygon: {},
+            rectangle: {},
+            circle: {},
+            marker: {}
+        },
+        initialize: function (options) {
+            for (var type in this.options) {
+                if (this.options.hasOwnProperty(type)) {
+                    if (options[type]) {
+                        options[type] = L.extend({}, this.options[type], options[type]);
+                    }
+                }
+            }
+            this._toolbarClass = 'leaflet-draw-draw';
+            L.Toolbar.prototype.initialize.call(this, options);
+        },
+        getModeHandlers: function (map) {
+            return [
+                {
+                    enabled: this.options.polyline,
+                    handler: new L.Draw.Polyline(map, this.options.polyline),
+                    title: L.drawLocal.draw.toolbar.buttons.polyline
+                },
+                {
+                    enabled: this.options.polygon,
+                    handler: new L.Draw.Polygon(map, this.options.polygon),
+                    title: L.drawLocal.draw.toolbar.buttons.polygon
+                },
+                {
+                    enabled: this.options.rectangle,
+                    handler: new L.Draw.Rectangle(map, this.options.rectangle),
+                    title: L.drawLocal.draw.toolbar.buttons.rectangle
+                },
+                {
+                    enabled: this.options.circle,
+                    handler: new L.Draw.Circle(map, this.options.circle),
+                    title: L.drawLocal.draw.toolbar.buttons.circle
+                },
+                {
+                    enabled: this.options.marker,
+                    handler: new L.Draw.Marker(map, this.options.marker),
+                    title: L.drawLocal.draw.toolbar.buttons.marker
+                }
+            ];
+        },
+        getActions: function (handler) {
+            return [
+                {
+                    enabled: handler.completeShape,
+                    title: L.drawLocal.draw.toolbar.finish.title,
+                    text: L.drawLocal.draw.toolbar.finish.text,
+                    callback: handler.completeShape,
+                    context: handler
+                },
+                {
+                    enabled: handler.deleteLastVertex,
+                    title: L.drawLocal.draw.toolbar.undo.title,
+                    text: L.drawLocal.draw.toolbar.undo.text,
+                    callback: handler.deleteLastVertex,
+                    context: handler
+                },
+                {
+                    title: L.drawLocal.draw.toolbar.actions.title,
+                    text: L.drawLocal.draw.toolbar.actions.text,
+                    callback: this.disable,
+                    context: this
+                }
+            ];
+        },
+        setOptions: function (options) {
+            L.setOptions(this, options);
+            for (var type in this._modes) {
+                if (this._modes.hasOwnProperty(type) && options.hasOwnProperty(type)) {
+                    this._modes[type].handler.setOptions(options[type]);
+                }
+            }
+        }
+    });
+    L.EditToolbar = L.Toolbar.extend({
+        statics: { TYPE: 'edit' },
+        options: {
+            edit: {
+                selectedPathOptions: {
+                    dashArray: '10, 10',
+                    fill: true,
+                    fillColor: '#fe57a1',
+                    fillOpacity: 0.1,
+                    maintainColor: false
+                }
+            },
+            remove: {},
+            featureGroup: null
+        },
+        initialize: function (options) {
+            if (options.edit) {
+                if (typeof options.edit.selectedPathOptions === 'undefined') {
+                    options.edit.selectedPathOptions = this.options.edit.selectedPathOptions;
+                }
+                options.edit.selectedPathOptions = L.extend({}, this.options.edit.selectedPathOptions, options.edit.selectedPathOptions);
+            }
+            if (options.remove) {
+                options.remove = L.extend({}, this.options.remove, options.remove);
+            }
+            this._toolbarClass = 'leaflet-draw-edit';
+            L.Toolbar.prototype.initialize.call(this, options);
+            this._selectedFeatureCount = 0;
+        },
+        getModeHandlers: function (map) {
+            var featureGroup = this.options.featureGroup;
+            return [
+                {
+                    enabled: this.options.edit,
+                    handler: new L.EditToolbar.Edit(map, {
+                        featureGroup: featureGroup,
+                        selectedPathOptions: this.options.edit.selectedPathOptions
+                    }),
+                    title: L.drawLocal.edit.toolbar.buttons.edit
+                },
+                {
+                    enabled: this.options.remove,
+                    handler: new L.EditToolbar.Delete(map, { featureGroup: featureGroup }),
+                    title: L.drawLocal.edit.toolbar.buttons.remove
+                }
+            ];
+        },
+        getActions: function () {
+            return [
+                {
+                    title: L.drawLocal.edit.toolbar.actions.save.title,
+                    text: L.drawLocal.edit.toolbar.actions.save.text,
+                    callback: this._save,
+                    context: this
+                },
+                {
+                    title: L.drawLocal.edit.toolbar.actions.cancel.title,
+                    text: L.drawLocal.edit.toolbar.actions.cancel.text,
+                    callback: this.disable,
+                    context: this
+                }
+            ];
+        },
+        addToolbar: function (map) {
+            var container = L.Toolbar.prototype.addToolbar.call(this, map);
+            this._checkDisabled();
+            this.options.featureGroup.on('layeradd layerremove', this._checkDisabled, this);
+            return container;
+        },
+        removeToolbar: function () {
+            this.options.featureGroup.off('layeradd layerremove', this._checkDisabled, this);
+            L.Toolbar.prototype.removeToolbar.call(this);
+        },
+        disable: function () {
+            if (!this.enabled()) {
+                return;
+            }
+            this._activeMode.handler.revertLayers();
+            L.Toolbar.prototype.disable.call(this);
+        },
+        _save: function () {
+            this._activeMode.handler.save();
+            this._activeMode.handler.disable();
+        },
+        _checkDisabled: function () {
+            var featureGroup = this.options.featureGroup, hasLayers = featureGroup.getLayers().length !== 0, button;
+            if (this.options.edit) {
+                button = this._modes[L.EditToolbar.Edit.TYPE].button;
+                if (hasLayers) {
+                    L.DomUtil.removeClass(button, 'leaflet-disabled');
+                } else {
+                    L.DomUtil.addClass(button, 'leaflet-disabled');
+                }
+                button.setAttribute('title', hasLayers ? L.drawLocal.edit.toolbar.buttons.edit : L.drawLocal.edit.toolbar.buttons.editDisabled);
+            }
+            if (this.options.remove) {
+                button = this._modes[L.EditToolbar.Delete.TYPE].button;
+                if (hasLayers) {
+                    L.DomUtil.removeClass(button, 'leaflet-disabled');
+                } else {
+                    L.DomUtil.addClass(button, 'leaflet-disabled');
+                }
+                button.setAttribute('title', hasLayers ? L.drawLocal.edit.toolbar.buttons.remove : L.drawLocal.edit.toolbar.buttons.removeDisabled);
+            }
+        }
+    });
+    L.EditToolbar.Edit = L.Handler.extend({
+        statics: { TYPE: 'edit' },
+        includes: L.Mixin.Events,
+        initialize: function (map, options) {
+            L.Handler.prototype.initialize.call(this, map);
+            L.setOptions(this, options);
+            this._featureGroup = options.featureGroup;
+            if (!(this._featureGroup instanceof L.FeatureGroup)) {
+                throw new Error('options.featureGroup must be a L.FeatureGroup');
+            }
+            this._uneditedLayerProps = {};
+            this.type = L.EditToolbar.Edit.TYPE;
+        },
+        enable: function () {
+            if (this._enabled || !this._hasAvailableLayers()) {
+                return;
+            }
+            this.fire('enabled', { handler: this.type });
+            this._map.fire('draw:editstart', { handler: this.type });
+            L.Handler.prototype.enable.call(this);
+            this._featureGroup.on('layeradd', this._enableLayerEdit, this).on('layerremove', this._disableLayerEdit, this);
+        },
+        disable: function () {
+            if (!this._enabled) {
+                return;
+            }
+            this._featureGroup.off('layeradd', this._enableLayerEdit, this).off('layerremove', this._disableLayerEdit, this);
+            L.Handler.prototype.disable.call(this);
+            this._map.fire('draw:editstop', { handler: this.type });
+            this.fire('disabled', { handler: this.type });
+        },
+        addHooks: function () {
+            var map = this._map;
+            if (map) {
+                map.getContainer().focus();
+                this._featureGroup.eachLayer(this._enableLayerEdit, this);
+                this._tooltip = new L.Tooltip(this._map);
+                this._updateTooltip();
+                this._map.on('mousemove', this._onMouseMove, this).on('touchmove', this._onMouseMove, this).on('MSPointerMove', this._onMouseMove, this).on('click', this._editStyle, this).on('draw:editvertex', this._updateTooltip, this);
+            }
+        },
+        removeHooks: function () {
+            if (this._map) {
+                this._featureGroup.eachLayer(this._disableLayerEdit, this);
+                this._uneditedLayerProps = {};
+                this._tooltip.dispose();
+                this._tooltip = null;
+                this._map.off('mousemove', this._onMouseMove, this).off('touchmove', this._onMouseMove, this).off('MSPointerMove', this._onMouseMove, this);
+            }
+        },
+        revertLayers: function () {
+            this._featureGroup.eachLayer(function (layer) {
+                this._revertLayer(layer);
+            }, this);
+        },
+        save: function () {
+            var editedLayers = new L.LayerGroup();
+            this._featureGroup.eachLayer(function (layer) {
+                if (layer.edited) {
+                    editedLayers.addLayer(layer);
+                    layer.edited = false;
+                }
+            });
+            this._map.fire('draw:edited', { layers: editedLayers });
+        },
+        _backupLayer: function (layer) {
+            var id = L.Util.stamp(layer);
+            if (!this._uneditedLayerProps[id]) {
+                if (layer instanceof L.Polyline || layer instanceof L.Polygon || layer instanceof L.Rectangle) {
+                    this._uneditedLayerProps[id] = { latlngs: L.LatLngUtil.cloneLatLngs(layer.getLatLngs()) };
+                } else if (layer instanceof L.Circle) {
+                    this._uneditedLayerProps[id] = {
+                        latlng: L.LatLngUtil.cloneLatLng(layer.getLatLng()),
+                        radius: layer.getRadius()
+                    };
+                } else if (layer instanceof L.Marker) {
+                    this._uneditedLayerProps[id] = { latlng: L.LatLngUtil.cloneLatLng(layer.getLatLng()) };
+                }
+            }
+        },
+        _getTooltipText: function () {
+            return {
+                text: L.drawLocal.edit.handlers.edit.tooltip.text,
+                subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
+            };
+        },
+        _updateTooltip: function () {
+            this._tooltip.updateContent(this._getTooltipText());
+        },
+        _revertLayer: function (layer) {
+            var id = L.Util.stamp(layer);
+            layer.edited = false;
+            if (this._uneditedLayerProps.hasOwnProperty(id)) {
+                if (layer instanceof L.Polyline || layer instanceof L.Polygon || layer instanceof L.Rectangle) {
+                    layer.setLatLngs(this._uneditedLayerProps[id].latlngs);
+                } else if (layer instanceof L.Circle) {
+                    layer.setLatLng(this._uneditedLayerProps[id].latlng);
+                    layer.setRadius(this._uneditedLayerProps[id].radius);
+                } else if (layer instanceof L.Marker) {
+                    layer.setLatLng(this._uneditedLayerProps[id].latlng);
+                }
+                layer.fire('revert-edited', { layer: layer });
+            }
+        },
+        _enableLayerEdit: function (e) {
+            var layer = e.layer || e.target || e, pathOptions;
+            this._backupLayer(layer);
+            if (this.options.selectedPathOptions) {
+                pathOptions = L.Util.extend({}, this.options.selectedPathOptions);
+                if (pathOptions.maintainColor) {
+                    pathOptions.color = layer.options.color;
+                    pathOptions.fillColor = layer.options.fillColor;
+                }
+                layer.options.original = L.extend({}, layer.options);
+                layer.options.editing = pathOptions;
+            }
+            if (this.isMarker) {
+                layer.dragging.enable();
+                layer.on('dragend', this._onMarkerDragEnd).on('touchmove', this._onTouchMove, this).on('MSPointerMove', this._onTouchMove, this).on('touchend', this._onMarkerDragEnd, this).on('MSPointerUp', this._onMarkerDragEnd, this);
+            } else {
+                layer.editing.enable();
+            }
+        },
+        _disableLayerEdit: function (e) {
+            var layer = e.layer || e.target || e;
+            layer.edited = false;
+            layer.editing.disable();
+            delete layer.options.editing;
+            delete layer.options.original;
+            if (this._selectedPathOptions) {
+                if (layer instanceof L.Marker) {
+                    this._toggleMarkerHighlight(layer);
+                } else {
+                    layer.setStyle(layer.options.previousOptions);
+                    delete layer.options.previousOptions;
+                }
+            }
+            if (layer instanceof L.Marker) {
+                layer.dragging.disable();
+                layer.off('dragend', this._onMarkerDragEnd, this).off('touchmove', this._onTouchMove, this).off('MSPointerMove', this._onTouchMove, this).off('touchend', this._onMarkerDragEnd, this).off('MSPointerUp', this._onMarkerDragEnd, this);
+            } else {
+                layer.editing.disable();
+            }
+        },
+        _onMouseMove: function (e) {
+            this._tooltip.updatePosition(e.latlng);
+        },
+        _onTouchMove: function (e) {
+            var touchEvent = e.originalEvent.changedTouches[0], layerPoint = this._map.mouseEventToLayerPoint(touchEvent), latlng = this._map.layerPointToLatLng(layerPoint);
+            e.target.setLatLng(latlng);
+        },
+        _hasAvailableLayers: function () {
+            return this._featureGroup.getLayers().length !== 0;
+        }
+    });
+    L.EditToolbar.Delete = L.Handler.extend({
+        statics: { TYPE: 'remove' },
+        includes: L.Mixin.Events,
+        initialize: function (map, options) {
+            L.Handler.prototype.initialize.call(this, map);
+            L.Util.setOptions(this, options);
+            this._deletableLayers = this.options.featureGroup;
+            if (!(this._deletableLayers instanceof L.FeatureGroup)) {
+                throw new Error('options.featureGroup must be a L.FeatureGroup');
+            }
+            this.type = L.EditToolbar.Delete.TYPE;
+        },
+        enable: function () {
+            if (this._enabled || !this._hasAvailableLayers()) {
+                return;
+            }
+            this.fire('enabled', { handler: this.type });
+            this._map.fire('draw:deletestart', { handler: this.type });
+            L.Handler.prototype.enable.call(this);
+            this._deletableLayers.on('layeradd', this._enableLayerDelete, this).on('layerremove', this._disableLayerDelete, this);
+        },
+        disable: function () {
+            if (!this._enabled) {
+                return;
+            }
+            this._deletableLayers.off('layeradd', this._enableLayerDelete, this).off('layerremove', this._disableLayerDelete, this);
+            L.Handler.prototype.disable.call(this);
+            this._map.fire('draw:deletestop', { handler: this.type });
+            this.fire('disabled', { handler: this.type });
+        },
+        addHooks: function () {
+            var map = this._map;
+            if (map) {
+                map.getContainer().focus();
+                this._deletableLayers.eachLayer(this._enableLayerDelete, this);
+                this._deletedLayers = new L.LayerGroup();
+                this._tooltip = new L.Tooltip(this._map);
+                this._tooltip.updateContent({ text: L.drawLocal.edit.handlers.remove.tooltip.text });
+                this._map.on('mousemove', this._onMouseMove, this);
+            }
+        },
+        removeHooks: function () {
+            if (this._map) {
+                this._deletableLayers.eachLayer(this._disableLayerDelete, this);
+                this._deletedLayers = null;
+                this._tooltip.dispose();
+                this._tooltip = null;
+                this._map.off('mousemove', this._onMouseMove, this);
+            }
+        },
+        revertLayers: function () {
+            this._deletedLayers.eachLayer(function (layer) {
+                this._deletableLayers.addLayer(layer);
+                layer.fire('revert-deleted', { layer: layer });
+            }, this);
+        },
+        save: function () {
+            this._map.fire('draw:deleted', { layers: this._deletedLayers });
+        },
+        _enableLayerDelete: function (e) {
+            var layer = e.layer || e.target || e;
+            layer.on('click', this._removeLayer, this);
+        },
+        _disableLayerDelete: function (e) {
+            var layer = e.layer || e.target || e;
+            layer.off('click', this._removeLayer, this);
+            this._deletedLayers.removeLayer(layer);
+        },
+        _removeLayer: function (e) {
+            var layer = e.layer || e.target || e;
+            this._deletableLayers.removeLayer(layer);
+            this._deletedLayers.addLayer(layer);
+            layer.fire('deleted');
+        },
+        _onMouseMove: function (e) {
+            this._tooltip.updatePosition(e.latlng);
+        },
+        _hasAvailableLayers: function () {
+            return this._deletableLayers.getLayers().length !== 0;
+        }
+    });
+}(window, document));
+leafletDraw = undefined;
+(function (factory) {
+    'use strict';
+    if (true) {
+        sortable = function () {
+            return typeof factory === 'function' ? factory() : factory;
+        }();
+    } else if (typeof module != 'undefined' && typeof module.exports != 'undefined') {
+        module.exports = factory();
+    } else if (typeof Package !== 'undefined') {
+        Sortable = factory();
+    } else {
+        window['Sortable'] = factory();
+    }
+}(function () {
+    'use strict';
+    if (typeof window == 'undefined' || typeof window.document == 'undefined') {
+        return function () {
+            throw new Error('Sortable.js requires a window with a document');
+        };
+    }
+    var dragEl, parentEl, ghostEl, cloneEl, rootEl, nextEl, scrollEl, scrollParentEl, lastEl, lastCSS, lastParentCSS, oldIndex, newIndex, activeGroup, autoScroll = {}, tapEvt, touchEvt, moved, RSPACE = /\s+/g, expando = 'Sortable' + new Date().getTime(), win = window, document = win.document, parseInt = win.parseInt, supportDraggable = !!('draggable' in document.createElement('div')), supportCssPointerEvents = function (el) {
+            el = document.createElement('x');
+            el.style.cssText = 'pointer-events:auto';
+            return el.style.pointerEvents === 'auto';
+        }(), _silent = false, abs = Math.abs, slice = [].slice, touchDragOverListeners = [], _autoScroll = _throttle(function (evt, options, rootEl) {
+            if (rootEl && options.scroll) {
+                var el, rect, sens = options.scrollSensitivity, speed = options.scrollSpeed, x = evt.clientX, y = evt.clientY, winWidth = window.innerWidth, winHeight = window.innerHeight, vx, vy;
+                if (scrollParentEl !== rootEl) {
+                    scrollEl = options.scroll;
+                    scrollParentEl = rootEl;
+                    if (scrollEl === true) {
+                        scrollEl = rootEl;
+                        do {
+                            if (scrollEl.offsetWidth < scrollEl.scrollWidth || scrollEl.offsetHeight < scrollEl.scrollHeight) {
+                                break;
+                            }
+                        } while (scrollEl = scrollEl.parentNode);
+                    }
+                }
+                if (scrollEl) {
+                    el = scrollEl;
+                    rect = scrollEl.getBoundingClientRect();
+                    vx = (abs(rect.right - x) <= sens) - (abs(rect.left - x) <= sens);
+                    vy = (abs(rect.bottom - y) <= sens) - (abs(rect.top - y) <= sens);
+                }
+                if (!(vx || vy)) {
+                    vx = (winWidth - x <= sens) - (x <= sens);
+                    vy = (winHeight - y <= sens) - (y <= sens);
+                    (vx || vy) && (el = win);
+                }
+                if (autoScroll.vx !== vx || autoScroll.vy !== vy || autoScroll.el !== el) {
+                    autoScroll.el = el;
+                    autoScroll.vx = vx;
+                    autoScroll.vy = vy;
+                    clearInterval(autoScroll.pid);
+                    if (el) {
+                        autoScroll.pid = setInterval(function () {
+                            if (el === win) {
+                                win.scrollTo(win.pageXOffset + vx * speed, win.pageYOffset + vy * speed);
+                            } else {
+                                vy && (el.scrollTop += vy * speed);
+                                vx && (el.scrollLeft += vx * speed);
+                            }
+                        }, 24);
+                    }
+                }
+            }
+        }, 30), _prepareGroup = function (options) {
+            var group = options.group;
+            if (!group || typeof group != 'object') {
+                group = options.group = { name: group };
+            }
+            [
+                'pull',
+                'put'
+            ].forEach(function (key) {
+                if (!(key in group)) {
+                    group[key] = true;
+                }
+            });
+            options.groups = ' ' + group.name + (group.put.join ? ' ' + group.put.join(' ') : '') + ' ';
+        };
+    function Sortable(el, options) {
+        if (!(el && el.nodeType && el.nodeType === 1)) {
+            throw 'Sortable: `el` must be HTMLElement, and not ' + {}.toString.call(el);
+        }
+        this.el = el;
+        this.options = options = _extend({}, options);
+        el[expando] = this;
+        var defaults = {
+            group: Math.random(),
+            sort: true,
+            disabled: false,
+            store: null,
+            handle: null,
+            scroll: true,
+            scrollSensitivity: 30,
+            scrollSpeed: 10,
+            draggable: /[uo]l/i.test(el.nodeName) ? 'li' : '>*',
+            ghostClass: 'sortable-ghost',
+            chosenClass: 'sortable-chosen',
+            ignore: 'a, img',
+            filter: null,
+            animation: 0,
+            setData: function (dataTransfer, dragEl) {
+                dataTransfer.setData('Text', dragEl.textContent);
+            },
+            dropBubble: false,
+            dragoverBubble: false,
+            dataIdAttr: 'data-id',
+            delay: 0,
+            forceFallback: false,
+            fallbackClass: 'sortable-fallback',
+            fallbackOnBody: false
+        };
+        for (var name in defaults) {
+            !(name in options) && (options[name] = defaults[name]);
+        }
+        _prepareGroup(options);
+        for (var fn in this) {
+            if (fn.charAt(0) === '_') {
+                this[fn] = this[fn].bind(this);
+            }
+        }
+        this.nativeDraggable = options.forceFallback ? false : supportDraggable;
+        _on(el, 'mousedown', this._onTapStart);
+        _on(el, 'touchstart', this._onTapStart);
+        if (this.nativeDraggable) {
+            _on(el, 'dragover', this);
+            _on(el, 'dragenter', this);
+        }
+        touchDragOverListeners.push(this._onDragOver);
+        options.store && this.sort(options.store.get(this));
+    }
+    Sortable.prototype = {
+        constructor: Sortable,
+        _onTapStart: function (evt) {
+            var _this = this, el = this.el, options = this.options, type = evt.type, touch = evt.touches && evt.touches[0], target = (touch || evt).target, originalTarget = target, filter = options.filter;
+            if (type === 'mousedown' && evt.button !== 0 || options.disabled) {
+                return;
+            }
+            target = _closest(target, options.draggable, el);
+            if (!target) {
+                return;
+            }
+            oldIndex = _index(target, options.draggable);
+            if (typeof filter === 'function') {
+                if (filter.call(this, evt, target, this)) {
+                    _dispatchEvent(_this, originalTarget, 'filter', target, el, oldIndex);
+                    evt.preventDefault();
+                    return;
+                }
+            } else if (filter) {
+                filter = filter.split(',').some(function (criteria) {
+                    criteria = _closest(originalTarget, criteria.trim(), el);
+                    if (criteria) {
+                        _dispatchEvent(_this, criteria, 'filter', target, el, oldIndex);
+                        return true;
+                    }
+                });
+                if (filter) {
+                    evt.preventDefault();
+                    return;
+                }
+            }
+            if (options.handle && !_closest(originalTarget, options.handle, el)) {
+                return;
+            }
+            this._prepareDragStart(evt, touch, target);
+        },
+        _prepareDragStart: function (evt, touch, target) {
+            var _this = this, el = _this.el, options = _this.options, ownerDocument = el.ownerDocument, dragStartFn;
+            if (target && !dragEl && target.parentNode === el) {
+                tapEvt = evt;
+                rootEl = el;
+                dragEl = target;
+                parentEl = dragEl.parentNode;
+                nextEl = dragEl.nextSibling;
+                activeGroup = options.group;
+                dragStartFn = function () {
+                    _this._disableDelayedDrag();
+                    dragEl.draggable = true;
+                    _toggleClass(dragEl, _this.options.chosenClass, true);
+                    _this._triggerDragStart(touch);
+                };
+                options.ignore.split(',').forEach(function (criteria) {
+                    _find(dragEl, criteria.trim(), _disableDraggable);
+                });
+                _on(ownerDocument, 'mouseup', _this._onDrop);
+                _on(ownerDocument, 'touchend', _this._onDrop);
+                _on(ownerDocument, 'touchcancel', _this._onDrop);
+                if (options.delay) {
+                    _on(ownerDocument, 'mouseup', _this._disableDelayedDrag);
+                    _on(ownerDocument, 'touchend', _this._disableDelayedDrag);
+                    _on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);
+                    _on(ownerDocument, 'mousemove', _this._disableDelayedDrag);
+                    _on(ownerDocument, 'touchmove', _this._disableDelayedDrag);
+                    _this._dragStartTimer = setTimeout(dragStartFn, options.delay);
+                } else {
+                    dragStartFn();
+                }
+            }
+        },
+        _disableDelayedDrag: function () {
+            var ownerDocument = this.el.ownerDocument;
+            clearTimeout(this._dragStartTimer);
+            _off(ownerDocument, 'mouseup', this._disableDelayedDrag);
+            _off(ownerDocument, 'touchend', this._disableDelayedDrag);
+            _off(ownerDocument, 'touchcancel', this._disableDelayedDrag);
+            _off(ownerDocument, 'mousemove', this._disableDelayedDrag);
+            _off(ownerDocument, 'touchmove', this._disableDelayedDrag);
+        },
+        _triggerDragStart: function (touch) {
+            if (touch) {
+                tapEvt = {
+                    target: dragEl,
+                    clientX: touch.clientX,
+                    clientY: touch.clientY
+                };
+                this._onDragStart(tapEvt, 'touch');
+            } else if (!this.nativeDraggable) {
+                this._onDragStart(tapEvt, true);
+            } else {
+                _on(dragEl, 'dragend', this);
+                _on(rootEl, 'dragstart', this._onDragStart);
+            }
+            try {
+                if (document.selection) {
+                    document.selection.empty();
+                } else {
+                    window.getSelection().removeAllRanges();
+                }
+            } catch (err) {
+            }
+        },
+        _dragStarted: function () {
+            if (rootEl && dragEl) {
+                _toggleClass(dragEl, this.options.ghostClass, true);
+                Sortable.active = this;
+                _dispatchEvent(this, rootEl, 'start', dragEl, rootEl, oldIndex);
+            }
+        },
+        _emulateDragOver: function () {
+            if (touchEvt) {
+                if (this._lastX === touchEvt.clientX && this._lastY === touchEvt.clientY) {
+                    return;
+                }
+                this._lastX = touchEvt.clientX;
+                this._lastY = touchEvt.clientY;
+                if (!supportCssPointerEvents) {
+                    _css(ghostEl, 'display', 'none');
+                }
+                var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY), parent = target, groupName = ' ' + this.options.group.name + '', i = touchDragOverListeners.length;
+                if (parent) {
+                    do {
+                        if (parent[expando] && parent[expando].options.groups.indexOf(groupName) > -1) {
+                            while (i--) {
+                                touchDragOverListeners[i]({
+                                    clientX: touchEvt.clientX,
+                                    clientY: touchEvt.clientY,
+                                    target: target,
+                                    rootEl: parent
+                                });
+                            }
+                            break;
+                        }
+                        target = parent;
+                    } while (parent = parent.parentNode);
+                }
+                if (!supportCssPointerEvents) {
+                    _css(ghostEl, 'display', '');
+                }
+            }
+        },
+        _onTouchMove: function (evt) {
+            if (tapEvt) {
+                if (!Sortable.active) {
+                    this._dragStarted();
+                }
+                this._appendGhost();
+                var touch = evt.touches ? evt.touches[0] : evt, dx = touch.clientX - tapEvt.clientX, dy = touch.clientY - tapEvt.clientY, translate3d = evt.touches ? 'translate3d(' + dx + 'px,' + dy + 'px,0)' : 'translate(' + dx + 'px,' + dy + 'px)';
+                moved = true;
+                touchEvt = touch;
+                _css(ghostEl, 'webkitTransform', translate3d);
+                _css(ghostEl, 'mozTransform', translate3d);
+                _css(ghostEl, 'msTransform', translate3d);
+                _css(ghostEl, 'transform', translate3d);
+                evt.preventDefault();
+            }
+        },
+        _appendGhost: function () {
+            if (!ghostEl) {
+                var rect = dragEl.getBoundingClientRect(), css = _css(dragEl), options = this.options, ghostRect;
+                ghostEl = dragEl.cloneNode(true);
+                _toggleClass(ghostEl, options.ghostClass, false);
+                _toggleClass(ghostEl, options.fallbackClass, true);
+                _css(ghostEl, 'top', rect.top - parseInt(css.marginTop, 10));
+                _css(ghostEl, 'left', rect.left - parseInt(css.marginLeft, 10));
+                _css(ghostEl, 'width', rect.width);
+                _css(ghostEl, 'height', rect.height);
+                _css(ghostEl, 'opacity', '0.8');
+                _css(ghostEl, 'position', 'fixed');
+                _css(ghostEl, 'zIndex', '100000');
+                _css(ghostEl, 'pointerEvents', 'none');
+                options.fallbackOnBody && document.body.appendChild(ghostEl) || rootEl.appendChild(ghostEl);
+                ghostRect = ghostEl.getBoundingClientRect();
+                _css(ghostEl, 'width', rect.width * 2 - ghostRect.width);
+                _css(ghostEl, 'height', rect.height * 2 - ghostRect.height);
+            }
+        },
+        _onDragStart: function (evt, useFallback) {
+            var dataTransfer = evt.dataTransfer, options = this.options;
+            this._offUpEvents();
+            if (activeGroup.pull == 'clone') {
+                cloneEl = dragEl.cloneNode(true);
+                _css(cloneEl, 'display', 'none');
+                rootEl.insertBefore(cloneEl, dragEl);
+            }
+            if (useFallback) {
+                if (useFallback === 'touch') {
+                    _on(document, 'touchmove', this._onTouchMove);
+                    _on(document, 'touchend', this._onDrop);
+                    _on(document, 'touchcancel', this._onDrop);
+                } else {
+                    _on(document, 'mousemove', this._onTouchMove);
+                    _on(document, 'mouseup', this._onDrop);
+                }
+                this._loopId = setInterval(this._emulateDragOver, 50);
+            } else {
+                if (dataTransfer) {
+                    dataTransfer.effectAllowed = 'move';
+                    options.setData && options.setData.call(this, dataTransfer, dragEl);
+                }
+                _on(document, 'drop', this);
+                setTimeout(this._dragStarted, 0);
+            }
+        },
+        _onDragOver: function (evt) {
+            var el = this.el, target, dragRect, revert, options = this.options, group = options.group, groupPut = group.put, isOwner = activeGroup === group, canSort = options.sort;
+            if (evt.preventDefault !== void 0) {
+                evt.preventDefault();
+                !options.dragoverBubble && evt.stopPropagation();
+            }
+            moved = true;
+            if (activeGroup && !options.disabled && (isOwner ? canSort || (revert = !rootEl.contains(dragEl)) : activeGroup.pull && groupPut && (activeGroup.name === group.name || groupPut.indexOf && ~groupPut.indexOf(activeGroup.name))) && (evt.rootEl === void 0 || evt.rootEl === this.el)) {
+                _autoScroll(evt, options, this.el);
+                if (_silent) {
+                    return;
+                }
+                target = _closest(evt.target, options.draggable, el);
+                dragRect = dragEl.getBoundingClientRect();
+                if (revert) {
+                    _cloneHide(true);
+                    if (cloneEl || nextEl) {
+                        rootEl.insertBefore(dragEl, cloneEl || nextEl);
+                    } else if (!canSort) {
+                        rootEl.appendChild(dragEl);
+                    }
+                    return;
+                }
+                if (el.children.length === 0 || el.children[0] === ghostEl || el === evt.target && (target = _ghostIsLast(el, evt))) {
+                    if (target) {
+                        if (target.animated) {
+                            return;
+                        }
+                        targetRect = target.getBoundingClientRect();
+                    }
+                    _cloneHide(isOwner);
+                    if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect) !== false) {
+                        if (!dragEl.contains(el)) {
+                            el.appendChild(dragEl);
+                            parentEl = el;
+                        }
+                        this._animate(dragRect, dragEl);
+                        target && this._animate(targetRect, target);
+                    }
+                } else if (target && !target.animated && target !== dragEl && target.parentNode[expando] !== void 0) {
+                    if (lastEl !== target) {
+                        lastEl = target;
+                        lastCSS = _css(target);
+                        lastParentCSS = _css(target.parentNode);
+                    }
+                    var targetRect = target.getBoundingClientRect(), width = targetRect.right - targetRect.left, height = targetRect.bottom - targetRect.top, floating = /left|right|inline/.test(lastCSS.cssFloat + lastCSS.display) || lastParentCSS.display == 'flex' && lastParentCSS['flex-direction'].indexOf('row') === 0, isWide = target.offsetWidth > dragEl.offsetWidth, isLong = target.offsetHeight > dragEl.offsetHeight, halfway = (floating ? (evt.clientX - targetRect.left) / width : (evt.clientY - targetRect.top) / height) > 0.5, nextSibling = target.nextElementSibling, moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect), after;
+                    if (moveVector !== false) {
+                        _silent = true;
+                        setTimeout(_unsilent, 30);
+                        _cloneHide(isOwner);
+                        if (moveVector === 1 || moveVector === -1) {
+                            after = moveVector === 1;
+                        } else if (floating) {
+                            var elTop = dragEl.offsetTop, tgTop = target.offsetTop;
+                            if (elTop === tgTop) {
+                                after = target.previousElementSibling === dragEl && !isWide || halfway && isWide;
+                            } else {
+                                after = tgTop > elTop;
+                            }
+                        } else {
+                            after = nextSibling !== dragEl && !isLong || halfway && isLong;
+                        }
+                        if (!dragEl.contains(el)) {
+                            if (after && !nextSibling) {
+                                el.appendChild(dragEl);
+                            } else {
+                                target.parentNode.insertBefore(dragEl, after ? nextSibling : target);
+                            }
+                        }
+                        parentEl = dragEl.parentNode;
+                        this._animate(dragRect, dragEl);
+                        this._animate(targetRect, target);
+                    }
+                }
+            }
+        },
+        _animate: function (prevRect, target) {
+            var ms = this.options.animation;
+            if (ms) {
+                var currentRect = target.getBoundingClientRect();
+                _css(target, 'transition', 'none');
+                _css(target, 'transform', 'translate3d(' + (prevRect.left - currentRect.left) + 'px,' + (prevRect.top - currentRect.top) + 'px,0)');
+                target.offsetWidth;
+                _css(target, 'transition', 'all ' + ms + 'ms');
+                _css(target, 'transform', 'translate3d(0,0,0)');
+                clearTimeout(target.animated);
+                target.animated = setTimeout(function () {
+                    _css(target, 'transition', '');
+                    _css(target, 'transform', '');
+                    target.animated = false;
+                }, ms);
+            }
+        },
+        _offUpEvents: function () {
+            var ownerDocument = this.el.ownerDocument;
+            _off(document, 'touchmove', this._onTouchMove);
+            _off(ownerDocument, 'mouseup', this._onDrop);
+            _off(ownerDocument, 'touchend', this._onDrop);
+            _off(ownerDocument, 'touchcancel', this._onDrop);
+        },
+        _onDrop: function (evt) {
+            var el = this.el, options = this.options;
+            clearInterval(this._loopId);
+            clearInterval(autoScroll.pid);
+            clearTimeout(this._dragStartTimer);
+            _off(document, 'mousemove', this._onTouchMove);
+            if (this.nativeDraggable) {
+                _off(document, 'drop', this);
+                _off(el, 'dragstart', this._onDragStart);
+            }
+            this._offUpEvents();
+            if (evt) {
+                if (moved) {
+                    evt.preventDefault();
+                    !options.dropBubble && evt.stopPropagation();
+                }
+                ghostEl && ghostEl.parentNode.removeChild(ghostEl);
+                if (dragEl) {
+                    if (this.nativeDraggable) {
+                        _off(dragEl, 'dragend', this);
+                    }
+                    _disableDraggable(dragEl);
+                    _toggleClass(dragEl, this.options.ghostClass, false);
+                    _toggleClass(dragEl, this.options.chosenClass, false);
+                    if (rootEl !== parentEl) {
+                        newIndex = _index(dragEl, options.draggable);
+                        if (newIndex >= 0) {
+                            _dispatchEvent(null, parentEl, 'sort', dragEl, rootEl, oldIndex, newIndex);
+                            _dispatchEvent(this, rootEl, 'sort', dragEl, rootEl, oldIndex, newIndex);
+                            _dispatchEvent(null, parentEl, 'add', dragEl, rootEl, oldIndex, newIndex);
+                            _dispatchEvent(this, rootEl, 'remove', dragEl, rootEl, oldIndex, newIndex);
+                        }
+                    } else {
+                        cloneEl && cloneEl.parentNode.removeChild(cloneEl);
+                        if (dragEl.nextSibling !== nextEl) {
+                            newIndex = _index(dragEl, options.draggable);
+                            if (newIndex >= 0) {
+                                _dispatchEvent(this, rootEl, 'update', dragEl, rootEl, oldIndex, newIndex);
+                                _dispatchEvent(this, rootEl, 'sort', dragEl, rootEl, oldIndex, newIndex);
+                            }
+                        }
+                    }
+                    if (Sortable.active) {
+                        if (newIndex === null || newIndex === -1) {
+                            newIndex = oldIndex;
+                        }
+                        _dispatchEvent(this, rootEl, 'end', dragEl, rootEl, oldIndex, newIndex);
+                        this.save();
+                    }
+                }
+            }
+            this._nulling();
+        },
+        _nulling: function () {
+            rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = scrollEl = scrollParentEl = tapEvt = touchEvt = moved = newIndex = lastEl = lastCSS = activeGroup = Sortable.active = null;
+        },
+        handleEvent: function (evt) {
+            var type = evt.type;
+            if (type === 'dragover' || type === 'dragenter') {
+                if (dragEl) {
+                    this._onDragOver(evt);
+                    _globalDragOver(evt);
+                }
+            } else if (type === 'drop' || type === 'dragend') {
+                this._onDrop(evt);
+            }
+        },
+        toArray: function () {
+            var order = [], el, children = this.el.children, i = 0, n = children.length, options = this.options;
+            for (; i < n; i++) {
+                el = children[i];
+                if (_closest(el, options.draggable, this.el)) {
+                    order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));
+                }
+            }
+            return order;
+        },
+        sort: function (order) {
+            var items = {}, rootEl = this.el;
+            this.toArray().forEach(function (id, i) {
+                var el = rootEl.children[i];
+                if (_closest(el, this.options.draggable, rootEl)) {
+                    items[id] = el;
+                }
+            }, this);
+            order.forEach(function (id) {
+                if (items[id]) {
+                    rootEl.removeChild(items[id]);
+                    rootEl.appendChild(items[id]);
+                }
+            });
+        },
+        save: function () {
+            var store = this.options.store;
+            store && store.set(this);
+        },
+        closest: function (el, selector) {
+            return _closest(el, selector || this.options.draggable, this.el);
+        },
+        option: function (name, value) {
+            var options = this.options;
+            if (value === void 0) {
+                return options[name];
+            } else {
+                options[name] = value;
+                if (name === 'group') {
+                    _prepareGroup(options);
+                }
+            }
+        },
+        destroy: function () {
+            var el = this.el;
+            el[expando] = null;
+            _off(el, 'mousedown', this._onTapStart);
+            _off(el, 'touchstart', this._onTapStart);
+            if (this.nativeDraggable) {
+                _off(el, 'dragover', this);
+                _off(el, 'dragenter', this);
+            }
+            Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {
+                el.removeAttribute('draggable');
+            });
+            touchDragOverListeners.splice(touchDragOverListeners.indexOf(this._onDragOver), 1);
+            this._onDrop();
+            this.el = el = null;
+        }
+    };
+    function _cloneHide(state) {
+        if (cloneEl && cloneEl.state !== state) {
+            _css(cloneEl, 'display', state ? 'none' : '');
+            !state && cloneEl.state && rootEl.insertBefore(cloneEl, dragEl);
+            cloneEl.state = state;
+        }
+    }
+    function _closest(el, selector, ctx) {
+        if (el) {
+            ctx = ctx || document;
+            do {
+                if (selector === '>*' && el.parentNode === ctx || _matches(el, selector)) {
+                    return el;
+                }
+            } while (el !== ctx && (el = el.parentNode));
+        }
+        return null;
+    }
+    function _globalDragOver(evt) {
+        if (evt.dataTransfer) {
+            evt.dataTransfer.dropEffect = 'move';
+        }
+        evt.preventDefault();
+    }
+    function _on(el, event, fn) {
+        el.addEventListener(event, fn, false);
+    }
+    function _off(el, event, fn) {
+        el.removeEventListener(event, fn, false);
+    }
+    function _toggleClass(el, name, state) {
+        if (el) {
+            if (el.classList) {
+                el.classList[state ? 'add' : 'remove'](name);
+            } else {
+                var className = (' ' + el.className + ' ').replace(RSPACE, ' ').replace(' ' + name + ' ', ' ');
+                el.className = (className + (state ? ' ' + name : '')).replace(RSPACE, ' ');
+            }
+        }
+    }
+    function _css(el, prop, val) {
+        var style = el && el.style;
+        if (style) {
+            if (val === void 0) {
+                if (document.defaultView && document.defaultView.getComputedStyle) {
+                    val = document.defaultView.getComputedStyle(el, '');
+                } else if (el.currentStyle) {
+                    val = el.currentStyle;
+                }
+                return prop === void 0 ? val : val[prop];
+            } else {
+                if (!(prop in style)) {
+                    prop = '-webkit-' + prop;
+                }
+                style[prop] = val + (typeof val === 'string' ? '' : 'px');
+            }
+        }
+    }
+    function _find(ctx, tagName, iterator) {
+        if (ctx) {
+            var list = ctx.getElementsByTagName(tagName), i = 0, n = list.length;
+            if (iterator) {
+                for (; i < n; i++) {
+                    iterator(list[i], i);
+                }
+            }
+            return list;
+        }
+        return [];
+    }
+    function _dispatchEvent(sortable, rootEl, name, targetEl, fromEl, startIndex, newIndex) {
+        var evt = document.createEvent('Event'), options = (sortable || rootEl[expando]).options, onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);
+        evt.initEvent(name, true, true);
+        evt.to = rootEl;
+        evt.from = fromEl || rootEl;
+        evt.item = targetEl || rootEl;
+        evt.clone = cloneEl;
+        evt.oldIndex = startIndex;
+        evt.newIndex = newIndex;
+        rootEl.dispatchEvent(evt);
+        if (options[onName]) {
+            options[onName].call(sortable, evt);
+        }
+    }
+    function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect) {
+        var evt, sortable = fromEl[expando], onMoveFn = sortable.options.onMove, retVal;
+        evt = document.createEvent('Event');
+        evt.initEvent('move', true, true);
+        evt.to = toEl;
+        evt.from = fromEl;
+        evt.dragged = dragEl;
+        evt.draggedRect = dragRect;
+        evt.related = targetEl || toEl;
+        evt.relatedRect = targetRect || toEl.getBoundingClientRect();
+        fromEl.dispatchEvent(evt);
+        if (onMoveFn) {
+            retVal = onMoveFn.call(sortable, evt);
+        }
+        return retVal;
+    }
+    function _disableDraggable(el) {
+        el.draggable = false;
+    }
+    function _unsilent() {
+        _silent = false;
+    }
+    function _ghostIsLast(el, evt) {
+        var lastEl = el.lastElementChild, rect = lastEl.getBoundingClientRect();
+        return (evt.clientY - (rect.top + rect.height) > 5 || evt.clientX - (rect.right + rect.width) > 5) && lastEl;
+    }
+    function _generateId(el) {
+        var str = el.tagName + el.className + el.src + el.href + el.textContent, i = str.length, sum = 0;
+        while (i--) {
+            sum += str.charCodeAt(i);
+        }
+        return sum.toString(36);
+    }
+    function _index(el, selector) {
+        var index = 0;
+        if (!el || !el.parentNode) {
+            return -1;
+        }
+        while (el && (el = el.previousElementSibling)) {
+            if (el.nodeName.toUpperCase() !== 'TEMPLATE' && _matches(el, selector)) {
+                index++;
+            }
+        }
+        return index;
+    }
+    function _matches(el, selector) {
+        if (el) {
+            selector = selector.split('.');
+            var tag = selector.shift().toUpperCase(), re = new RegExp('\\s(' + selector.join('|') + ')(?=\\s)', 'g');
+            return (tag === '' || el.nodeName.toUpperCase() == tag) && (!selector.length || ((' ' + el.className + ' ').match(re) || []).length == selector.length);
+        }
+        return false;
+    }
+    function _throttle(callback, ms) {
+        var args, _this;
+        return function () {
+            if (args === void 0) {
+                args = arguments;
+                _this = this;
+                setTimeout(function () {
+                    if (args.length === 1) {
+                        callback.call(_this, args[0]);
+                    } else {
+                        callback.apply(_this, args);
+                    }
+                    args = void 0;
+                }, ms);
+            }
+        };
+    }
+    function _extend(dst, src) {
+        if (dst && src) {
+            for (var key in src) {
+                if (src.hasOwnProperty(key)) {
+                    dst[key] = src[key];
+                }
+            }
+        }
+        return dst;
+    }
+    Sortable.utils = {
+        on: _on,
+        off: _off,
+        css: _css,
+        find: _find,
+        is: function (el, selector) {
+            return !!_closest(el, selector, el);
+        },
+        extend: _extend,
+        throttle: _throttle,
+        closest: _closest,
+        toggleClass: _toggleClass,
+        index: _index
+    };
+    Sortable.create = function (el, options) {
+        return new Sortable(el, options);
+    };
+    Sortable.version = '1.4.2';
+    return Sortable;
+}));
+CommonControlsLayerSwitcherDOM = function (Sortable) {
+    var LayerSwitcherDOM = {
+        _createDraggableElement: function (elementDraggable, context) {
+            Sortable.create(elementDraggable, {
+                handle: '.GPlayerName',
+                draggable: '.draggable-layer',
+                ghostClass: 'GPghostLayer',
+                animation: 200,
+                onEnd: function (e) {
+                    context._onDragAndDropLayerClick(e);
+                }
+            });
+        },
+        _addUID: function (id) {
+            var uid = this._uid ? id + '-' + this._uid : id;
+            return uid;
+        },
+        _createMainContainerElement: function () {
+            var container = document.createElement('div');
+            container.id = this._addUID('GPlayerSwitcher');
+            container.className = 'GPwidget';
+            return container;
+        },
+        _createMainLayersShowElement: function () {
+            var input = document.createElement('input');
+            input.id = this._addUID('GPshowLayersList');
+            input.type = 'checkbox';
+            return input;
+        },
+        _createMainLayersElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPlayersList');
+            div.className = 'GPpanel';
+            return div;
+        },
+        _createMainPictoElement: function () {
+            var self = this;
+            var label = document.createElement('label');
+            label.id = this._addUID('GPshowLayersListPicto');
+            label.className = 'GPshowAdvancedToolPicto';
+            label.htmlFor = this._addUID('GPshowLayersList');
+            label.title = 'Afficher/masquer le gestionnaire de couches';
+            var spanOpen = document.createElement('span');
+            spanOpen.id = this._addUID('GPshowLayersListOpen');
+            spanOpen.className = 'GPshowAdvancedToolOpen';
+            spanOpen.addEventListener('click', function () {
+                if (document.getElementById(self._addUID('GPshowLayersList')).checked) {
+                    var layers = document.getElementsByClassName('GPlayerInfoOpened');
+                    for (var i = 0; i < layers.length; i++) {
+                        layers[i].className = 'GPlayerInfo';
+                    }
+                    document.getElementById(self._addUID('GPlayerInfoPanel')).className = 'GPlayerInfoPanelClosed';
+                }
+            });
+            label.appendChild(spanOpen);
+            var spanClose = document.createElement('span');
+            spanClose.addEventListener('click', function () {
+                if (document.getElementById(self._addUID('GPshowLayersList')).checked) {
+                    var layers = document.getElementsByClassName('GPlayerInfoOpened');
+                    for (var i = 0; i < layers.length; i++) {
+                        layers[i].className = 'GPlayerInfo';
+                    }
+                    document.getElementById(self._addUID('GPlayerInfoPanel')).className = 'GPlayerInfoPanelClosed';
+                }
+            });
+            spanClose.id = self._addUID('GPshowLayersListClose');
+            label.appendChild(spanClose);
+            return label;
+        },
+        _createMainInfoElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPlayerInfoPanel');
+            div.className = 'GPpanel GPlayerInfoPanelClosed';
+            return div;
+        },
+        _createContainerLayerElement: function (obj) {
+            var container = document.createElement('div');
+            container.id = 'GPlayerSwitcher_ID' + obj.id;
+            container.className = 'GPlayerSwitcher_layer draggable-layer';
+            container.appendChild(this._createBasicToolElement(obj));
+            var array = this._createAdvancedToolShowElement(obj);
+            for (var i = 0; i < array.length; i++) {
+                container.appendChild(array[i]);
+            }
+            container.appendChild(this._createAdvancedToolElement(obj));
+            return container;
+        },
+        _createBasicToolElement: function (obj) {
+            var div = document.createElement('div');
+            div.id = 'GPbasicTools_IDLayer' + obj.id;
+            div.className = 'GPlayerBasicTools';
+            div.appendChild(this._createBasicToolNameElement(obj));
+            var array = this._createBasicToolVisibilityElement(obj);
+            for (var i = 0; i < array.length; i++) {
+                div.appendChild(array[i]);
+            }
+            return div;
+        },
+        _createBasicToolNameElement: function (obj) {
+            var span = document.createElement('span');
+            span.id = 'GPname_ID' + obj.id;
+            span.className = 'GPlayerName';
+            span.title = obj.description || obj.title;
+            span.innerHTML = obj.title;
+            return span;
+        },
+        _createBasicToolVisibilityElement: function (obj) {
+            var list = [];
+            var checked = obj.visibility;
+            var id = 'GPvisibility_ID' + obj.id;
+            var input = document.createElement('input');
+            input.id = id;
+            input.type = 'checkbox';
+            input.checked = checked;
+            var label = document.createElement('label');
+            label.htmlFor = id;
+            label.id = 'GPvisibilityPicto_ID' + obj.id;
+            label.className = 'GPlayerVisibility';
+            label.title = 'Afficher/masquer la couche';
+            var context = this;
+            if (input.addEventListener) {
+                input.addEventListener('click', function (e) {
+                    context._onVisibilityLayerClick.call(context, e);
+                });
+            } else if (input.attachEvent) {
+                input.attachEvent('onclick', function (e) {
+                    context._onVisibilityLayerClick.call(context, e);
+                });
+            }
+            list.push(input);
+            list.push(label);
+            return list;
+        },
+        _createAdvancedToolShowElement: function (obj) {
+            var list = [];
+            var label = document.createElement('label');
+            label.id = 'GPshowAdvancedToolsPicto_ID' + obj.id;
+            label.htmlFor = 'GPshowAdvancedTools_ID' + obj.id;
+            label.title = 'Plus d\'outils';
+            label.className = 'GPshowMoreOptions GPshowLayerAdvancedTools';
+            var input = document.createElement('input');
+            input.type = 'checkbox';
+            input.id = 'GPshowAdvancedTools_ID' + obj.id;
+            list.push(input);
+            list.push(label);
+            return list;
+        },
+        _createAdvancedToolElement: function (obj) {
+            var container = document.createElement('div');
+            container.id = 'GPadvancedTools_ID' + obj.id;
+            container.className = 'GPlayerAdvancedTools';
+            container.appendChild(this._createAdvancedToolDeleteElement(obj));
+            if (obj.title && obj.description) {
+                container.appendChild(this._createAdvancedToolInformationElement(obj));
+            }
+            if (obj.type !== 'feature') {
+                var array = this._createAdvancedToolOpacityElement(obj);
+                for (var i = 0; i < array.length; i++) {
+                    container.appendChild(array[i]);
+                }
+            }
+            return container;
+        },
+        _createAdvancedToolDeleteElement: function (obj) {
+            var div = document.createElement('div');
+            div.id = 'GPremove_ID' + obj.id;
+            div.className = 'GPlayerRemove';
+            div.title = 'Supprimer la couche';
+            div.layerId = obj.id;
+            var context = this;
+            if (div.addEventListener) {
+                div.addEventListener('click', function (e) {
+                    context._onDropLayerClick.call(context, e);
+                });
+            } else if (div.attachEvent) {
+                div.attachEvent('onclick', function (e) {
+                    context._onDropLayerClick.call(context, e);
+                });
+            }
+            return div;
+        },
+        _createAdvancedToolInformationElement: function (obj) {
+            var div = document.createElement('div');
+            div.id = 'GPinfo_ID' + obj.id;
+            div.className = 'GPlayerInfo';
+            div.title = 'Informations/légende';
+            div.layerId = obj.id;
+            var context = this;
+            if (div.addEventListener) {
+                div.addEventListener('click', function (e) {
+                    context._onOpenLayerInfoClick.call(context, e);
+                });
+            } else if (div.attachEvent) {
+                div.attachEvent('onclick', function (e) {
+                    context._onOpenLayerInfoClick.call(context, e);
+                });
+            }
+            return div;
+        },
+        _createAdvancedToolOpacityElement: function (obj) {
+            var list = [];
+            var divO = document.createElement('div');
+            divO.id = 'GPopacity_ID' + obj.id;
+            divO.className = 'GPlayerOpacity';
+            divO.title = 'Opacité';
+            var opacity = Math.round(obj.opacity * 100);
+            var input = document.createElement('input');
+            input.id = 'GPopacityValueDiv_ID' + obj.id;
+            input.type = 'range';
+            input.value = opacity;
+            var context = this;
+            if (input.addEventListener) {
+                input.addEventListener('change', function (e) {
+                    context._onChangeLayerOpacity.call(context, e);
+                });
+            } else if (input.attachEvent) {
+                input.attachEvent('onchange', function (e) {
+                    context._onChangeLayerOpacity.call(context, e);
+                });
+            }
+            if (input.addEventListener) {
+                input.addEventListener('input', function (e) {
+                    context._onChangeLayerOpacity.call(context, e);
+                });
+            } else if (input.attachEvent) {
+                input.attachEvent('oninput', function (e) {
+                    context._onChangeLayerOpacity.call(context, e);
+                });
+            }
+            divO.appendChild(input);
+            var divC = document.createElement('div');
+            divC.id = 'GPopacityValueDiv_ID' + obj.id;
+            divC.className = 'GPlayerOpacityValue';
+            var span = document.createElement('span');
+            span.id = 'GPopacityValue_ID' + obj.id;
+            span.innerHTML = opacity + '%';
+            divC.appendChild(span);
+            list.push(divO);
+            list.push(divC);
+            return list;
+        },
+        _createContainerLayerInfoElement: function (obj) {
+            var container = document.createElement('div');
+            container.id = 'GPlayerInfoContent';
+            var title = document.createElement('div');
+            title.id = 'GPlayerInfoTitle';
+            title.innerHTML = obj.title;
+            container.appendChild(title);
+            if (obj.quicklookUrl) {
+                var quick = document.createElement('div');
+                quick.id = 'GPlayerInfoQuicklook';
+                quick.title = 'Afficher un aperçu de la couche';
+                var refquick = document.createElement('a');
+                refquick.href = obj.quicklookUrl;
+                refquick.appendChild(quick);
+                container.appendChild(refquick);
+            }
+            var close = document.createElement('div');
+            close.id = 'GPlayerInfoClose';
+            close.title = 'Fermer la fenêtre';
+            var onCloseClick = function () {
+                document.getElementById('GPlayerInfoPanel').className = 'GPlayerInfoPanelClosed';
+                var layers = document.getElementsByClassName('GPlayerInfoOpened');
+                for (var i = 0; i < layers.length; i++) {
+                    layers[i].className = 'GPlayerInfo';
+                }
+            };
+            if (close.addEventListener) {
+                close.addEventListener('click', onCloseClick);
+            } else if (close.attachEvent) {
+                close.attachEvent('onclick', onCloseClick);
+            }
+            container.appendChild(close);
+            var desc = document.createElement('div');
+            desc.id = 'GPlayerInfoDescription';
+            desc.innerHTML = obj.description;
+            container.appendChild(desc);
+            if (obj.metadata) {
+                var mtd = document.createElement('div');
+                mtd.id = 'GPlayerInfoMetadata';
+                var mtdtitle = document.createElement('div');
+                mtdtitle.className = 'GPlayerInfoSubtitle';
+                mtdtitle.innerHTML = 'Métadonnées';
+                mtd.appendChild(mtdtitle);
+                for (var i = 0; i < obj.metadata.length; i++) {
+                    var urlmtd = obj.metadata[i].url;
+                    var mtdlink = document.createElement('div');
+                    mtdlink.className = 'GPlayerInfoLink';
+                    var refmtd = document.createElement('a');
+                    refmtd.href = urlmtd;
+                    refmtd.innerHTML = urlmtd;
+                    mtdlink.appendChild(refmtd);
+                    mtd.appendChild(mtdlink);
+                }
+                if (obj.metadata.length !== 0) {
+                    container.appendChild(mtd);
+                }
+            }
+            if (obj.legends) {
+                var lgd = document.createElement('div');
+                lgd.id = 'GPlayerInfoLegend';
+                var lgdtitle = document.createElement('div');
+                lgdtitle.className = 'GPlayerInfoSubtitle';
+                lgdtitle.innerHTML = 'Légende';
+                lgd.appendChild(lgdtitle);
+                var legends = {};
+                var maxScale = obj.maxScaleDenominator || 560000000;
+                for (var k = 0; k < obj.legends.length; k++) {
+                    var minScale = obj.legends[k].minScaleDenominator;
+                    if (minScale) {
+                        var s = minScale.toString();
+                        minScale = Math.round(parseInt(s.substring(0, 3), 10) / 10) * Math.pow(10, s.length - 2);
+                    } else {
+                        minScale = 270;
+                    }
+                    legends[minScale] = obj.legends[k];
+                }
+                for (var scale in legends) {
+                    if (legends.hasOwnProperty(scale)) {
+                        var urllgd = legends[scale].url;
+                        if (typeof urllgd === 'string' && urllgd.toLowerCase().indexOf('nolegend.jpg') == -1) {
+                            var lgdlink = document.createElement('div');
+                            lgdlink.className = 'GPlayerInfoLink';
+                            maxScale = legends[scale].maxScaleDenominator || maxScale;
+                            var reflgd = document.createElement('a');
+                            reflgd.href = urllgd;
+                            reflgd.innerHTML = 'Du 1/' + scale + ' au 1/' + maxScale;
+                            lgdlink.appendChild(reflgd);
+                            lgd.appendChild(lgdlink);
+                        } else {
+                            delete legends[scale];
+                        }
+                    }
+                }
+                if (Object.keys(legends).length !== 0) {
+                    container.appendChild(lgd);
+                }
+            }
+            return container;
+        }
+    };
+    return LayerSwitcherDOM;
+}(sortable);
+LeafletControlsLayerSwitcher = function (L, woodman, LayerSwitcherDOM) {
+    var LayerSwitcher = L.Control.Layers.extend({
+        includes: LayerSwitcherDOM,
+        options: {
+            collapsed: true,
+            position: 'topright',
+            autoZIndex: true,
+            layers: []
+        },
+        initialize: function (options) {
+            L.Util.setOptions(this, options);
+            this._hasLayersConfig = !this.options.layers || Object.keys(this.options.layers).length === 0 ? false : true;
+            this._layersConfig = this._hasLayersConfig ? this.options.layers : [];
+            this._layers = {};
+            this._lastZIndex = 0;
+            if (this._hasLayersConfig) {
+                for (var i = 0; i < this._layersConfig.length; i++) {
+                    var obj = this._layersConfig[i];
+                    this._addLayer(obj.layer, null, true);
+                }
+            }
+        },
+        onAdd: function (map) {
+            var layersMap = map._layers;
+            if (Object.keys(layersMap).length !== 0) {
+                var layersKeys = Object.keys(layersMap);
+                this._lastZIndex = 0;
+                for (var i = 0; i < layersKeys.length; i++) {
+                    var layerId = layersKeys[i];
+                    if (this.options.autoZIndex && layersMap[layerId].setZIndex) {
+                        this._lastZIndex++;
+                        layersMap[layerId].setZIndex(this._lastZIndex);
+                    }
+                    if (this._hasLayersConfig) {
+                        if (this._layers[layerId]) {
+                            continue;
+                        }
+                    }
+                    this.addOverlay(layersMap[layerId]);
+                }
+            }
+            if (Object.keys(layersMap).length === 0) {
+                var config = this._layersConfig;
+                this._lastZIndex = 0;
+                for (var j = 0; j < config.length; j++) {
+                    var layer = config[j].layer;
+                    if (!map.hasLayer(layer)) {
+                        map.addLayer(layer);
+                        this.addOverlay(layer, null);
+                        if (this.options.autoZIndex && layer.setZIndex) {
+                            this._lastZIndex++;
+                            layer.setZIndex(this._lastZIndex);
+                        }
+                    }
+                }
+            }
+            for (var k in this._layers) {
+                if (this._layers.hasOwnProperty(k)) {
+                    var obj = this._layers[k];
+                    if (!obj.visibility) {
+                        this._visibilityLayer(!obj.visibility, obj.layer);
+                    }
+                }
+            }
+            this._initLayout();
+            this._update();
+            map.on('layeradd', this._onLayerChange, this);
+            map.on('layerremove', this._onLayerChange, this);
+            return this._container;
+        },
+        _addLayer: function (layer, name, overlay) {
+            var id = layer._geoportal_id ? layer._geoportal_id : layer._leaflet_id;
+            if (!id) {
+                return;
+            }
+            var layerConfig = {};
+            for (var i in this._layersConfig) {
+                if (this._layersConfig.hasOwnProperty(i)) {
+                    if (id === L.stamp(this._layersConfig[i].layer)) {
+                        layerConfig = this._layersConfig[i].config;
+                        var display = typeof this._layersConfig[i].display != 'undefined' ? this._layersConfig[i].display : true;
+                        if (!display) {
+                            return;
+                        }
+                        break;
+                    }
+                }
+            }
+            this._layers[id] = {
+                layer: layer,
+                id: id,
+                overlay: overlay,
+                title: layer._geoportal_id && layer._title ? layer._title : name ? name : id,
+                description: layer._geoportal_id && layer._description ? layer._description : name ? name : id,
+                visibility: layer._geoportal_id ? layer.getVisible() : true,
+                legends: layer._geoportal_id ? layer._legends : null,
+                metadata: layer._geoportal_id ? layer._metadata : null,
+                quicklookUrl: layer._geoportal_id ? layer._quicklookUrl : null
+            };
+            if (layerConfig && Object.keys(layerConfig)) {
+                L.Util.extend(this._layers[id], layerConfig);
+            }
+            layer._geoportal_id ? layer.setVisible(this._layers[id].visibility) : null;
+        },
+        _initLayout: function () {
+            var container = this._container = this._createMainContainerElement();
+            var input = this._createMainLayersShowElement();
+            container.appendChild(input);
+            if (!this.options.collapsed) {
+                input.checked = 'checked';
+            }
+            var divL = this._overlaysList = this._createMainLayersElement();
+            container.appendChild(divL);
+            var picto = this._createMainPictoElement();
+            container.appendChild(picto);
+            var divI = this._createMainInfoElement();
+            container.appendChild(divI);
+            this._createDraggableElement(this._overlaysList, this);
+            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
+            this._map.on('moveend', this._onOutOfRangeLayerZoom, this);
+            switch (this.getPosition()) {
+            case 'topright':
+                container.style.position = 'relative';
+                container.style.top = '0';
+                container.style.right = '0';
+                break;
+            case 'topleft':
+                container.style.position = 'relative';
+                container.style.top = '0';
+                container.style.right = 'initial';
+                picto.style.float = 'left';
+                divL.style.borderBottomRightRadius = '5px';
+                divL.style.borderBottomLeftRadius = '0';
+                divI.style.right = 'initial';
+                divI.style.left = '190px';
+                break;
+            case 'bottomleft':
+                container.style.position = 'relative';
+                container.style.top = '0';
+                container.style.right = 'initial';
+                picto.style.float = 'left';
+                divL.style.borderBottomRightRadius = '5px';
+                divL.style.borderBottomLeftRadius = '0';
+                divI.style.right = 'initial';
+                divI.style.left = '190px';
+                break;
+            case 'bottomright':
+                container.style.position = 'relative';
+                container.style.top = '0';
+                container.style.right = '0';
+                break;
+            default:
+                container.style.position = 'relative';
+                container.style.top = '0';
+                container.style.right = '0';
+            }
+        },
+        _update: function () {
+            if (!this._container) {
+                return;
+            }
+            this._overlaysList.innerHTML = '';
+            var layersId = [];
+            for (var i in this._layers) {
+                if (this._layers.hasOwnProperty(i)) {
+                    layersId.push(i);
+                }
+            }
+            var layers = layersId.sort(function (a, b) {
+                var ia = parseInt(a, 10);
+                var ib = parseInt(b, 10);
+                return ia - ib;
+            }).reverse();
+            for (var j = 0; j < layers.length; j++) {
+                var id = layers[j];
+                var obj = this._layers[id];
+                this._addItem(obj);
+            }
+        },
+        _addItem: function (obj) {
+            obj.opacity = obj.layer.options.opacity;
+            var container = this._createContainerLayerElement(obj);
+            obj.layer.options.minZoom > this._map.getZoom() || obj.layer.options.maxZoom < this._map.getZoom() ? L.DomUtil.addClass(container, 'outOfRange') : L.DomUtil.removeClass(container, 'outOfRange');
+            this._overlaysList.appendChild(container);
+            return container;
+        },
+        _onLayerChange: function (e) {
+            var obj = this._layers[L.stamp(e.layer)];
+            if (!obj) {
+                return;
+            }
+            if (!this._handlingClick) {
+                this._update();
+            }
+            var type = e.type === 'layeradd' ? 'overlayadd' : 'overlayremove';
+            if (type) {
+                this._map.fire(type, obj);
+            }
+        },
+        removeLayer: function (layer) {
+            var id = L.stamp(layer);
+            delete this._layers[id];
+            this._update();
+            return this;
+        },
+        _visibilityLayer: function (checked, layer) {
+            this._handlingClick = true;
+            if (layer._geoportal_id) {
+                var value = !layer.getVisible();
+                layer.setVisible(value);
+            }
+            if (checked && this._map.hasLayer(layer)) {
+                this._map.removeLayer(layer);
+            } else if (!checked && !this._map.hasLayer(layer)) {
+                this._map.addLayer(layer);
+            } else {
+            }
+            this._handlingClick = false;
+            this._refocusOnMap();
+        },
+        _onOutOfRangeLayerZoom: function () {
+            var map = this._map;
+            var layers = this._layers;
+            for (var i in layers) {
+                if (layers.hasOwnProperty(i)) {
+                    var layer = layers[i].layer;
+                    var id = layers[i].id;
+                    var div = L.DomUtil.get('GPlayerSwitcher_ID' + id);
+                    if (layer.options.minZoom > map.getZoom() || layer.options.maxZoom < map.getZoom()) {
+                        L.DomUtil.addClass(div, 'outOfRange');
+                    } else {
+                        L.DomUtil.removeClass(div, 'outOfRange');
+                    }
+                }
+            }
+        },
+        _onVisibilityLayerClick: function (e) {
+            var layerId = e.target.id;
+            var layerIdx = layerId.substring(layerId.indexOf('_') + 3);
+            var input = L.DomUtil.get(layerId);
+            this._layers[layerIdx].visibility = input.checked;
+            this._visibilityLayer(!input.checked, this._layers[layerIdx].layer);
+        },
+        _onDropLayerClick: function (e) {
+            var layerId = e.target.id;
+            var layerIdx = layerId.substring(layerId.indexOf('_') + 3);
+            var layer = this._layers[layerIdx].layer;
+            this.removeLayer(layer);
+            if (this._map.hasLayer(layer)) {
+                this._map.removeLayer(layer);
+            }
+        },
+        _onChangeLayerOpacity: function (e) {
+            var layerId = e.target.id;
+            var layerIdx = layerId.substring(layerId.indexOf('_') + 3);
+            var layer = this._layers[layerIdx].layer;
+            var opacityValue = e.target.value;
+            var opacityId = L.DomUtil.get('GPopacityValue_ID' + layerIdx);
+            opacityId.innerHTML = opacityValue + '%';
+            if (this._map.hasLayer(layer)) {
+                layer.setOpacity(opacityValue / 100);
+            }
+        },
+        _onOpenLayerInfoClick: function (e) {
+            var layerId = e.target.id;
+            var layerIdx = layerId.substring(layerId.indexOf('_') + 3);
+            var layer = this._layers[layerIdx];
+            var divId = L.DomUtil.get(e.target.id);
+            var panel = null;
+            var info = null;
+            if (divId.className === 'GPlayerInfoOpened') {
+                L.DomUtil.removeClass(divId, 'GPlayerInfoOpened');
+                L.DomUtil.addClass(divId, 'GPlayerInfo');
+                panel = L.DomUtil.get('GPlayerInfoPanel');
+                L.DomUtil.removeClass(panel, 'GPpanel');
+                L.DomUtil.removeClass(panel, 'GPlayerInfoPanelOpened');
+                L.DomUtil.addClass(panel, 'GPlayerInfoPanelClosed');
+                info = L.DomUtil.get('GPlayerInfoContent');
+                panel.removeChild(info);
+                return;
+            }
+            var layers = document.getElementsByClassName('GPlayerInfoOpened');
+            for (var i = 0; i < layers.length; i++) {
+                layers[i].className = 'GPlayerInfo';
+            }
+            L.DomUtil.removeClass(divId, 'GPlayerInfo');
+            L.DomUtil.addClass(divId, 'GPlayerInfoOpened');
+            panel = L.DomUtil.get('GPlayerInfoPanel');
+            L.DomUtil.addClass(panel, 'GPpanel');
+            L.DomUtil.removeClass(panel, 'GPlayerInfoPanelClosed');
+            L.DomUtil.addClass(panel, 'GPlayerInfoPanelOpened');
+            info = L.DomUtil.get('GPlayerInfoContent');
+            if (info) {
+                panel.removeChild(info);
+            }
+            var infoLayer = this._createContainerLayerInfoElement(layer);
+            panel.appendChild(infoLayer);
+        },
+        _onDragAndDropLayerClick: function (e) {
+            var layerId = e.item.id;
+            var layerIdx = layerId.substring(layerId.indexOf('_') + 3);
+            var layer = this._layers[layerIdx].layer;
+            var matchesLayers = document.querySelectorAll('div.GPlayerSwitcher_layer');
+            this._lastZIndex = matchesLayers.length;
+            for (var i = 0; i < matchesLayers.length; i++) {
+                var tag = matchesLayers[i].id;
+                var id = tag.substring(tag.indexOf('_') + 3);
+                var _layer = this._layers[id].layer;
+                if (this.options.autoZIndex && _layer.setZIndex) {
+                    this._lastZIndex--;
+                    _layer.setZIndex(this._lastZIndex);
+                }
+            }
+        },
+        addLayer: function (layer, config) {
+            var map = this._map;
+            var cfg = this._layersConfig;
+            if (!layer) {
+                console.log('[ERROR] LayerSwitcher:addLayer - missing layer parameter !');
+                return;
+            }
+            if (!map.hasLayer(layer)) {
+                console.log('[WARN] LayerSwitcher:addLayer - layer has not been added on map !');
+            }
+            var id = L.stamp(layer);
+            for (var i in cfg) {
+                if (cfg.hasOwnProperty(i)) {
+                    if (id === L.stamp(cfg[i].layer)) {
+                        delete cfg[i];
+                        break;
+                    }
+                }
+            }
+            var _config = config || {};
+            L.Util.extend(_config, { layer: layer });
+            cfg.push(_config);
+            layer.setZIndex(this._lastZIndex++);
+            this.addOverlay(layer);
+            this._update();
+        }
+    });
+    return LayerSwitcher;
+}(leaflet, {}, CommonControlsLayerSwitcherDOM);
+CommonUtilsConfig = function () {
+    var Config = {
+        configuration: null,
+        isConfigLoaded: function () {
+            var scope = typeof window !== 'undefined' ? window : {};
+            if (scope.Gp && scope.Gp.Config && Object.keys(scope.Gp.Config).length !== 0) {
+                this.configuration = scope.Gp.Config;
+                return true;
+            }
+            return false;
+        },
+        getLayerId: function (layerName, service) {
+            var layerId = null;
+            if (this.configuration) {
+                var layers = this.configuration['layers'];
+                for (var key in layers) {
+                    if (layers.hasOwnProperty(key)) {
+                        var parts = key.split('$');
+                        if (layerName === parts[0]) {
+                            if (parts[1]) {
+                                var servicePartsLayer = parts[1].split(':');
+                                var servicePartsService = parts[1].split(';');
+                                if (servicePartsService[1] === service) {
+                                    layerId = key;
+                                    break;
+                                }
+                                if (servicePartsLayer[2] === service) {
+                                    layerId = key;
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            if (!layerId) {
+                console.log('ERROR layer id (' + layerName + ' / ' + service + ') was not found !?');
+            }
+            return layerId;
+        },
+        getLayerParams: function (layerName, service, apiKey) {
+            var params = {};
+            if (this.configuration) {
+                var layerId = this.getLayerId(layerName, service);
+                if (layerId) {
+                    var layerConf = this.configuration.layers[layerId];
+                    var key = layerConf.apiKeys[0];
+                    if (apiKey) {
+                        if (apiKey !== key) {
+                            console.log('ERROR different keys (' + apiKey + ' !== ' + key + ') !?');
+                            return;
+                        }
+                    }
+                    apiKey = apiKey || key;
+                    params.key = apiKey;
+                    params.url = layerConf.getServerUrl(apiKey);
+                    params.version = layerConf.getServiceParams().version;
+                    params.styles = layerConf.getDefaultStyle();
+                    params.format = layerConf.getDefaultFormat();
+                    params.projection = layerConf.getDefaultProjection();
+                    params.minScale = layerConf.getMinScaleDenominator();
+                    params.maxScale = layerConf.getMaxScaleDenominator();
+                    params.extent = layerConf.getBBOX();
+                    params.legends = layerConf.getLegends();
+                    params.metadata = layerConf.getMetadata();
+                    params.originators = layerConf.getOriginators();
+                    params.title = layerConf.getTitle();
+                    params.description = layerConf.getDescription();
+                    params.quicklookUrl = layerConf.getQuicklookUrl();
+                    if (layerConf.wmtsOptions) {
+                        params.tileMatrixSetLimits = layerConf.wmtsOptions.tileMatrixSetLimits;
+                    }
+                    var TMSLink = layerConf.getTMSID();
+                    if (TMSLink) {
+                        params.TMSLink = TMSLink;
+                        var tmsConf = this.configuration.getTMSConf(TMSLink);
+                        params.matrixOrigin = tmsConf.getTopLeftCorner();
+                        params.nativeResolutions = tmsConf.nativeResolutions;
+                        params.matrixIds = tmsConf.matrixIds;
+                        params.tileMatrices = tmsConf.tileMatrices;
+                    }
+                }
+            }
+            return params;
+        },
+        getServiceParams: function (resource, service, apiKey) {
+            var params = {};
+            if (this.configuration) {
+                var layerId = this.getLayerId(resource, service);
+                if (layerId) {
+                    var layerConf = this.configuration.layers[layerId];
+                    var key = layerConf.apiKeys[0];
+                    if (apiKey) {
+                        if (apiKey !== key) {
+                            return;
+                        }
+                    }
+                    apiKey = apiKey || key;
+                    params.key = apiKey;
+                    params.url = layerConf.getServerUrl(apiKey);
+                    params.version = layerConf.getServiceParams().version;
+                    params.extent = layerConf.getBBOX();
+                    params.title = layerConf.getTitle();
+                    params.description = layerConf.getDescription();
+                }
+            }
+            return params;
+        },
+        getResolutions: function () {
+            var resolutions = [];
+            if (this.configuration) {
+                resolutions = this.configuration['generalOptions']['wgs84Resolutions'];
+            }
+            return resolutions;
+        },
+        getTileMatrix: function (tmsName) {
+            var tms = {};
+            if (this.configuration) {
+                if (tmsName) {
+                    tms = this.configuration['tileMatrixSets'][tmsName.toUpperCase()];
+                }
+            }
+            return tms;
+        },
+        getGlobalConstraints: function (layerId) {
+            var params = {};
+            if (layerId) {
+                var layerConf = this.configuration.layers[layerId];
+                params.projection = layerConf.getDefaultProjection();
+                params.minScale = layerConf.getMinScaleDenominator();
+                params.maxScale = layerConf.getMaxScaleDenominator();
+                params.extent = layerConf.getBBOX();
+            }
+            return params;
+        }
+    };
+    return Config;
+}();
+CommonUtilsCheckRightManagement = function (woodman, Config) {
+    return {
+        check: function (options) {
+            if (!options) {
+                return;
+            }
+            var _key = options.key;
+            var _resources = options.resources || [];
+            var _services = options.services || [];
+            if (!_resources || _resources.length === 0) {
+                return;
+            }
+            if (!_services || _services.length === 0) {
+                return;
+            }
+            var _rightManagement = {};
+            if (!_key) {
+                if (!Config.isConfigLoaded()) {
+                    console.log('WARNING : ' + 'parameter \'apiKey\' has not been parametered, ' + 'and the contract key configuration has not been loaded, ' + 'so impossible to check yours rights !');
+                    return;
+                } else {
+                    _key = Object.keys(Config.configuration.generalOptions.apiKeys)[0];
+                }
+            }
+            if (_key) {
+                if (!Config.isConfigLoaded()) {
+                    console.log('WARNING : ' + 'the contract key configuration has not been loaded, ' + 'so be carefull !');
+                    var _noRightManagement = {};
+                    for (var i = 0; i < _services.length; i++) {
+                        var service = _services[i];
+                        _noRightManagement[service] = [];
+                        for (var j = 0; j < _resources.length; j++) {
+                            var resource = _resources[j];
+                            _noRightManagement[service].push(resource);
+                        }
+                    }
+                    _noRightManagement.key = _key;
+                    return _noRightManagement;
+                } else {
+                    for (var k = 0; k < _resources.length; k++) {
+                        var _resource = _resources[k];
+                        for (var l = 0; l < _services.length; l++) {
+                            var _service = _services[l];
+                            var params = Config.getServiceParams(_resource, _service, _key);
+                            if (!params || Object.keys(params).length === 0) {
+                                console.log('WARNING : ' + 'contract key configuration has no rights to load this geoportal ' + 'resource (' + _resource + ') ' + 'for this service (' + _service + ') ');
+                                continue;
+                            }
+                            if (!_rightManagement[_service]) {
+                                _rightManagement[_service] = [];
+                            }
+                            _rightManagement[_service].push(_resource);
+                        }
+                    }
+                    if (!_rightManagement || Object.keys(_rightManagement).length === 0) {
+                        console.log('WARNING : ' + 'the contract key configuration has been loaded, ' + 'and the parameter \'apiKey\' has been parametered, ' + 'but, there is a problem on the mapping between the contract and the key !');
+                        return;
+                    }
+                    _rightManagement.key = _key;
+                    return _rightManagement;
+                }
+            }
+        }
+    };
+}({}, CommonUtilsConfig);
+CommonUtilsSelectorID = function () {
+    var SelectorID = {
+        generate: function () {
+            var timestamp = Math.floor(Date.now());
+            return function () {
+                return timestamp++;
+            };
+        }(),
+        name: function (id) {
+            var name = null;
+            var i = id.indexOf('-');
+            if (i === -1) {
+                name = id;
+            } else {
+                name = id.substring(0, i);
+            }
+            return name;
+        },
+        index: function (id) {
+            var index = null;
+            var name = this.name(id);
+            if (name !== id) {
+                var i = name.indexOf('_');
+                if (i !== -1) {
+                    index = name.substring(i + 1);
+                }
+            }
+            return index;
+        },
+        uuid: function (id) {
+            var uuid = null;
+            var i = id.indexOf('-');
+            if (i !== -1) {
+                uuid = parseInt(id.substring(i + 1), 10);
+            }
+            return uuid;
+        }
+    };
+    return SelectorID;
+}();
+CommonControlsLocationSelectorDOM = function (ID) {
+    var LocationSelectorDOM = {
+        _addUID: function (id) {
+            return id + '-' + this._uid;
+        },
+        _createMainContainerElement: function () {
+            var container = document.createElement('div');
+            container.className = this._addUID('GPlocationPoint');
+            container.className += ' GPwidget';
+            return container;
+        },
+        _createLocationPointElement: function (id, display) {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPlocationPoint_' + id);
+            div.className = display ? 'GPflexInput GPlocationStageFlexInput' : 'GPflexInput GPlocationStageFlexInputHidden';
+            div.style.cssText = '';
+            return div;
+        },
+        _createLocationPointLabelElement: function (id, text) {
+            var self = this;
+            var labelOrigin = document.createElement('label');
+            labelOrigin.id = this._addUID('GPlocationOriginLabel_' + id);
+            labelOrigin.htmlFor = 'GPlocationOrigin_' + id;
+            labelOrigin.innerHTML = text;
+            labelOrigin.addEventListener('click', function (e) {
+                var i = ID.index(this.id);
+                var points = document.getElementsByClassName(self._addUID('GPlocationPoint'));
+                for (var j = 0; j < points.length; j++) {
+                    var tag = points[j].childNodes[0].id;
+                    var id = ID.index(tag);
+                    document.getElementById(self._addUID('GPlocationPoint_' + id)).style.cssText = '';
+                }
+                document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).value = '';
+                document.getElementById(self._addUID('GPlocationOrigin_' + i)).value = '';
+                document.getElementById(self._addUID('GPlocationPoint_' + i)).style.cssText = '';
+                document.getElementById(self._addUID('GPlocationOriginPointer_' + i)).checked = false;
+                document.getElementById(self._addUID('GPlocationOrigin_' + i)).className = 'GPlocationOriginVisible';
+                document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).className = 'GPlocationOriginHidden';
+                if (document.getElementById(self._addUID('GPlocationStageRemove_' + i))) {
+                    document.getElementById(self._addUID('GPlocationStageRemove_' + i)).className = 'GPlocationStageRemove';
+                }
+                if (document.getElementById(self._addUID('GPlocationStageAdd'))) {
+                    document.getElementById(self._addUID('GPlocationStageAdd')).className = '';
+                }
+                self.onLocationClearPointClick(e);
+            });
+            return labelOrigin;
+        },
+        _createLocationAutoCompleteteInputElement: function (id) {
+            var self = this;
+            var inputOrigin = document.createElement('input');
+            inputOrigin.id = this._addUID('GPlocationOrigin_' + id);
+            inputOrigin.className = 'GPlocationOriginVisible';
+            inputOrigin.type = 'text';
+            inputOrigin.placeholder = 'Saisir une adresse';
+            inputOrigin.autocomplete = 'off';
+            inputOrigin.addEventListener('keyup', function (e) {
+                var charCode = e.which || e.keyCode;
+                if (charCode === 13 || charCode === 10 || charCode === 38 || charCode === 40) {
+                    return;
+                }
+                var i = ID.index(this.id);
+                if (document.getElementById(self._addUID('GPlocationOrigin_' + i)).value.length > 2) {
+                    document.getElementById(self._addUID('GPlocationAutoCompleteList_' + i)).style.display = 'block';
+                } else {
+                    document.getElementById(self._addUID('GPlocationAutoCompleteList_' + i)).style.display = 'none';
+                }
+                self.onAutoCompleteSearchText(e);
+            });
+            inputOrigin.addEventListener('keydown', function (e) {
+                var charCode = e.which || e.keyCode;
+                var container = document.getElementById(self._addUID('GPlocationAutoCompleteList_' + id));
+                if (!container) {
+                    return;
+                }
+                var curr = container.getElementsByClassName('GPautoCompleteProposal current');
+                var list = container.getElementsByClassName('GPautoCompleteProposal');
+                var length = list.length;
+                if (!length) {
+                    return;
+                }
+                var current = null;
+                if (!curr.length) {
+                    current = list[0];
+                    current.className = 'GPautoCompleteProposal current';
+                    current.style.color = '#000000';
+                    current.style['background-color'] = '#CEDBEF';
+                    return;
+                } else {
+                    current = curr[0];
+                }
+                var index = parseInt(ID.index(current.id), 10);
+                var next = index === length - 1 ? list[0] : list[index + 1];
+                var prev = index === 0 ? list[length - 1] : list[index - 1];
+                current.style['background-color'] = '';
+                current.style.color = '';
+                prev.style['background-color'] = '';
+                prev.style.color = '';
+                next.style['background-color'] = '';
+                next.style.color = '';
+                switch (charCode) {
+                case 38:
+                    console.log('arrow up');
+                    current.className = 'GPautoCompleteProposal';
+                    prev.className = 'GPautoCompleteProposal current';
+                    prev.style.color = '#000000';
+                    prev.style['background-color'] = '#CEDBEF';
+                    break;
+                case 40:
+                    console.log('arrow down');
+                    current.className = 'GPautoCompleteProposal';
+                    next.className = 'GPautoCompleteProposal current';
+                    next.style.color = '#000000';
+                    next.style['background-color'] = '#CEDBEF';
+                    break;
+                case 13:
+                    console.log('enter');
+                    current.click(e);
+                    break;
+                }
+                current.focus();
+            });
+            return inputOrigin;
+        },
+        _createLocationCoordinateInputElement: function (id) {
+            var self = this;
+            var inputOriginCoord = document.createElement('input');
+            inputOriginCoord.id = this._addUID('GPlocationOriginCoords_' + id);
+            inputOriginCoord.className = 'GPlocationOriginHidden';
+            inputOriginCoord.type = 'text';
+            inputOriginCoord.disabled = false;
+            inputOriginCoord.addEventListener('click', function () {
+                var i = ID.index(this.id);
+                document.getElementById(self._addUID('GPlocationOriginLabel_' + i)).click();
+            });
+            return inputOriginCoord;
+        },
+        _createLocationPointerShowInputElement: function (id) {
+            var inputOriginPointer = document.createElement('input');
+            inputOriginPointer.id = this._addUID('GPlocationOriginPointer_' + id);
+            inputOriginPointer.type = 'checkbox';
+            return inputOriginPointer;
+        },
+        _createLocationPointerInputElement: function (id) {
+            var self = this;
+            var labelOriginPointer = document.createElement('label');
+            labelOriginPointer.id = this._addUID('GPlocationOriginPointerImg_' + id);
+            labelOriginPointer.htmlFor = 'GPlocationOriginPointer_' + id;
+            labelOriginPointer.className = 'GPlocationOriginPointerImg';
+            labelOriginPointer.title = 'Pointer un lieu sur la carte';
+            labelOriginPointer.addEventListener('click', function (e) {
+                e.preventDefault();
+                e.stopPropagation();
+                var i = ID.index(this.id);
+                var points = document.getElementsByClassName(self._addUID('GPlocationPoint'));
+                var j;
+                var tag;
+                var id;
+                for (j = 0; j < points.length; j++) {
+                    tag = points[j].childNodes[0].id;
+                    id = ID.index(tag);
+                    if (i != id) {
+                        document.getElementById(self._addUID('GPlocationOriginPointer_' + id)).checked = false;
+                        if (document.getElementById(self._addUID('GPlocationOriginCoords_' + id)).value == 'Pointer un lieu sur la carte') {
+                            document.getElementById(self._addUID('GPlocationOriginCoords_' + id)).value = '';
+                            document.getElementById(self._addUID('GPlocationOrigin_' + id)).className = 'GPlocationOriginVisible';
+                            document.getElementById(self._addUID('GPlocationOriginCoords_' + id)).className = 'GPlocationOriginHidden';
+                        }
+                    }
+                }
+                if (document.getElementById(self._addUID('GPlocationOriginPointer_' + i)).checked) {
+                    document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).value = '';
+                    for (j = 0; j < points.length; j++) {
+                        tag = points[j].childNodes[0].id;
+                        id = ID.index(tag);
+                        document.getElementById(self._addUID('GPlocationPoint_' + id)).style.cssText = '';
+                    }
+                    if (document.getElementById(self._addUID('GPlocationStageRemove_' + i))) {
+                        document.getElementById(self._addUID('GPlocationStageRemove_' + i)).className = 'GPlocationStageRemove';
+                    }
+                    if (document.getElementById(self._addUID('GPlocationStageAdd'))) {
+                        document.getElementById(self._addUID('GPlocationStageAdd')).className = '';
+                    }
+                    document.getElementById(self._addUID('GPlocationOriginPointer_' + i)).checked = false;
+                    document.getElementById(self._addUID('GPlocationOrigin_' + i)).className = 'GPlocationOriginVisible';
+                    document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).className = 'GPlocationOriginHidden';
+                } else {
+                    document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).value = 'Pointer un lieu sur la carte';
+                    for (j = 0; j < points.length; j++) {
+                        tag = points[j].childNodes[0].id;
+                        id = ID.index(tag);
+                        if (i == id) {
+                            document.getElementById(self._addUID('GPlocationPoint_' + id)).style.cssText = '';
+                        } else {
+                            document.getElementById(self._addUID('GPlocationPoint_' + id)).style.display = 'none';
+                        }
+                    }
+                    if (document.getElementById(self._addUID('GPlocationStageRemove_' + i))) {
+                        document.getElementById(self._addUID('GPlocationStageRemove_' + i)).className = 'GPlocationOriginHidden';
+                    }
+                    if (document.getElementById(self._addUID('GPlocationStageAdd'))) {
+                        document.getElementById(self._addUID('GPlocationStageAdd')).className = 'GPlocationOriginHidden';
+                    }
+                    document.getElementById(self._addUID('GPlocationOriginPointer_' + i)).checked = true;
+                    document.getElementById(self._addUID('GPlocationOrigin_' + i)).className = 'GPlocationOriginHidden';
+                    document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).className = 'GPlocationOriginVisible';
+                    document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).disabled = true;
+                }
+                self.onActivateMapPointClick(e);
+            });
+            return labelOriginPointer;
+        },
+        _createLocationRemovePointElement: function (id) {
+            var self = this;
+            var divRm = document.createElement('div');
+            divRm.id = this._addUID('GPlocationStageRemove_' + id);
+            divRm.className = 'GPlocationStageRemove';
+            divRm.title = 'Supprimer l\'étape';
+            divRm.addEventListener('click', function (e) {
+                var points = document.getElementsByClassName(self._addUID('GPlocationPoint'));
+                var last = points.length - 1;
+                var start = points[0].childNodes[0].id;
+                var end = points[last].childNodes[0].id;
+                var startID = ID.index(start);
+                var endID = ID.index(end);
+                if (id != startID && id != endID) {
+                    var i = ID.index(this.id);
+                    document.getElementById(self._addUID('GPlocationPoint_' + i)).className = 'GPflexInput GPlocationStageFlexInputHidden';
+                    document.getElementById(self._addUID('GPlocationOrigin_' + i)).value = '';
+                    document.getElementById(self._addUID('GPlocationOrigin_' + i)).className = 'GPlocationOriginVisible';
+                    document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).value = '';
+                    document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).className = 'GPlocationOriginHidden';
+                    document.getElementById(self._addUID('GPlocationStageAdd')).style.display = '';
+                    self.onLocationRemovePointClick(e);
+                }
+            });
+            return divRm;
+        },
+        _createLocationAddPointElement: function () {
+            var self = this;
+            var divAdd = document.createElement('div');
+            divAdd.id = this._addUID('GPlocationStageAdd');
+            divAdd.title = 'Ajouter une étape';
+            divAdd.addEventListener('click', function (e) {
+                var lastStage = 1;
+                var nbStages = 0;
+                var points = document.getElementsByClassName(self._addUID('GPlocationPoint'));
+                for (var i = 1; i < points.length - 1; i++) {
+                    var tag = points[i].childNodes[0].id;
+                    var id = ID.index(tag);
+                    if (document.getElementById(self._addUID('GPlocationPoint_' + id))) {
+                        if (document.getElementById(self._addUID('GPlocationPoint_' + id)).className == 'GPflexInput GPlocationStageFlexInputHidden') {
+                            if (lastStage == 1) {
+                                lastStage = id;
+                            }
+                        } else {
+                            nbStages++;
+                        }
+                    }
+                }
+                if (lastStage < points.length) {
+                    document.getElementById(self._addUID('GPlocationPoint_' + lastStage)).className = 'GPflexInput GPlocationStageFlexInput';
+                }
+                if (nbStages == 4) {
+                    document.getElementById(self._addUID('GPlocationStageAdd')).style.display = 'none';
+                }
+                self.onLocationAddPointClick(e);
+            });
+            return divAdd;
+        },
+        _createLocationAutoCompleteResultElement: function (id) {
+            var self = this;
+            var div = document.createElement('div');
+            div.id = this._addUID('GPlocationAutoCompleteList_' + id);
+            div.className = 'GPadvancedAutoCompleteList';
+            if (div.addEventListener) {
+                div.addEventListener('click', function (e) {
+                    self.onAutoCompletedResultsItemClick(e);
+                    document.getElementById(self._addUID('GPlocationAutoCompleteList_' + id)).style.display = 'none';
+                }, false);
+            } else if (div.attachEvent) {
+                div.attachEvent('onclick', function (e) {
+                    self.onAutoCompletedResultsItemClick(e);
+                    document.getElementById(self._addUID('GPlocationAutoCompleteList_' + id)).style.display = 'none';
+                });
+            }
+            return div;
+        },
+        _createLocationAutoCompletedLocationElement: function (id, location, n) {
+            var container = document.getElementById(this._addUID('GPlocationAutoCompleteList_' + id));
+            var div = document.createElement('div');
+            div.id = this._addUID('AutoCompletedLocation_' + n);
+            div.className = 'GPautoCompleteProposal';
+            div.innerHTML = location.fullText;
+            container.appendChild(div);
+        },
+        GPdisplayCoordinate: function (value) {
+            var points = document.getElementsByClassName(this._addUID('GPlocationPoint'));
+            for (var i = 0; i < points.length; i++) {
+                var tag = points[i].childNodes[0].id;
+                var id1 = ID.index(tag);
+                if (document.getElementById(this._addUID('GPlocationOriginPointer_' + id1)).checked) {
+                    document.getElementById(this._addUID('GPlocationOriginCoords_' + id1)).value = value;
+                    document.getElementById(this._addUID('GPlocationOriginCoords_' + id1)).disabled = false;
+                    for (var j = 0; j < points.length; j++) {
+                        tag = points[j].childNodes[0].id;
+                        var id2 = ID.index(tag);
+                        document.getElementById(this._addUID('GPlocationPoint_' + id2)).style.cssText = '';
+                        if (document.getElementById(this._addUID('GPlocationStageRemove_' + id2))) {
+                            document.getElementById(this._addUID('GPlocationStageRemove_' + id2)).className = 'GPlocationStageRemove';
+                        }
+                    }
+                    document.getElementById(this._addUID('GPlocationOriginPointer_' + id1)).checked = false;
+                    if (document.getElementById(this._addUID('GPlocationStageAdd'))) {
+                        document.getElementById(this._addUID('GPlocationStageAdd')).className = '';
+                    }
+                    return;
+                }
+            }
+        }
+    };
+    return LocationSelectorDOM;
+}(CommonUtilsSelectorID);
+LeafletControlsUtilsPositionFormater = function () {
+    var PositionFormater = {
+        NORTH: 'N',
+        SOUTH: 'S',
+        EAST: 'E',
+        WEST: 'W',
+        digitSecond: 2,
+        digitDecimal: 5,
+        digitRadian: 8,
+        roundToDecimal: function (inputNum, numPoints) {
+            var multiplier = Math.pow(10, numPoints);
+            return Math.round(inputNum * multiplier) / multiplier;
+        },
+        decimalToRadian: function (location) {
+            var d = 0.017453292519943295;
+            return this.roundToDecimal(location * d, this.digitRadian);
+        },
+        decimalToGrade: function (location) {
+            var d = 1.1111111111111112;
+            return this.roundToDecimal(location * d, this.digitRadian);
+        },
+        decimalToDMS: function (location, hemisphere) {
+            if (location < 0) {
+                location *= -1;
+            }
+            var degrees = Math.floor(location);
+            var minutesFromRemainder = (location - degrees) * 60;
+            var minutes = Math.floor(minutesFromRemainder);
+            var secondsFromRemainder = (minutesFromRemainder - minutes) * 60;
+            var seconds = this.roundToDecimal(secondsFromRemainder, this.digitSecond);
+            var dms = degrees + '\xB0 ' + minutes + '\' ' + seconds + '" ';
+            if (hemisphere) {
+                dms += hemisphere;
+            }
+            return dms;
+        },
+        decimalLatToDMS: function (location) {
+            var hemisphere = location < 0 ? this.SOUTH : this.NORTH;
+            return this.decimalToDMS(location, hemisphere);
+        },
+        decimalLongToDMS: function (location) {
+            var hemisphere = location < 0 ? this.WEST : this.EAST;
+            return this.decimalToDMS(location, hemisphere);
+        },
+        DMSToDecimal: function (degrees, minutes, seconds, hemisphere) {
+            var ddVal = degrees + minutes / 60 + seconds / 3600;
+            ddVal = hemisphere == this.SOUTH || hemisphere == this.WEST ? ddVal * -1 : ddVal;
+            var decimal = this.roundToDecimal(ddVal, this.digitDecimal);
+            return decimal;
+        }
+    };
+    return PositionFormater;
+}();
+LeafletControlsUtilsIconDefault = function (L) {
+    var IconDefault = L.Icon.Default.extend({
+        images: {
+            shadow: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=',
+            color: {
+                blue: 'data:image/png;base64,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',
+                orange: 'data:image/png;base64,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',
+                red: 'data:image/png;base64,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',
+                green: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wJCgoDDgqHD/MAAAZVSURBVFjDpZZtiFxXGcd/c+69M7PzurvdTTZNGvxQTCJqFSok+MmFQPSDUlsQhBaxWNhorQlWPxSKTYqsFLYGA8VCISDESIpCILYQW4xJNtHGGBooZtl16UrKNrMvM7N3Xu6555zHD7OZ7OzsW/Be/nBnznnO/zzP83/OcxKPv/IOW32KXzj2KFBc/nm7cuvl8IOXD21ql3j8lT9vsOjxfuB7wCHgoAoUCV8BYJsWRGaBc8DpvzwxfnF9kl90kxQ+f9wDXgReyg9kc8VkH4Wg2DUvdpqyXqRcKxOH5l3gZ+89OX5rDZLzqwhe7QfOZAcyB4fSO0h6KbSNqNt6F0lSJcn4WQA+bcyycHehATzz3pPjb6+cp0SEe8jvOdYvsRvPDmQOPpLZjRXLYjRPzYSIuC5EtsliNE9ZL7ItvY2dD+/sSRaDs8Nn9o90kLQ92HvcA87mduT27Mw8QiWuUDMhVuymMC5mPpoj42UYyu0A+M3wmf3D90lEQATgxfT29PDDPTup6jKx08gar6+CNf8XhEW9QEqlGNw16AFnhs/s72+FC6Gw79V+4KXtPUPUbZ3IRR07DVSSQlCkEBRRCdX+zvn5Lq/mohKFoEh2KDO4LB4ULUe+mxpI5RSKMA5xIm0Ug16SKsknjTtMfTxFGIdMfTzFzOIMoVmiGPQCdNjUTY3B9HZEeO5rv9/v+YggwncK6QKxxB3qyQU5aibk7iclvv3YUzz91WfJ+wUALsy+w+sf/opGusFgahuLerFt17BN0l4PQc7v10vmgJ/f98sccCDjZ5mP5jpIvITHYljm+QNH+NaupzrGDg59nc/m9/KDC08TD8UEyqdhG+1xh8PP+eglc0jhZLeXUp4V2yFPPxFQNzWymWwXAYAg7M5+hm/s+yZzzRIpL91hXzc1kioAJ59TQH9C3WOXNlJeitCEfLH3S2sSAFgxPNb7ZXQl7rJ3IiRaCxd9caLFgXUGcdJeyDiDiKBdtC6BE6FhGygv0WUvnsOKRZw0FHDHRg6HdCzWtHXyQZ4bn17HrBKEFdNaAMel0l/xcz5WbOd5hcI4A3BHiWPWaReKuNYOjEOMw2hDggQudpyceL3DC9cqXsZLl7g+9Q8KQYEls9S2FePwEgrbsIhjxuvb+2tJDYx/RXJuXzbI0dRR+xBwypDtyXLrvx9yLbzC9vR2HkoO8J9wkrMzp/nt+Bv0DKbwVUCj0VxxeEAQJKneDRErz/siAk5ONueiJzI7MrAirroe4zJC70NFphem+PnkUWzkUH6CZG9A364iXsKjulTprK98nqV6Fde0F/72/Q8+8hGh8u+fvl/Y89rVWn/tQDaXI6wu3e8ZYYzxLflsjlymU2UN2yAO4zUbVXNeIyLHAHzuJ/w1XY7/mN7mWKUBJHZUy9UttehsMUtYD7EN8/6lZ69fBmiFCxDLuWhBT0b90aN+zm9r/0EfEdfywjLaddRXJ45aYCxa0PjKp53FB0CqN0mzGWFC88/Lz12/sKIzrpjn5FRzLioZZ/B6fMTxQFAkiBY04mS0szOuYKlOHG0g8mazFOGlFGJly0jmfXQ9Rpf1bUT+tG6PX87PiWg+aiDgpbyWpLeARKCIyjHA6JWRG3ZVjxdWojJxpAT8rjkX4We9LSU7KATYhiWu6Bng9OpxtVYCxTHWLEX2XmE6tzGUnyAqx4hj7MrIDd1FsjpcIkJl4oXbYuW8rhqSfUkkduvCSymsdkRzUUmsvLWWp2o9OYqTsWhRb6pcP+ujyzHi5OTVH/8rXJNkLU9EhOrUCxdNzVw1NUN6ILlmsv2MhxhHcy4KgRPr5awr8Z3ghC7r5Uru3oif8YgWNMAb135ys7I+yYbx4O24aiZt5Ej2JjsvGSkPBKJ5rRHGNlLfuuESESqTP7IiLW+UrxBLG0E+aFW3cOrakZuzG5JsHC4BOKUrpuRM64ojTlB+AhGhOa8tMLpZHanN1FOZ/GEIvBlXYvweBSIk+wJ0q7r/8PejN6c3JdnSCevkZLSgtdhWLsSBLmtYdRD+H+ESKlOHZ8XJqbgaExQC4iWD0+58Zerwra2RbM7B8qX8hK7EiBN0WSPC6OoOun5O2NpbnT78kdXunKlbbOQuVqcPX5YtsqgH636M6bIGYbTj/rN5Trb+VKdHLtqme6s6PfLug9j9D/FCc1g2qf7VAAAAAElFTkSuQmCC'
+            }
+        },
+        initialize: function (color, options) {
+            L.Util.extend(this.options, options);
+            switch (color) {
+            case 'red':
+                this.options.iconUrl = this.images.color.red;
+                break;
+            case 'green':
+                this.options.iconUrl = this.images.color.green;
+                break;
+            case 'orange':
+                this.options.iconUrl = this.images.color.orange;
+                break;
+            case 'blue':
+                this.options.iconUrl = this.images.color.blue;
+                break;
+            default:
+                this.options.iconUrl = this.images.color.blue;
+            }
+            this.options.shadowUrl = this.images.shadow;
+        }
+    });
+    return IconDefault;
+}(leaflet);
+LeafletControlsLocationSelector = function (L, woodman, Gp, RightManagement, ID, LocationSelectorDOM, PositionFormater, IconDefault) {
+    var LocationSelector = L.Control.extend({
+        includes: LocationSelectorDOM,
+        options: {
+            position: 'topleft',
+            tag: {
+                id: 0,
+                unique: null,
+                label: '>',
+                color: 'blue',
+                display: true,
+                addOption: false,
+                removeOption: false
+            },
+            disableReverse: false,
+            displayInfo: true,
+            autocompleteOptions: {},
+            reverseGeocodeOptions: {}
+        },
+        initialize: function (options) {
+            L.Util.setOptions(this, options);
+            this._uid = this.options.tag.unique || null;
+            this._activeDragAndDrop = false;
+            this._pressedKeyOnDragAndDrop = false;
+            this._map = null;
+            this._inputsContainer = null;
+            this._inputLabelContainer = null;
+            this._inputAutoCompleteContainer = null;
+            this._inputShowPointerContainer = null;
+            this._inputCoordinateContainer = null;
+            this._coordinate = null;
+            this._suggestedContainer = null;
+            this._suggestedLocations = [];
+            this._currentLocation = null;
+            this._marker = null;
+            this._resources = {};
+            this._noRightManagement = false;
+            this._checkRightsManagement();
+            this._container = this._uid ? this._initLayout() : null;
+        },
+        onAdd: function () {
+            this._uid = ID.generate();
+            var container = this._initLayout();
+            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
+            return container;
+        },
+        onRemove: function () {
+        },
+        getCoordinate: function () {
+            return this._coordinate;
+        },
+        getCoordinateInverse: function () {
+            if (!this._coordinate) {
+                return;
+            }
+            var coordinateInv = {
+                x: this._coordinate.y,
+                y: this._coordinate.x
+            };
+            return coordinateInv;
+        },
+        setMap: function (map) {
+            if (!this._map) {
+                this._map = map;
+            }
+        },
+        clear: function () {
+            this._setCursor();
+            this._setMarker();
+            this._clearResults();
+            this._inputLabelContainer.click();
+        },
+        dragging: function (active) {
+            if (this._marker) {
+                if (active) {
+                    this._marker.dragging.enable();
+                } else {
+                    this._marker.dragging.disable();
+                }
+            }
+        },
+        _initLayout: function () {
+            var id = this.options.tag.id;
+            var container = this._createMainContainerElement();
+            var inputs = this._inputsContainer = this._createLocationPointElement(id, this.options.tag.display);
+            container.appendChild(inputs);
+            var _inputLabel = this._inputLabelContainer = this._createLocationPointLabelElement(id, this.options.tag.label);
+            inputs.appendChild(_inputLabel);
+            var _inputAutoComplete = this._inputAutoCompleteContainer = this._createLocationAutoCompleteteInputElement(id);
+            inputs.appendChild(_inputAutoComplete);
+            var _inputCoordinate = this._inputCoordinateContainer = this._createLocationCoordinateInputElement(id);
+            inputs.appendChild(_inputCoordinate);
+            var _inputShowPointer = this._inputShowPointerContainer = this._createLocationPointerShowInputElement(id);
+            inputs.appendChild(_inputShowPointer);
+            var _inputPointer = this._createLocationPointerInputElement(id);
+            inputs.appendChild(_inputPointer);
+            if (this.options.tag.addOption) {
+                var _inputAddStage = this._createLocationAddPointElement();
+                inputs.appendChild(_inputAddStage);
+            }
+            if (this.options.tag.removeOption) {
+                var _inputRemoveStage = this._createLocationRemovePointElement(id);
+                inputs.appendChild(_inputRemoveStage);
+            }
+            var results = this._suggestedContainer = this._createLocationAutoCompleteResultElement(id);
+            container.appendChild(results);
+            return container;
+        },
+        _checkRightsManagement: function () {
+            var _opts = null;
+            var _res = [];
+            var _key = null;
+            _key = this.options.reverseGeocodeOptions.apiKey;
+            _opts = this.options.reverseGeocodeOptions.filterOptions;
+            _res = _opts ? _opts.type : [];
+            if (!_res || _res.length === 0) {
+                _res = [
+                    'PositionOfInterest',
+                    'StreetAddress'
+                ];
+            }
+            var rightManagementRerverse = RightManagement.check({
+                key: _key || this.options.apiKey,
+                resources: _res,
+                services: ['ReverseGeocode']
+            });
+            _key = this.options.autocompleteOptions.apiKey;
+            _opts = this.options.autocompleteOptions.filterOptions;
+            _res = _opts ? _opts.type : [];
+            if (!_res || _res.length === 0) {
+                _res = [
+                    'PositionOfInterest',
+                    'StreetAddress'
+                ];
+            }
+            var rightManagementAutoComplete = RightManagement.check({
+                key: _key || this.options.apiKey,
+                resources: _res,
+                services: ['AutoCompletion']
+            });
+            if (!rightManagementRerverse && !rightManagementAutoComplete) {
+                this._noRightManagement = true;
+            }
+            if (rightManagementAutoComplete) {
+                this._resources['AutoCompletion'] = {};
+                this._resources['AutoCompletion']['resources'] = rightManagementAutoComplete['AutoCompletion'];
+                this._resources['AutoCompletion']['key'] = rightManagementAutoComplete['key'];
+            }
+            if (rightManagementRerverse) {
+                this._resources['ReverseGeocode'] = {};
+                this._resources['ReverseGeocode']['resources'] = rightManagementRerverse['ReverseGeocode'];
+                this._resources['ReverseGeocode']['key'] = rightManagementRerverse['key'];
+            }
+        },
+        _setLabel: function (label) {
+            this._inputAutoCompleteContainer.value = label || '';
+        },
+        _setCoordinate: function (oLatLng) {
+            this._coordinate = {
+                x: oLatLng.lng,
+                y: oLatLng.lat
+            };
+            var lat = null;
+            var lng = null;
+            if (false) {
+                lat = PositionFormater.decimalLatToDMS(oLatLng.lat);
+                lng = PositionFormater.decimalLongToDMS(oLatLng.lng);
+            } else {
+                lat = PositionFormater.roundToDecimal(oLatLng.lat, 4);
+                lng = PositionFormater.roundToDecimal(oLatLng.lng, 4);
+            }
+            var value = lng + ' , ' + lat;
+            this.GPdisplayCoordinate(value);
+        },
+        _setPosition: function (position) {
+            var map = this._map;
+            map.panTo(L.latLng(position.y, position.x));
+        },
+        _setMarker: function (position, information, display) {
+            if (this._activeDragAndDrop) {
+                return;
+            }
+            var map = this._map;
+            if (this._marker != null) {
+                this._marker.off('mousedown', this.onMouseDownMarker, this);
+                this._marker.off('dragstart', this.onStartDragMarker, this);
+                this._marker.off('drag', this.onDragMarker, this);
+                this._marker.off('dragend', this.onEndDragMarker, this);
+                map.removeLayer(this._marker);
+                this._marker = null;
+            }
+            if (position) {
+                var options = {
+                    icon: new IconDefault(this.options.tag.color),
+                    draggable: true,
+                    clickable: true,
+                    zIndexOffset: 1000
+                };
+                this._marker = L.marker(L.latLng(position.y, position.x), options);
+                this._marker.on('mousedown', this.onMouseDownMarker, this);
+                this._marker.on('dragstart', this.onStartDragMarker, this);
+                this._marker.on('drag', this.onDragMarker, this);
+                this._marker.on('dragend', this.onEndDragMarker, this);
+                this._marker.addTo(map);
+                if (display) {
+                    var popupContent = null;
+                    if (typeof information !== 'string') {
+                        if (information.fields.fullText) {
+                            popupContent = information.fields.fullText;
+                        } else {
+                            var values = [];
+                            values.push(information.fields.street || '');
+                            values.push(information.fields.postalCode || '');
+                            values.push(information.fields.commune || '');
+                            if (information.type === 'PositionOfInterest') {
+                                values.push(information.fields.poi || '');
+                                values.push(information.fields.kind || '');
+                            }
+                            popupContent = values.join(' - ');
+                        }
+                    } else {
+                        popupContent = information;
+                    }
+                    this._marker.bindPopup(popupContent);
+                }
+            }
+        },
+        _setCursor: function (cursor) {
+            var div = this._map.getContainer();
+            if (cursor) {
+                div.style.cursor = cursor;
+            } else {
+                div.style.cursor = null;
+            }
+        },
+        _clearResults: function () {
+            this._currentLocation = null;
+            this._coordinate = null;
+            this._clearSuggestedLocation();
+        },
+        _clearSuggestedLocation: function () {
+            this._suggestedLocations = [];
+            if (this._suggestedContainer) {
+                while (this._suggestedContainer.firstChild) {
+                    this._suggestedContainer.removeChild(this._suggestedContainer.firstChild);
+                }
+            }
+        },
+        _requestAutoComplete: function (settings) {
+            if (!settings || Object.keys(settings).length === 0) {
+                return;
+            }
+            if (!settings.text) {
+                return;
+            }
+            if (this._noRightManagement) {
+                console.log('no rights for all service !?');
+                return;
+            }
+            if (!this._resources['AutoCompletion']) {
+                console.log('no rights for this service !?');
+                return;
+            }
+            var resources = this._resources['AutoCompletion'].resources;
+            if (!resources || Object.keys(resources).length === 0) {
+                return;
+            }
+            var key = this._resources['AutoCompletion']['key'];
+            var options = {};
+            L.Util.extend(options, this.options.autocompleteOptions);
+            L.Util.extend(options, settings);
+            L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey || key });
+            Gp.Services.autoComplete(options);
+        },
+        _fillAutoCompletedLocationListContainer: function (locations) {
+            if (!locations || locations.length === 0) {
+                return;
+            }
+            var element = this._suggestedContainer;
+            if (element.childElementCount) {
+                while (element.firstChild) {
+                    element.removeChild(element.firstChild);
+                }
+            }
+            for (var i = 0; i < locations.length; i++) {
+                this._createLocationAutoCompletedLocationElement(this.options.tag.id, locations[i], i);
+            }
+            this._suggestedLocations = locations;
+        },
+        _requestReverseGeocode: function (settings) {
+            if (!settings || Object.keys(settings).length === 0) {
+                return;
+            }
+            if (!settings.position || Object.keys(settings.position).length === 0) {
+                return;
+            }
+            if (this._noRightManagement) {
+                console.log('no rights for all service !?');
+                return;
+            }
+            if (!this._resources['ReverseGeocode']) {
+                console.log('no rights for this service !?');
+                return;
+            }
+            var resources = this._resources['ReverseGeocode'].resources;
+            if (!resources || Object.keys(resources).length === 0) {
+                return;
+            }
+            var key = this._resources['ReverseGeocode']['key'];
+            var options = {};
+            L.Util.extend(options, this.options.reverseGeocodeOptions);
+            L.Util.extend(options, settings);
+            L.Util.extend(options, {
+                returnFreeForm: true,
+                filterOptions: { type: ['StreetAddress'] }
+            });
+            L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey || key });
+            Gp.Services.reverseGeocode(options);
+        },
+        _displayResultOfCoordinate: function (oLatLng) {
+            this._setCoordinate(oLatLng);
+            this._setMarker({
+                x: oLatLng.lng,
+                y: oLatLng.lat
+            }, null, false);
+            this.onActivateMapPointClick();
+        },
+        _displayResultOfLabel: function (oLocation) {
+            var places = oLocation.placeAttributes;
+            var label = places.number + ' ' + places.street + ', ' + places.postalCode + ' ' + places.commune;
+            this._setCoordinate({
+                lat: oLocation.position.x,
+                lng: oLocation.position.y
+            });
+            this._setLabel(label);
+            this._setMarker({
+                x: oLocation.position.y,
+                y: oLocation.position.x
+            }, null, false);
+            this._inputShowPointerContainer.checked = false;
+            this._inputAutoCompleteContainer.className = 'GPlocationOriginVisible';
+            this._inputCoordinateContainer.className = 'GPlocationOriginHidden';
+            this.onActivateMapPointClick();
+        },
+        onAutoCompleteSearchText: function (e) {
+            var value = e.target.value;
+            if (!value) {
+                return;
+            }
+            if (this._noRightManagement) {
+                console.log('no rights for this service !?');
+                return;
+            }
+            this._currentLocation = value;
+            if (value.length < 3) {
+                return;
+            }
+            var context = this;
+            this._requestAutoComplete({
+                text: value,
+                maximumResponses: 5,
+                onSuccess: function (results) {
+                    if (results) {
+                        var locations = results.suggestedLocations;
+                        context._fillAutoCompletedLocationListContainer(locations);
+                    }
+                },
+                onFailure: function (error) {
+                    context._clearSuggestedLocation();
+                }
+            });
+        },
+        onAutoCompletedResultsItemClick: function (e) {
+            var idx = ID.index(e.target.id);
+            if (!idx) {
+                return;
+            }
+            var position = {
+                x: this._suggestedLocations[idx].position.x,
+                y: this._suggestedLocations[idx].position.y
+            };
+            var info = {
+                type: this._suggestedLocations[idx].type,
+                fields: this._suggestedLocations[idx]
+            };
+            var label = this._suggestedLocations[idx].fullText;
+            this._setLabel(label);
+            this._setPosition(position);
+            this._setMarker(position, info, this.options.displayInfo);
+            this._coordinate = position;
+        },
+        onActivateMapPointClick: function (e) {
+            var map = this._map;
+            if (this._inputShowPointerContainer.checked) {
+                if (!this._activeDragAndDrop) {
+                    map.on('click', this.onMouseMapClick, this);
+                    this._setCursor('crosshair');
+                    this._setMarker();
+                    this._clearResults();
+                }
+            } else {
+                if (!this._activeDragAndDrop) {
+                    map.off('click', this.onMouseMapClick, this);
+                    this._setCursor();
+                }
+            }
+        },
+        onLocationClearPointClick: function (e) {
+            this._setCursor();
+            this._setMarker();
+            this._clearResults();
+            this._inputAutoCompleteContainer.focus();
+        },
+        onLocationRemovePointClick: function (e) {
+            this._setCursor();
+            this._setMarker();
+            this._clearResults();
+        },
+        onLocationAddPointClick: function (e) {
+        },
+        onMouseMapClick: function (e) {
+            var oLatLng = e.latlng;
+            if (this.options.disableReverse || this._noRightManagement) {
+                this._displayResultOfCoordinate(oLatLng);
+            } else {
+                var self = this;
+                this._requestReverseGeocode({
+                    position: {
+                        x: oLatLng.lat,
+                        y: oLatLng.lng
+                    },
+                    srs: 'EPSG:4326',
+                    onSuccess: function (results) {
+                        if (results.locations.length !== 0) {
+                            var oLocation = results.locations[0];
+                            self._displayResultOfLabel(oLocation);
+                        } else {
+                            self._displayResultOfCoordinate(oLatLng);
+                        }
+                    },
+                    onFailure: function (error) {
+                        self._displayResultOfCoordinate(oLatLng);
+                    }
+                });
+            }
+        },
+        onStartDragMarker: function () {
+            if (!this._marker) {
+                return;
+            }
+            this._activeDragAndDrop = true;
+            this._inputShowPointerContainer.checked = true;
+            this._inputAutoCompleteContainer.className = 'GPlocationOriginHidden';
+            this._inputCoordinateContainer.className = 'GPlocationOriginVisible';
+            this._marker.unbindPopup();
+            this._setLabel();
+            this._clearResults();
+        },
+        onDragMarker: function () {
+            if (!this._marker) {
+                return;
+            }
+            this._activeDragAndDrop = false;
+            this._inputShowPointerContainer.checked = true;
+            var oLatLng = this._marker.getLatLng();
+            this._setCoordinate(oLatLng);
+        },
+        onEndDragMarker: function () {
+            if (!this._marker) {
+                return;
+            }
+            this._inputShowPointerContainer.checked = true;
+            var oLatLng = this._marker.getLatLng();
+            if (this._pressedKeyOnDragAndDrop) {
+                this._setCoordinate(oLatLng);
+            } else {
+                this.onMouseMapClick({ latlng: oLatLng });
+            }
+            this._activeDragAndDrop = false;
+            this._pressedKeyOnDragAndDrop = false;
+        },
+        onMouseDownMarker: function (e) {
+            if (!this._marker) {
+                return;
+            }
+            this._pressedKeyOnDragAndDrop = e.originalEvent.ctrlKey;
+        }
+    });
+    return LocationSelector;
+}(leaflet, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, CommonControlsLocationSelectorDOM, LeafletControlsUtilsPositionFormater, LeafletControlsUtilsIconDefault);
+CommonControlsIsoDOM = function () {
+    var IsoDOM = {
+        _addUID: function (id) {
+            return id + '-' + this._uid;
+        },
+        _createMainContainerElement: function () {
+            var container = document.createElement('div');
+            container.id = this._addUID('GPisochron');
+            container.className = 'GPwidget';
+            return container;
+        },
+        _createShowIsoElement: function () {
+            var input = document.createElement('input');
+            input.id = this._addUID('GPshowIsochron');
+            input.type = 'checkbox';
+            return input;
+        },
+        _createShowIsoPictoElement: function () {
+            var context = this;
+            var label = document.createElement('label');
+            label.id = this._addUID('GPshowIsochronPicto');
+            label.className = 'GPshowAdvancedToolPicto';
+            label.htmlFor = this._addUID('GPshowIsochron');
+            label.title = 'Calculer une isochrone';
+            if (label.addEventListener) {
+                label.addEventListener('click', function (e) {
+                    context.onShowIsoPanelClick(e);
+                });
+            } else if (label.attachEvent) {
+                label.attachEvent('onclick', function (e) {
+                    context.onShowIsoPanelClick(e);
+                });
+            }
+            var spanOpen = document.createElement('span');
+            spanOpen.id = this._addUID('GPshowIsochronOpen');
+            spanOpen.className = 'GPshowAdvancedToolOpen';
+            label.appendChild(spanOpen);
+            return label;
+        },
+        _createIsoPanelElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPisochronPanel');
+            div.className = 'GPpanel';
+            return div;
+        },
+        _createIsoPanelHeaderElement: function () {
+            var self = this;
+            var container = document.createElement('div');
+            container.className = 'GPpanelHeader';
+            var div = document.createElement('div');
+            div.className = 'GPpanelTitle';
+            div.innerHTML = 'Calcul d\'isochrone';
+            container.appendChild(div);
+            var divClose = document.createElement('div');
+            divClose.id = this._addUID('GPisochronPanelClose');
+            divClose.className = 'GPpanelClose';
+            divClose.title = 'Fermer le panneau';
+            if (divClose.addEventListener) {
+                divClose.addEventListener('click', function () {
+                    document.getElementById(self._addUID('GPshowIsochronPicto')).click();
+                }, false);
+            } else if (divClose.attachEvent) {
+                divClose.attachEvent('onclick', function () {
+                    document.getElementById(self._addUID('GPshowIsochronPicto')).click();
+                });
+            }
+            container.appendChild(divClose);
+            return container;
+        },
+        _createIsoPanelFormElement: function () {
+            var self = this;
+            var form = document.createElement('form');
+            form.id = this._addUID('GPisochronForm');
+            form.addEventListener('submit', function (e) {
+                e.preventDefault();
+                self.onIsoComputationSubmit(e);
+                return false;
+            });
+            return form;
+        },
+        _createIsoWaitingElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPisochronCalcWaitingContainer');
+            div.className = 'GPisochronCalcWaitingContainerHidden';
+            var p = document.createElement('p');
+            p.className = 'GPisochronCalcWaiting';
+            p.innerHTML = 'Calcul en cours...';
+            div.appendChild(p);
+            return div;
+        },
+        _createIsoPanelFormTypeChoiceElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPisochronChoice');
+            return div;
+        },
+        _createIsoPanelFormTypeChoiceChronElement: function (checked) {
+            var self = this;
+            var div = document.createElement('div');
+            div.className = 'GPisochronChoiceAlt';
+            var input = document.createElement('input');
+            input.id = this._addUID('GPisochronChoiceAltChron');
+            input.name = 'GPisochronChoiceMode';
+            input.type = 'radio';
+            input.checked = checked ? true : false;
+            if (input.addEventListener) {
+                input.addEventListener('change', function (e) {
+                    document.getElementById(self._addUID('GPisochronValueChron')).className = 'GPflexInput';
+                    document.getElementById(self._addUID('GPisochronValueDist')).className = 'GPisochronValueHidden';
+                    self.onIsoTypeChoiceChange(e);
+                }, false);
+            } else if (input.attachEvent) {
+                input.attachEvent('onchange', function () {
+                    document.getElementById(self._addUID('GPisochronValueChron')).className = 'GPflexInput';
+                    document.getElementById(self._addUID('GPisochronValueDist')).className = 'GPisochronValueHidden';
+                    self.onIsoTypeChoiceChange();
+                });
+            }
+            input.value = 'isochron';
+            div.appendChild(input);
+            var label = document.createElement('label');
+            label.className = 'GPisochronChoiceAltImg';
+            label.htmlFor = this._addUID('GPisochronChoiceAltChron');
+            div.appendChild(label);
+            var span = document.createElement('span');
+            span.id = this._addUID('GPisochronChoiceAltChronTxt');
+            span.innerHTML = 'isochrone';
+            if (span.addEventListener) {
+                span.addEventListener('click', function () {
+                    document.getElementById(self._addUID('GPisochronChoiceAltChron')).click();
+                }, false);
+            } else if (span.attachEvent) {
+                span.attachEvent('onclick', function () {
+                    document.getElementById(self._addUID('GPisochronChoiceAltChron')).click();
+                });
+            }
+            div.appendChild(span);
+            return div;
+        },
+        _createIsoPanelFormTypeChoiceDistElement: function (checked) {
+            var self = this;
+            var div = document.createElement('div');
+            div.className = 'GPisochronChoiceAlt';
+            var input = document.createElement('input');
+            input.id = this._addUID('GPisochronChoiceAltDist');
+            input.name = 'GPisochronChoiceMode';
+            input.type = 'radio';
+            input.checked = checked ? true : false;
+            if (input.addEventListener) {
+                input.addEventListener('change', function (e) {
+                    document.getElementById(self._addUID('GPisochronValueDist')).className = 'GPflexInput';
+                    document.getElementById(self._addUID('GPisochronValueChron')).className = 'GPisochronValueHidden';
+                    self.onIsoTypeChoiceChange(e);
+                }, false);
+            } else if (input.attachEvent) {
+                input.attachEvent('onchange', function () {
+                    document.getElementById(self._addUID('GPisochronValueDist')).className = 'GPflexInput';
+                    document.getElementById(self._addUID('GPisochronValueChron')).className = 'GPisochronValueHidden';
+                    self.onIsoTypeChoiceChange();
+                });
+            }
+            input.value = 'isodistance';
+            div.appendChild(input);
+            var label = document.createElement('label');
+            label.className = 'GPisochronChoiceAltImg';
+            label.htmlFor = this._addUID('GPisochronChoiceAltDist');
+            div.appendChild(label);
+            var span = document.createElement('span');
+            span.id = this._addUID('GPisochronChoiceAltDistTxt');
+            span.innerHTML = 'isodistance';
+            if (span.addEventListener) {
+                span.addEventListener('click', function () {
+                    document.getElementById(self._addUID('GPisochronChoiceAltDist')).click();
+                }, false);
+            } else if (span.attachEvent) {
+                span.attachEvent('onclick', function () {
+                    document.getElementById(self._addUID('GPisochronChoiceAltDist')).click();
+                });
+            }
+            div.appendChild(span);
+            return div;
+        },
+        _createIsoPanelFormValueIsochronElement: function (checked) {
+            var context = this;
+            var div = document.createElement('div');
+            div.id = this._addUID('GPisochronValueChron');
+            div.className = checked ? 'GPflexInput' : 'GPisochronValueHidden';
+            var label = document.createElement('label');
+            label.id = this._addUID('GPisochronValueChronLabel');
+            label.htmlFor = this._addUID('GPisochronValueChronInput');
+            label.innerHTML = 'Temps';
+            div.appendChild(label);
+            var input1 = document.createElement('input');
+            input1.id = this._addUID('GPisochronValueChronInput1');
+            input1.min = '0';
+            input1.step = '1';
+            input1.value = '0';
+            input1.type = 'number';
+            if (input1.addEventListener) {
+                input1.addEventListener('change', function (e) {
+                    if (typeof context.onIsoValueChronTimeMinuteChange === 'function') {
+                        context.onIsoValueChronTimeHourChange(e);
+                    }
+                });
+            } else if (input1.attachEvent) {
+                input1.attachEvent('onchange', function (e) {
+                    if (typeof context.onIsoValueChronTimeMinuteChange === 'function') {
+                        context.onIsoValueChronTimeHourChange(e);
+                    }
+                });
+            }
+            div.appendChild(input1);
+            var label1 = document.createElement('label');
+            label1.innerHTML = 'h';
+            div.appendChild(label1);
+            var input2 = document.createElement('input');
+            input2.id = this._addUID('GPisochronValueChronInput2');
+            input2.min = '0';
+            input2.max = '59';
+            input2.step = '1';
+            input2.value = '0';
+            input2.type = 'number';
+            if (input2.addEventListener) {
+                input2.addEventListener('change', function (e) {
+                    if (typeof context.onIsoValueChronTimeMinuteChange === 'function') {
+                        context.onIsoValueChronTimeMinuteChange(e);
+                    }
+                });
+            } else if (input2.attachEvent) {
+                input2.attachEvent('onchange', function (e) {
+                    if (typeof context.onIsoValueChronTimeMinuteChange === 'function') {
+                        context.onIsoValueChronTimeMinuteChange(e);
+                    }
+                });
+            }
+            div.appendChild(input2);
+            var label2 = document.createElement('label');
+            label2.innerHTML = 'min';
+            div.appendChild(label2);
+            return div;
+        },
+        _createIsoPanelFormValueIsodistanceElement: function (checked) {
+            var context = this;
+            var div = document.createElement('div');
+            div.id = this._addUID('GPisochronValueDist');
+            div.className = checked ? 'GPflexInput' : 'GPisochronValueHidden';
+            var label = document.createElement('label');
+            label.id = this._addUID('GPisochronValueDistLabel');
+            label.htmlFor = this._addUID('GPisochronValueDistInput');
+            label.innerHTML = 'Distance';
+            div.appendChild(label);
+            var input1 = document.createElement('input');
+            input1.id = this._addUID('GPisochronValueDistInput');
+            input1.min = '0';
+            input1.step = 'any';
+            input1.value = '0';
+            input1.type = 'number';
+            if (input1.addEventListener) {
+                input1.addEventListener('change', function (e) {
+                    if (typeof context.onIsoValueDistChange === 'function') {
+                        context.onIsoValueDistChange(e);
+                    }
+                });
+            } else if (input1.attachEvent) {
+                input1.attachEvent('onchange', function (e) {
+                    if (typeof context.onIsoValueDistChange === 'function') {
+                        context.onIsoValueDistChange(e);
+                    }
+                });
+            }
+            div.appendChild(input1);
+            var label1 = document.createElement('label');
+            label1.innerHTML = 'km';
+            div.appendChild(label1);
+            return div;
+        },
+        _createIsoPanelFormModeChoiceElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPisochronModeChoice');
+            return div;
+        },
+        _createIsoPanelFormModeChoiceTransportElement: function (transports) {
+            var context = this;
+            var div = document.createElement('div');
+            div.id = this._addUID('GPisochronTransportChoice');
+            var span = document.createElement('span');
+            span.className = 'GPisochronModeLabel';
+            span.innerHTML = 'Mode de transport';
+            div.appendChild(span);
+            for (var i = 0; i < transports.length; i++) {
+                var transport = transports[i];
+                if (transport === 'Voiture') {
+                    var inputCar = document.createElement('input');
+                    inputCar.id = this._addUID('GPisochronTransportCar');
+                    inputCar.type = 'radio';
+                    inputCar.name = 'GPisochronTransport';
+                    if (i === 0) {
+                        inputCar.checked = true;
+                    }
+                    if (inputCar.addEventListener) {
+                        inputCar.addEventListener('change', function (e) {
+                            context.onIsoModeTransportChange(e);
+                        });
+                    } else if (inputCar.attachEvent) {
+                        inputCar.attachEvent('onchange', function (e) {
+                            context.onIsoModeTransportChange(e);
+                        });
+                    }
+                    inputCar.value = 'Voiture';
+                    div.appendChild(inputCar);
+                    var labelCar = document.createElement('label');
+                    labelCar.className = 'GPisochronTransportImg';
+                    labelCar.htmlFor = this._addUID('GPisochronTransportCar');
+                    labelCar.title = 'Voiture';
+                    div.appendChild(labelCar);
+                }
+                if (transport === 'Pieton') {
+                    var inputPedestrian = document.createElement('input');
+                    inputPedestrian.id = this._addUID('GPisochronTransportPedestrian');
+                    inputPedestrian.type = 'radio';
+                    inputPedestrian.name = 'GPisochronTransport';
+                    if (i === 0) {
+                        inputPedestrian.checked = true;
+                    }
+                    if (inputPedestrian.addEventListener) {
+                        inputPedestrian.addEventListener('change', function (e) {
+                            context.onIsoModeTransportChange(e);
+                        });
+                    } else if (inputPedestrian.attachEvent) {
+                        inputPedestrian.attachEvent('onchange', function (e) {
+                            context.onIsoModeTransportChange(e);
+                        });
+                    }
+                    inputPedestrian.value = 'Pieton';
+                    div.appendChild(inputPedestrian);
+                    var labelPedestrian = document.createElement('label');
+                    labelPedestrian.className = 'GPisochronTransportImg';
+                    labelPedestrian.htmlFor = this._addUID('GPisochronTransportPedestrian');
+                    labelPedestrian.title = 'Piéton';
+                    div.appendChild(labelPedestrian);
+                }
+            }
+            return div;
+        },
+        _createIsoPanelFormModeChoiceDirectionElement: function (directions) {
+            var self = this;
+            var div = document.createElement('div');
+            div.id = this._addUID('GPisochronDirectionChoice');
+            var span = document.createElement('span');
+            span.className = 'GPisochronModeLabel';
+            span.innerHTML = 'Sens de parcours';
+            div.appendChild(span);
+            var select = document.createElement('select');
+            select.id = this._addUID('GPisochronDirectionSelect');
+            select.className = 'GPinputSelect';
+            select.addEventListener('change', function (e) {
+                self.onIsoModeDirectionChange(e);
+            });
+            for (var i = 0; i < directions.length; i++) {
+                var direction = directions[i];
+                if (direction.toLowerCase() === 'departure') {
+                    var departureOption = document.createElement('option');
+                    if (i === 0) {
+                        departureOption.selected = 'selected';
+                    }
+                    departureOption.value = 'departure';
+                    departureOption.text = 'Départ';
+                    select.appendChild(departureOption);
+                }
+                if (direction.toLowerCase() === 'arrival') {
+                    var arrivalOption = document.createElement('option');
+                    if (i === 0) {
+                        arrivalOption.selected = 'selected';
+                    }
+                    arrivalOption.value = 'arrival';
+                    arrivalOption.text = 'Arrivée';
+                    select.appendChild(arrivalOption);
+                }
+            }
+            div.appendChild(select);
+            return div;
+        },
+        _createShowIsoExclusionsElement: function () {
+            var input = document.createElement('input');
+            input.id = this._addUID('GPshowIsoExclusions');
+            input.type = 'checkbox';
+            return input;
+        },
+        _createShowIsoExclusionsPictoElement: function () {
+            var label = document.createElement('label');
+            label.id = this._addUID('GPshowIsoExclusionsPicto');
+            label.className = 'GPshowMoreOptions GPshowIsoExclusionsPicto';
+            label.htmlFor = this._addUID('GPshowIsoExclusions');
+            label.title = 'Exclusions';
+            label.style.top = '240px';
+            return label;
+        },
+        _createIsoPanelFormExclusionsElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPisoExclusions');
+            var span = document.createElement('span');
+            span.className = 'GPisoExclusionsLabel';
+            span.innerHTML = 'Passages autorisés';
+            div.appendChild(span);
+            return div;
+        },
+        _createIsoPanelFormExclusionOptionsElement: function (exclusions) {
+            var context = this;
+            var div = document.createElement('div');
+            div.className = 'GPisoExclusionsOptions';
+            for (var value in exclusions) {
+                if (exclusions.hasOwnProperty(value)) {
+                    var status = exclusions[value];
+                    switch (value) {
+                    case 'toll':
+                        var inputToll = document.createElement('input');
+                        inputToll.id = this._addUID('GPisoExclusionsToll');
+                        inputToll.type = 'checkbox';
+                        inputToll.checked = !status;
+                        if (inputToll.addEventListener) {
+                            inputToll.addEventListener('change', function (e) {
+                                context.onIsoExclusionsChange(e);
+                            });
+                        } else if (inputToll.attachEvent) {
+                            inputToll.attachEvent('onchange', function (e) {
+                                context.onIsoExclusionsChange(e);
+                            });
+                        }
+                        inputToll.value = 'Toll';
+                        div.appendChild(inputToll);
+                        var labelToll = document.createElement('label');
+                        labelToll.className = 'GPisoExclusionsOption';
+                        labelToll.htmlFor = this._addUID('GPisoExclusionsToll');
+                        labelToll.innerHTML = 'Péages';
+                        div.appendChild(labelToll);
+                        break;
+                    case 'tunnel':
+                        var inputTunnel = document.createElement('input');
+                        inputTunnel.id = this._addUID('GPisoExclusionsTunnel');
+                        inputTunnel.type = 'checkbox';
+                        inputTunnel.checked = !status;
+                        if (inputTunnel.addEventListener) {
+                            inputTunnel.addEventListener('change', function (e) {
+                                context.onIsoExclusionsChange(e);
+                            });
+                        } else if (inputTunnel.attachEvent) {
+                            inputTunnel.attachEvent('onchange', function (e) {
+                                context.onIsoExclusionsChange(e);
+                            });
+                        }
+                        inputTunnel.value = 'Tunnel';
+                        div.appendChild(inputTunnel);
+                        var labelTunnel = document.createElement('label');
+                        labelTunnel.className = 'GPisoExclusionsOption';
+                        labelTunnel.htmlFor = this._addUID('GPisoExclusionsTunnel');
+                        labelTunnel.innerHTML = 'Tunnels';
+                        div.appendChild(labelTunnel);
+                        break;
+                    case 'bridge':
+                        var inputBridge = document.createElement('input');
+                        inputBridge.id = this._addUID('GPisoExclusionsBridge');
+                        inputBridge.type = 'checkbox';
+                        inputBridge.checked = !status;
+                        if (inputBridge.addEventListener) {
+                            inputBridge.addEventListener('change', function (e) {
+                                context.onIsoExclusionsChange(e);
+                            });
+                        } else if (inputBridge.attachEvent) {
+                            inputBridge.attachEvent('onchange', function (e) {
+                                context.onIsoExclusionsChange(e);
+                            });
+                        }
+                        inputBridge.value = 'Bridge';
+                        div.appendChild(inputBridge);
+                        var labelBridge = document.createElement('label');
+                        labelBridge.className = 'GPisoExclusionsOption';
+                        labelBridge.htmlFor = this._addUID('GPisoExclusionsBridge');
+                        labelBridge.innerHTML = 'Ponts';
+                        div.appendChild(labelBridge);
+                        break;
+                    }
+                }
+            }
+            return div;
+        },
+        _createIsoSubmitFormElement: function () {
+            var input = document.createElement('input');
+            input.id = this._addUID('GPisochronSubmit');
+            input.className = 'GPinputSubmit';
+            input.type = 'submit';
+            input.value = 'Calculer';
+            return input;
+        },
+        _createIsoFormResetElement: function () {
+            var self = this;
+            var divReset = document.createElement('div');
+            divReset.id = this._addUID('GPisochronReset');
+            divReset.title = 'Réinitialiser les paramètres';
+            divReset.addEventListener('click', function (e) {
+                self.onIsoResetClick(e);
+            });
+            return divReset;
+        }
+    };
+    return IsoDOM;
+}();
+LeafletControlsIsocurve = function (L, woodman, Gp, RightManagement, ID, LocationSelector, IsoDOM) {
+    var Isocurve = L.Control.extend({
+        includes: IsoDOM,
+        options: {
+            position: 'topleft',
+            collapsed: true,
+            methods: [
+                'time',
+                'distance'
+            ],
+            graphs: [
+                'Voiture',
+                'Pieton'
+            ],
+            exclusions: {
+                toll: false,
+                tunnel: false,
+                bridge: false
+            },
+            directions: [
+                'departure',
+                'arrival'
+            ],
+            disableReverse: false,
+            isocurveOptions: {},
+            autocompleteOptions: {}
+        },
+        initialize: function (options) {
+            L.Util.setOptions(this, options);
+            this._uid = ID.generate();
+            this._isDesktop = this._detectSupport();
+            this._waitingContainer = null;
+            this._showContainer = null;
+            this._formContainer = null;
+            this._submitContainer = null;
+            this._currentTransport = null;
+            this._currentDirection = null;
+            this._currentComputation = null;
+            this._currentTimeHour = 0;
+            this._currentTimeMinute = 0;
+            this._currentDistance = 0;
+            this._currentExclusions = [];
+            this._initTransport();
+            this._initComputation();
+            this._initDirection();
+            this._initExclusions();
+            this._currentPoint = null;
+            this._geojsonIso = null;
+            this._waiting = false;
+            this._timer = null;
+            this._currentIsoResults = null;
+            this._resources = {};
+            this._noRightManagement = false;
+            this._checkRightsManagement();
+        },
+        onAdd: function (map) {
+            var container = this._container = this._initLayout(map);
+            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
+            return container;
+        },
+        onRemove: function () {
+        },
+        _initTransport: function () {
+            this._currentTransport = 'Voiture';
+            var transport = this.options.graphs;
+            if (!transport || transport.length === 0) {
+                this.options.graphs = [
+                    'Voiture',
+                    'Pieton'
+                ];
+            }
+            if (L.Util.isArray(transport) && transport.length) {
+                if (transport[0] === 'Voiture' || transport[0] === 'Pieton') {
+                    this._currentTransport = transport[0];
+                }
+            }
+            var serviceOptions = this.options.isocurveOptions;
+            if (serviceOptions.graph) {
+                this._currentTransport = serviceOptions.graph;
+            }
+        },
+        _initDirection: function () {
+            this._currentDirection = 'departure';
+            var directions = this.options.directions;
+            if (!directions || directions.length === 0) {
+                this.options.directions = [
+                    'departure',
+                    'arrival'
+                ];
+            }
+            if (L.Util.isArray(directions) && directions.length) {
+                if (directions[0] === 'departure' || directions[0] === 'arrival') {
+                    this._currentDirection = directions[0];
+                }
+            }
+            var serviceOptions = this.options.isocurveOptions;
+            if (!serviceOptions.reverse) {
+                this._currentDirection = 'departure';
+            }
+            if (serviceOptions.reverse === true) {
+                this._currentDirection = 'arrival';
+                this.options.directions = [
+                    'arrival',
+                    'departure'
+                ];
+            }
+        },
+        _initComputation: function () {
+            this._currentComputation = 'time';
+            var methods = this.options.methods;
+            if (!methods || methods.length === 0) {
+                this.options.methods = [
+                    'time',
+                    'distance'
+                ];
+            }
+            if (L.Util.isArray(methods) && methods.length) {
+                if (methods[0] === 'time' || methods[0] === 'distance') {
+                    this._currentComputation = methods[0];
+                }
+            }
+            var serviceOptions = this.options.isocurveOptions;
+            if (serviceOptions.method) {
+                this._currentComputation = serviceOptions.method;
+            }
+            if (serviceOptions.time) {
+                this._currentComputation = 'time';
+            }
+            if (serviceOptions.distance) {
+                this._currentComputation = 'distance';
+            }
+        },
+        _initExclusions: function () {
+            this._currentExclusions = [];
+            var exclusion = this.options.exclusions;
+            if (!exclusion || typeof exclusion === 'object' && Object.keys(exclusion).length === 0) {
+                this.options.exclusions = {
+                    toll: false,
+                    tunnel: false,
+                    bridge: false
+                };
+            }
+            if (exclusion && typeof exclusion === 'object' && Object.keys(exclusion).length) {
+                for (var k in exclusion) {
+                    if (exclusion.hasOwnProperty(k)) {
+                        if (exclusion.k) {
+                            this._currentExclusions.push(k);
+                        }
+                    }
+                }
+            }
+            var serviceOptions = this.options.isocurveOptions;
+            if (Array.isArray(serviceOptions.exclusions)) {
+                this._currentExclusions = serviceOptions.exclusions;
+            }
+        },
+        _checkRightsManagement: function () {
+            var _opts = null;
+            var _res = [];
+            var _key = null;
+            _key = this.options.isocurveOptions.apiKey;
+            _opts = this.options.isocurveOptions.filterOptions;
+            _res = _opts ? _opts.type : [];
+            if (!_res || _res.length === 0) {
+                _res = [
+                    'Voiture',
+                    'Pieton'
+                ];
+            }
+            var rightManagementIsochrone = RightManagement.check({
+                key: _key || this.options.apiKey,
+                resources: _res,
+                services: ['Isochrone']
+            });
+            _key = this.options.autocompleteOptions.apiKey;
+            _opts = this.options.autocompleteOptions.filterOptions;
+            _res = _opts ? _opts.type : [];
+            if (!_res || _res.length === 0) {
+                _res = [
+                    'PositionOfInterest',
+                    'StreetAddress'
+                ];
+            }
+            var rightManagementAutoComplete = RightManagement.check({
+                key: _key || this.options.apiKey,
+                resources: _res,
+                services: ['AutoCompletion']
+            });
+            if (!rightManagementIsochrone && !rightManagementAutoComplete) {
+                this._noRightManagement = true;
+            }
+            if (rightManagementAutoComplete) {
+                this._resources['AutoCompletion'] = {};
+                this._resources['AutoCompletion']['resources'] = rightManagementAutoComplete['AutoCompletion'];
+                this._resources['AutoCompletion']['key'] = rightManagementAutoComplete['key'];
+            }
+            if (rightManagementIsochrone) {
+                this._resources['Isochrone'] = {};
+                this._resources['Isochrone']['resources'] = rightManagementIsochrone['Isochrone'];
+                this._resources['Isochrone']['key'] = rightManagementIsochrone['key'];
+            }
+        },
+        _detectSupport: function () {
+            var isDesktop = true;
+            var userAgent = window.navigator.userAgent.toLowerCase();
+            if (userAgent.indexOf('iphone') !== -1 || userAgent.indexOf('ipod') !== -1 || userAgent.indexOf('ipad') !== -1 || userAgent.indexOf('android') !== -1 || userAgent.indexOf('mobile') !== -1 || userAgent.indexOf('blackberry') !== -1 || userAgent.indexOf('tablet') !== -1 || userAgent.indexOf('phone') !== -1 || userAgent.indexOf('touch') !== -1) {
+                isDesktop = false;
+            }
+            if (userAgent.indexOf('msie') !== -1 || userAgent.indexOf('trident') !== -1) {
+                isDesktop = true;
+            }
+            return isDesktop;
+        },
+        _initLayout: function (map) {
+            var container = this._createMainContainerElement();
+            var inputShow = this._showContainer = this._createShowIsoElement();
+            container.appendChild(inputShow);
+            if (!this.options.collapsed) {
+                inputShow.checked = true;
+            }
+            var picto = this._createShowIsoPictoElement();
+            container.appendChild(picto);
+            var panel = this._createIsoPanelElement();
+            var header = this._createIsoPanelHeaderElement();
+            panel.appendChild(header);
+            var form = this._formContainer = this._createIsoPanelFormElement();
+            var point = this._createIsoPanelFormPointElement(map);
+            form.appendChild(point);
+            var isoChronChecked = false;
+            var isoDistChecked = false;
+            var typeChoice = this._createIsoPanelFormTypeChoiceElement();
+            for (var i = 0; i < this.options.methods.length; i++) {
+                if (this.options.methods[i] === 'time') {
+                    isoChronChecked = i === 0 ? true : false;
+                    typeChoice.appendChild(this._createIsoPanelFormTypeChoiceChronElement(isoChronChecked));
+                }
+                if (this.options.methods[i] === 'distance') {
+                    isoDistChecked = i === 0 ? true : false;
+                    typeChoice.appendChild(this._createIsoPanelFormTypeChoiceDistElement(isoDistChecked));
+                }
+            }
+            form.appendChild(typeChoice);
+            form.appendChild(this._createIsoPanelFormValueIsochronElement(isoChronChecked));
+            form.appendChild(this._createIsoPanelFormValueIsodistanceElement(isoDistChecked));
+            var modeChoice = this._createIsoPanelFormModeChoiceElement();
+            modeChoice.appendChild(this._createIsoPanelFormModeChoiceTransportElement(this.options.graphs));
+            modeChoice.appendChild(this._createIsoPanelFormModeChoiceDirectionElement(this.options.directions));
+            form.appendChild(modeChoice);
+            if (this.options.exclusions && typeof this.options.exclusions === 'object' && Object.keys(this.options.exclusions).length !== 0) {
+                form.appendChild(this._createShowIsoExclusionsElement());
+                form.appendChild(this._createShowIsoExclusionsPictoElement());
+                var exclusion = this._createIsoPanelFormExclusionsElement();
+                exclusion.appendChild(this._createIsoPanelFormExclusionOptionsElement(this.options.exclusions));
+                form.appendChild(exclusion);
+            }
+            var divReset = this._createIsoFormResetElement();
+            form.appendChild(divReset);
+            var submit = this._submitContainer = this._createIsoSubmitFormElement();
+            form.appendChild(submit);
+            panel.appendChild(form);
+            var waiting = this._waitingContainer = this._createIsoWaitingElement();
+            panel.appendChild(waiting);
+            container.appendChild(panel);
+            return container;
+        },
+        _createIsoPanelFormPointElement: function (map) {
+            this._currentPoint = new LocationSelector({
+                apiKey: this.options.apiKey || null,
+                tag: {
+                    id: 0,
+                    unique: this._uid,
+                    label: 'Départ',
+                    color: 'red',
+                    display: true
+                },
+                displayInfo: true,
+                disableReverse: this.options.disableReverse,
+                autocompleteOptions: this.options.autocompleteOptions || null
+            });
+            this._currentPoint.setMap(map);
+            return this._currentPoint.getContainer();
+        },
+        onShowIsoPanelClick: function (e) {
+        },
+        onIsoResetClick: function (e) {
+            this._clear();
+        },
+        onIsoTypeChoiceChange: function (e) {
+            var value = e.target.value;
+            if (!value) {
+                return;
+            }
+            if (value === 'isodistance') {
+                this._currentComputation = 'distance';
+            }
+            if (value === 'isochron') {
+                this._currentComputation = 'time';
+            }
+        },
+        onIsoModeTransportChange: function (e) {
+            var value = e.target.value;
+            if (!value) {
+                return;
+            }
+            this._currentTransport = value;
+        },
+        onIsoModeDirectionChange: function (e) {
+            var value = e.target.value;
+            if (!value) {
+                return;
+            }
+            this._currentDirection = value;
+        },
+        onIsoValueChronTimeHourChange: function (e) {
+            var value = e.target.value;
+            this._timeHourContainer = e.target;
+            if (!value) {
+                return;
+            }
+            this._currentTimeHour = value;
+        },
+        onIsoValueChronTimeMinuteChange: function (e) {
+            var value = e.target.value;
+            this._timeMinuteContainer = e.target;
+            if (!value) {
+                return;
+            }
+            this._currentTimeMinute = value;
+        },
+        onIsoValueDistChange: function (e) {
+            var value = e.target.value;
+            this._distanceContainer = e.target;
+            if (!value) {
+                return;
+            }
+            this._currentDistance = value;
+        },
+        onIsoExclusionsChange: function (e) {
+            var value = e.target.value;
+            var checked = e.target.checked;
+            if (!value) {
+                return;
+            }
+            var bFound = false;
+            var iFound = null;
+            for (var i = 0; i < this._currentExclusions.length; i++) {
+                if (this._currentExclusions[i] === value) {
+                    iFound = i;
+                    bFound = true;
+                }
+            }
+            if (!bFound && !checked) {
+                this._currentExclusions.push(value);
+            }
+            if (bFound && checked) {
+                this._currentExclusions.splice(iFound, 1);
+            }
+        },
+        onIsoComputationSubmit: function () {
+            if (!this._currentPoint || !this._currentPoint.getCoordinate || !this._currentPoint.getCoordinate()) {
+                return;
+            }
+            var time;
+            if (this._currentComputation.toLowerCase() === 'time') {
+                time = this._currentTimeHour * 3600 + this._currentTimeMinute * 60;
+            }
+            var distance;
+            if (this._currentComputation.toLowerCase() === 'distance') {
+                distance = this._currentDistance * 1000;
+            }
+            if (!time && !distance) {
+                return;
+            }
+            if (this._noRightManagement) {
+                return;
+            }
+            this._displayWaitingContainer();
+            var self = this;
+            this._requestIsoCurve({
+                position: self._currentPoint.getCoordinate(),
+                graph: self._currentTransport,
+                exclusions: self._currentExclusions,
+                method: self._currentComputation,
+                reverse: self._currentDirection.toLowerCase() === 'arrival' ? true : false,
+                time: time,
+                distance: distance,
+                smoothing: true,
+                timeout: 7000,
+                protocol: 'XHR',
+                onSuccess: function (results) {
+                    if (results) {
+                        self._drawIsoResults(results);
+                    }
+                },
+                onFailure: function (error) {
+                    self._hideWaitingContainer();
+                    self._clearIsoResultsGeometry();
+                }
+            });
+        },
+        _requestIsoCurve: function (settings) {
+            if (!settings || typeof settings === 'object' && Object.keys(settings).length === 0) {
+                return;
+            }
+            if (!settings.position) {
+                return;
+            }
+            if (this._noRightManagement) {
+                return;
+            }
+            var services = this._resources['Isochrone'];
+            if (!services) {
+                return;
+            }
+            var resources = services.resources;
+            if (!resources || typeof resources === 'object' && Object.keys(resources).length === 0) {
+                return;
+            }
+            var options = {};
+            L.Util.extend(options, settings);
+            L.Util.extend(options, this.options.isocurveOptions);
+            var bFound = false;
+            for (var i = 0; i < resources.length; i++) {
+                if (resources[i] === options.graph) {
+                    bFound = true;
+                }
+            }
+            if (!bFound) {
+                console.log('no rights for this service !?');
+                return;
+            }
+            var key = this._resources['Isochrone']['key'];
+            options.apiKey = this.options.isocurveOptions.apiKey || this.options.apiKey || key;
+            Gp.Services.isoCurve(options);
+        },
+        _drawIsoResults: function (results) {
+            this._clearIsoResultsGeometry();
+            this._currentIsoResults = results;
+            if (!results.geometry) {
+                this._hideWaitingContainer();
+                return;
+            }
+            var map = this._map;
+            var _geometry = results.geometry;
+            var _style = {
+                color: '#ff7800',
+                weight: 5,
+                opacity: 0.65
+            };
+            this._geojsonIso = L.geoJson(_geometry, { style: _style }).addTo(map);
+            this._hideWaitingContainer();
+            this._formContainer.className = 'GPisochroComponentHidden';
+        },
+        _clear: function () {
+            this._initTransport();
+            this._initExclusions();
+            this._initComputation();
+            this._initDirection();
+            this._currentIsoResults = null;
+            this._clearIsoResultsGeometry();
+            this._currentPoint.clear();
+            if (this._timeHourContainer) {
+                this._timeHourContainer.value = 0;
+            }
+            if (this._timeMinuteContainer) {
+                this._timeMinuteContainer.value = 0;
+            }
+            if (this._distanceContainer) {
+                this._distanceContainer.value = 0;
+            }
+        },
+        _clearIsoResultsGeometry: function () {
+            var map = this._map;
+            if (this._geojsonIso != null) {
+                map.removeLayer(this._geojsonIso);
+                this._geojsonIso = null;
+            }
+        },
+        _displayWaitingContainer: function () {
+            this._waitingContainer.className = 'GPisochronCalcWaitingContainerVisible';
+            this._waiting = true;
+            if (this._timer) {
+                clearTimeout(this._timer);
+                this._timer = null;
+            }
+            var context = this;
+            this._timer = setTimeout(function () {
+                if (context._waiting === true) {
+                    context._hideWaitingContainer();
+                } else {
+                    if (context._timer) {
+                        clearTimeout(context._timer);
+                    }
+                }
+            }, 16000);
+        },
+        _hideWaitingContainer: function () {
+            if (this._waiting) {
+                this._waitingContainer.className = 'GPisochronCalcWaitingContainerHidden';
+                this._waiting = false;
+                clearTimeout(this._timer);
+                this._timer = null;
+            }
+        }
+    });
+    return Isocurve;
+}(leaflet, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, LeafletControlsLocationSelector, CommonControlsIsoDOM);
+CommonControlsMousePositionDOM = function () {
+    var MousePositionDOM = {
+        _addUID: function (id) {
+            var uid = this._uid ? id + '-' + this._uid : id;
+            return uid;
+        },
+        _createMainContainerElement: function () {
+            var container = document.createElement('div');
+            container.id = this._addUID('GPmousePosition');
+            container.className = 'GPwidget';
+            return container;
+        },
+        _createShowMousePositionElement: function () {
+            var input = document.createElement('input');
+            input.id = this._addUID('GPshowMousePosition');
+            input.type = 'checkbox';
+            return input;
+        },
+        _createShowMousePositionPictoElement: function (isDesktop) {
+            var self = this;
+            var label = document.createElement('label');
+            label.id = this._addUID('GPshowMousePositionPicto');
+            label.className = 'GPshowAdvancedToolPicto';
+            label.htmlFor = this._addUID('GPshowMousePosition');
+            label.title = 'Afficher les coordonnées du curseur';
+            label.addEventListener('click', function (e) {
+                var mapCenterClass = '';
+                if (!document.getElementById(self._addUID('GPshowMousePosition')).checked && !isDesktop) {
+                    mapCenterClass = 'GPmapCenterVisible';
+                }
+                document.getElementById('GPmapCenter').className = mapCenterClass;
+                self.onShowMousePositionClick(e);
+            });
+            var spanOpen = document.createElement('span');
+            spanOpen.id = this._addUID('GPshowMousePositionOpen');
+            spanOpen.className = 'GPshowAdvancedToolOpen';
+            label.appendChild(spanOpen);
+            return label;
+        },
+        _createMousePositionPanelElement: function (displayAltitude, displayCoordinates) {
+            displayAltitude = displayAltitude ? true : typeof displayAltitude === 'undefined' ? true : false;
+            displayCoordinates = displayCoordinates ? true : typeof displayCoordinates === 'undefined' ? true : false;
+            var div = document.createElement('div');
+            div.id = this._addUID('GPmousePositionPanel');
+            div.className = 'GPpanel';
+            div.appendChild(this._createMousePositionPanelHeaderElement());
+            div.appendChild(this._createMousePositionPanelBasicElement(displayAltitude, displayCoordinates));
+            var arraySettings = this._createShowMousePositionSettingsElement(displayCoordinates);
+            for (var j = 0; j < arraySettings.length; j++) {
+                div.appendChild(arraySettings[j]);
+            }
+            return div;
+        },
+        _createMapCenter: function () {
+            var div = document.createElement('div');
+            div.id = 'GPmapCenter';
+            div.className = '';
+            return div;
+        },
+        _createMousePositionPanelHeaderElement: function () {
+            var container = document.createElement('div');
+            container.className = 'GPpanelHeader';
+            var divTitle = document.createElement('div');
+            divTitle.className = 'GPpanelTitle';
+            divTitle.innerHTML = 'Coordonnées';
+            container.appendChild(divTitle);
+            var divClose = document.createElement('div');
+            divClose.id = 'GPmousePositionPanelClose';
+            divClose.className = 'GPpanelClose';
+            divClose.title = 'Fermer le panneau';
+            var self = this;
+            if (divClose.addEventListener) {
+                divClose.addEventListener('click', function () {
+                    document.getElementById(self._addUID('GPshowMousePositionPicto')).click();
+                }, false);
+            } else if (divClose.attachEvent) {
+                divClose.attachEvent('onclick', function () {
+                    document.getElementById(self._addUID('GPshowMousePositionPicto')).click();
+                });
+            }
+            container.appendChild(divClose);
+            return container;
+        },
+        _createMousePositionPanelBasicElement: function (displayAltitude, displayCoordinates) {
+            var container = document.createElement('div');
+            container.id = this._addUID('GPmousePositionBasicPanel');
+            container.appendChild(this._createMousePositionPanelBasicCoordinateElement(displayCoordinates));
+            container.appendChild(this._createMousePositionPanelBasicAltitudeElement(displayAltitude));
+            return container;
+        },
+        _createMousePositionPanelBasicCoordinateElement: function (display) {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPmousePositionCoordinate');
+            div.style.display = display ? 'block' : 'none';
+            var spanLat = document.createElement('span');
+            spanLat.className = 'GPmousePositionLabel';
+            spanLat.id = this._addUID('GPmousePositionLatLabel');
+            spanLat.innerHTML = 'Latitude : ';
+            div.appendChild(spanLat);
+            var spanCLat = document.createElement('span');
+            spanCLat.className = 'GPmousePositionCoords';
+            spanCLat.id = this._addUID('GPmousePositionLat');
+            spanCLat.innerHTML = '';
+            div.appendChild(spanCLat);
+            var spanLon = document.createElement('span');
+            spanLon.className = 'GPmousePositionLabel';
+            spanLon.id = this._addUID('GPmousePositionLonLabel');
+            spanLon.innerHTML = 'Longitude : ';
+            div.appendChild(spanLon);
+            var spanCLon = document.createElement('span');
+            spanCLon.className = 'GPmousePositionCoords';
+            spanCLon.id = this._addUID('GPmousePositionLon');
+            spanCLon.innerHTML = '';
+            div.appendChild(spanCLon);
+            return div;
+        },
+        _createMousePositionPanelBasicAltitudeElement: function (display) {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPmousePositionAltitude');
+            div.style.display = display ? 'block' : 'none';
+            var spanLabel = document.createElement('span');
+            spanLabel.className = 'GPmousePositionLabel';
+            spanLabel.innerHTML = 'Altitude : ';
+            div.appendChild(spanLabel);
+            var spanAlt = document.createElement('span');
+            spanAlt.className = 'GPmousePositionCoords';
+            spanAlt.id = this._addUID('GPmousePositionAlt');
+            spanAlt.innerHTML = '';
+            div.appendChild(spanAlt);
+            return div;
+        },
+        _createShowMousePositionSettingsElement: function (display) {
+            var list = [];
+            var input = document.createElement('input');
+            input.type = 'checkbox';
+            input.id = this._addUID('GPshowMousePositionSettings');
+            var label = document.createElement('label');
+            label.id = this._addUID('GPshowMousePositionSettingsPicto');
+            label.htmlFor = this._addUID('GPshowMousePositionSettings');
+            label.title = 'Réglages';
+            label.className = 'GPshowMoreOptions GPshowMousePositionSettingsPicto';
+            label.style.display = display ? 'block' : 'none';
+            list.push(input);
+            list.push(label);
+            return list;
+        },
+        _createMousePositionSettingsElement: function () {
+            var container = document.createElement('div');
+            container.id = this._addUID('GPmousePositionSettings');
+            var span = document.createElement('span');
+            span.className = 'GPmousePositionSettingsLabel';
+            span.innerHTML = 'Système de référence';
+            container.appendChild(span);
+            return container;
+        },
+        _createMousePositionSettingsSystemsElement: function (systems) {
+            var context = this;
+            var selectSystem = document.createElement('select');
+            selectSystem.id = this._addUID('GPmousePositionProjectionSystem');
+            selectSystem.className = 'GPinputSelect GPmousePositionSettingsSelect';
+            selectSystem.addEventListener('change', function (e) {
+                context.onMousePositionProjectionSystemChange(e);
+            });
+            selectSystem.addEventListener('mouseover', function (e) {
+                context.onMousePositionProjectionSystemMouseOver(e);
+            });
+            for (var i = 0; i < systems.length; i++) {
+                var obj = systems[i];
+                var option = document.createElement('option');
+                option.value = obj.code;
+                option.text = obj.label || i;
+                selectSystem.appendChild(option);
+            }
+            return selectSystem;
+        },
+        _createMousePositionSettingsUnitsElement: function (units) {
+            var context = this;
+            var selectUnits = document.createElement('select');
+            selectUnits.id = this._addUID('GPmousePositionProjectionUnits');
+            selectUnits.className = 'GPinputSelect GPmousePositionSettingsSelect';
+            selectUnits.addEventListener('change', function (e) {
+                context.onMousePositionProjectionUnitsChange(e);
+            });
+            for (var j = 0; j < units.length; j++) {
+                var obj = units[j];
+                var option = document.createElement('option');
+                option.value = obj.code ? obj.code : j;
+                option.text = obj.label || j;
+                selectUnits.appendChild(option);
+            }
+            return selectUnits;
+        },
+        GPdisplayCoords: function (coordinate) {
+            if (coordinate && coordinate != null) {
+                var labelLon = document.getElementById(this._addUID('GPmousePositionLonLabel'));
+                var labelLat = document.getElementById(this._addUID('GPmousePositionLatLabel'));
+                if (coordinate.x || coordinate.y) {
+                    labelLat.innerHTML = 'X : ';
+                    labelLon.innerHTML = 'Y : ';
+                } else if (coordinate.e || coordinate.n) {
+                    labelLat.innerHTML = 'E : ';
+                    labelLon.innerHTML = 'N : ';
+                } else {
+                    labelLat.innerHTML = 'Latitude : ';
+                    labelLon.innerHTML = 'Longitude : ';
+                }
+                var elLat = document.getElementById(this._addUID('GPmousePositionLat'));
+                var elLon = document.getElementById(this._addUID('GPmousePositionLon'));
+                elLat.innerHTML = coordinate.x || coordinate.lat || coordinate.e || '0';
+                if (coordinate.unit) {
+                    elLat.innerHTML += ' ';
+                    elLat.innerHTML += coordinate.unit;
+                }
+                elLon.innerHTML = coordinate.y || coordinate.lng || coordinate.lon || coordinate.n || '0';
+                if (coordinate.unit) {
+                    elLon.innerHTML += ' ';
+                    elLon.innerHTML += coordinate.unit;
+                }
+            }
+        },
+        GPdisplayElevation: function (coordinate, altitudeTimeoutDelay, noDataValue, noDataValueTolerance) {
+            var self = this;
+            var altitudeTimeout;
+            if (!altitudeTimeoutDelay) {
+                altitudeTimeoutDelay = 500;
+            }
+            clearTimeout(altitudeTimeout);
+            document.getElementById(this._addUID('GPmousePositionAlt')).innerHTML = '...';
+            if (noDataValue == null) {
+                noDataValue = -99999;
+            }
+            if (noDataValueTolerance == null) {
+                noDataValueTolerance = 99980;
+            }
+            var maxThreshold = noDataValue + noDataValueTolerance;
+            var minThreshold = noDataValue - noDataValueTolerance;
+            if (coordinate && coordinate != null) {
+                if (document.getElementById(this._addUID('GPmousePositionAltitude'))) {
+                    altitudeTimeout = setTimeout(function () {
+                        self.onRequestAltitude(coordinate, function (z) {
+                            if (minThreshold < z && z < maxThreshold) {
+                                document.getElementById(self._addUID('GPmousePositionAlt')).innerHTML = '--- m';
+                            } else {
+                                document.getElementById(self._addUID('GPmousePositionAlt')).innerHTML = z + ' m';
+                            }
+                        });
+                    }, altitudeTimeoutDelay);
+                }
+            }
+        }
+    };
+    return MousePositionDOM;
+}();
+!function (e) {
+    if ('object' == typeof exports)
+        module.exports = e();
+    else if (true)
+        proj4 = function () {
+            return typeof e === 'function' ? e() : e;
+        }();
+    else {
+        var f;
+        'undefined' != typeof window ? f = window : 'undefined' != typeof global ? f = global : 'undefined' != typeof self && (f = self), f.proj4 = e();
+    }
+}(function () {
+    var define, module, exports;
+    return function e(t, n, r) {
+        function s(o, u) {
+            if (!n[o]) {
+                if (!t[o]) {
+                    var a = typeof require == 'function' && require;
+                    if (!u && a)
+                        return a(o, !0);
+                    if (i)
+                        return i(o, !0);
+                    throw new Error('Cannot find module \'' + o + '\'');
+                }
+                var f = n[o] = { exports: {} };
+                t[o][0].call(f.exports, function (e) {
+                    var n = t[o][1][e];
+                    return s(n ? n : e);
+                }, f, f.exports, e, t, n, r);
+            }
+            return n[o].exports;
+        }
+        var i = typeof require == 'function' && require;
+        for (var o = 0; o < r.length; o++)
+            s(r[o]);
+        return s;
+    }({
+        1: [
+            function (_dereq_, module, exports) {
+                var mgrs = _dereq_('mgrs');
+                function Point(x, y, z) {
+                    if (!(this instanceof Point)) {
+                        return new Point(x, y, z);
+                    }
+                    if (Array.isArray(x)) {
+                        this.x = x[0];
+                        this.y = x[1];
+                        this.z = x[2] || 0;
+                    } else if (typeof x === 'object') {
+                        this.x = x.x;
+                        this.y = x.y;
+                        this.z = x.z || 0;
+                    } else if (typeof x === 'string' && typeof y === 'undefined') {
+                        var coords = x.split(',');
+                        this.x = parseFloat(coords[0], 10);
+                        this.y = parseFloat(coords[1], 10);
+                        this.z = parseFloat(coords[2], 10) || 0;
+                    } else {
+                        this.x = x;
+                        this.y = y;
+                        this.z = z || 0;
+                    }
+                    console.warn('proj4.Point will be removed in version 3, use proj4.toPoint');
+                }
+                Point.fromMGRS = function (mgrsStr) {
+                    return new Point(mgrs.toPoint(mgrsStr));
+                };
+                Point.prototype.toMGRS = function (accuracy) {
+                    return mgrs.forward([
+                        this.x,
+                        this.y
+                    ], accuracy);
+                };
+                module.exports = Point;
+                return exports;
+            },
+            { 'mgrs': 66 }
+        ],
+        2: [
+            function (_dereq_, module, exports) {
+                var parseCode = _dereq_('./parseCode');
+                var extend = _dereq_('./extend');
+                var projections = _dereq_('./projections');
+                var deriveConstants = _dereq_('./deriveConstants');
+                function Projection(srsCode, callback) {
+                    if (!(this instanceof Projection)) {
+                        return new Projection(srsCode);
+                    }
+                    callback = callback || function (error) {
+                        if (error) {
+                            throw error;
+                        }
+                    };
+                    var json = parseCode(srsCode);
+                    if (typeof json !== 'object') {
+                        callback(srsCode);
+                        return;
+                    }
+                    var modifiedJSON = deriveConstants(json);
+                    var ourProj = Projection.projections.get(modifiedJSON.projName);
+                    if (ourProj) {
+                        extend(this, modifiedJSON);
+                        extend(this, ourProj);
+                        this.init();
+                        callback(null, this);
+                    } else {
+                        callback(srsCode);
+                    }
+                }
+                Projection.projections = projections;
+                Projection.projections.start();
+                module.exports = Projection;
+                return exports;
+            },
+            {
+                './deriveConstants': 32,
+                './extend': 33,
+                './parseCode': 36,
+                './projections': 38
+            }
+        ],
+        3: [
+            function (_dereq_, module, exports) {
+                module.exports = function (crs, denorm, point) {
+                    var xin = point.x, yin = point.y, zin = point.z || 0;
+                    var v, t, i;
+                    for (i = 0; i < 3; i++) {
+                        if (denorm && i === 2 && point.z === undefined) {
+                            continue;
+                        }
+                        if (i === 0) {
+                            v = xin;
+                            t = 'x';
+                        } else if (i === 1) {
+                            v = yin;
+                            t = 'y';
+                        } else {
+                            v = zin;
+                            t = 'z';
+                        }
+                        switch (crs.axis[i]) {
+                        case 'e':
+                            point[t] = v;
+                            break;
+                        case 'w':
+                            point[t] = -v;
+                            break;
+                        case 'n':
+                            point[t] = v;
+                            break;
+                        case 's':
+                            point[t] = -v;
+                            break;
+                        case 'u':
+                            if (point[t] !== undefined) {
+                                point.z = v;
+                            }
+                            break;
+                        case 'd':
+                            if (point[t] !== undefined) {
+                                point.z = -v;
+                            }
+                            break;
+                        default:
+                            return null;
+                        }
+                    }
+                    return point;
+                };
+                return exports;
+            },
+            {}
+        ],
+        4: [
+            function (_dereq_, module, exports) {
+                var HALF_PI = Math.PI / 2;
+                var sign = _dereq_('./sign');
+                module.exports = function (x) {
+                    return Math.abs(x) < HALF_PI ? x : x - sign(x) * Math.PI;
+                };
+                return exports;
+            },
+            { './sign': 21 }
+        ],
+        5: [
+            function (_dereq_, module, exports) {
+                var TWO_PI = Math.PI * 2;
+                var sign = _dereq_('./sign');
+                module.exports = function (x) {
+                    return Math.abs(x) < Math.PI ? x : x - sign(x) * TWO_PI;
+                };
+                return exports;
+            },
+            { './sign': 21 }
+        ],
+        6: [
+            function (_dereq_, module, exports) {
+                module.exports = function (x) {
+                    if (Math.abs(x) > 1) {
+                        x = x > 1 ? 1 : -1;
+                    }
+                    return Math.asin(x);
+                };
+                return exports;
+            },
+            {}
+        ],
+        7: [
+            function (_dereq_, module, exports) {
+                module.exports = function (x) {
+                    return 1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x));
+                };
+                return exports;
+            },
+            {}
+        ],
+        8: [
+            function (_dereq_, module, exports) {
+                module.exports = function (x) {
+                    return 0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x));
+                };
+                return exports;
+            },
+            {}
+        ],
+        9: [
+            function (_dereq_, module, exports) {
+                module.exports = function (x) {
+                    return 0.05859375 * x * x * (1 + 0.75 * x);
+                };
+                return exports;
+            },
+            {}
+        ],
+        10: [
+            function (_dereq_, module, exports) {
+                module.exports = function (x) {
+                    return x * x * x * (35 / 3072);
+                };
+                return exports;
+            },
+            {}
+        ],
+        11: [
+            function (_dereq_, module, exports) {
+                module.exports = function (a, e, sinphi) {
+                    var temp = e * sinphi;
+                    return a / Math.sqrt(1 - temp * temp);
+                };
+                return exports;
+            },
+            {}
+        ],
+        12: [
+            function (_dereq_, module, exports) {
+                module.exports = function (ml, e0, e1, e2, e3) {
+                    var phi;
+                    var dphi;
+                    phi = ml / e0;
+                    for (var i = 0; i < 15; i++) {
+                        dphi = (ml - (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi))) / (e0 - 2 * e1 * Math.cos(2 * phi) + 4 * e2 * Math.cos(4 * phi) - 6 * e3 * Math.cos(6 * phi));
+                        phi += dphi;
+                        if (Math.abs(dphi) <= 1e-10) {
+                            return phi;
+                        }
+                    }
+                    return NaN;
+                };
+                return exports;
+            },
+            {}
+        ],
+        13: [
+            function (_dereq_, module, exports) {
+                var HALF_PI = Math.PI / 2;
+                module.exports = function (eccent, q) {
+                    var temp = 1 - (1 - eccent * eccent) / (2 * eccent) * Math.log((1 - eccent) / (1 + eccent));
+                    if (Math.abs(Math.abs(q) - temp) < 0.000001) {
+                        if (q < 0) {
+                            return -1 * HALF_PI;
+                        } else {
+                            return HALF_PI;
+                        }
+                    }
+                    var phi = Math.asin(0.5 * q);
+                    var dphi;
+                    var sin_phi;
+                    var cos_phi;
+                    var con;
+                    for (var i = 0; i < 30; i++) {
+                        sin_phi = Math.sin(phi);
+                        cos_phi = Math.cos(phi);
+                        con = eccent * sin_phi;
+                        dphi = Math.pow(1 - con * con, 2) / (2 * cos_phi) * (q / (1 - eccent * eccent) - sin_phi / (1 - con * con) + 0.5 / eccent * Math.log((1 - con) / (1 + con)));
+                        phi += dphi;
+                        if (Math.abs(dphi) <= 1e-10) {
+                            return phi;
+                        }
+                    }
+                    return NaN;
+                };
+                return exports;
+            },
+            {}
+        ],
+        14: [
+            function (_dereq_, module, exports) {
+                module.exports = function (e0, e1, e2, e3, phi) {
+                    return e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi);
+                };
+                return exports;
+            },
+            {}
+        ],
+        15: [
+            function (_dereq_, module, exports) {
+                module.exports = function (eccent, sinphi, cosphi) {
+                    var con = eccent * sinphi;
+                    return cosphi / Math.sqrt(1 - con * con);
+                };
+                return exports;
+            },
+            {}
+        ],
+        16: [
+            function (_dereq_, module, exports) {
+                var HALF_PI = Math.PI / 2;
+                module.exports = function (eccent, ts) {
+                    var eccnth = 0.5 * eccent;
+                    var con, dphi;
+                    var phi = HALF_PI - 2 * Math.atan(ts);
+                    for (var i = 0; i <= 15; i++) {
+                        con = eccent * Math.sin(phi);
+                        dphi = HALF_PI - 2 * Math.atan(ts * Math.pow((1 - con) / (1 + con), eccnth)) - phi;
+                        phi += dphi;
+                        if (Math.abs(dphi) <= 1e-10) {
+                            return phi;
+                        }
+                    }
+                    return -9999;
+                };
+                return exports;
+            },
+            {}
+        ],
+        17: [
+            function (_dereq_, module, exports) {
+                var C00 = 1;
+                var C02 = 0.25;
+                var C04 = 0.046875;
+                var C06 = 0.01953125;
+                var C08 = 0.01068115234375;
+                var C22 = 0.75;
+                var C44 = 0.46875;
+                var C46 = 0.013020833333333334;
+                var C48 = 0.007120768229166667;
+                var C66 = 0.3645833333333333;
+                var C68 = 0.005696614583333333;
+                var C88 = 0.3076171875;
+                module.exports = function (es) {
+                    var en = [];
+                    en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08)));
+                    en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08)));
+                    var t = es * es;
+                    en[2] = t * (C44 - es * (C46 + es * C48));
+                    t *= es;
+                    en[3] = t * (C66 - es * C68);
+                    en[4] = t * es * C88;
+                    return en;
+                };
+                return exports;
+            },
+            {}
+        ],
+        18: [
+            function (_dereq_, module, exports) {
+                var pj_mlfn = _dereq_('./pj_mlfn');
+                var EPSLN = 1e-10;
+                var MAX_ITER = 20;
+                module.exports = function (arg, es, en) {
+                    var k = 1 / (1 - es);
+                    var phi = arg;
+                    for (var i = MAX_ITER; i; --i) {
+                        var s = Math.sin(phi);
+                        var t = 1 - es * s * s;
+                        t = (pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k;
+                        phi -= t;
+                        if (Math.abs(t) < EPSLN) {
+                            return phi;
+                        }
+                    }
+                    return phi;
+                };
+                return exports;
+            },
+            { './pj_mlfn': 19 }
+        ],
+        19: [
+            function (_dereq_, module, exports) {
+                module.exports = function (phi, sphi, cphi, en) {
+                    cphi *= sphi;
+                    sphi *= sphi;
+                    return en[0] * phi - cphi * (en[1] + sphi * (en[2] + sphi * (en[3] + sphi * en[4])));
+                };
+                return exports;
+            },
+            {}
+        ],
+        20: [
+            function (_dereq_, module, exports) {
+                module.exports = function (eccent, sinphi) {
+                    var con;
+                    if (eccent > 1e-7) {
+                        con = eccent * sinphi;
+                        return (1 - eccent * eccent) * (sinphi / (1 - con * con) - 0.5 / eccent * Math.log((1 - con) / (1 + con)));
+                    } else {
+                        return 2 * sinphi;
+                    }
+                };
+                return exports;
+            },
+            {}
+        ],
+        21: [
+            function (_dereq_, module, exports) {
+                module.exports = function (x) {
+                    return x < 0 ? -1 : 1;
+                };
+                return exports;
+            },
+            {}
+        ],
+        22: [
+            function (_dereq_, module, exports) {
+                module.exports = function (esinp, exp) {
+                    return Math.pow((1 - esinp) / (1 + esinp), exp);
+                };
+                return exports;
+            },
+            {}
+        ],
+        23: [
+            function (_dereq_, module, exports) {
+                module.exports = function (array) {
+                    var out = {
+                        x: array[0],
+                        y: array[1]
+                    };
+                    if (array.length > 2) {
+                        out.z = array[2];
+                    }
+                    if (array.length > 3) {
+                        out.m = array[3];
+                    }
+                    return out;
+                };
+                return exports;
+            },
+            {}
+        ],
+        24: [
+            function (_dereq_, module, exports) {
+                var HALF_PI = Math.PI / 2;
+                module.exports = function (eccent, phi, sinphi) {
+                    var con = eccent * sinphi;
+                    var com = 0.5 * eccent;
+                    con = Math.pow((1 - con) / (1 + con), com);
+                    return Math.tan(0.5 * (HALF_PI - phi)) / con;
+                };
+                return exports;
+            },
+            {}
+        ],
+        25: [
+            function (_dereq_, module, exports) {
+                exports.wgs84 = {
+                    towgs84: '0,0,0',
+                    ellipse: 'WGS84',
+                    datumName: 'WGS84'
+                };
+                exports.ch1903 = {
+                    towgs84: '674.374,15.056,405.346',
+                    ellipse: 'bessel',
+                    datumName: 'swiss'
+                };
+                exports.ggrs87 = {
+                    towgs84: '-199.87,74.79,246.62',
+                    ellipse: 'GRS80',
+                    datumName: 'Greek_Geodetic_Reference_System_1987'
+                };
+                exports.nad83 = {
+                    towgs84: '0,0,0',
+                    ellipse: 'GRS80',
+                    datumName: 'North_American_Datum_1983'
+                };
+                exports.nad27 = {
+                    nadgrids: '@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat',
+                    ellipse: 'clrk66',
+                    datumName: 'North_American_Datum_1927'
+                };
+                exports.potsdam = {
+                    towgs84: '606.0,23.0,413.0',
+                    ellipse: 'bessel',
+                    datumName: 'Potsdam Rauenberg 1950 DHDN'
+                };
+                exports.carthage = {
+                    towgs84: '-263.0,6.0,431.0',
+                    ellipse: 'clark80',
+                    datumName: 'Carthage 1934 Tunisia'
+                };
+                exports.hermannskogel = {
+                    towgs84: '653.0,-212.0,449.0',
+                    ellipse: 'bessel',
+                    datumName: 'Hermannskogel'
+                };
+                exports.ire65 = {
+                    towgs84: '482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15',
+                    ellipse: 'mod_airy',
+                    datumName: 'Ireland 1965'
+                };
+                exports.rassadiran = {
+                    towgs84: '-133.63,-157.5,-158.62',
+                    ellipse: 'intl',
+                    datumName: 'Rassadiran'
+                };
+                exports.nzgd49 = {
+                    towgs84: '59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993',
+                    ellipse: 'intl',
+                    datumName: 'New Zealand Geodetic Datum 1949'
+                };
+                exports.osgb36 = {
+                    towgs84: '446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894',
+                    ellipse: 'airy',
+                    datumName: 'Airy 1830'
+                };
+                exports.s_jtsk = {
+                    towgs84: '589,76,480',
+                    ellipse: 'bessel',
+                    datumName: 'S-JTSK (Ferro)'
+                };
+                exports.beduaram = {
+                    towgs84: '-106,-87,188',
+                    ellipse: 'clrk80',
+                    datumName: 'Beduaram'
+                };
+                exports.gunung_segara = {
+                    towgs84: '-403,684,41',
+                    ellipse: 'bessel',
+                    datumName: 'Gunung Segara Jakarta'
+                };
+                exports.rnb72 = {
+                    towgs84: '106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1',
+                    ellipse: 'intl',
+                    datumName: 'Reseau National Belge 1972'
+                };
+                return exports;
+            },
+            {}
+        ],
+        26: [
+            function (_dereq_, module, exports) {
+                exports.MERIT = {
+                    a: 6378137,
+                    rf: 298.257,
+                    ellipseName: 'MERIT 1983'
+                };
+                exports.SGS85 = {
+                    a: 6378136,
+                    rf: 298.257,
+                    ellipseName: 'Soviet Geodetic System 85'
+                };
+                exports.GRS80 = {
+                    a: 6378137,
+                    rf: 298.257222101,
+                    ellipseName: 'GRS 1980(IUGG, 1980)'
+                };
+                exports.IAU76 = {
+                    a: 6378140,
+                    rf: 298.257,
+                    ellipseName: 'IAU 1976'
+                };
+                exports.airy = {
+                    a: 6377563.396,
+                    b: 6356256.91,
+                    ellipseName: 'Airy 1830'
+                };
+                exports.APL4 = {
+                    a: 6378137,
+                    rf: 298.25,
+                    ellipseName: 'Appl. Physics. 1965'
+                };
+                exports.NWL9D = {
+                    a: 6378145,
+                    rf: 298.25,
+                    ellipseName: 'Naval Weapons Lab., 1965'
+                };
+                exports.mod_airy = {
+                    a: 6377340.189,
+                    b: 6356034.446,
+                    ellipseName: 'Modified Airy'
+                };
+                exports.andrae = {
+                    a: 6377104.43,
+                    rf: 300,
+                    ellipseName: 'Andrae 1876 (Den., Iclnd.)'
+                };
+                exports.aust_SA = {
+                    a: 6378160,
+                    rf: 298.25,
+                    ellipseName: 'Australian Natl & S. Amer. 1969'
+                };
+                exports.GRS67 = {
+                    a: 6378160,
+                    rf: 298.247167427,
+                    ellipseName: 'GRS 67(IUGG 1967)'
+                };
+                exports.bessel = {
+                    a: 6377397.155,
+                    rf: 299.1528128,
+                    ellipseName: 'Bessel 1841'
+                };
+                exports.bess_nam = {
+                    a: 6377483.865,
+                    rf: 299.1528128,
+                    ellipseName: 'Bessel 1841 (Namibia)'
+                };
+                exports.clrk66 = {
+                    a: 6378206.4,
+                    b: 6356583.8,
+                    ellipseName: 'Clarke 1866'
+                };
+                exports.clrk80 = {
+                    a: 6378249.145,
+                    rf: 293.4663,
+                    ellipseName: 'Clarke 1880 mod.'
+                };
+                exports.clrk58 = {
+                    a: 6378293.645208759,
+                    rf: 294.2606763692654,
+                    ellipseName: 'Clarke 1858'
+                };
+                exports.CPM = {
+                    a: 6375738.7,
+                    rf: 334.29,
+                    ellipseName: 'Comm. des Poids et Mesures 1799'
+                };
+                exports.delmbr = {
+                    a: 6376428,
+                    rf: 311.5,
+                    ellipseName: 'Delambre 1810 (Belgium)'
+                };
+                exports.engelis = {
+                    a: 6378136.05,
+                    rf: 298.2566,
+                    ellipseName: 'Engelis 1985'
+                };
+                exports.evrst30 = {
+                    a: 6377276.345,
+                    rf: 300.8017,
+                    ellipseName: 'Everest 1830'
+                };
+                exports.evrst48 = {
+                    a: 6377304.063,
+                    rf: 300.8017,
+                    ellipseName: 'Everest 1948'
+                };
+                exports.evrst56 = {
+                    a: 6377301.243,
+                    rf: 300.8017,
+                    ellipseName: 'Everest 1956'
+                };
+                exports.evrst69 = {
+                    a: 6377295.664,
+                    rf: 300.8017,
+                    ellipseName: 'Everest 1969'
+                };
+                exports.evrstSS = {
+                    a: 6377298.556,
+                    rf: 300.8017,
+                    ellipseName: 'Everest (Sabah & Sarawak)'
+                };
+                exports.fschr60 = {
+                    a: 6378166,
+                    rf: 298.3,
+                    ellipseName: 'Fischer (Mercury Datum) 1960'
+                };
+                exports.fschr60m = {
+                    a: 6378155,
+                    rf: 298.3,
+                    ellipseName: 'Fischer 1960'
+                };
+                exports.fschr68 = {
+                    a: 6378150,
+                    rf: 298.3,
+                    ellipseName: 'Fischer 1968'
+                };
+                exports.helmert = {
+                    a: 6378200,
+                    rf: 298.3,
+                    ellipseName: 'Helmert 1906'
+                };
+                exports.hough = {
+                    a: 6378270,
+                    rf: 297,
+                    ellipseName: 'Hough'
+                };
+                exports.intl = {
+                    a: 6378388,
+                    rf: 297,
+                    ellipseName: 'International 1909 (Hayford)'
+                };
+                exports.kaula = {
+                    a: 6378163,
+                    rf: 298.24,
+                    ellipseName: 'Kaula 1961'
+                };
+                exports.lerch = {
+                    a: 6378139,
+                    rf: 298.257,
+                    ellipseName: 'Lerch 1979'
+                };
+                exports.mprts = {
+                    a: 6397300,
+                    rf: 191,
+                    ellipseName: 'Maupertius 1738'
+                };
+                exports.new_intl = {
+                    a: 6378157.5,
+                    b: 6356772.2,
+                    ellipseName: 'New International 1967'
+                };
+                exports.plessis = {
+                    a: 6376523,
+                    rf: 6355863,
+                    ellipseName: 'Plessis 1817 (France)'
+                };
+                exports.krass = {
+                    a: 6378245,
+                    rf: 298.3,
+                    ellipseName: 'Krassovsky, 1942'
+                };
+                exports.SEasia = {
+                    a: 6378155,
+                    b: 6356773.3205,
+                    ellipseName: 'Southeast Asia'
+                };
+                exports.walbeck = {
+                    a: 6376896,
+                    b: 6355834.8467,
+                    ellipseName: 'Walbeck'
+                };
+                exports.WGS60 = {
+                    a: 6378165,
+                    rf: 298.3,
+                    ellipseName: 'WGS 60'
+                };
+                exports.WGS66 = {
+                    a: 6378145,
+                    rf: 298.25,
+                    ellipseName: 'WGS 66'
+                };
+                exports.WGS7 = {
+                    a: 6378135,
+                    rf: 298.26,
+                    ellipseName: 'WGS 72'
+                };
+                exports.WGS84 = {
+                    a: 6378137,
+                    rf: 298.257223563,
+                    ellipseName: 'WGS 84'
+                };
+                exports.sphere = {
+                    a: 6370997,
+                    b: 6370997,
+                    ellipseName: 'Normal Sphere (r=6370997)'
+                };
+                return exports;
+            },
+            {}
+        ],
+        27: [
+            function (_dereq_, module, exports) {
+                exports.greenwich = 0;
+                exports.lisbon = -9.131906111111;
+                exports.paris = 2.337229166667;
+                exports.bogota = -74.080916666667;
+                exports.madrid = -3.687938888889;
+                exports.rome = 12.452333333333;
+                exports.bern = 7.439583333333;
+                exports.jakarta = 106.807719444444;
+                exports.ferro = -17.666666666667;
+                exports.brussels = 4.367975;
+                exports.stockholm = 18.058277777778;
+                exports.athens = 23.7163375;
+                exports.oslo = 10.722916666667;
+                return exports;
+            },
+            {}
+        ],
+        28: [
+            function (_dereq_, module, exports) {
+                var proj = _dereq_('./Proj');
+                var transform = _dereq_('./transform');
+                var wgs84 = proj('WGS84');
+                function transformer(from, to, coords) {
+                    var transformedArray;
+                    if (Array.isArray(coords)) {
+                        transformedArray = transform(from, to, coords);
+                        if (coords.length === 3) {
+                            return [
+                                transformedArray.x,
+                                transformedArray.y,
+                                transformedArray.z
+                            ];
+                        } else {
+                            return [
+                                transformedArray.x,
+                                transformedArray.y
+                            ];
+                        }
+                    } else {
+                        return transform(from, to, coords);
+                    }
+                }
+                function checkProj(item) {
+                    if (item instanceof proj) {
+                        return item;
+                    }
+                    if (item.oProj) {
+                        return item.oProj;
+                    }
+                    return proj(item);
+                }
+                function proj4(fromProj, toProj, coord) {
+                    fromProj = checkProj(fromProj);
+                    var single = false;
+                    var obj;
+                    if (typeof toProj === 'undefined') {
+                        toProj = fromProj;
+                        fromProj = wgs84;
+                        single = true;
+                    } else if (typeof toProj.x !== 'undefined' || Array.isArray(toProj)) {
+                        coord = toProj;
+                        toProj = fromProj;
+                        fromProj = wgs84;
+                        single = true;
+                    }
+                    toProj = checkProj(toProj);
+                    if (coord) {
+                        return transformer(fromProj, toProj, coord);
+                    } else {
+                        obj = {
+                            forward: function (coords) {
+                                return transformer(fromProj, toProj, coords);
+                            },
+                            inverse: function (coords) {
+                                return transformer(toProj, fromProj, coords);
+                            }
+                        };
+                        if (single) {
+                            obj.oProj = toProj;
+                        }
+                        return obj;
+                    }
+                }
+                module.exports = proj4;
+                return exports;
+            },
+            {
+                './Proj': 2,
+                './transform': 64
+            }
+        ],
+        29: [
+            function (_dereq_, module, exports) {
+                var HALF_PI = Math.PI / 2;
+                var PJD_3PARAM = 1;
+                var PJD_7PARAM = 2;
+                var PJD_GRIDSHIFT = 3;
+                var PJD_WGS84 = 4;
+                var PJD_NODATUM = 5;
+                var SEC_TO_RAD = 0.00000484813681109536;
+                var AD_C = 1.0026;
+                var COS_67P5 = 0.3826834323650898;
+                var datum = function (proj) {
+                    if (!(this instanceof datum)) {
+                        return new datum(proj);
+                    }
+                    this.datum_type = PJD_WGS84;
+                    if (!proj) {
+                        return;
+                    }
+                    if (proj.datumCode && proj.datumCode === 'none') {
+                        this.datum_type = PJD_NODATUM;
+                    }
+                    if (proj.datum_params) {
+                        for (var i = 0; i < proj.datum_params.length; i++) {
+                            proj.datum_params[i] = parseFloat(proj.datum_params[i]);
+                        }
+                        if (proj.datum_params[0] !== 0 || proj.datum_params[1] !== 0 || proj.datum_params[2] !== 0) {
+                            this.datum_type = PJD_3PARAM;
+                        }
+                        if (proj.datum_params.length > 3) {
+                            if (proj.datum_params[3] !== 0 || proj.datum_params[4] !== 0 || proj.datum_params[5] !== 0 || proj.datum_params[6] !== 0) {
+                                this.datum_type = PJD_7PARAM;
+                                proj.datum_params[3] *= SEC_TO_RAD;
+                                proj.datum_params[4] *= SEC_TO_RAD;
+                                proj.datum_params[5] *= SEC_TO_RAD;
+                                proj.datum_params[6] = proj.datum_params[6] / 1000000 + 1;
+                            }
+                        }
+                    }
+                    this.datum_type = proj.grids ? PJD_GRIDSHIFT : this.datum_type;
+                    this.a = proj.a;
+                    this.b = proj.b;
+                    this.es = proj.es;
+                    this.ep2 = proj.ep2;
+                    this.datum_params = proj.datum_params;
+                    if (this.datum_type === PJD_GRIDSHIFT) {
+                        this.grids = proj.grids;
+                    }
+                };
+                datum.prototype = {
+                    compare_datums: function (dest) {
+                        if (this.datum_type !== dest.datum_type) {
+                            return false;
+                        } else if (this.a !== dest.a || Math.abs(this.es - dest.es) > 5e-11) {
+                            return false;
+                        } else if (this.datum_type === PJD_3PARAM) {
+                            return this.datum_params[0] === dest.datum_params[0] && this.datum_params[1] === dest.datum_params[1] && this.datum_params[2] === dest.datum_params[2];
+                        } else if (this.datum_type === PJD_7PARAM) {
+                            return this.datum_params[0] === dest.datum_params[0] && this.datum_params[1] === dest.datum_params[1] && this.datum_params[2] === dest.datum_params[2] && this.datum_params[3] === dest.datum_params[3] && this.datum_params[4] === dest.datum_params[4] && this.datum_params[5] === dest.datum_params[5] && this.datum_params[6] === dest.datum_params[6];
+                        } else if (this.datum_type === PJD_GRIDSHIFT || dest.datum_type === PJD_GRIDSHIFT) {
+                            return this.nadgrids === dest.nadgrids;
+                        } else {
+                            return true;
+                        }
+                    },
+                    geodetic_to_geocentric: function (p) {
+                        var Longitude = p.x;
+                        var Latitude = p.y;
+                        var Height = p.z ? p.z : 0;
+                        var X;
+                        var Y;
+                        var Z;
+                        var Error_Code = 0;
+                        var Rn;
+                        var Sin_Lat;
+                        var Sin2_Lat;
+                        var Cos_Lat;
+                        if (Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI) {
+                            Latitude = -HALF_PI;
+                        } else if (Latitude > HALF_PI && Latitude < 1.001 * HALF_PI) {
+                            Latitude = HALF_PI;
+                        } else if (Latitude < -HALF_PI || Latitude > HALF_PI) {
+                            return null;
+                        }
+                        if (Longitude > Math.PI) {
+                            Longitude -= 2 * Math.PI;
+                        }
+                        Sin_Lat = Math.sin(Latitude);
+                        Cos_Lat = Math.cos(Latitude);
+                        Sin2_Lat = Sin_Lat * Sin_Lat;
+                        Rn = this.a / Math.sqrt(1 - this.es * Sin2_Lat);
+                        X = (Rn + Height) * Cos_Lat * Math.cos(Longitude);
+                        Y = (Rn + Height) * Cos_Lat * Math.sin(Longitude);
+                        Z = (Rn * (1 - this.es) + Height) * Sin_Lat;
+                        p.x = X;
+                        p.y = Y;
+                        p.z = Z;
+                        return Error_Code;
+                    },
+                    geocentric_to_geodetic: function (p) {
+                        var genau = 1e-12;
+                        var genau2 = genau * genau;
+                        var maxiter = 30;
+                        var P;
+                        var RR;
+                        var CT;
+                        var ST;
+                        var RX;
+                        var RK;
+                        var RN;
+                        var CPHI0;
+                        var SPHI0;
+                        var CPHI;
+                        var SPHI;
+                        var SDPHI;
+                        var At_Pole;
+                        var iter;
+                        var X = p.x;
+                        var Y = p.y;
+                        var Z = p.z ? p.z : 0;
+                        var Longitude;
+                        var Latitude;
+                        var Height;
+                        At_Pole = false;
+                        P = Math.sqrt(X * X + Y * Y);
+                        RR = Math.sqrt(X * X + Y * Y + Z * Z);
+                        if (P / this.a < genau) {
+                            At_Pole = true;
+                            Longitude = 0;
+                            if (RR / this.a < genau) {
+                                Latitude = HALF_PI;
+                                Height = -this.b;
+                                return;
+                            }
+                        } else {
+                            Longitude = Math.atan2(Y, X);
+                        }
+                        CT = Z / RR;
+                        ST = P / RR;
+                        RX = 1 / Math.sqrt(1 - this.es * (2 - this.es) * ST * ST);
+                        CPHI0 = ST * (1 - this.es) * RX;
+                        SPHI0 = CT * RX;
+                        iter = 0;
+                        do {
+                            iter++;
+                            RN = this.a / Math.sqrt(1 - this.es * SPHI0 * SPHI0);
+                            Height = P * CPHI0 + Z * SPHI0 - RN * (1 - this.es * SPHI0 * SPHI0);
+                            RK = this.es * RN / (RN + Height);
+                            RX = 1 / Math.sqrt(1 - RK * (2 - RK) * ST * ST);
+                            CPHI = ST * (1 - RK) * RX;
+                            SPHI = CT * RX;
+                            SDPHI = SPHI * CPHI0 - CPHI * SPHI0;
+                            CPHI0 = CPHI;
+                            SPHI0 = SPHI;
+                        } while (SDPHI * SDPHI > genau2 && iter < maxiter);
+                        Latitude = Math.atan(SPHI / Math.abs(CPHI));
+                        p.x = Longitude;
+                        p.y = Latitude;
+                        p.z = Height;
+                        return p;
+                    },
+                    geocentric_to_geodetic_noniter: function (p) {
+                        var X = p.x;
+                        var Y = p.y;
+                        var Z = p.z ? p.z : 0;
+                        var Longitude;
+                        var Latitude;
+                        var Height;
+                        var W;
+                        var W2;
+                        var T0;
+                        var T1;
+                        var S0;
+                        var S1;
+                        var Sin_B0;
+                        var Sin3_B0;
+                        var Cos_B0;
+                        var Sin_p1;
+                        var Cos_p1;
+                        var Rn;
+                        var Sum;
+                        var At_Pole;
+                        X = parseFloat(X);
+                        Y = parseFloat(Y);
+                        Z = parseFloat(Z);
+                        At_Pole = false;
+                        if (X !== 0) {
+                            Longitude = Math.atan2(Y, X);
+                        } else {
+                            if (Y > 0) {
+                                Longitude = HALF_PI;
+                            } else if (Y < 0) {
+                                Longitude = -HALF_PI;
+                            } else {
+                                At_Pole = true;
+                                Longitude = 0;
+                                if (Z > 0) {
+                                    Latitude = HALF_PI;
+                                } else if (Z < 0) {
+                                    Latitude = -HALF_PI;
+                                } else {
+                                    Latitude = HALF_PI;
+                                    Height = -this.b;
+                                    return;
+                                }
+                            }
+                        }
+                        W2 = X * X + Y * Y;
+                        W = Math.sqrt(W2);
+                        T0 = Z * AD_C;
+                        S0 = Math.sqrt(T0 * T0 + W2);
+                        Sin_B0 = T0 / S0;
+                        Cos_B0 = W / S0;
+                        Sin3_B0 = Sin_B0 * Sin_B0 * Sin_B0;
+                        T1 = Z + this.b * this.ep2 * Sin3_B0;
+                        Sum = W - this.a * this.es * Cos_B0 * Cos_B0 * Cos_B0;
+                        S1 = Math.sqrt(T1 * T1 + Sum * Sum);
+                        Sin_p1 = T1 / S1;
+                        Cos_p1 = Sum / S1;
+                        Rn = this.a / Math.sqrt(1 - this.es * Sin_p1 * Sin_p1);
+                        if (Cos_p1 >= COS_67P5) {
+                            Height = W / Cos_p1 - Rn;
+                        } else if (Cos_p1 <= -COS_67P5) {
+                            Height = W / -Cos_p1 - Rn;
+                        } else {
+                            Height = Z / Sin_p1 + Rn * (this.es - 1);
+                        }
+                        if (At_Pole === false) {
+                            Latitude = Math.atan(Sin_p1 / Cos_p1);
+                        }
+                        p.x = Longitude;
+                        p.y = Latitude;
+                        p.z = Height;
+                        return p;
+                    },
+                    geocentric_to_wgs84: function (p) {
+                        if (this.datum_type === PJD_3PARAM) {
+                            p.x += this.datum_params[0];
+                            p.y += this.datum_params[1];
+                            p.z += this.datum_params[2];
+                        } else if (this.datum_type === PJD_7PARAM) {
+                            var Dx_BF = this.datum_params[0];
+                            var Dy_BF = this.datum_params[1];
+                            var Dz_BF = this.datum_params[2];
+                            var Rx_BF = this.datum_params[3];
+                            var Ry_BF = this.datum_params[4];
+                            var Rz_BF = this.datum_params[5];
+                            var M_BF = this.datum_params[6];
+                            var x_out = M_BF * (p.x - Rz_BF * p.y + Ry_BF * p.z) + Dx_BF;
+                            var y_out = M_BF * (Rz_BF * p.x + p.y - Rx_BF * p.z) + Dy_BF;
+                            var z_out = M_BF * (-Ry_BF * p.x + Rx_BF * p.y + p.z) + Dz_BF;
+                            p.x = x_out;
+                            p.y = y_out;
+                            p.z = z_out;
+                        }
+                    },
+                    geocentric_from_wgs84: function (p) {
+                        if (this.datum_type === PJD_3PARAM) {
+                            p.x -= this.datum_params[0];
+                            p.y -= this.datum_params[1];
+                            p.z -= this.datum_params[2];
+                        } else if (this.datum_type === PJD_7PARAM) {
+                            var Dx_BF = this.datum_params[0];
+                            var Dy_BF = this.datum_params[1];
+                            var Dz_BF = this.datum_params[2];
+                            var Rx_BF = this.datum_params[3];
+                            var Ry_BF = this.datum_params[4];
+                            var Rz_BF = this.datum_params[5];
+                            var M_BF = this.datum_params[6];
+                            var x_tmp = (p.x - Dx_BF) / M_BF;
+                            var y_tmp = (p.y - Dy_BF) / M_BF;
+                            var z_tmp = (p.z - Dz_BF) / M_BF;
+                            p.x = x_tmp + Rz_BF * y_tmp - Ry_BF * z_tmp;
+                            p.y = -Rz_BF * x_tmp + y_tmp + Rx_BF * z_tmp;
+                            p.z = Ry_BF * x_tmp - Rx_BF * y_tmp + z_tmp;
+                        }
+                    }
+                };
+                module.exports = datum;
+                return exports;
+            },
+            {}
+        ],
+        30: [
+            function (_dereq_, module, exports) {
+                var PJD_3PARAM = 1;
+                var PJD_7PARAM = 2;
+                var PJD_GRIDSHIFT = 3;
+                var PJD_NODATUM = 5;
+                var SRS_WGS84_SEMIMAJOR = 6378137;
+                var SRS_WGS84_ESQUARED = 0.006694379990141316;
+                module.exports = function (source, dest, point) {
+                    var wp, i, l;
+                    function checkParams(fallback) {
+                        return fallback === PJD_3PARAM || fallback === PJD_7PARAM;
+                    }
+                    if (source.compare_datums(dest)) {
+                        return point;
+                    }
+                    if (source.datum_type === PJD_NODATUM || dest.datum_type === PJD_NODATUM) {
+                        return point;
+                    }
+                    var src_a = source.a;
+                    var src_es = source.es;
+                    var dst_a = dest.a;
+                    var dst_es = dest.es;
+                    var fallback = source.datum_type;
+                    if (fallback === PJD_GRIDSHIFT) {
+                        if (this.apply_gridshift(source, 0, point) === 0) {
+                            source.a = SRS_WGS84_SEMIMAJOR;
+                            source.es = SRS_WGS84_ESQUARED;
+                        } else {
+                            if (!source.datum_params) {
+                                source.a = src_a;
+                                source.es = source.es;
+                                return point;
+                            }
+                            wp = 1;
+                            for (i = 0, l = source.datum_params.length; i < l; i++) {
+                                wp *= source.datum_params[i];
+                            }
+                            if (wp === 0) {
+                                source.a = src_a;
+                                source.es = source.es;
+                                return point;
+                            }
+                            if (source.datum_params.length > 3) {
+                                fallback = PJD_7PARAM;
+                            } else {
+                                fallback = PJD_3PARAM;
+                            }
+                        }
+                    }
+                    if (dest.datum_type === PJD_GRIDSHIFT) {
+                        dest.a = SRS_WGS84_SEMIMAJOR;
+                        dest.es = SRS_WGS84_ESQUARED;
+                    }
+                    if (source.es !== dest.es || source.a !== dest.a || checkParams(fallback) || checkParams(dest.datum_type)) {
+                        source.geodetic_to_geocentric(point);
+                        if (checkParams(source.datum_type)) {
+                            source.geocentric_to_wgs84(point);
+                        }
+                        if (checkParams(dest.datum_type)) {
+                            dest.geocentric_from_wgs84(point);
+                        }
+                        dest.geocentric_to_geodetic(point);
+                    }
+                    if (dest.datum_type === PJD_GRIDSHIFT) {
+                        this.apply_gridshift(dest, 1, point);
+                    }
+                    source.a = src_a;
+                    source.es = src_es;
+                    dest.a = dst_a;
+                    dest.es = dst_es;
+                    return point;
+                };
+                return exports;
+            },
+            {}
+        ],
+        31: [
+            function (_dereq_, module, exports) {
+                var globals = _dereq_('./global');
+                var parseProj = _dereq_('./projString');
+                var wkt = _dereq_('./wkt');
+                function defs(name) {
+                    var that = this;
+                    if (arguments.length === 2) {
+                        var def = arguments[1];
+                        if (typeof def === 'string') {
+                            if (def[0] === '+') {
+                                defs[name] = parseProj(arguments[1]);
+                            } else {
+                                defs[name] = wkt(arguments[1]);
+                            }
+                        } else {
+                            defs[name] = def;
+                        }
+                    } else if (arguments.length === 1) {
+                        if (Array.isArray(name)) {
+                            return name.map(function (v) {
+                                if (Array.isArray(v)) {
+                                    defs.apply(that, v);
+                                } else {
+                                    defs(v);
+                                }
+                            });
+                        } else if (typeof name === 'string') {
+                            if (name in defs) {
+                                return defs[name];
+                            }
+                        } else if ('EPSG' in name) {
+                            defs['EPSG:' + name.EPSG] = name;
+                        } else if ('ESRI' in name) {
+                            defs['ESRI:' + name.ESRI] = name;
+                        } else if ('IAU2000' in name) {
+                            defs['IAU2000:' + name.IAU2000] = name;
+                        } else {
+                            console.log(name);
+                        }
+                        return;
+                    }
+                }
+                globals(defs);
+                module.exports = defs;
+                return exports;
+            },
+            {
+                './global': 34,
+                './projString': 37,
+                './wkt': 65
+            }
+        ],
+        32: [
+            function (_dereq_, module, exports) {
+                var Datum = _dereq_('./constants/Datum');
+                var Ellipsoid = _dereq_('./constants/Ellipsoid');
+                var extend = _dereq_('./extend');
+                var datum = _dereq_('./datum');
+                var EPSLN = 1e-10;
+                var SIXTH = 0.16666666666666666;
+                var RA4 = 0.04722222222222222;
+                var RA6 = 0.022156084656084655;
+                module.exports = function (json) {
+                    if (json.datumCode && json.datumCode !== 'none') {
+                        var datumDef = Datum[json.datumCode];
+                        if (datumDef) {
+                            json.datum_params = datumDef.towgs84 ? datumDef.towgs84.split(',') : null;
+                            json.ellps = datumDef.ellipse;
+                            json.datumName = datumDef.datumName ? datumDef.datumName : json.datumCode;
+                        }
+                    }
+                    if (!json.a) {
+                        var ellipse = Ellipsoid[json.ellps] ? Ellipsoid[json.ellps] : Ellipsoid.WGS84;
+                        extend(json, ellipse);
+                    }
+                    if (json.rf && !json.b) {
+                        json.b = (1 - 1 / json.rf) * json.a;
+                    }
+                    if (json.rf === 0 || Math.abs(json.a - json.b) < EPSLN) {
+                        json.sphere = true;
+                        json.b = json.a;
+                    }
+                    json.a2 = json.a * json.a;
+                    json.b2 = json.b * json.b;
+                    json.es = (json.a2 - json.b2) / json.a2;
+                    json.e = Math.sqrt(json.es);
+                    if (json.R_A) {
+                        json.a *= 1 - json.es * (SIXTH + json.es * (RA4 + json.es * RA6));
+                        json.a2 = json.a * json.a;
+                        json.b2 = json.b * json.b;
+                        json.es = 0;
+                    }
+                    json.ep2 = (json.a2 - json.b2) / json.b2;
+                    if (!json.k0) {
+                        json.k0 = 1;
+                    }
+                    if (!json.axis) {
+                        json.axis = 'enu';
+                    }
+                    json.datum = datum(json);
+                    return json;
+                };
+                return exports;
+            },
+            {
+                './constants/Datum': 25,
+                './constants/Ellipsoid': 26,
+                './datum': 29,
+                './extend': 33
+            }
+        ],
+        33: [
+            function (_dereq_, module, exports) {
+                module.exports = function (destination, source) {
+                    destination = destination || {};
+                    var value, property;
+                    if (!source) {
+                        return destination;
+                    }
+                    for (property in source) {
+                        value = source[property];
+                        if (value !== undefined) {
+                            destination[property] = value;
+                        }
+                    }
+                    return destination;
+                };
+                return exports;
+            },
+            {}
+        ],
+        34: [
+            function (_dereq_, module, exports) {
+                module.exports = function (defs) {
+                    defs('EPSG:4326', '+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees');
+                    defs('EPSG:4269', '+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees');
+                    defs('EPSG:3857', '+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs');
+                    defs.WGS84 = defs['EPSG:4326'];
+                    defs['EPSG:3785'] = defs['EPSG:3857'];
+                    defs.GOOGLE = defs['EPSG:3857'];
+                    defs['EPSG:900913'] = defs['EPSG:3857'];
+                    defs['EPSG:102113'] = defs['EPSG:3857'];
+                };
+                return exports;
+            },
+            {}
+        ],
+        35: [
+            function (_dereq_, module, exports) {
+                var proj4 = _dereq_('./core');
+                proj4.defaultDatum = 'WGS84';
+                proj4.Proj = _dereq_('./Proj');
+                proj4.WGS84 = new proj4.Proj('WGS84');
+                proj4.Point = _dereq_('./Point');
+                proj4.toPoint = _dereq_('./common/toPoint');
+                proj4.defs = _dereq_('./defs');
+                proj4.transform = _dereq_('./transform');
+                proj4.mgrs = _dereq_('mgrs');
+                proj4.version = _dereq_('../package.json').version;
+                _dereq_('./includedProjections')(proj4);
+                module.exports = proj4;
+                return exports;
+            },
+            {
+                '../package.json': 67,
+                './Point': 1,
+                './Proj': 2,
+                './common/toPoint': 23,
+                './core': 28,
+                './defs': 31,
+                './includedProjections': 'gWUPNW',
+                './transform': 64,
+                'mgrs': 66
+            }
+        ],
+        36: [
+            function (_dereq_, module, exports) {
+                var defs = _dereq_('./defs');
+                var wkt = _dereq_('./wkt');
+                var projStr = _dereq_('./projString');
+                function testObj(code) {
+                    return typeof code === 'string';
+                }
+                function testDef(code) {
+                    return code in defs;
+                }
+                function testWKT(code) {
+                    var codeWords = [
+                        'GEOGCS',
+                        'GEOCCS',
+                        'PROJCS',
+                        'LOCAL_CS'
+                    ];
+                    return codeWords.reduce(function (a, b) {
+                        return a + 1 + code.indexOf(b);
+                    }, 0);
+                }
+                function testProj(code) {
+                    return code[0] === '+';
+                }
+                function parse(code) {
+                    if (testObj(code)) {
+                        if (testDef(code)) {
+                            return defs[code];
+                        } else if (testWKT(code)) {
+                            return wkt(code);
+                        } else if (testProj(code)) {
+                            return projStr(code);
+                        }
+                    } else {
+                        return code;
+                    }
+                }
+                module.exports = parse;
+                return exports;
+            },
+            {
+                './defs': 31,
+                './projString': 37,
+                './wkt': 65
+            }
+        ],
+        37: [
+            function (_dereq_, module, exports) {
+                var D2R = 0.017453292519943295;
+                var PrimeMeridian = _dereq_('./constants/PrimeMeridian');
+                module.exports = function (defData) {
+                    var self = {};
+                    var paramObj = {};
+                    defData.split('+').map(function (v) {
+                        return v.trim();
+                    }).filter(function (a) {
+                        return a;
+                    }).forEach(function (a) {
+                        var split = a.split('=');
+                        split.push(true);
+                        paramObj[split[0].toLowerCase()] = split[1];
+                    });
+                    var paramName, paramVal, paramOutname;
+                    var params = {
+                        proj: 'projName',
+                        datum: 'datumCode',
+                        rf: function (v) {
+                            self.rf = parseFloat(v, 10);
+                        },
+                        lat_0: function (v) {
+                            self.lat0 = v * D2R;
+                        },
+                        lat_1: function (v) {
+                            self.lat1 = v * D2R;
+                        },
+                        lat_2: function (v) {
+                            self.lat2 = v * D2R;
+                        },
+                        lat_ts: function (v) {
+                            self.lat_ts = v * D2R;
+                        },
+                        lon_0: function (v) {
+                            self.long0 = v * D2R;
+                        },
+                        lon_1: function (v) {
+                            self.long1 = v * D2R;
+                        },
+                        lon_2: function (v) {
+                            self.long2 = v * D2R;
+                        },
+                        alpha: function (v) {
+                            self.alpha = parseFloat(v) * D2R;
+                        },
+                        lonc: function (v) {
+                            self.longc = v * D2R;
+                        },
+                        x_0: function (v) {
+                            self.x0 = parseFloat(v, 10);
+                        },
+                        y_0: function (v) {
+                            self.y0 = parseFloat(v, 10);
+                        },
+                        k_0: function (v) {
+                            self.k0 = parseFloat(v, 10);
+                        },
+                        k: function (v) {
+                            self.k0 = parseFloat(v, 10);
+                        },
+                        r_a: function () {
+                            self.R_A = true;
+                        },
+                        zone: function (v) {
+                            self.zone = parseInt(v, 10);
+                        },
+                        south: function () {
+                            self.utmSouth = true;
+                        },
+                        towgs84: function (v) {
+                            self.datum_params = v.split(',').map(function (a) {
+                                return parseFloat(a, 10);
+                            });
+                        },
+                        to_meter: function (v) {
+                            self.to_meter = parseFloat(v, 10);
+                        },
+                        from_greenwich: function (v) {
+                            self.from_greenwich = v * D2R;
+                        },
+                        pm: function (v) {
+                            self.from_greenwich = (PrimeMeridian[v] ? PrimeMeridian[v] : parseFloat(v, 10)) * D2R;
+                        },
+                        nadgrids: function (v) {
+                            if (v === '@null') {
+                                self.datumCode = 'none';
+                            } else {
+                                self.nadgrids = v;
+                            }
+                        },
+                        axis: function (v) {
+                            var legalAxis = 'ewnsud';
+                            if (v.length === 3 && legalAxis.indexOf(v.substr(0, 1)) !== -1 && legalAxis.indexOf(v.substr(1, 1)) !== -1 && legalAxis.indexOf(v.substr(2, 1)) !== -1) {
+                                self.axis = v;
+                            }
+                        }
+                    };
+                    for (paramName in paramObj) {
+                        paramVal = paramObj[paramName];
+                        if (paramName in params) {
+                            paramOutname = params[paramName];
+                            if (typeof paramOutname === 'function') {
+                                paramOutname(paramVal);
+                            } else {
+                                self[paramOutname] = paramVal;
+                            }
+                        } else {
+                            self[paramName] = paramVal;
+                        }
+                    }
+                    if (typeof self.datumCode === 'string' && self.datumCode !== 'WGS84') {
+                        self.datumCode = self.datumCode.toLowerCase();
+                    }
+                    return self;
+                };
+                return exports;
+            },
+            { './constants/PrimeMeridian': 27 }
+        ],
+        38: [
+            function (_dereq_, module, exports) {
+                var projs = [
+                    _dereq_('./projections/merc'),
+                    _dereq_('./projections/longlat')
+                ];
+                var names = {};
+                var projStore = [];
+                function add(proj, i) {
+                    var len = projStore.length;
+                    if (!proj.names) {
+                        console.log(i);
+                        return true;
+                    }
+                    projStore[len] = proj;
+                    proj.names.forEach(function (n) {
+                        names[n.toLowerCase()] = len;
+                    });
+                    return this;
+                }
+                exports.add = add;
+                exports.get = function (name) {
+                    if (!name) {
+                        return false;
+                    }
+                    var n = name.toLowerCase();
+                    if (typeof names[n] !== 'undefined' && projStore[names[n]]) {
+                        return projStore[names[n]];
+                    }
+                };
+                exports.start = function () {
+                    projs.forEach(add);
+                };
+                return exports;
+            },
+            {
+                './projections/longlat': 50,
+                './projections/merc': 51
+            }
+        ],
+        39: [
+            function (_dereq_, module, exports) {
+                var EPSLN = 1e-10;
+                var msfnz = _dereq_('../common/msfnz');
+                var qsfnz = _dereq_('../common/qsfnz');
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                var asinz = _dereq_('../common/asinz');
+                exports.init = function () {
+                    if (Math.abs(this.lat1 + this.lat2) < EPSLN) {
+                        return;
+                    }
+                    this.temp = this.b / this.a;
+                    this.es = 1 - Math.pow(this.temp, 2);
+                    this.e3 = Math.sqrt(this.es);
+                    this.sin_po = Math.sin(this.lat1);
+                    this.cos_po = Math.cos(this.lat1);
+                    this.t1 = this.sin_po;
+                    this.con = this.sin_po;
+                    this.ms1 = msfnz(this.e3, this.sin_po, this.cos_po);
+                    this.qs1 = qsfnz(this.e3, this.sin_po, this.cos_po);
+                    this.sin_po = Math.sin(this.lat2);
+                    this.cos_po = Math.cos(this.lat2);
+                    this.t2 = this.sin_po;
+                    this.ms2 = msfnz(this.e3, this.sin_po, this.cos_po);
+                    this.qs2 = qsfnz(this.e3, this.sin_po, this.cos_po);
+                    this.sin_po = Math.sin(this.lat0);
+                    this.cos_po = Math.cos(this.lat0);
+                    this.t3 = this.sin_po;
+                    this.qs0 = qsfnz(this.e3, this.sin_po, this.cos_po);
+                    if (Math.abs(this.lat1 - this.lat2) > EPSLN) {
+                        this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1);
+                    } else {
+                        this.ns0 = this.con;
+                    }
+                    this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1;
+                    this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0) / this.ns0;
+                };
+                exports.forward = function (p) {
+                    var lon = p.x;
+                    var lat = p.y;
+                    this.sin_phi = Math.sin(lat);
+                    this.cos_phi = Math.cos(lat);
+                    var qs = qsfnz(this.e3, this.sin_phi, this.cos_phi);
+                    var rh1 = this.a * Math.sqrt(this.c - this.ns0 * qs) / this.ns0;
+                    var theta = this.ns0 * adjust_lon(lon - this.long0);
+                    var x = rh1 * Math.sin(theta) + this.x0;
+                    var y = this.rh - rh1 * Math.cos(theta) + this.y0;
+                    p.x = x;
+                    p.y = y;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    var rh1, qs, con, theta, lon, lat;
+                    p.x -= this.x0;
+                    p.y = this.rh - p.y + this.y0;
+                    if (this.ns0 >= 0) {
+                        rh1 = Math.sqrt(p.x * p.x + p.y * p.y);
+                        con = 1;
+                    } else {
+                        rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);
+                        con = -1;
+                    }
+                    theta = 0;
+                    if (rh1 !== 0) {
+                        theta = Math.atan2(con * p.x, con * p.y);
+                    }
+                    con = rh1 * this.ns0 / this.a;
+                    if (this.sphere) {
+                        lat = Math.asin((this.c - con * con) / (2 * this.ns0));
+                    } else {
+                        qs = (this.c - con * con) / this.ns0;
+                        lat = this.phi1z(this.e3, qs);
+                    }
+                    lon = adjust_lon(theta / this.ns0 + this.long0);
+                    p.x = lon;
+                    p.y = lat;
+                    return p;
+                };
+                exports.phi1z = function (eccent, qs) {
+                    var sinphi, cosphi, con, com, dphi;
+                    var phi = asinz(0.5 * qs);
+                    if (eccent < EPSLN) {
+                        return phi;
+                    }
+                    var eccnts = eccent * eccent;
+                    for (var i = 1; i <= 25; i++) {
+                        sinphi = Math.sin(phi);
+                        cosphi = Math.cos(phi);
+                        con = eccent * sinphi;
+                        com = 1 - con * con;
+                        dphi = 0.5 * com * com / cosphi * (qs / (1 - eccnts) - sinphi / com + 0.5 / eccent * Math.log((1 - con) / (1 + con)));
+                        phi = phi + dphi;
+                        if (Math.abs(dphi) <= 1e-7) {
+                            return phi;
+                        }
+                    }
+                    return null;
+                };
+                exports.names = [
+                    'Albers_Conic_Equal_Area',
+                    'Albers',
+                    'aea'
+                ];
+                return exports;
+            },
+            {
+                '../common/adjust_lon': 5,
+                '../common/asinz': 6,
+                '../common/msfnz': 15,
+                '../common/qsfnz': 20
+            }
+        ],
+        40: [
+            function (_dereq_, module, exports) {
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                var HALF_PI = Math.PI / 2;
+                var EPSLN = 1e-10;
+                var mlfn = _dereq_('../common/mlfn');
+                var e0fn = _dereq_('../common/e0fn');
+                var e1fn = _dereq_('../common/e1fn');
+                var e2fn = _dereq_('../common/e2fn');
+                var e3fn = _dereq_('../common/e3fn');
+                var gN = _dereq_('../common/gN');
+                var asinz = _dereq_('../common/asinz');
+                var imlfn = _dereq_('../common/imlfn');
+                exports.init = function () {
+                    this.sin_p12 = Math.sin(this.lat0);
+                    this.cos_p12 = Math.cos(this.lat0);
+                };
+                exports.forward = function (p) {
+                    var lon = p.x;
+                    var lat = p.y;
+                    var sinphi = Math.sin(p.y);
+                    var cosphi = Math.cos(p.y);
+                    var dlon = adjust_lon(lon - this.long0);
+                    var e0, e1, e2, e3, Mlp, Ml, tanphi, Nl1, Nl, psi, Az, G, H, GH, Hs, c, kp, cos_c, s, s2, s3, s4, s5;
+                    if (this.sphere) {
+                        if (Math.abs(this.sin_p12 - 1) <= EPSLN) {
+                            p.x = this.x0 + this.a * (HALF_PI - lat) * Math.sin(dlon);
+                            p.y = this.y0 - this.a * (HALF_PI - lat) * Math.cos(dlon);
+                            return p;
+                        } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {
+                            p.x = this.x0 + this.a * (HALF_PI + lat) * Math.sin(dlon);
+                            p.y = this.y0 + this.a * (HALF_PI + lat) * Math.cos(dlon);
+                            return p;
+                        } else {
+                            cos_c = this.sin_p12 * sinphi + this.cos_p12 * cosphi * Math.cos(dlon);
+                            c = Math.acos(cos_c);
+                            kp = c / Math.sin(c);
+                            p.x = this.x0 + this.a * kp * cosphi * Math.sin(dlon);
+                            p.y = this.y0 + this.a * kp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * Math.cos(dlon));
+                            return p;
+                        }
+                    } else {
+                        e0 = e0fn(this.es);
+                        e1 = e1fn(this.es);
+                        e2 = e2fn(this.es);
+                        e3 = e3fn(this.es);
+                        if (Math.abs(this.sin_p12 - 1) <= EPSLN) {
+                            Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);
+                            Ml = this.a * mlfn(e0, e1, e2, e3, lat);
+                            p.x = this.x0 + (Mlp - Ml) * Math.sin(dlon);
+                            p.y = this.y0 - (Mlp - Ml) * Math.cos(dlon);
+                            return p;
+                        } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {
+                            Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);
+                            Ml = this.a * mlfn(e0, e1, e2, e3, lat);
+                            p.x = this.x0 + (Mlp + Ml) * Math.sin(dlon);
+                            p.y = this.y0 + (Mlp + Ml) * Math.cos(dlon);
+                            return p;
+                        } else {
+                            tanphi = sinphi / cosphi;
+                            Nl1 = gN(this.a, this.e, this.sin_p12);
+                            Nl = gN(this.a, this.e, sinphi);
+                            psi = Math.atan((1 - this.es) * tanphi + this.es * Nl1 * this.sin_p12 / (Nl * cosphi));
+                            Az = Math.atan2(Math.sin(dlon), this.cos_p12 * Math.tan(psi) - this.sin_p12 * Math.cos(dlon));
+                            if (Az === 0) {
+                                s = Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi));
+                            } else if (Math.abs(Math.abs(Az) - Math.PI) <= EPSLN) {
+                                s = -Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi));
+                            } else {
+                                s = Math.asin(Math.sin(dlon) * Math.cos(psi) / Math.sin(Az));
+                            }
+                            G = this.e * this.sin_p12 / Math.sqrt(1 - this.es);
+                            H = this.e * this.cos_p12 * Math.cos(Az) / Math.sqrt(1 - this.es);
+                            GH = G * H;
+                            Hs = H * H;
+                            s2 = s * s;
+                            s3 = s2 * s;
+                            s4 = s3 * s;
+                            s5 = s4 * s;
+                            c = Nl1 * s * (1 - s2 * Hs * (1 - Hs) / 6 + s3 / 8 * GH * (1 - 2 * Hs) + s4 / 120 * (Hs * (4 - 7 * Hs) - 3 * G * G * (1 - 7 * Hs)) - s5 / 48 * GH);
+                            p.x = this.x0 + c * Math.sin(Az);
+                            p.y = this.y0 + c * Math.cos(Az);
+                            return p;
+                        }
+                    }
+                };
+                exports.inverse = function (p) {
+                    p.x -= this.x0;
+                    p.y -= this.y0;
+                    var rh, z, sinz, cosz, lon, lat, con, e0, e1, e2, e3, Mlp, M, N1, psi, Az, cosAz, tmp, A, B, D, Ee, F;
+                    if (this.sphere) {
+                        rh = Math.sqrt(p.x * p.x + p.y * p.y);
+                        if (rh > 2 * HALF_PI * this.a) {
+                            return;
+                        }
+                        z = rh / this.a;
+                        sinz = Math.sin(z);
+                        cosz = Math.cos(z);
+                        lon = this.long0;
+                        if (Math.abs(rh) <= EPSLN) {
+                            lat = this.lat0;
+                        } else {
+                            lat = asinz(cosz * this.sin_p12 + p.y * sinz * this.cos_p12 / rh);
+                            con = Math.abs(this.lat0) - HALF_PI;
+                            if (Math.abs(con) <= EPSLN) {
+                                if (this.lat0 >= 0) {
+                                    lon = adjust_lon(this.long0 + Math.atan2(p.x, -p.y));
+                                } else {
+                                    lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y));
+                                }
+                            } else {
+                                lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p12 * cosz - p.y * this.sin_p12 * sinz));
+                            }
+                        }
+                        p.x = lon;
+                        p.y = lat;
+                        return p;
+                    } else {
+                        e0 = e0fn(this.es);
+                        e1 = e1fn(this.es);
+                        e2 = e2fn(this.es);
+                        e3 = e3fn(this.es);
+                        if (Math.abs(this.sin_p12 - 1) <= EPSLN) {
+                            Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);
+                            rh = Math.sqrt(p.x * p.x + p.y * p.y);
+                            M = Mlp - rh;
+                            lat = imlfn(M / this.a, e0, e1, e2, e3);
+                            lon = adjust_lon(this.long0 + Math.atan2(p.x, -1 * p.y));
+                            p.x = lon;
+                            p.y = lat;
+                            return p;
+                        } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {
+                            Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);
+                            rh = Math.sqrt(p.x * p.x + p.y * p.y);
+                            M = rh - Mlp;
+                            lat = imlfn(M / this.a, e0, e1, e2, e3);
+                            lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y));
+                            p.x = lon;
+                            p.y = lat;
+                            return p;
+                        } else {
+                            rh = Math.sqrt(p.x * p.x + p.y * p.y);
+                            Az = Math.atan2(p.x, p.y);
+                            N1 = gN(this.a, this.e, this.sin_p12);
+                            cosAz = Math.cos(Az);
+                            tmp = this.e * this.cos_p12 * cosAz;
+                            A = -tmp * tmp / (1 - this.es);
+                            B = 3 * this.es * (1 - A) * this.sin_p12 * this.cos_p12 * cosAz / (1 - this.es);
+                            D = rh / N1;
+                            Ee = D - A * (1 + A) * Math.pow(D, 3) / 6 - B * (1 + 3 * A) * Math.pow(D, 4) / 24;
+                            F = 1 - A * Ee * Ee / 2 - D * Ee * Ee * Ee / 6;
+                            psi = Math.asin(this.sin_p12 * Math.cos(Ee) + this.cos_p12 * Math.sin(Ee) * cosAz);
+                            lon = adjust_lon(this.long0 + Math.asin(Math.sin(Az) * Math.sin(Ee) / Math.cos(psi)));
+                            lat = Math.atan((1 - this.es * F * this.sin_p12 / Math.sin(psi)) * Math.tan(psi) / (1 - this.es));
+                            p.x = lon;
+                            p.y = lat;
+                            return p;
+                        }
+                    }
+                };
+                exports.names = [
+                    'Azimuthal_Equidistant',
+                    'aeqd'
+                ];
+                return exports;
+            },
+            {
+                '../common/adjust_lon': 5,
+                '../common/asinz': 6,
+                '../common/e0fn': 7,
+                '../common/e1fn': 8,
+                '../common/e2fn': 9,
+                '../common/e3fn': 10,
+                '../common/gN': 11,
+                '../common/imlfn': 12,
+                '../common/mlfn': 14
+            }
+        ],
+        41: [
+            function (_dereq_, module, exports) {
+                var mlfn = _dereq_('../common/mlfn');
+                var e0fn = _dereq_('../common/e0fn');
+                var e1fn = _dereq_('../common/e1fn');
+                var e2fn = _dereq_('../common/e2fn');
+                var e3fn = _dereq_('../common/e3fn');
+                var gN = _dereq_('../common/gN');
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                var adjust_lat = _dereq_('../common/adjust_lat');
+                var imlfn = _dereq_('../common/imlfn');
+                var HALF_PI = Math.PI / 2;
+                var EPSLN = 1e-10;
+                exports.init = function () {
+                    if (!this.sphere) {
+                        this.e0 = e0fn(this.es);
+                        this.e1 = e1fn(this.es);
+                        this.e2 = e2fn(this.es);
+                        this.e3 = e3fn(this.es);
+                        this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);
+                    }
+                };
+                exports.forward = function (p) {
+                    var x, y;
+                    var lam = p.x;
+                    var phi = p.y;
+                    lam = adjust_lon(lam - this.long0);
+                    if (this.sphere) {
+                        x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam));
+                        y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0);
+                    } else {
+                        var sinphi = Math.sin(phi);
+                        var cosphi = Math.cos(phi);
+                        var nl = gN(this.a, this.e, sinphi);
+                        var tl = Math.tan(phi) * Math.tan(phi);
+                        var al = lam * Math.cos(phi);
+                        var asq = al * al;
+                        var cl = this.es * cosphi * cosphi / (1 - this.es);
+                        var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);
+                        x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120));
+                        y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24);
+                    }
+                    p.x = x + this.x0;
+                    p.y = y + this.y0;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    p.x -= this.x0;
+                    p.y -= this.y0;
+                    var x = p.x / this.a;
+                    var y = p.y / this.a;
+                    var phi, lam;
+                    if (this.sphere) {
+                        var dd = y + this.lat0;
+                        phi = Math.asin(Math.sin(dd) * Math.cos(x));
+                        lam = Math.atan2(Math.tan(x), Math.cos(dd));
+                    } else {
+                        var ml1 = this.ml0 / this.a + y;
+                        var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3);
+                        if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) {
+                            p.x = this.long0;
+                            p.y = HALF_PI;
+                            if (y < 0) {
+                                p.y *= -1;
+                            }
+                            return p;
+                        }
+                        var nl1 = gN(this.a, this.e, Math.sin(phi1));
+                        var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es);
+                        var tl1 = Math.pow(Math.tan(phi1), 2);
+                        var dl = x * this.a / nl1;
+                        var dsq = dl * dl;
+                        phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24);
+                        lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1);
+                    }
+                    p.x = adjust_lon(lam + this.long0);
+                    p.y = adjust_lat(phi);
+                    return p;
+                };
+                exports.names = [
+                    'Cassini',
+                    'Cassini_Soldner',
+                    'cass'
+                ];
+                return exports;
+            },
+            {
+                '../common/adjust_lat': 4,
+                '../common/adjust_lon': 5,
+                '../common/e0fn': 7,
+                '../common/e1fn': 8,
+                '../common/e2fn': 9,
+                '../common/e3fn': 10,
+                '../common/gN': 11,
+                '../common/imlfn': 12,
+                '../common/mlfn': 14
+            }
+        ],
+        42: [
+            function (_dereq_, module, exports) {
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                var qsfnz = _dereq_('../common/qsfnz');
+                var msfnz = _dereq_('../common/msfnz');
+                var iqsfnz = _dereq_('../common/iqsfnz');
+                exports.init = function () {
+                    if (!this.sphere) {
+                        this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));
+                    }
+                };
+                exports.forward = function (p) {
+                    var lon = p.x;
+                    var lat = p.y;
+                    var x, y;
+                    var dlon = adjust_lon(lon - this.long0);
+                    if (this.sphere) {
+                        x = this.x0 + this.a * dlon * Math.cos(this.lat_ts);
+                        y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts);
+                    } else {
+                        var qs = qsfnz(this.e, Math.sin(lat));
+                        x = this.x0 + this.a * this.k0 * dlon;
+                        y = this.y0 + this.a * qs * 0.5 / this.k0;
+                    }
+                    p.x = x;
+                    p.y = y;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    p.x -= this.x0;
+                    p.y -= this.y0;
+                    var lon, lat;
+                    if (this.sphere) {
+                        lon = adjust_lon(this.long0 + p.x / this.a / Math.cos(this.lat_ts));
+                        lat = Math.asin(p.y / this.a * Math.cos(this.lat_ts));
+                    } else {
+                        lat = iqsfnz(this.e, 2 * p.y * this.k0 / this.a);
+                        lon = adjust_lon(this.long0 + p.x / (this.a * this.k0));
+                    }
+                    p.x = lon;
+                    p.y = lat;
+                    return p;
+                };
+                exports.names = ['cea'];
+                return exports;
+            },
+            {
+                '../common/adjust_lon': 5,
+                '../common/iqsfnz': 13,
+                '../common/msfnz': 15,
+                '../common/qsfnz': 20
+            }
+        ],
+        43: [
+            function (_dereq_, module, exports) {
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                var adjust_lat = _dereq_('../common/adjust_lat');
+                exports.init = function () {
+                    this.x0 = this.x0 || 0;
+                    this.y0 = this.y0 || 0;
+                    this.lat0 = this.lat0 || 0;
+                    this.long0 = this.long0 || 0;
+                    this.lat_ts = this.lat_ts || 0;
+                    this.title = this.title || 'Equidistant Cylindrical (Plate Carre)';
+                    this.rc = Math.cos(this.lat_ts);
+                };
+                exports.forward = function (p) {
+                    var lon = p.x;
+                    var lat = p.y;
+                    var dlon = adjust_lon(lon - this.long0);
+                    var dlat = adjust_lat(lat - this.lat0);
+                    p.x = this.x0 + this.a * dlon * this.rc;
+                    p.y = this.y0 + this.a * dlat;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    var x = p.x;
+                    var y = p.y;
+                    p.x = adjust_lon(this.long0 + (x - this.x0) / (this.a * this.rc));
+                    p.y = adjust_lat(this.lat0 + (y - this.y0) / this.a);
+                    return p;
+                };
+                exports.names = [
+                    'Equirectangular',
+                    'Equidistant_Cylindrical',
+                    'eqc'
+                ];
+                return exports;
+            },
+            {
+                '../common/adjust_lat': 4,
+                '../common/adjust_lon': 5
+            }
+        ],
+        44: [
+            function (_dereq_, module, exports) {
+                var e0fn = _dereq_('../common/e0fn');
+                var e1fn = _dereq_('../common/e1fn');
+                var e2fn = _dereq_('../common/e2fn');
+                var e3fn = _dereq_('../common/e3fn');
+                var msfnz = _dereq_('../common/msfnz');
+                var mlfn = _dereq_('../common/mlfn');
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                var adjust_lat = _dereq_('../common/adjust_lat');
+                var imlfn = _dereq_('../common/imlfn');
+                var EPSLN = 1e-10;
+                exports.init = function () {
+                    if (Math.abs(this.lat1 + this.lat2) < EPSLN) {
+                        return;
+                    }
+                    this.lat2 = this.lat2 || this.lat1;
+                    this.temp = this.b / this.a;
+                    this.es = 1 - Math.pow(this.temp, 2);
+                    this.e = Math.sqrt(this.es);
+                    this.e0 = e0fn(this.es);
+                    this.e1 = e1fn(this.es);
+                    this.e2 = e2fn(this.es);
+                    this.e3 = e3fn(this.es);
+                    this.sinphi = Math.sin(this.lat1);
+                    this.cosphi = Math.cos(this.lat1);
+                    this.ms1 = msfnz(this.e, this.sinphi, this.cosphi);
+                    this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1);
+                    if (Math.abs(this.lat1 - this.lat2) < EPSLN) {
+                        this.ns = this.sinphi;
+                    } else {
+                        this.sinphi = Math.sin(this.lat2);
+                        this.cosphi = Math.cos(this.lat2);
+                        this.ms2 = msfnz(this.e, this.sinphi, this.cosphi);
+                        this.ml2 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2);
+                        this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1);
+                    }
+                    this.g = this.ml1 + this.ms1 / this.ns;
+                    this.ml0 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);
+                    this.rh = this.a * (this.g - this.ml0);
+                };
+                exports.forward = function (p) {
+                    var lon = p.x;
+                    var lat = p.y;
+                    var rh1;
+                    if (this.sphere) {
+                        rh1 = this.a * (this.g - lat);
+                    } else {
+                        var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat);
+                        rh1 = this.a * (this.g - ml);
+                    }
+                    var theta = this.ns * adjust_lon(lon - this.long0);
+                    var x = this.x0 + rh1 * Math.sin(theta);
+                    var y = this.y0 + this.rh - rh1 * Math.cos(theta);
+                    p.x = x;
+                    p.y = y;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    p.x -= this.x0;
+                    p.y = this.rh - p.y + this.y0;
+                    var con, rh1, lat, lon;
+                    if (this.ns >= 0) {
+                        rh1 = Math.sqrt(p.x * p.x + p.y * p.y);
+                        con = 1;
+                    } else {
+                        rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);
+                        con = -1;
+                    }
+                    var theta = 0;
+                    if (rh1 !== 0) {
+                        theta = Math.atan2(con * p.x, con * p.y);
+                    }
+                    if (this.sphere) {
+                        lon = adjust_lon(this.long0 + theta / this.ns);
+                        lat = adjust_lat(this.g - rh1 / this.a);
+                        p.x = lon;
+                        p.y = lat;
+                        return p;
+                    } else {
+                        var ml = this.g - rh1 / this.a;
+                        lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3);
+                        lon = adjust_lon(this.long0 + theta / this.ns);
+                        p.x = lon;
+                        p.y = lat;
+                        return p;
+                    }
+                };
+                exports.names = [
+                    'Equidistant_Conic',
+                    'eqdc'
+                ];
+                return exports;
+            },
+            {
+                '../common/adjust_lat': 4,
+                '../common/adjust_lon': 5,
+                '../common/e0fn': 7,
+                '../common/e1fn': 8,
+                '../common/e2fn': 9,
+                '../common/e3fn': 10,
+                '../common/imlfn': 12,
+                '../common/mlfn': 14,
+                '../common/msfnz': 15
+            }
+        ],
+        45: [
+            function (_dereq_, module, exports) {
+                var FORTPI = Math.PI / 4;
+                var srat = _dereq_('../common/srat');
+                var HALF_PI = Math.PI / 2;
+                var MAX_ITER = 20;
+                exports.init = function () {
+                    var sphi = Math.sin(this.lat0);
+                    var cphi = Math.cos(this.lat0);
+                    cphi *= cphi;
+                    this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi);
+                    this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es));
+                    this.phic0 = Math.asin(sphi / this.C);
+                    this.ratexp = 0.5 * this.C * this.e;
+                    this.K = Math.tan(0.5 * this.phic0 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp));
+                };
+                exports.forward = function (p) {
+                    var lon = p.x;
+                    var lat = p.y;
+                    p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI;
+                    p.x = this.C * lon;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    var DEL_TOL = 1e-14;
+                    var lon = p.x / this.C;
+                    var lat = p.y;
+                    var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C);
+                    for (var i = MAX_ITER; i > 0; --i) {
+                        lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), -0.5 * this.e)) - HALF_PI;
+                        if (Math.abs(lat - p.y) < DEL_TOL) {
+                            break;
+                        }
+                        p.y = lat;
+                    }
+                    if (!i) {
+                        return null;
+                    }
+                    p.x = lon;
+                    p.y = lat;
+                    return p;
+                };
+                exports.names = ['gauss'];
+                return exports;
+            },
+            { '../common/srat': 22 }
+        ],
+        46: [
+            function (_dereq_, module, exports) {
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                var EPSLN = 1e-10;
+                var asinz = _dereq_('../common/asinz');
+                exports.init = function () {
+                    this.sin_p14 = Math.sin(this.lat0);
+                    this.cos_p14 = Math.cos(this.lat0);
+                    this.infinity_dist = 1000 * this.a;
+                    this.rc = 1;
+                };
+                exports.forward = function (p) {
+                    var sinphi, cosphi;
+                    var dlon;
+                    var coslon;
+                    var ksp;
+                    var g;
+                    var x, y;
+                    var lon = p.x;
+                    var lat = p.y;
+                    dlon = adjust_lon(lon - this.long0);
+                    sinphi = Math.sin(lat);
+                    cosphi = Math.cos(lat);
+                    coslon = Math.cos(dlon);
+                    g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;
+                    ksp = 1;
+                    if (g > 0 || Math.abs(g) <= EPSLN) {
+                        x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g;
+                        y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g;
+                    } else {
+                        x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon);
+                        y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);
+                    }
+                    p.x = x;
+                    p.y = y;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    var rh;
+                    var sinc, cosc;
+                    var c;
+                    var lon, lat;
+                    p.x = (p.x - this.x0) / this.a;
+                    p.y = (p.y - this.y0) / this.a;
+                    p.x /= this.k0;
+                    p.y /= this.k0;
+                    if (rh = Math.sqrt(p.x * p.x + p.y * p.y)) {
+                        c = Math.atan2(rh, this.rc);
+                        sinc = Math.sin(c);
+                        cosc = Math.cos(c);
+                        lat = asinz(cosc * this.sin_p14 + p.y * sinc * this.cos_p14 / rh);
+                        lon = Math.atan2(p.x * sinc, rh * this.cos_p14 * cosc - p.y * this.sin_p14 * sinc);
+                        lon = adjust_lon(this.long0 + lon);
+                    } else {
+                        lat = this.phic0;
+                        lon = 0;
+                    }
+                    p.x = lon;
+                    p.y = lat;
+                    return p;
+                };
+                exports.names = ['gnom'];
+                return exports;
+            },
+            {
+                '../common/adjust_lon': 5,
+                '../common/asinz': 6
+            }
+        ],
+        47: [
+            function (_dereq_, module, exports) {
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                exports.init = function () {
+                    this.a = 6377397.155;
+                    this.es = 0.006674372230614;
+                    this.e = Math.sqrt(this.es);
+                    if (!this.lat0) {
+                        this.lat0 = 0.863937979737193;
+                    }
+                    if (!this.long0) {
+                        this.long0 = 0.7417649320975901 - 0.308341501185665;
+                    }
+                    if (!this.k0) {
+                        this.k0 = 0.9999;
+                    }
+                    this.s45 = 0.785398163397448;
+                    this.s90 = 2 * this.s45;
+                    this.fi0 = this.lat0;
+                    this.e2 = this.es;
+                    this.e = Math.sqrt(this.e2);
+                    this.alfa = Math.sqrt(1 + this.e2 * Math.pow(Math.cos(this.fi0), 4) / (1 - this.e2));
+                    this.uq = 1.04216856380474;
+                    this.u0 = Math.asin(Math.sin(this.fi0) / this.alfa);
+                    this.g = Math.pow((1 + this.e * Math.sin(this.fi0)) / (1 - this.e * Math.sin(this.fi0)), this.alfa * this.e / 2);
+                    this.k = Math.tan(this.u0 / 2 + this.s45) / Math.pow(Math.tan(this.fi0 / 2 + this.s45), this.alfa) * this.g;
+                    this.k1 = this.k0;
+                    this.n0 = this.a * Math.sqrt(1 - this.e2) / (1 - this.e2 * Math.pow(Math.sin(this.fi0), 2));
+                    this.s0 = 1.37008346281555;
+                    this.n = Math.sin(this.s0);
+                    this.ro0 = this.k1 * this.n0 / Math.tan(this.s0);
+                    this.ad = this.s90 - this.uq;
+                };
+                exports.forward = function (p) {
+                    var gfi, u, deltav, s, d, eps, ro;
+                    var lon = p.x;
+                    var lat = p.y;
+                    var delta_lon = adjust_lon(lon - this.long0);
+                    gfi = Math.pow((1 + this.e * Math.sin(lat)) / (1 - this.e * Math.sin(lat)), this.alfa * this.e / 2);
+                    u = 2 * (Math.atan(this.k * Math.pow(Math.tan(lat / 2 + this.s45), this.alfa) / gfi) - this.s45);
+                    deltav = -delta_lon * this.alfa;
+                    s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav));
+                    d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s));
+                    eps = this.n * d;
+                    ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(s / 2 + this.s45), this.n);
+                    p.y = ro * Math.cos(eps) / 1;
+                    p.x = ro * Math.sin(eps) / 1;
+                    if (!this.czech) {
+                        p.y *= -1;
+                        p.x *= -1;
+                    }
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    var u, deltav, s, d, eps, ro, fi1;
+                    var ok;
+                    var tmp = p.x;
+                    p.x = p.y;
+                    p.y = tmp;
+                    if (!this.czech) {
+                        p.y *= -1;
+                        p.x *= -1;
+                    }
+                    ro = Math.sqrt(p.x * p.x + p.y * p.y);
+                    eps = Math.atan2(p.y, p.x);
+                    d = eps / Math.sin(this.s0);
+                    s = 2 * (Math.atan(Math.pow(this.ro0 / ro, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45);
+                    u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d));
+                    deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u));
+                    p.x = this.long0 - deltav / this.alfa;
+                    fi1 = u;
+                    ok = 0;
+                    var iter = 0;
+                    do {
+                        p.y = 2 * (Math.atan(Math.pow(this.k, -1 / this.alfa) * Math.pow(Math.tan(u / 2 + this.s45), 1 / this.alfa) * Math.pow((1 + this.e * Math.sin(fi1)) / (1 - this.e * Math.sin(fi1)), this.e / 2)) - this.s45);
+                        if (Math.abs(fi1 - p.y) < 1e-10) {
+                            ok = 1;
+                        }
+                        fi1 = p.y;
+                        iter += 1;
+                    } while (ok === 0 && iter < 15);
+                    if (iter >= 15) {
+                        return null;
+                    }
+                    return p;
+                };
+                exports.names = [
+                    'Krovak',
+                    'krovak'
+                ];
+                return exports;
+            },
+            { '../common/adjust_lon': 5 }
+        ],
+        48: [
+            function (_dereq_, module, exports) {
+                var HALF_PI = Math.PI / 2;
+                var FORTPI = Math.PI / 4;
+                var EPSLN = 1e-10;
+                var qsfnz = _dereq_('../common/qsfnz');
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                exports.S_POLE = 1;
+                exports.N_POLE = 2;
+                exports.EQUIT = 3;
+                exports.OBLIQ = 4;
+                exports.init = function () {
+                    var t = Math.abs(this.lat0);
+                    if (Math.abs(t - HALF_PI) < EPSLN) {
+                        this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE;
+                    } else if (Math.abs(t) < EPSLN) {
+                        this.mode = this.EQUIT;
+                    } else {
+                        this.mode = this.OBLIQ;
+                    }
+                    if (this.es > 0) {
+                        var sinphi;
+                        this.qp = qsfnz(this.e, 1);
+                        this.mmf = 0.5 / (1 - this.es);
+                        this.apa = this.authset(this.es);
+                        switch (this.mode) {
+                        case this.N_POLE:
+                            this.dd = 1;
+                            break;
+                        case this.S_POLE:
+                            this.dd = 1;
+                            break;
+                        case this.EQUIT:
+                            this.rq = Math.sqrt(0.5 * this.qp);
+                            this.dd = 1 / this.rq;
+                            this.xmf = 1;
+                            this.ymf = 0.5 * this.qp;
+                            break;
+                        case this.OBLIQ:
+                            this.rq = Math.sqrt(0.5 * this.qp);
+                            sinphi = Math.sin(this.lat0);
+                            this.sinb1 = qsfnz(this.e, sinphi) / this.qp;
+                            this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1);
+                            this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * sinphi * sinphi) * this.rq * this.cosb1);
+                            this.ymf = (this.xmf = this.rq) / this.dd;
+                            this.xmf *= this.dd;
+                            break;
+                        }
+                    } else {
+                        if (this.mode === this.OBLIQ) {
+                            this.sinph0 = Math.sin(this.lat0);
+                            this.cosph0 = Math.cos(this.lat0);
+                        }
+                    }
+                };
+                exports.forward = function (p) {
+                    var x, y, coslam, sinlam, sinphi, q, sinb, cosb, b, cosphi;
+                    var lam = p.x;
+                    var phi = p.y;
+                    lam = adjust_lon(lam - this.long0);
+                    if (this.sphere) {
+                        sinphi = Math.sin(phi);
+                        cosphi = Math.cos(phi);
+                        coslam = Math.cos(lam);
+                        if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {
+                            y = this.mode === this.EQUIT ? 1 + cosphi * coslam : 1 + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam;
+                            if (y <= EPSLN) {
+                                return null;
+                            }
+                            y = Math.sqrt(2 / y);
+                            x = y * cosphi * Math.sin(lam);
+                            y *= this.mode === this.EQUIT ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam;
+                        } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {
+                            if (this.mode === this.N_POLE) {
+                                coslam = -coslam;
+                            }
+                            if (Math.abs(phi + this.phi0) < EPSLN) {
+                                return null;
+                            }
+                            y = FORTPI - phi * 0.5;
+                            y = 2 * (this.mode === this.S_POLE ? Math.cos(y) : Math.sin(y));
+                            x = y * Math.sin(lam);
+                            y *= coslam;
+                        }
+                    } else {
+                        sinb = 0;
+                        cosb = 0;
+                        b = 0;
+                        coslam = Math.cos(lam);
+                        sinlam = Math.sin(lam);
+                        sinphi = Math.sin(phi);
+                        q = qsfnz(this.e, sinphi);
+                        if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {
+                            sinb = q / this.qp;
+                            cosb = Math.sqrt(1 - sinb * sinb);
+                        }
+                        switch (this.mode) {
+                        case this.OBLIQ:
+                            b = 1 + this.sinb1 * sinb + this.cosb1 * cosb * coslam;
+                            break;
+                        case this.EQUIT:
+                            b = 1 + cosb * coslam;
+                            break;
+                        case this.N_POLE:
+                            b = HALF_PI + phi;
+                            q = this.qp - q;
+                            break;
+                        case this.S_POLE:
+                            b = phi - HALF_PI;
+                            q = this.qp + q;
+                            break;
+                        }
+                        if (Math.abs(b) < EPSLN) {
+                            return null;
+                        }
+                        switch (this.mode) {
+                        case this.OBLIQ:
+                        case this.EQUIT:
+                            b = Math.sqrt(2 / b);
+                            if (this.mode === this.OBLIQ) {
+                                y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam);
+                            } else {
+                                y = (b = Math.sqrt(2 / (1 + cosb * coslam))) * sinb * this.ymf;
+                            }
+                            x = this.xmf * b * cosb * sinlam;
+                            break;
+                        case this.N_POLE:
+                        case this.S_POLE:
+                            if (q >= 0) {
+                                x = (b = Math.sqrt(q)) * sinlam;
+                                y = coslam * (this.mode === this.S_POLE ? b : -b);
+                            } else {
+                                x = y = 0;
+                            }
+                            break;
+                        }
+                    }
+                    p.x = this.a * x + this.x0;
+                    p.y = this.a * y + this.y0;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    p.x -= this.x0;
+                    p.y -= this.y0;
+                    var x = p.x / this.a;
+                    var y = p.y / this.a;
+                    var lam, phi, cCe, sCe, q, rho, ab;
+                    if (this.sphere) {
+                        var cosz = 0, rh, sinz = 0;
+                        rh = Math.sqrt(x * x + y * y);
+                        phi = rh * 0.5;
+                        if (phi > 1) {
+                            return null;
+                        }
+                        phi = 2 * Math.asin(phi);
+                        if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {
+                            sinz = Math.sin(phi);
+                            cosz = Math.cos(phi);
+                        }
+                        switch (this.mode) {
+                        case this.EQUIT:
+                            phi = Math.abs(rh) <= EPSLN ? 0 : Math.asin(y * sinz / rh);
+                            x *= sinz;
+                            y = cosz * rh;
+                            break;
+                        case this.OBLIQ:
+                            phi = Math.abs(rh) <= EPSLN ? this.phi0 : Math.asin(cosz * this.sinph0 + y * sinz * this.cosph0 / rh);
+                            x *= sinz * this.cosph0;
+                            y = (cosz - Math.sin(phi) * this.sinph0) * rh;
+                            break;
+                        case this.N_POLE:
+                            y = -y;
+                            phi = HALF_PI - phi;
+                            break;
+                        case this.S_POLE:
+                            phi -= HALF_PI;
+                            break;
+                        }
+                        lam = y === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ) ? 0 : Math.atan2(x, y);
+                    } else {
+                        ab = 0;
+                        if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {
+                            x /= this.dd;
+                            y *= this.dd;
+                            rho = Math.sqrt(x * x + y * y);
+                            if (rho < EPSLN) {
+                                p.x = 0;
+                                p.y = this.phi0;
+                                return p;
+                            }
+                            sCe = 2 * Math.asin(0.5 * rho / this.rq);
+                            cCe = Math.cos(sCe);
+                            x *= sCe = Math.sin(sCe);
+                            if (this.mode === this.OBLIQ) {
+                                ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho;
+                                q = this.qp * ab;
+                                y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe;
+                            } else {
+                                ab = y * sCe / rho;
+                                q = this.qp * ab;
+                                y = rho * cCe;
+                            }
+                        } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {
+                            if (this.mode === this.N_POLE) {
+                                y = -y;
+                            }
+                            q = x * x + y * y;
+                            if (!q) {
+                                p.x = 0;
+                                p.y = this.phi0;
+                                return p;
+                            }
+                            ab = 1 - q / this.qp;
+                            if (this.mode === this.S_POLE) {
+                                ab = -ab;
+                            }
+                        }
+                        lam = Math.atan2(x, y);
+                        phi = this.authlat(Math.asin(ab), this.apa);
+                    }
+                    p.x = adjust_lon(this.long0 + lam);
+                    p.y = phi;
+                    return p;
+                };
+                exports.P00 = 0.3333333333333333;
+                exports.P01 = 0.17222222222222222;
+                exports.P02 = 0.10257936507936508;
+                exports.P10 = 0.06388888888888888;
+                exports.P11 = 0.0664021164021164;
+                exports.P20 = 0.016415012942191543;
+                exports.authset = function (es) {
+                    var t;
+                    var APA = [];
+                    APA[0] = es * this.P00;
+                    t = es * es;
+                    APA[0] += t * this.P01;
+                    APA[1] = t * this.P10;
+                    t *= es;
+                    APA[0] += t * this.P02;
+                    APA[1] += t * this.P11;
+                    APA[2] = t * this.P20;
+                    return APA;
+                };
+                exports.authlat = function (beta, APA) {
+                    var t = beta + beta;
+                    return beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t + t) + APA[2] * Math.sin(t + t + t);
+                };
+                exports.names = [
+                    'Lambert Azimuthal Equal Area',
+                    'Lambert_Azimuthal_Equal_Area',
+                    'laea'
+                ];
+                return exports;
+            },
+            {
+                '../common/adjust_lon': 5,
+                '../common/qsfnz': 20
+            }
+        ],
+        49: [
+            function (_dereq_, module, exports) {
+                var EPSLN = 1e-10;
+                var msfnz = _dereq_('../common/msfnz');
+                var tsfnz = _dereq_('../common/tsfnz');
+                var HALF_PI = Math.PI / 2;
+                var sign = _dereq_('../common/sign');
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                var phi2z = _dereq_('../common/phi2z');
+                exports.init = function () {
+                    if (!this.lat2) {
+                        this.lat2 = this.lat1;
+                    }
+                    if (!this.k0) {
+                        this.k0 = 1;
+                    }
+                    this.x0 = this.x0 || 0;
+                    this.y0 = this.y0 || 0;
+                    if (Math.abs(this.lat1 + this.lat2) < EPSLN) {
+                        return;
+                    }
+                    var temp = this.b / this.a;
+                    this.e = Math.sqrt(1 - temp * temp);
+                    var sin1 = Math.sin(this.lat1);
+                    var cos1 = Math.cos(this.lat1);
+                    var ms1 = msfnz(this.e, sin1, cos1);
+                    var ts1 = tsfnz(this.e, this.lat1, sin1);
+                    var sin2 = Math.sin(this.lat2);
+                    var cos2 = Math.cos(this.lat2);
+                    var ms2 = msfnz(this.e, sin2, cos2);
+                    var ts2 = tsfnz(this.e, this.lat2, sin2);
+                    var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0));
+                    if (Math.abs(this.lat1 - this.lat2) > EPSLN) {
+                        this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2);
+                    } else {
+                        this.ns = sin1;
+                    }
+                    if (isNaN(this.ns)) {
+                        this.ns = sin1;
+                    }
+                    this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns));
+                    this.rh = this.a * this.f0 * Math.pow(ts0, this.ns);
+                    if (!this.title) {
+                        this.title = 'Lambert Conformal Conic';
+                    }
+                };
+                exports.forward = function (p) {
+                    var lon = p.x;
+                    var lat = p.y;
+                    if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) {
+                        lat = sign(lat) * (HALF_PI - 2 * EPSLN);
+                    }
+                    var con = Math.abs(Math.abs(lat) - HALF_PI);
+                    var ts, rh1;
+                    if (con > EPSLN) {
+                        ts = tsfnz(this.e, lat, Math.sin(lat));
+                        rh1 = this.a * this.f0 * Math.pow(ts, this.ns);
+                    } else {
+                        con = lat * this.ns;
+                        if (con <= 0) {
+                            return null;
+                        }
+                        rh1 = 0;
+                    }
+                    var theta = this.ns * adjust_lon(lon - this.long0);
+                    p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0;
+                    p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    var rh1, con, ts;
+                    var lat, lon;
+                    var x = (p.x - this.x0) / this.k0;
+                    var y = this.rh - (p.y - this.y0) / this.k0;
+                    if (this.ns > 0) {
+                        rh1 = Math.sqrt(x * x + y * y);
+                        con = 1;
+                    } else {
+                        rh1 = -Math.sqrt(x * x + y * y);
+                        con = -1;
+                    }
+                    var theta = 0;
+                    if (rh1 !== 0) {
+                        theta = Math.atan2(con * x, con * y);
+                    }
+                    if (rh1 !== 0 || this.ns > 0) {
+                        con = 1 / this.ns;
+                        ts = Math.pow(rh1 / (this.a * this.f0), con);
+                        lat = phi2z(this.e, ts);
+                        if (lat === -9999) {
+                            return null;
+                        }
+                    } else {
+                        lat = -HALF_PI;
+                    }
+                    lon = adjust_lon(theta / this.ns + this.long0);
+                    p.x = lon;
+                    p.y = lat;
+                    return p;
+                };
+                exports.names = [
+                    'Lambert Tangential Conformal Conic Projection',
+                    'Lambert_Conformal_Conic',
+                    'Lambert_Conformal_Conic_2SP',
+                    'lcc'
+                ];
+                return exports;
+            },
+            {
+                '../common/adjust_lon': 5,
+                '../common/msfnz': 15,
+                '../common/phi2z': 16,
+                '../common/sign': 21,
+                '../common/tsfnz': 24
+            }
+        ],
+        50: [
+            function (_dereq_, module, exports) {
+                exports.init = function () {
+                };
+                function identity(pt) {
+                    return pt;
+                }
+                exports.forward = identity;
+                exports.inverse = identity;
+                exports.names = [
+                    'longlat',
+                    'identity'
+                ];
+                return exports;
+            },
+            {}
+        ],
+        51: [
+            function (_dereq_, module, exports) {
+                var msfnz = _dereq_('../common/msfnz');
+                var HALF_PI = Math.PI / 2;
+                var EPSLN = 1e-10;
+                var R2D = 57.29577951308232;
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                var FORTPI = Math.PI / 4;
+                var tsfnz = _dereq_('../common/tsfnz');
+                var phi2z = _dereq_('../common/phi2z');
+                exports.init = function () {
+                    var con = this.b / this.a;
+                    this.es = 1 - con * con;
+                    if (!('x0' in this)) {
+                        this.x0 = 0;
+                    }
+                    if (!('y0' in this)) {
+                        this.y0 = 0;
+                    }
+                    this.e = Math.sqrt(this.es);
+                    if (this.lat_ts) {
+                        if (this.sphere) {
+                            this.k0 = Math.cos(this.lat_ts);
+                        } else {
+                            this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));
+                        }
+                    } else {
+                        if (!this.k0) {
+                            if (this.k) {
+                                this.k0 = this.k;
+                            } else {
+                                this.k0 = 1;
+                            }
+                        }
+                    }
+                };
+                exports.forward = function (p) {
+                    var lon = p.x;
+                    var lat = p.y;
+                    if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) {
+                        return null;
+                    }
+                    var x, y;
+                    if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {
+                        return null;
+                    } else {
+                        if (this.sphere) {
+                            x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0);
+                            y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat));
+                        } else {
+                            var sinphi = Math.sin(lat);
+                            var ts = tsfnz(this.e, lat, sinphi);
+                            x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0);
+                            y = this.y0 - this.a * this.k0 * Math.log(ts);
+                        }
+                        p.x = x;
+                        p.y = y;
+                        return p;
+                    }
+                };
+                exports.inverse = function (p) {
+                    var x = p.x - this.x0;
+                    var y = p.y - this.y0;
+                    var lon, lat;
+                    if (this.sphere) {
+                        lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0)));
+                    } else {
+                        var ts = Math.exp(-y / (this.a * this.k0));
+                        lat = phi2z(this.e, ts);
+                        if (lat === -9999) {
+                            return null;
+                        }
+                    }
+                    lon = adjust_lon(this.long0 + x / (this.a * this.k0));
+                    p.x = lon;
+                    p.y = lat;
+                    return p;
+                };
+                exports.names = [
+                    'Mercator',
+                    'Popular Visualisation Pseudo Mercator',
+                    'Mercator_1SP',
+                    'Mercator_Auxiliary_Sphere',
+                    'merc'
+                ];
+                return exports;
+            },
+            {
+                '../common/adjust_lon': 5,
+                '../common/msfnz': 15,
+                '../common/phi2z': 16,
+                '../common/tsfnz': 24
+            }
+        ],
+        52: [
+            function (_dereq_, module, exports) {
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                exports.init = function () {
+                };
+                exports.forward = function (p) {
+                    var lon = p.x;
+                    var lat = p.y;
+                    var dlon = adjust_lon(lon - this.long0);
+                    var x = this.x0 + this.a * dlon;
+                    var y = this.y0 + this.a * Math.log(Math.tan(Math.PI / 4 + lat / 2.5)) * 1.25;
+                    p.x = x;
+                    p.y = y;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    p.x -= this.x0;
+                    p.y -= this.y0;
+                    var lon = adjust_lon(this.long0 + p.x / this.a);
+                    var lat = 2.5 * (Math.atan(Math.exp(0.8 * p.y / this.a)) - Math.PI / 4);
+                    p.x = lon;
+                    p.y = lat;
+                    return p;
+                };
+                exports.names = [
+                    'Miller_Cylindrical',
+                    'mill'
+                ];
+                return exports;
+            },
+            { '../common/adjust_lon': 5 }
+        ],
+        53: [
+            function (_dereq_, module, exports) {
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                var EPSLN = 1e-10;
+                exports.init = function () {
+                };
+                exports.forward = function (p) {
+                    var lon = p.x;
+                    var lat = p.y;
+                    var delta_lon = adjust_lon(lon - this.long0);
+                    var theta = lat;
+                    var con = Math.PI * Math.sin(lat);
+                    for (var i = 0; true; i++) {
+                        var delta_theta = -(theta + Math.sin(theta) - con) / (1 + Math.cos(theta));
+                        theta += delta_theta;
+                        if (Math.abs(delta_theta) < EPSLN) {
+                            break;
+                        }
+                    }
+                    theta /= 2;
+                    if (Math.PI / 2 - Math.abs(lat) < EPSLN) {
+                        delta_lon = 0;
+                    }
+                    var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0;
+                    var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0;
+                    p.x = x;
+                    p.y = y;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    var theta;
+                    var arg;
+                    p.x -= this.x0;
+                    p.y -= this.y0;
+                    arg = p.y / (1.4142135623731 * this.a);
+                    if (Math.abs(arg) > 0.999999999999) {
+                        arg = 0.999999999999;
+                    }
+                    theta = Math.asin(arg);
+                    var lon = adjust_lon(this.long0 + p.x / (0.900316316158 * this.a * Math.cos(theta)));
+                    if (lon < -Math.PI) {
+                        lon = -Math.PI;
+                    }
+                    if (lon > Math.PI) {
+                        lon = Math.PI;
+                    }
+                    arg = (2 * theta + Math.sin(2 * theta)) / Math.PI;
+                    if (Math.abs(arg) > 1) {
+                        arg = 1;
+                    }
+                    var lat = Math.asin(arg);
+                    p.x = lon;
+                    p.y = lat;
+                    return p;
+                };
+                exports.names = [
+                    'Mollweide',
+                    'moll'
+                ];
+                return exports;
+            },
+            { '../common/adjust_lon': 5 }
+        ],
+        54: [
+            function (_dereq_, module, exports) {
+                var SEC_TO_RAD = 0.00000484813681109536;
+                exports.iterations = 1;
+                exports.init = function () {
+                    this.A = [];
+                    this.A[1] = 0.6399175073;
+                    this.A[2] = -0.1358797613;
+                    this.A[3] = 0.063294409;
+                    this.A[4] = -0.02526853;
+                    this.A[5] = 0.0117879;
+                    this.A[6] = -0.0055161;
+                    this.A[7] = 0.0026906;
+                    this.A[8] = -0.001333;
+                    this.A[9] = 0.00067;
+                    this.A[10] = -0.00034;
+                    this.B_re = [];
+                    this.B_im = [];
+                    this.B_re[1] = 0.7557853228;
+                    this.B_im[1] = 0;
+                    this.B_re[2] = 0.249204646;
+                    this.B_im[2] = 0.003371507;
+                    this.B_re[3] = -0.001541739;
+                    this.B_im[3] = 0.04105856;
+                    this.B_re[4] = -0.10162907;
+                    this.B_im[4] = 0.01727609;
+                    this.B_re[5] = -0.26623489;
+                    this.B_im[5] = -0.36249218;
+                    this.B_re[6] = -0.6870983;
+                    this.B_im[6] = -1.1651967;
+                    this.C_re = [];
+                    this.C_im = [];
+                    this.C_re[1] = 1.3231270439;
+                    this.C_im[1] = 0;
+                    this.C_re[2] = -0.577245789;
+                    this.C_im[2] = -0.007809598;
+                    this.C_re[3] = 0.508307513;
+                    this.C_im[3] = -0.112208952;
+                    this.C_re[4] = -0.15094762;
+                    this.C_im[4] = 0.18200602;
+                    this.C_re[5] = 1.01418179;
+                    this.C_im[5] = 1.64497696;
+                    this.C_re[6] = 1.9660549;
+                    this.C_im[6] = 2.5127645;
+                    this.D = [];
+                    this.D[1] = 1.5627014243;
+                    this.D[2] = 0.5185406398;
+                    this.D[3] = -0.03333098;
+                    this.D[4] = -0.1052906;
+                    this.D[5] = -0.0368594;
+                    this.D[6] = 0.007317;
+                    this.D[7] = 0.0122;
+                    this.D[8] = 0.00394;
+                    this.D[9] = -0.0013;
+                };
+                exports.forward = function (p) {
+                    var n;
+                    var lon = p.x;
+                    var lat = p.y;
+                    var delta_lat = lat - this.lat0;
+                    var delta_lon = lon - this.long0;
+                    var d_phi = delta_lat / SEC_TO_RAD * 0.00001;
+                    var d_lambda = delta_lon;
+                    var d_phi_n = 1;
+                    var d_psi = 0;
+                    for (n = 1; n <= 10; n++) {
+                        d_phi_n = d_phi_n * d_phi;
+                        d_psi = d_psi + this.A[n] * d_phi_n;
+                    }
+                    var th_re = d_psi;
+                    var th_im = d_lambda;
+                    var th_n_re = 1;
+                    var th_n_im = 0;
+                    var th_n_re1;
+                    var th_n_im1;
+                    var z_re = 0;
+                    var z_im = 0;
+                    for (n = 1; n <= 6; n++) {
+                        th_n_re1 = th_n_re * th_re - th_n_im * th_im;
+                        th_n_im1 = th_n_im * th_re + th_n_re * th_im;
+                        th_n_re = th_n_re1;
+                        th_n_im = th_n_im1;
+                        z_re = z_re + this.B_re[n] * th_n_re - this.B_im[n] * th_n_im;
+                        z_im = z_im + this.B_im[n] * th_n_re + this.B_re[n] * th_n_im;
+                    }
+                    p.x = z_im * this.a + this.x0;
+                    p.y = z_re * this.a + this.y0;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    var n;
+                    var x = p.x;
+                    var y = p.y;
+                    var delta_x = x - this.x0;
+                    var delta_y = y - this.y0;
+                    var z_re = delta_y / this.a;
+                    var z_im = delta_x / this.a;
+                    var z_n_re = 1;
+                    var z_n_im = 0;
+                    var z_n_re1;
+                    var z_n_im1;
+                    var th_re = 0;
+                    var th_im = 0;
+                    for (n = 1; n <= 6; n++) {
+                        z_n_re1 = z_n_re * z_re - z_n_im * z_im;
+                        z_n_im1 = z_n_im * z_re + z_n_re * z_im;
+                        z_n_re = z_n_re1;
+                        z_n_im = z_n_im1;
+                        th_re = th_re + this.C_re[n] * z_n_re - this.C_im[n] * z_n_im;
+                        th_im = th_im + this.C_im[n] * z_n_re + this.C_re[n] * z_n_im;
+                    }
+                    for (var i = 0; i < this.iterations; i++) {
+                        var th_n_re = th_re;
+                        var th_n_im = th_im;
+                        var th_n_re1;
+                        var th_n_im1;
+                        var num_re = z_re;
+                        var num_im = z_im;
+                        for (n = 2; n <= 6; n++) {
+                            th_n_re1 = th_n_re * th_re - th_n_im * th_im;
+                            th_n_im1 = th_n_im * th_re + th_n_re * th_im;
+                            th_n_re = th_n_re1;
+                            th_n_im = th_n_im1;
+                            num_re = num_re + (n - 1) * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);
+                            num_im = num_im + (n - 1) * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);
+                        }
+                        th_n_re = 1;
+                        th_n_im = 0;
+                        var den_re = this.B_re[1];
+                        var den_im = this.B_im[1];
+                        for (n = 2; n <= 6; n++) {
+                            th_n_re1 = th_n_re * th_re - th_n_im * th_im;
+                            th_n_im1 = th_n_im * th_re + th_n_re * th_im;
+                            th_n_re = th_n_re1;
+                            th_n_im = th_n_im1;
+                            den_re = den_re + n * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);
+                            den_im = den_im + n * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);
+                        }
+                        var den2 = den_re * den_re + den_im * den_im;
+                        th_re = (num_re * den_re + num_im * den_im) / den2;
+                        th_im = (num_im * den_re - num_re * den_im) / den2;
+                    }
+                    var d_psi = th_re;
+                    var d_lambda = th_im;
+                    var d_psi_n = 1;
+                    var d_phi = 0;
+                    for (n = 1; n <= 9; n++) {
+                        d_psi_n = d_psi_n * d_psi;
+                        d_phi = d_phi + this.D[n] * d_psi_n;
+                    }
+                    var lat = this.lat0 + d_phi * SEC_TO_RAD * 100000;
+                    var lon = this.long0 + d_lambda;
+                    p.x = lon;
+                    p.y = lat;
+                    return p;
+                };
+                exports.names = [
+                    'New_Zealand_Map_Grid',
+                    'nzmg'
+                ];
+                return exports;
+            },
+            {}
+        ],
+        55: [
+            function (_dereq_, module, exports) {
+                var tsfnz = _dereq_('../common/tsfnz');
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                var phi2z = _dereq_('../common/phi2z');
+                var HALF_PI = Math.PI / 2;
+                var FORTPI = Math.PI / 4;
+                var EPSLN = 1e-10;
+                exports.init = function () {
+                    this.no_off = this.no_off || false;
+                    this.no_rot = this.no_rot || false;
+                    if (isNaN(this.k0)) {
+                        this.k0 = 1;
+                    }
+                    var sinlat = Math.sin(this.lat0);
+                    var coslat = Math.cos(this.lat0);
+                    var con = this.e * sinlat;
+                    this.bl = Math.sqrt(1 + this.es / (1 - this.es) * Math.pow(coslat, 4));
+                    this.al = this.a * this.bl * this.k0 * Math.sqrt(1 - this.es) / (1 - con * con);
+                    var t0 = tsfnz(this.e, this.lat0, sinlat);
+                    var dl = this.bl / coslat * Math.sqrt((1 - this.es) / (1 - con * con));
+                    if (dl * dl < 1) {
+                        dl = 1;
+                    }
+                    var fl;
+                    var gl;
+                    if (!isNaN(this.longc)) {
+                        if (this.lat0 >= 0) {
+                            fl = dl + Math.sqrt(dl * dl - 1);
+                        } else {
+                            fl = dl - Math.sqrt(dl * dl - 1);
+                        }
+                        this.el = fl * Math.pow(t0, this.bl);
+                        gl = 0.5 * (fl - 1 / fl);
+                        this.gamma0 = Math.asin(Math.sin(this.alpha) / dl);
+                        this.long0 = this.longc - Math.asin(gl * Math.tan(this.gamma0)) / this.bl;
+                    } else {
+                        var t1 = tsfnz(this.e, this.lat1, Math.sin(this.lat1));
+                        var t2 = tsfnz(this.e, this.lat2, Math.sin(this.lat2));
+                        if (this.lat0 >= 0) {
+                            this.el = (dl + Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl);
+                        } else {
+                            this.el = (dl - Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl);
+                        }
+                        var hl = Math.pow(t1, this.bl);
+                        var ll = Math.pow(t2, this.bl);
+                        fl = this.el / hl;
+                        gl = 0.5 * (fl - 1 / fl);
+                        var jl = (this.el * this.el - ll * hl) / (this.el * this.el + ll * hl);
+                        var pl = (ll - hl) / (ll + hl);
+                        var dlon12 = adjust_lon(this.long1 - this.long2);
+                        this.long0 = 0.5 * (this.long1 + this.long2) - Math.atan(jl * Math.tan(0.5 * this.bl * dlon12) / pl) / this.bl;
+                        this.long0 = adjust_lon(this.long0);
+                        var dlon10 = adjust_lon(this.long1 - this.long0);
+                        this.gamma0 = Math.atan(Math.sin(this.bl * dlon10) / gl);
+                        this.alpha = Math.asin(dl * Math.sin(this.gamma0));
+                    }
+                    if (this.no_off) {
+                        this.uc = 0;
+                    } else {
+                        if (this.lat0 >= 0) {
+                            this.uc = this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha));
+                        } else {
+                            this.uc = -1 * this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha));
+                        }
+                    }
+                };
+                exports.forward = function (p) {
+                    var lon = p.x;
+                    var lat = p.y;
+                    var dlon = adjust_lon(lon - this.long0);
+                    var us, vs;
+                    var con;
+                    if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {
+                        if (lat > 0) {
+                            con = -1;
+                        } else {
+                            con = 1;
+                        }
+                        vs = this.al / this.bl * Math.log(Math.tan(FORTPI + con * this.gamma0 * 0.5));
+                        us = -1 * con * HALF_PI * this.al / this.bl;
+                    } else {
+                        var t = tsfnz(this.e, lat, Math.sin(lat));
+                        var ql = this.el / Math.pow(t, this.bl);
+                        var sl = 0.5 * (ql - 1 / ql);
+                        var tl = 0.5 * (ql + 1 / ql);
+                        var vl = Math.sin(this.bl * dlon);
+                        var ul = (sl * Math.sin(this.gamma0) - vl * Math.cos(this.gamma0)) / tl;
+                        if (Math.abs(Math.abs(ul) - 1) <= EPSLN) {
+                            vs = Number.POSITIVE_INFINITY;
+                        } else {
+                            vs = 0.5 * this.al * Math.log((1 - ul) / (1 + ul)) / this.bl;
+                        }
+                        if (Math.abs(Math.cos(this.bl * dlon)) <= EPSLN) {
+                            us = this.al * this.bl * dlon;
+                        } else {
+                            us = this.al * Math.atan2(sl * Math.cos(this.gamma0) + vl * Math.sin(this.gamma0), Math.cos(this.bl * dlon)) / this.bl;
+                        }
+                    }
+                    if (this.no_rot) {
+                        p.x = this.x0 + us;
+                        p.y = this.y0 + vs;
+                    } else {
+                        us -= this.uc;
+                        p.x = this.x0 + vs * Math.cos(this.alpha) + us * Math.sin(this.alpha);
+                        p.y = this.y0 + us * Math.cos(this.alpha) - vs * Math.sin(this.alpha);
+                    }
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    var us, vs;
+                    if (this.no_rot) {
+                        vs = p.y - this.y0;
+                        us = p.x - this.x0;
+                    } else {
+                        vs = (p.x - this.x0) * Math.cos(this.alpha) - (p.y - this.y0) * Math.sin(this.alpha);
+                        us = (p.y - this.y0) * Math.cos(this.alpha) + (p.x - this.x0) * Math.sin(this.alpha);
+                        us += this.uc;
+                    }
+                    var qp = Math.exp(-1 * this.bl * vs / this.al);
+                    var sp = 0.5 * (qp - 1 / qp);
+                    var tp = 0.5 * (qp + 1 / qp);
+                    var vp = Math.sin(this.bl * us / this.al);
+                    var up = (vp * Math.cos(this.gamma0) + sp * Math.sin(this.gamma0)) / tp;
+                    var ts = Math.pow(this.el / Math.sqrt((1 + up) / (1 - up)), 1 / this.bl);
+                    if (Math.abs(up - 1) < EPSLN) {
+                        p.x = this.long0;
+                        p.y = HALF_PI;
+                    } else if (Math.abs(up + 1) < EPSLN) {
+                        p.x = this.long0;
+                        p.y = -1 * HALF_PI;
+                    } else {
+                        p.y = phi2z(this.e, ts);
+                        p.x = adjust_lon(this.long0 - Math.atan2(sp * Math.cos(this.gamma0) - vp * Math.sin(this.gamma0), Math.cos(this.bl * us / this.al)) / this.bl);
+                    }
+                    return p;
+                };
+                exports.names = [
+                    'Hotine_Oblique_Mercator',
+                    'Hotine Oblique Mercator',
+                    'Hotine_Oblique_Mercator_Azimuth_Natural_Origin',
+                    'Hotine_Oblique_Mercator_Azimuth_Center',
+                    'omerc'
+                ];
+                return exports;
+            },
+            {
+                '../common/adjust_lon': 5,
+                '../common/phi2z': 16,
+                '../common/tsfnz': 24
+            }
+        ],
+        56: [
+            function (_dereq_, module, exports) {
+                var e0fn = _dereq_('../common/e0fn');
+                var e1fn = _dereq_('../common/e1fn');
+                var e2fn = _dereq_('../common/e2fn');
+                var e3fn = _dereq_('../common/e3fn');
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                var adjust_lat = _dereq_('../common/adjust_lat');
+                var mlfn = _dereq_('../common/mlfn');
+                var EPSLN = 1e-10;
+                var gN = _dereq_('../common/gN');
+                var MAX_ITER = 20;
+                exports.init = function () {
+                    this.temp = this.b / this.a;
+                    this.es = 1 - Math.pow(this.temp, 2);
+                    this.e = Math.sqrt(this.es);
+                    this.e0 = e0fn(this.es);
+                    this.e1 = e1fn(this.es);
+                    this.e2 = e2fn(this.es);
+                    this.e3 = e3fn(this.es);
+                    this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);
+                };
+                exports.forward = function (p) {
+                    var lon = p.x;
+                    var lat = p.y;
+                    var x, y, el;
+                    var dlon = adjust_lon(lon - this.long0);
+                    el = dlon * Math.sin(lat);
+                    if (this.sphere) {
+                        if (Math.abs(lat) <= EPSLN) {
+                            x = this.a * dlon;
+                            y = -1 * this.a * this.lat0;
+                        } else {
+                            x = this.a * Math.sin(el) / Math.tan(lat);
+                            y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat));
+                        }
+                    } else {
+                        if (Math.abs(lat) <= EPSLN) {
+                            x = this.a * dlon;
+                            y = -1 * this.ml0;
+                        } else {
+                            var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat);
+                            x = nl * Math.sin(el);
+                            y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el));
+                        }
+                    }
+                    p.x = x + this.x0;
+                    p.y = y + this.y0;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    var lon, lat, x, y, i;
+                    var al, bl;
+                    var phi, dphi;
+                    x = p.x - this.x0;
+                    y = p.y - this.y0;
+                    if (this.sphere) {
+                        if (Math.abs(y + this.a * this.lat0) <= EPSLN) {
+                            lon = adjust_lon(x / this.a + this.long0);
+                            lat = 0;
+                        } else {
+                            al = this.lat0 + y / this.a;
+                            bl = x * x / this.a / this.a + al * al;
+                            phi = al;
+                            var tanphi;
+                            for (i = MAX_ITER; i; --i) {
+                                tanphi = Math.tan(phi);
+                                dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1);
+                                phi += dphi;
+                                if (Math.abs(dphi) <= EPSLN) {
+                                    lat = phi;
+                                    break;
+                                }
+                            }
+                            lon = adjust_lon(this.long0 + Math.asin(x * Math.tan(phi) / this.a) / Math.sin(lat));
+                        }
+                    } else {
+                        if (Math.abs(y + this.ml0) <= EPSLN) {
+                            lat = 0;
+                            lon = adjust_lon(this.long0 + x / this.a);
+                        } else {
+                            al = (this.ml0 + y) / this.a;
+                            bl = x * x / this.a / this.a + al * al;
+                            phi = al;
+                            var cl, mln, mlnp, ma;
+                            var con;
+                            for (i = MAX_ITER; i; --i) {
+                                con = this.e * Math.sin(phi);
+                                cl = Math.sqrt(1 - con * con) * Math.tan(phi);
+                                mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);
+                                mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi);
+                                ma = mln / this.a;
+                                dphi = (al * (cl * ma + 1) - ma - 0.5 * cl * (ma * ma + bl)) / (this.es * Math.sin(2 * phi) * (ma * ma + bl - 2 * al * ma) / (4 * cl) + (al - ma) * (cl * mlnp - 2 / Math.sin(2 * phi)) - mlnp);
+                                phi -= dphi;
+                                if (Math.abs(dphi) <= EPSLN) {
+                                    lat = phi;
+                                    break;
+                                }
+                            }
+                            cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat);
+                            lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat));
+                        }
+                    }
+                    p.x = lon;
+                    p.y = lat;
+                    return p;
+                };
+                exports.names = [
+                    'Polyconic',
+                    'poly'
+                ];
+                return exports;
+            },
+            {
+                '../common/adjust_lat': 4,
+                '../common/adjust_lon': 5,
+                '../common/e0fn': 7,
+                '../common/e1fn': 8,
+                '../common/e2fn': 9,
+                '../common/e3fn': 10,
+                '../common/gN': 11,
+                '../common/mlfn': 14
+            }
+        ],
+        57: [
+            function (_dereq_, module, exports) {
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                var adjust_lat = _dereq_('../common/adjust_lat');
+                var pj_enfn = _dereq_('../common/pj_enfn');
+                var MAX_ITER = 20;
+                var pj_mlfn = _dereq_('../common/pj_mlfn');
+                var pj_inv_mlfn = _dereq_('../common/pj_inv_mlfn');
+                var HALF_PI = Math.PI / 2;
+                var EPSLN = 1e-10;
+                var asinz = _dereq_('../common/asinz');
+                exports.init = function () {
+                    if (!this.sphere) {
+                        this.en = pj_enfn(this.es);
+                    } else {
+                        this.n = 1;
+                        this.m = 0;
+                        this.es = 0;
+                        this.C_y = Math.sqrt((this.m + 1) / this.n);
+                        this.C_x = this.C_y / (this.m + 1);
+                    }
+                };
+                exports.forward = function (p) {
+                    var x, y;
+                    var lon = p.x;
+                    var lat = p.y;
+                    lon = adjust_lon(lon - this.long0);
+                    if (this.sphere) {
+                        if (!this.m) {
+                            lat = this.n !== 1 ? Math.asin(this.n * Math.sin(lat)) : lat;
+                        } else {
+                            var k = this.n * Math.sin(lat);
+                            for (var i = MAX_ITER; i; --i) {
+                                var V = (this.m * lat + Math.sin(lat) - k) / (this.m + Math.cos(lat));
+                                lat -= V;
+                                if (Math.abs(V) < EPSLN) {
+                                    break;
+                                }
+                            }
+                        }
+                        x = this.a * this.C_x * lon * (this.m + Math.cos(lat));
+                        y = this.a * this.C_y * lat;
+                    } else {
+                        var s = Math.sin(lat);
+                        var c = Math.cos(lat);
+                        y = this.a * pj_mlfn(lat, s, c, this.en);
+                        x = this.a * lon * c / Math.sqrt(1 - this.es * s * s);
+                    }
+                    p.x = x;
+                    p.y = y;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    var lat, temp, lon, s;
+                    p.x -= this.x0;
+                    lon = p.x / this.a;
+                    p.y -= this.y0;
+                    lat = p.y / this.a;
+                    if (this.sphere) {
+                        lat /= this.C_y;
+                        lon = lon / (this.C_x * (this.m + Math.cos(lat)));
+                        if (this.m) {
+                            lat = asinz((this.m * lat + Math.sin(lat)) / this.n);
+                        } else if (this.n !== 1) {
+                            lat = asinz(Math.sin(lat) / this.n);
+                        }
+                        lon = adjust_lon(lon + this.long0);
+                        lat = adjust_lat(lat);
+                    } else {
+                        lat = pj_inv_mlfn(p.y / this.a, this.es, this.en);
+                        s = Math.abs(lat);
+                        if (s < HALF_PI) {
+                            s = Math.sin(lat);
+                            temp = this.long0 + p.x * Math.sqrt(1 - this.es * s * s) / (this.a * Math.cos(lat));
+                            lon = adjust_lon(temp);
+                        } else if (s - EPSLN < HALF_PI) {
+                            lon = this.long0;
+                        }
+                    }
+                    p.x = lon;
+                    p.y = lat;
+                    return p;
+                };
+                exports.names = [
+                    'Sinusoidal',
+                    'sinu'
+                ];
+                return exports;
+            },
+            {
+                '../common/adjust_lat': 4,
+                '../common/adjust_lon': 5,
+                '../common/asinz': 6,
+                '../common/pj_enfn': 17,
+                '../common/pj_inv_mlfn': 18,
+                '../common/pj_mlfn': 19
+            }
+        ],
+        58: [
+            function (_dereq_, module, exports) {
+                exports.init = function () {
+                    var phy0 = this.lat0;
+                    this.lambda0 = this.long0;
+                    var sinPhy0 = Math.sin(phy0);
+                    var semiMajorAxis = this.a;
+                    var invF = this.rf;
+                    var flattening = 1 / invF;
+                    var e2 = 2 * flattening - Math.pow(flattening, 2);
+                    var e = this.e = Math.sqrt(e2);
+                    this.R = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2));
+                    this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4));
+                    this.b0 = Math.asin(sinPhy0 / this.alpha);
+                    var k1 = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2));
+                    var k2 = Math.log(Math.tan(Math.PI / 4 + phy0 / 2));
+                    var k3 = Math.log((1 + e * sinPhy0) / (1 - e * sinPhy0));
+                    this.K = k1 - this.alpha * k2 + this.alpha * e / 2 * k3;
+                };
+                exports.forward = function (p) {
+                    var Sa1 = Math.log(Math.tan(Math.PI / 4 - p.y / 2));
+                    var Sa2 = this.e / 2 * Math.log((1 + this.e * Math.sin(p.y)) / (1 - this.e * Math.sin(p.y)));
+                    var S = -this.alpha * (Sa1 + Sa2) + this.K;
+                    var b = 2 * (Math.atan(Math.exp(S)) - Math.PI / 4);
+                    var I = this.alpha * (p.x - this.lambda0);
+                    var rotI = Math.atan(Math.sin(I) / (Math.sin(this.b0) * Math.tan(b) + Math.cos(this.b0) * Math.cos(I)));
+                    var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - Math.sin(this.b0) * Math.cos(b) * Math.cos(I));
+                    p.y = this.R / 2 * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + this.y0;
+                    p.x = this.R * rotI + this.x0;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    var Y = p.x - this.x0;
+                    var X = p.y - this.y0;
+                    var rotI = Y / this.R;
+                    var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4);
+                    var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI));
+                    var I = Math.atan(Math.sin(rotI) / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) * Math.tan(rotB)));
+                    var lambda = this.lambda0 + I / this.alpha;
+                    var S = 0;
+                    var phy = b;
+                    var prevPhy = -1000;
+                    var iteration = 0;
+                    while (Math.abs(phy - prevPhy) > 1e-7) {
+                        if (++iteration > 20) {
+                            return;
+                        }
+                        S = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + b / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(phy)) / 2));
+                        prevPhy = phy;
+                        phy = 2 * Math.atan(Math.exp(S)) - Math.PI / 2;
+                    }
+                    p.x = lambda;
+                    p.y = phy;
+                    return p;
+                };
+                exports.names = ['somerc'];
+                return exports;
+            },
+            {}
+        ],
+        59: [
+            function (_dereq_, module, exports) {
+                var HALF_PI = Math.PI / 2;
+                var EPSLN = 1e-10;
+                var sign = _dereq_('../common/sign');
+                var msfnz = _dereq_('../common/msfnz');
+                var tsfnz = _dereq_('../common/tsfnz');
+                var phi2z = _dereq_('../common/phi2z');
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                exports.ssfn_ = function (phit, sinphi, eccen) {
+                    sinphi *= eccen;
+                    return Math.tan(0.5 * (HALF_PI + phit)) * Math.pow((1 - sinphi) / (1 + sinphi), 0.5 * eccen);
+                };
+                exports.init = function () {
+                    this.coslat0 = Math.cos(this.lat0);
+                    this.sinlat0 = Math.sin(this.lat0);
+                    if (this.sphere) {
+                        if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) {
+                            this.k0 = 0.5 * (1 + sign(this.lat0) * Math.sin(this.lat_ts));
+                        }
+                    } else {
+                        if (Math.abs(this.coslat0) <= EPSLN) {
+                            if (this.lat0 > 0) {
+                                this.con = 1;
+                            } else {
+                                this.con = -1;
+                            }
+                        }
+                        this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e));
+                        if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) {
+                            this.k0 = 0.5 * this.cons * msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / tsfnz(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts));
+                        }
+                        this.ms1 = msfnz(this.e, this.sinlat0, this.coslat0);
+                        this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - HALF_PI;
+                        this.cosX0 = Math.cos(this.X0);
+                        this.sinX0 = Math.sin(this.X0);
+                    }
+                };
+                exports.forward = function (p) {
+                    var lon = p.x;
+                    var lat = p.y;
+                    var sinlat = Math.sin(lat);
+                    var coslat = Math.cos(lat);
+                    var A, X, sinX, cosX, ts, rh;
+                    var dlon = adjust_lon(lon - this.long0);
+                    if (Math.abs(Math.abs(lon - this.long0) - Math.PI) <= EPSLN && Math.abs(lat + this.lat0) <= EPSLN) {
+                        p.x = NaN;
+                        p.y = NaN;
+                        return p;
+                    }
+                    if (this.sphere) {
+                        A = 2 * this.k0 / (1 + this.sinlat0 * sinlat + this.coslat0 * coslat * Math.cos(dlon));
+                        p.x = this.a * A * coslat * Math.sin(dlon) + this.x0;
+                        p.y = this.a * A * (this.coslat0 * sinlat - this.sinlat0 * coslat * Math.cos(dlon)) + this.y0;
+                        return p;
+                    } else {
+                        X = 2 * Math.atan(this.ssfn_(lat, sinlat, this.e)) - HALF_PI;
+                        cosX = Math.cos(X);
+                        sinX = Math.sin(X);
+                        if (Math.abs(this.coslat0) <= EPSLN) {
+                            ts = tsfnz(this.e, lat * this.con, this.con * sinlat);
+                            rh = 2 * this.a * this.k0 * ts / this.cons;
+                            p.x = this.x0 + rh * Math.sin(lon - this.long0);
+                            p.y = this.y0 - this.con * rh * Math.cos(lon - this.long0);
+                            return p;
+                        } else if (Math.abs(this.sinlat0) < EPSLN) {
+                            A = 2 * this.a * this.k0 / (1 + cosX * Math.cos(dlon));
+                            p.y = A * sinX;
+                        } else {
+                            A = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * sinX + this.cosX0 * cosX * Math.cos(dlon)));
+                            p.y = A * (this.cosX0 * sinX - this.sinX0 * cosX * Math.cos(dlon)) + this.y0;
+                        }
+                        p.x = A * cosX * Math.sin(dlon) + this.x0;
+                    }
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    p.x -= this.x0;
+                    p.y -= this.y0;
+                    var lon, lat, ts, ce, Chi;
+                    var rh = Math.sqrt(p.x * p.x + p.y * p.y);
+                    if (this.sphere) {
+                        var c = 2 * Math.atan(rh / (0.5 * this.a * this.k0));
+                        lon = this.long0;
+                        lat = this.lat0;
+                        if (rh <= EPSLN) {
+                            p.x = lon;
+                            p.y = lat;
+                            return p;
+                        }
+                        lat = Math.asin(Math.cos(c) * this.sinlat0 + p.y * Math.sin(c) * this.coslat0 / rh);
+                        if (Math.abs(this.coslat0) < EPSLN) {
+                            if (this.lat0 > 0) {
+                                lon = adjust_lon(this.long0 + Math.atan2(p.x, -1 * p.y));
+                            } else {
+                                lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y));
+                            }
+                        } else {
+                            lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(c), rh * this.coslat0 * Math.cos(c) - p.y * this.sinlat0 * Math.sin(c)));
+                        }
+                        p.x = lon;
+                        p.y = lat;
+                        return p;
+                    } else {
+                        if (Math.abs(this.coslat0) <= EPSLN) {
+                            if (rh <= EPSLN) {
+                                lat = this.lat0;
+                                lon = this.long0;
+                                p.x = lon;
+                                p.y = lat;
+                                return p;
+                            }
+                            p.x *= this.con;
+                            p.y *= this.con;
+                            ts = rh * this.cons / (2 * this.a * this.k0);
+                            lat = this.con * phi2z(this.e, ts);
+                            lon = this.con * adjust_lon(this.con * this.long0 + Math.atan2(p.x, -1 * p.y));
+                        } else {
+                            ce = 2 * Math.atan(rh * this.cosX0 / (2 * this.a * this.k0 * this.ms1));
+                            lon = this.long0;
+                            if (rh <= EPSLN) {
+                                Chi = this.X0;
+                            } else {
+                                Chi = Math.asin(Math.cos(ce) * this.sinX0 + p.y * Math.sin(ce) * this.cosX0 / rh);
+                                lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(ce), rh * this.cosX0 * Math.cos(ce) - p.y * this.sinX0 * Math.sin(ce)));
+                            }
+                            lat = -1 * phi2z(this.e, Math.tan(0.5 * (HALF_PI + Chi)));
+                        }
+                    }
+                    p.x = lon;
+                    p.y = lat;
+                    return p;
+                };
+                exports.names = ['stere'];
+                return exports;
+            },
+            {
+                '../common/adjust_lon': 5,
+                '../common/msfnz': 15,
+                '../common/phi2z': 16,
+                '../common/sign': 21,
+                '../common/tsfnz': 24
+            }
+        ],
+        60: [
+            function (_dereq_, module, exports) {
+                var gauss = _dereq_('./gauss');
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                exports.init = function () {
+                    gauss.init.apply(this);
+                    if (!this.rc) {
+                        return;
+                    }
+                    this.sinc0 = Math.sin(this.phic0);
+                    this.cosc0 = Math.cos(this.phic0);
+                    this.R2 = 2 * this.rc;
+                    if (!this.title) {
+                        this.title = 'Oblique Stereographic Alternative';
+                    }
+                };
+                exports.forward = function (p) {
+                    var sinc, cosc, cosl, k;
+                    p.x = adjust_lon(p.x - this.long0);
+                    gauss.forward.apply(this, [p]);
+                    sinc = Math.sin(p.y);
+                    cosc = Math.cos(p.y);
+                    cosl = Math.cos(p.x);
+                    k = this.k0 * this.R2 / (1 + this.sinc0 * sinc + this.cosc0 * cosc * cosl);
+                    p.x = k * cosc * Math.sin(p.x);
+                    p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl);
+                    p.x = this.a * p.x + this.x0;
+                    p.y = this.a * p.y + this.y0;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    var sinc, cosc, lon, lat, rho;
+                    p.x = (p.x - this.x0) / this.a;
+                    p.y = (p.y - this.y0) / this.a;
+                    p.x /= this.k0;
+                    p.y /= this.k0;
+                    if (rho = Math.sqrt(p.x * p.x + p.y * p.y)) {
+                        var c = 2 * Math.atan2(rho, this.R2);
+                        sinc = Math.sin(c);
+                        cosc = Math.cos(c);
+                        lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho);
+                        lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc);
+                    } else {
+                        lat = this.phic0;
+                        lon = 0;
+                    }
+                    p.x = lon;
+                    p.y = lat;
+                    gauss.inverse.apply(this, [p]);
+                    p.x = adjust_lon(p.x + this.long0);
+                    return p;
+                };
+                exports.names = [
+                    'Stereographic_North_Pole',
+                    'Oblique_Stereographic',
+                    'Polar_Stereographic',
+                    'sterea',
+                    'Oblique Stereographic Alternative'
+                ];
+                return exports;
+            },
+            {
+                '../common/adjust_lon': 5,
+                './gauss': 45
+            }
+        ],
+        61: [
+            function (_dereq_, module, exports) {
+                var e0fn = _dereq_('../common/e0fn');
+                var e1fn = _dereq_('../common/e1fn');
+                var e2fn = _dereq_('../common/e2fn');
+                var e3fn = _dereq_('../common/e3fn');
+                var mlfn = _dereq_('../common/mlfn');
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                var HALF_PI = Math.PI / 2;
+                var EPSLN = 1e-10;
+                var sign = _dereq_('../common/sign');
+                var asinz = _dereq_('../common/asinz');
+                exports.init = function () {
+                    this.e0 = e0fn(this.es);
+                    this.e1 = e1fn(this.es);
+                    this.e2 = e2fn(this.es);
+                    this.e3 = e3fn(this.es);
+                    this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);
+                };
+                exports.forward = function (p) {
+                    var lon = p.x;
+                    var lat = p.y;
+                    var delta_lon = adjust_lon(lon - this.long0);
+                    var con;
+                    var x, y;
+                    var sin_phi = Math.sin(lat);
+                    var cos_phi = Math.cos(lat);
+                    if (this.sphere) {
+                        var b = cos_phi * Math.sin(delta_lon);
+                        if (Math.abs(Math.abs(b) - 1) < 1e-10) {
+                            return 93;
+                        } else {
+                            x = 0.5 * this.a * this.k0 * Math.log((1 + b) / (1 - b));
+                            con = Math.acos(cos_phi * Math.cos(delta_lon) / Math.sqrt(1 - b * b));
+                            if (lat < 0) {
+                                con = -con;
+                            }
+                            y = this.a * this.k0 * (con - this.lat0);
+                        }
+                    } else {
+                        var al = cos_phi * delta_lon;
+                        var als = Math.pow(al, 2);
+                        var c = this.ep2 * Math.pow(cos_phi, 2);
+                        var tq = Math.tan(lat);
+                        var t = Math.pow(tq, 2);
+                        con = 1 - this.es * Math.pow(sin_phi, 2);
+                        var n = this.a / Math.sqrt(con);
+                        var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat);
+                        x = this.k0 * n * al * (1 + als / 6 * (1 - t + c + als / 20 * (5 - 18 * t + Math.pow(t, 2) + 72 * c - 58 * this.ep2))) + this.x0;
+                        y = this.k0 * (ml - this.ml0 + n * tq * (als * (0.5 + als / 24 * (5 - t + 9 * c + 4 * Math.pow(c, 2) + als / 30 * (61 - 58 * t + Math.pow(t, 2) + 600 * c - 330 * this.ep2))))) + this.y0;
+                    }
+                    p.x = x;
+                    p.y = y;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    var con, phi;
+                    var delta_phi;
+                    var i;
+                    var max_iter = 6;
+                    var lat, lon;
+                    if (this.sphere) {
+                        var f = Math.exp(p.x / (this.a * this.k0));
+                        var g = 0.5 * (f - 1 / f);
+                        var temp = this.lat0 + p.y / (this.a * this.k0);
+                        var h = Math.cos(temp);
+                        con = Math.sqrt((1 - h * h) / (1 + g * g));
+                        lat = asinz(con);
+                        if (temp < 0) {
+                            lat = -lat;
+                        }
+                        if (g === 0 && h === 0) {
+                            lon = this.long0;
+                        } else {
+                            lon = adjust_lon(Math.atan2(g, h) + this.long0);
+                        }
+                    } else {
+                        var x = p.x - this.x0;
+                        var y = p.y - this.y0;
+                        con = (this.ml0 + y / this.k0) / this.a;
+                        phi = con;
+                        for (i = 0; true; i++) {
+                            delta_phi = (con + this.e1 * Math.sin(2 * phi) - this.e2 * Math.sin(4 * phi) + this.e3 * Math.sin(6 * phi)) / this.e0 - phi;
+                            phi += delta_phi;
+                            if (Math.abs(delta_phi) <= EPSLN) {
+                                break;
+                            }
+                            if (i >= max_iter) {
+                                return 95;
+                            }
+                        }
+                        if (Math.abs(phi) < HALF_PI) {
+                            var sin_phi = Math.sin(phi);
+                            var cos_phi = Math.cos(phi);
+                            var tan_phi = Math.tan(phi);
+                            var c = this.ep2 * Math.pow(cos_phi, 2);
+                            var cs = Math.pow(c, 2);
+                            var t = Math.pow(tan_phi, 2);
+                            var ts = Math.pow(t, 2);
+                            con = 1 - this.es * Math.pow(sin_phi, 2);
+                            var n = this.a / Math.sqrt(con);
+                            var r = n * (1 - this.es) / con;
+                            var d = x / (n * this.k0);
+                            var ds = Math.pow(d, 2);
+                            lat = phi - n * tan_phi * ds / r * (0.5 - ds / 24 * (5 + 3 * t + 10 * c - 4 * cs - 9 * this.ep2 - ds / 30 * (61 + 90 * t + 298 * c + 45 * ts - 252 * this.ep2 - 3 * cs)));
+                            lon = adjust_lon(this.long0 + d * (1 - ds / 6 * (1 + 2 * t + c - ds / 20 * (5 - 2 * c + 28 * t - 3 * cs + 8 * this.ep2 + 24 * ts))) / cos_phi);
+                        } else {
+                            lat = HALF_PI * sign(y);
+                            lon = this.long0;
+                        }
+                    }
+                    p.x = lon;
+                    p.y = lat;
+                    return p;
+                };
+                exports.names = [
+                    'Transverse_Mercator',
+                    'Transverse Mercator',
+                    'tmerc'
+                ];
+                return exports;
+            },
+            {
+                '../common/adjust_lon': 5,
+                '../common/asinz': 6,
+                '../common/e0fn': 7,
+                '../common/e1fn': 8,
+                '../common/e2fn': 9,
+                '../common/e3fn': 10,
+                '../common/mlfn': 14,
+                '../common/sign': 21
+            }
+        ],
+        62: [
+            function (_dereq_, module, exports) {
+                var D2R = 0.017453292519943295;
+                var tmerc = _dereq_('./tmerc');
+                exports.dependsOn = 'tmerc';
+                exports.init = function () {
+                    if (!this.zone) {
+                        return;
+                    }
+                    this.lat0 = 0;
+                    this.long0 = (6 * Math.abs(this.zone) - 183) * D2R;
+                    this.x0 = 500000;
+                    this.y0 = this.utmSouth ? 10000000 : 0;
+                    this.k0 = 0.9996;
+                    tmerc.init.apply(this);
+                    this.forward = tmerc.forward;
+                    this.inverse = tmerc.inverse;
+                };
+                exports.names = [
+                    'Universal Transverse Mercator System',
+                    'utm'
+                ];
+                return exports;
+            },
+            { './tmerc': 61 }
+        ],
+        63: [
+            function (_dereq_, module, exports) {
+                var adjust_lon = _dereq_('../common/adjust_lon');
+                var HALF_PI = Math.PI / 2;
+                var EPSLN = 1e-10;
+                var asinz = _dereq_('../common/asinz');
+                exports.init = function () {
+                    this.R = this.a;
+                };
+                exports.forward = function (p) {
+                    var lon = p.x;
+                    var lat = p.y;
+                    var dlon = adjust_lon(lon - this.long0);
+                    var x, y;
+                    if (Math.abs(lat) <= EPSLN) {
+                        x = this.x0 + this.R * dlon;
+                        y = this.y0;
+                    }
+                    var theta = asinz(2 * Math.abs(lat / Math.PI));
+                    if (Math.abs(dlon) <= EPSLN || Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {
+                        x = this.x0;
+                        if (lat >= 0) {
+                            y = this.y0 + Math.PI * this.R * Math.tan(0.5 * theta);
+                        } else {
+                            y = this.y0 + Math.PI * this.R * -Math.tan(0.5 * theta);
+                        }
+                    }
+                    var al = 0.5 * Math.abs(Math.PI / dlon - dlon / Math.PI);
+                    var asq = al * al;
+                    var sinth = Math.sin(theta);
+                    var costh = Math.cos(theta);
+                    var g = costh / (sinth + costh - 1);
+                    var gsq = g * g;
+                    var m = g * (2 / sinth - 1);
+                    var msq = m * m;
+                    var con = Math.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq);
+                    if (dlon < 0) {
+                        con = -con;
+                    }
+                    x = this.x0 + con;
+                    var q = asq + g;
+                    con = Math.PI * this.R * (m * q - al * Math.sqrt((msq + asq) * (asq + 1) - q * q)) / (msq + asq);
+                    if (lat >= 0) {
+                        y = this.y0 + con;
+                    } else {
+                        y = this.y0 - con;
+                    }
+                    p.x = x;
+                    p.y = y;
+                    return p;
+                };
+                exports.inverse = function (p) {
+                    var lon, lat;
+                    var xx, yy, xys, c1, c2, c3;
+                    var a1;
+                    var m1;
+                    var con;
+                    var th1;
+                    var d;
+                    p.x -= this.x0;
+                    p.y -= this.y0;
+                    con = Math.PI * this.R;
+                    xx = p.x / con;
+                    yy = p.y / con;
+                    xys = xx * xx + yy * yy;
+                    c1 = -Math.abs(yy) * (1 + xys);
+                    c2 = c1 - 2 * yy * yy + xx * xx;
+                    c3 = -2 * c1 + 1 + 2 * yy * yy + xys * xys;
+                    d = yy * yy / c3 + (2 * c2 * c2 * c2 / c3 / c3 / c3 - 9 * c1 * c2 / c3 / c3) / 27;
+                    a1 = (c1 - c2 * c2 / 3 / c3) / c3;
+                    m1 = 2 * Math.sqrt(-a1 / 3);
+                    con = 3 * d / a1 / m1;
+                    if (Math.abs(con) > 1) {
+                        if (con >= 0) {
+                            con = 1;
+                        } else {
+                            con = -1;
+                        }
+                    }
+                    th1 = Math.acos(con) / 3;
+                    if (p.y >= 0) {
+                        lat = (-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;
+                    } else {
+                        lat = -(-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;
+                    }
+                    if (Math.abs(xx) < EPSLN) {
+                        lon = this.long0;
+                    } else {
+                        lon = adjust_lon(this.long0 + Math.PI * (xys - 1 + Math.sqrt(1 + 2 * (xx * xx - yy * yy) + xys * xys)) / 2 / xx);
+                    }
+                    p.x = lon;
+                    p.y = lat;
+                    return p;
+                };
+                exports.names = [
+                    'Van_der_Grinten_I',
+                    'VanDerGrinten',
+                    'vandg'
+                ];
+                return exports;
+            },
+            {
+                '../common/adjust_lon': 5,
+                '../common/asinz': 6
+            }
+        ],
+        64: [
+            function (_dereq_, module, exports) {
+                var D2R = 0.017453292519943295;
+                var R2D = 57.29577951308232;
+                var PJD_3PARAM = 1;
+                var PJD_7PARAM = 2;
+                var datum_transform = _dereq_('./datum_transform');
+                var adjust_axis = _dereq_('./adjust_axis');
+                var proj = _dereq_('./Proj');
+                var toPoint = _dereq_('./common/toPoint');
+                module.exports = function transform(source, dest, point) {
+                    var wgs84;
+                    if (Array.isArray(point)) {
+                        point = toPoint(point);
+                    }
+                    function checkNotWGS(source, dest) {
+                        return (source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM) && dest.datumCode !== 'WGS84';
+                    }
+                    if (source.datum && dest.datum && (checkNotWGS(source, dest) || checkNotWGS(dest, source))) {
+                        wgs84 = new proj('WGS84');
+                        transform(source, wgs84, point);
+                        source = wgs84;
+                    }
+                    if (source.axis !== 'enu') {
+                        adjust_axis(source, false, point);
+                    }
+                    if (source.projName === 'longlat') {
+                        point.x *= D2R;
+                        point.y *= D2R;
+                    } else {
+                        if (source.to_meter) {
+                            point.x *= source.to_meter;
+                            point.y *= source.to_meter;
+                        }
+                        source.inverse(point);
+                    }
+                    if (source.from_greenwich) {
+                        point.x += source.from_greenwich;
+                    }
+                    point = datum_transform(source.datum, dest.datum, point);
+                    if (dest.from_greenwich) {
+                        point.x -= dest.from_greenwich;
+                    }
+                    if (dest.projName === 'longlat') {
+                        point.x *= R2D;
+                        point.y *= R2D;
+                    } else {
+                        dest.forward(point);
+                        if (dest.to_meter) {
+                            point.x /= dest.to_meter;
+                            point.y /= dest.to_meter;
+                        }
+                    }
+                    if (dest.axis !== 'enu') {
+                        adjust_axis(dest, true, point);
+                    }
+                    return point;
+                };
+                return exports;
+            },
+            {
+                './Proj': 2,
+                './adjust_axis': 3,
+                './common/toPoint': 23,
+                './datum_transform': 30
+            }
+        ],
+        65: [
+            function (_dereq_, module, exports) {
+                var D2R = 0.017453292519943295;
+                var extend = _dereq_('./extend');
+                function mapit(obj, key, v) {
+                    obj[key] = v.map(function (aa) {
+                        var o = {};
+                        sExpr(aa, o);
+                        return o;
+                    }).reduce(function (a, b) {
+                        return extend(a, b);
+                    }, {});
+                }
+                function sExpr(v, obj) {
+                    var key;
+                    if (!Array.isArray(v)) {
+                        obj[v] = true;
+                        return;
+                    } else {
+                        key = v.shift();
+                        if (key === 'PARAMETER') {
+                            key = v.shift();
+                        }
+                        if (v.length === 1) {
+                            if (Array.isArray(v[0])) {
+                                obj[key] = {};
+                                sExpr(v[0], obj[key]);
+                            } else {
+                                obj[key] = v[0];
+                            }
+                        } else if (!v.length) {
+                            obj[key] = true;
+                        } else if (key === 'TOWGS84') {
+                            obj[key] = v;
+                        } else {
+                            obj[key] = {};
+                            if ([
+                                    'UNIT',
+                                    'PRIMEM',
+                                    'VERT_DATUM'
+                                ].indexOf(key) > -1) {
+                                obj[key] = {
+                                    name: v[0].toLowerCase(),
+                                    convert: v[1]
+                                };
+                                if (v.length === 3) {
+                                    obj[key].auth = v[2];
+                                }
+                            } else if (key === 'SPHEROID') {
+                                obj[key] = {
+                                    name: v[0],
+                                    a: v[1],
+                                    rf: v[2]
+                                };
+                                if (v.length === 4) {
+                                    obj[key].auth = v[3];
+                                }
+                            } else if ([
+                                    'GEOGCS',
+                                    'GEOCCS',
+                                    'DATUM',
+                                    'VERT_CS',
+                                    'COMPD_CS',
+                                    'LOCAL_CS',
+                                    'FITTED_CS',
+                                    'LOCAL_DATUM'
+                                ].indexOf(key) > -1) {
+                                v[0] = [
+                                    'name',
+                                    v[0]
+                                ];
+                                mapit(obj, key, v);
+                            } else if (v.every(function (aa) {
+                                    return Array.isArray(aa);
+                                })) {
+                                mapit(obj, key, v);
+                            } else {
+                                sExpr(v, obj[key]);
+                            }
+                        }
+                    }
+                }
+                function rename(obj, params) {
+                    var outName = params[0];
+                    var inName = params[1];
+                    if (!(outName in obj) && inName in obj) {
+                        obj[outName] = obj[inName];
+                        if (params.length === 3) {
+                            obj[outName] = params[2](obj[outName]);
+                        }
+                    }
+                }
+                function d2r(input) {
+                    return input * D2R;
+                }
+                function cleanWKT(wkt) {
+                    if (wkt.type === 'GEOGCS') {
+                        wkt.projName = 'longlat';
+                    } else if (wkt.type === 'LOCAL_CS') {
+                        wkt.projName = 'identity';
+                        wkt.local = true;
+                    } else {
+                        if (typeof wkt.PROJECTION === 'object') {
+                            wkt.projName = Object.keys(wkt.PROJECTION)[0];
+                        } else {
+                            wkt.projName = wkt.PROJECTION;
+                        }
+                    }
+                    if (wkt.UNIT) {
+                        wkt.units = wkt.UNIT.name.toLowerCase();
+                        if (wkt.units === 'metre') {
+                            wkt.units = 'meter';
+                        }
+                        if (wkt.UNIT.convert) {
+                            wkt.to_meter = parseFloat(wkt.UNIT.convert, 10);
+                        }
+                    }
+                    if (wkt.GEOGCS) {
+                        if (wkt.GEOGCS.DATUM) {
+                            wkt.datumCode = wkt.GEOGCS.DATUM.name.toLowerCase();
+                        } else {
+                            wkt.datumCode = wkt.GEOGCS.name.toLowerCase();
+                        }
+                        if (wkt.datumCode.slice(0, 2) === 'd_') {
+                            wkt.datumCode = wkt.datumCode.slice(2);
+                        }
+                        if (wkt.datumCode === 'new_zealand_geodetic_datum_1949' || wkt.datumCode === 'new_zealand_1949') {
+                            wkt.datumCode = 'nzgd49';
+                        }
+                        if (wkt.datumCode === 'wgs_1984') {
+                            if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') {
+                                wkt.sphere = true;
+                            }
+                            wkt.datumCode = 'wgs84';
+                        }
+                        if (wkt.datumCode.slice(-6) === '_ferro') {
+                            wkt.datumCode = wkt.datumCode.slice(0, -6);
+                        }
+                        if (wkt.datumCode.slice(-8) === '_jakarta') {
+                            wkt.datumCode = wkt.datumCode.slice(0, -8);
+                        }
+                        if (~wkt.datumCode.indexOf('belge')) {
+                            wkt.datumCode = 'rnb72';
+                        }
+                        if (wkt.GEOGCS.DATUM && wkt.GEOGCS.DATUM.SPHEROID) {
+                            wkt.ellps = wkt.GEOGCS.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\_18/, 'clrk');
+                            if (wkt.ellps.toLowerCase().slice(0, 13) === 'international') {
+                                wkt.ellps = 'intl';
+                            }
+                            wkt.a = wkt.GEOGCS.DATUM.SPHEROID.a;
+                            wkt.rf = parseFloat(wkt.GEOGCS.DATUM.SPHEROID.rf, 10);
+                        }
+                        if (~wkt.datumCode.indexOf('osgb_1936')) {
+                            wkt.datumCode = 'osgb36';
+                        }
+                    }
+                    if (wkt.b && !isFinite(wkt.b)) {
+                        wkt.b = wkt.a;
+                    }
+                    function toMeter(input) {
+                        var ratio = wkt.to_meter || 1;
+                        return parseFloat(input, 10) * ratio;
+                    }
+                    var renamer = function (a) {
+                        return rename(wkt, a);
+                    };
+                    var list = [
+                        [
+                            'standard_parallel_1',
+                            'Standard_Parallel_1'
+                        ],
+                        [
+                            'standard_parallel_2',
+                            'Standard_Parallel_2'
+                        ],
+                        [
+                            'false_easting',
+                            'False_Easting'
+                        ],
+                        [
+                            'false_northing',
+                            'False_Northing'
+                        ],
+                        [
+                            'central_meridian',
+                            'Central_Meridian'
+                        ],
+                        [
+                            'latitude_of_origin',
+                            'Latitude_Of_Origin'
+                        ],
+                        [
+                            'scale_factor',
+                            'Scale_Factor'
+                        ],
+                        [
+                            'k0',
+                            'scale_factor'
+                        ],
+                        [
+                            'latitude_of_center',
+                            'Latitude_of_center'
+                        ],
+                        [
+                            'lat0',
+                            'latitude_of_center',
+                            d2r
+                        ],
+                        [
+                            'longitude_of_center',
+                            'Longitude_Of_Center'
+                        ],
+                        [
+                            'longc',
+                            'longitude_of_center',
+                            d2r
+                        ],
+                        [
+                            'x0',
+                            'false_easting',
+                            toMeter
+                        ],
+                        [
+                            'y0',
+                            'false_northing',
+                            toMeter
+                        ],
+                        [
+                            'long0',
+                            'central_meridian',
+                            d2r
+                        ],
+                        [
+                            'lat0',
+                            'latitude_of_origin',
+                            d2r
+                        ],
+                        [
+                            'lat0',
+                            'standard_parallel_1',
+                            d2r
+                        ],
+                        [
+                            'lat1',
+                            'standard_parallel_1',
+                            d2r
+                        ],
+                        [
+                            'lat2',
+                            'standard_parallel_2',
+                            d2r
+                        ],
+                        [
+                            'alpha',
+                            'azimuth',
+                            d2r
+                        ],
+                        [
+                            'srsCode',
+                            'name'
+                        ]
+                    ];
+                    list.forEach(renamer);
+                    if (!wkt.long0 && wkt.longc && (wkt.PROJECTION === 'Albers_Conic_Equal_Area' || wkt.PROJECTION === 'Lambert_Azimuthal_Equal_Area')) {
+                        wkt.long0 = wkt.longc;
+                    }
+                }
+                module.exports = function (wkt, self) {
+                    var lisp = JSON.parse((',' + wkt).replace(/\s*\,\s*([A-Z_0-9]+?)(\[)/g, ',["$1",').slice(1).replace(/\s*\,\s*([A-Z_0-9]+?)\]/g, ',"$1"]'));
+                    var type = lisp.shift();
+                    var name = lisp.shift();
+                    lisp.unshift([
+                        'name',
+                        name
+                    ]);
+                    lisp.unshift([
+                        'type',
+                        type
+                    ]);
+                    lisp.unshift('output');
+                    var obj = {};
+                    sExpr(lisp, obj);
+                    cleanWKT(obj.output);
+                    return extend(self, obj.output);
+                };
+                return exports;
+            },
+            { './extend': 33 }
+        ],
+        66: [
+            function (_dereq_, module, exports) {
+                var NUM_100K_SETS = 6;
+                var SET_ORIGIN_COLUMN_LETTERS = 'AJSAJS';
+                var SET_ORIGIN_ROW_LETTERS = 'AFAFAF';
+                var A = 65;
+                var I = 73;
+                var O = 79;
+                var V = 86;
+                var Z = 90;
+                exports.forward = function (ll, accuracy) {
+                    accuracy = accuracy || 5;
+                    return encode(LLtoUTM({
+                        lat: ll[1],
+                        lon: ll[0]
+                    }), accuracy);
+                };
+                exports.inverse = function (mgrs) {
+                    var bbox = UTMtoLL(decode(mgrs.toUpperCase()));
+                    return [
+                        bbox.left,
+                        bbox.bottom,
+                        bbox.right,
+                        bbox.top
+                    ];
+                };
+                exports.toPoint = function (mgrsStr) {
+                    var llbbox = exports.inverse(mgrsStr);
+                    return [
+                        (llbbox[2] + llbbox[0]) / 2,
+                        (llbbox[3] + llbbox[1]) / 2
+                    ];
+                };
+                function degToRad(deg) {
+                    return deg * (Math.PI / 180);
+                }
+                function radToDeg(rad) {
+                    return 180 * (rad / Math.PI);
+                }
+                function LLtoUTM(ll) {
+                    var Lat = ll.lat;
+                    var Long = ll.lon;
+                    var a = 6378137;
+                    var eccSquared = 0.00669438;
+                    var k0 = 0.9996;
+                    var LongOrigin;
+                    var eccPrimeSquared;
+                    var N, T, C, A, M;
+                    var LatRad = degToRad(Lat);
+                    var LongRad = degToRad(Long);
+                    var LongOriginRad;
+                    var ZoneNumber;
+                    ZoneNumber = Math.floor((Long + 180) / 6) + 1;
+                    if (Long === 180) {
+                        ZoneNumber = 60;
+                    }
+                    if (Lat >= 56 && Lat < 64 && Long >= 3 && Long < 12) {
+                        ZoneNumber = 32;
+                    }
+                    if (Lat >= 72 && Lat < 84) {
+                        if (Long >= 0 && Long < 9) {
+                            ZoneNumber = 31;
+                        } else if (Long >= 9 && Long < 21) {
+                            ZoneNumber = 33;
+                        } else if (Long >= 21 && Long < 33) {
+                            ZoneNumber = 35;
+                        } else if (Long >= 33 && Long < 42) {
+                            ZoneNumber = 37;
+                        }
+                    }
+                    LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3;
+                    LongOriginRad = degToRad(LongOrigin);
+                    eccPrimeSquared = eccSquared / (1 - eccSquared);
+                    N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad));
+                    T = Math.tan(LatRad) * Math.tan(LatRad);
+                    C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad);
+                    A = Math.cos(LatRad) * (LongRad - LongOriginRad);
+                    M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(2 * LatRad) + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(4 * LatRad) - 35 * eccSquared * eccSquared * eccSquared / 3072 * Math.sin(6 * LatRad));
+                    var UTMEasting = k0 * N * (A + (1 - T + C) * A * A * A / 6 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120) + 500000;
+                    var UTMNorthing = k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720));
+                    if (Lat < 0) {
+                        UTMNorthing += 10000000;
+                    }
+                    return {
+                        northing: Math.round(UTMNorthing),
+                        easting: Math.round(UTMEasting),
+                        zoneNumber: ZoneNumber,
+                        zoneLetter: getLetterDesignator(Lat)
+                    };
+                }
+                function UTMtoLL(utm) {
+                    var UTMNorthing = utm.northing;
+                    var UTMEasting = utm.easting;
+                    var zoneLetter = utm.zoneLetter;
+                    var zoneNumber = utm.zoneNumber;
+                    if (zoneNumber < 0 || zoneNumber > 60) {
+                        return null;
+                    }
+                    var k0 = 0.9996;
+                    var a = 6378137;
+                    var eccSquared = 0.00669438;
+                    var eccPrimeSquared;
+                    var e1 = (1 - Math.sqrt(1 - eccSquared)) / (1 + Math.sqrt(1 - eccSquared));
+                    var N1, T1, C1, R1, D, M;
+                    var LongOrigin;
+                    var mu, phi1Rad;
+                    var x = UTMEasting - 500000;
+                    var y = UTMNorthing;
+                    if (zoneLetter < 'N') {
+                        y -= 10000000;
+                    }
+                    LongOrigin = (zoneNumber - 1) * 6 - 180 + 3;
+                    eccPrimeSquared = eccSquared / (1 - eccSquared);
+                    M = y / k0;
+                    mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256));
+                    phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + 151 * e1 * e1 * e1 / 96 * Math.sin(6 * mu);
+                    N1 = a / Math.sqrt(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad));
+                    T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad);
+                    C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad);
+                    R1 = a * (1 - eccSquared) / Math.pow(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5);
+                    D = x / (N1 * k0);
+                    var lat = phi1Rad - N1 * Math.tan(phi1Rad) / R1 * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720);
+                    lat = radToDeg(lat);
+                    var lon = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) / Math.cos(phi1Rad);
+                    lon = LongOrigin + radToDeg(lon);
+                    var result;
+                    if (utm.accuracy) {
+                        var topRight = UTMtoLL({
+                            northing: utm.northing + utm.accuracy,
+                            easting: utm.easting + utm.accuracy,
+                            zoneLetter: utm.zoneLetter,
+                            zoneNumber: utm.zoneNumber
+                        });
+                        result = {
+                            top: topRight.lat,
+                            right: topRight.lon,
+                            bottom: lat,
+                            left: lon
+                        };
+                    } else {
+                        result = {
+                            lat: lat,
+                            lon: lon
+                        };
+                    }
+                    return result;
+                }
+                function getLetterDesignator(lat) {
+                    var LetterDesignator = 'Z';
+                    if (84 >= lat && lat >= 72) {
+                        LetterDesignator = 'X';
+                    } else if (72 > lat && lat >= 64) {
+                        LetterDesignator = 'W';
+                    } else if (64 > lat && lat >= 56) {
+                        LetterDesignator = 'V';
+                    } else if (56 > lat && lat >= 48) {
+                        LetterDesignator = 'U';
+                    } else if (48 > lat && lat >= 40) {
+                        LetterDesignator = 'T';
+                    } else if (40 > lat && lat >= 32) {
+                        LetterDesignator = 'S';
+                    } else if (32 > lat && lat >= 24) {
+                        LetterDesignator = 'R';
+                    } else if (24 > lat && lat >= 16) {
+                        LetterDesignator = 'Q';
+                    } else if (16 > lat && lat >= 8) {
+                        LetterDesignator = 'P';
+                    } else if (8 > lat && lat >= 0) {
+                        LetterDesignator = 'N';
+                    } else if (0 > lat && lat >= -8) {
+                        LetterDesignator = 'M';
+                    } else if (-8 > lat && lat >= -16) {
+                        LetterDesignator = 'L';
+                    } else if (-16 > lat && lat >= -24) {
+                        LetterDesignator = 'K';
+                    } else if (-24 > lat && lat >= -32) {
+                        LetterDesignator = 'J';
+                    } else if (-32 > lat && lat >= -40) {
+                        LetterDesignator = 'H';
+                    } else if (-40 > lat && lat >= -48) {
+                        LetterDesignator = 'G';
+                    } else if (-48 > lat && lat >= -56) {
+                        LetterDesignator = 'F';
+                    } else if (-56 > lat && lat >= -64) {
+                        LetterDesignator = 'E';
+                    } else if (-64 > lat && lat >= -72) {
+                        LetterDesignator = 'D';
+                    } else if (-72 > lat && lat >= -80) {
+                        LetterDesignator = 'C';
+                    }
+                    return LetterDesignator;
+                }
+                function encode(utm, accuracy) {
+                    var seasting = '' + utm.easting, snorthing = '' + utm.northing;
+                    return utm.zoneNumber + utm.zoneLetter + get100kID(utm.easting, utm.northing, utm.zoneNumber) + seasting.substr(seasting.length - 5, accuracy) + snorthing.substr(snorthing.length - 5, accuracy);
+                }
+                function get100kID(easting, northing, zoneNumber) {
+                    var setParm = get100kSetForZone(zoneNumber);
+                    var setColumn = Math.floor(easting / 100000);
+                    var setRow = Math.floor(northing / 100000) % 20;
+                    return getLetter100kID(setColumn, setRow, setParm);
+                }
+                function get100kSetForZone(i) {
+                    var setParm = i % NUM_100K_SETS;
+                    if (setParm === 0) {
+                        setParm = NUM_100K_SETS;
+                    }
+                    return setParm;
+                }
+                function getLetter100kID(column, row, parm) {
+                    var index = parm - 1;
+                    var colOrigin = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(index);
+                    var rowOrigin = SET_ORIGIN_ROW_LETTERS.charCodeAt(index);
+                    var colInt = colOrigin + column - 1;
+                    var rowInt = rowOrigin + row;
+                    var rollover = false;
+                    if (colInt > Z) {
+                        colInt = colInt - Z + A - 1;
+                        rollover = true;
+                    }
+                    if (colInt === I || colOrigin < I && colInt > I || (colInt > I || colOrigin < I) && rollover) {
+                        colInt++;
+                    }
+                    if (colInt === O || colOrigin < O && colInt > O || (colInt > O || colOrigin < O) && rollover) {
+                        colInt++;
+                        if (colInt === I) {
+                            colInt++;
+                        }
+                    }
+                    if (colInt > Z) {
+                        colInt = colInt - Z + A - 1;
+                    }
+                    if (rowInt > V) {
+                        rowInt = rowInt - V + A - 1;
+                        rollover = true;
+                    } else {
+                        rollover = false;
+                    }
+                    if (rowInt === I || rowOrigin < I && rowInt > I || (rowInt > I || rowOrigin < I) && rollover) {
+                        rowInt++;
+                    }
+                    if (rowInt === O || rowOrigin < O && rowInt > O || (rowInt > O || rowOrigin < O) && rollover) {
+                        rowInt++;
+                        if (rowInt === I) {
+                            rowInt++;
+                        }
+                    }
+                    if (rowInt > V) {
+                        rowInt = rowInt - V + A - 1;
+                    }
+                    var twoLetter = String.fromCharCode(colInt) + String.fromCharCode(rowInt);
+                    return twoLetter;
+                }
+                function decode(mgrsString) {
+                    if (mgrsString && mgrsString.length === 0) {
+                        throw 'MGRSPoint coverting from nothing';
+                    }
+                    var length = mgrsString.length;
+                    var hunK = null;
+                    var sb = '';
+                    var testChar;
+                    var i = 0;
+                    while (!/[A-Z]/.test(testChar = mgrsString.charAt(i))) {
+                        if (i >= 2) {
+                            throw 'MGRSPoint bad conversion from: ' + mgrsString;
+                        }
+                        sb += testChar;
+                        i++;
+                    }
+                    var zoneNumber = parseInt(sb, 10);
+                    if (i === 0 || i + 3 > length) {
+                        throw 'MGRSPoint bad conversion from: ' + mgrsString;
+                    }
+                    var zoneLetter = mgrsString.charAt(i++);
+                    if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') {
+                        throw 'MGRSPoint zone letter ' + zoneLetter + ' not handled: ' + mgrsString;
+                    }
+                    hunK = mgrsString.substring(i, i += 2);
+                    var set = get100kSetForZone(zoneNumber);
+                    var east100k = getEastingFromChar(hunK.charAt(0), set);
+                    var north100k = getNorthingFromChar(hunK.charAt(1), set);
+                    while (north100k < getMinNorthing(zoneLetter)) {
+                        north100k += 2000000;
+                    }
+                    var remainder = length - i;
+                    if (remainder % 2 !== 0) {
+                        throw 'MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters' + mgrsString;
+                    }
+                    var sep = remainder / 2;
+                    var sepEasting = 0;
+                    var sepNorthing = 0;
+                    var accuracyBonus, sepEastingString, sepNorthingString, easting, northing;
+                    if (sep > 0) {
+                        accuracyBonus = 100000 / Math.pow(10, sep);
+                        sepEastingString = mgrsString.substring(i, i + sep);
+                        sepEasting = parseFloat(sepEastingString) * accuracyBonus;
+                        sepNorthingString = mgrsString.substring(i + sep);
+                        sepNorthing = parseFloat(sepNorthingString) * accuracyBonus;
+                    }
+                    easting = sepEasting + east100k;
+                    northing = sepNorthing + north100k;
+                    return {
+                        easting: easting,
+                        northing: northing,
+                        zoneLetter: zoneLetter,
+                        zoneNumber: zoneNumber,
+                        accuracy: accuracyBonus
+                    };
+                }
+                function getEastingFromChar(e, set) {
+                    var curCol = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(set - 1);
+                    var eastingValue = 100000;
+                    var rewindMarker = false;
+                    while (curCol !== e.charCodeAt(0)) {
+                        curCol++;
+                        if (curCol === I) {
+                            curCol++;
+                        }
+                        if (curCol === O) {
+                            curCol++;
+                        }
+                        if (curCol > Z) {
+                            if (rewindMarker) {
+                                throw 'Bad character: ' + e;
+                            }
+                            curCol = A;
+                            rewindMarker = true;
+                        }
+                        eastingValue += 100000;
+                    }
+                    return eastingValue;
+                }
+                function getNorthingFromChar(n, set) {
+                    if (n > 'V') {
+                        throw 'MGRSPoint given invalid Northing ' + n;
+                    }
+                    var curRow = SET_ORIGIN_ROW_LETTERS.charCodeAt(set - 1);
+                    var northingValue = 0;
+                    var rewindMarker = false;
+                    while (curRow !== n.charCodeAt(0)) {
+                        curRow++;
+                        if (curRow === I) {
+                            curRow++;
+                        }
+                        if (curRow === O) {
+                            curRow++;
+                        }
+                        if (curRow > V) {
+                            if (rewindMarker) {
+                                throw 'Bad character: ' + n;
+                            }
+                            curRow = A;
+                            rewindMarker = true;
+                        }
+                        northingValue += 100000;
+                    }
+                    return northingValue;
+                }
+                function getMinNorthing(zoneLetter) {
+                    var northing;
+                    switch (zoneLetter) {
+                    case 'C':
+                        northing = 1100000;
+                        break;
+                    case 'D':
+                        northing = 2000000;
+                        break;
+                    case 'E':
+                        northing = 2800000;
+                        break;
+                    case 'F':
+                        northing = 3700000;
+                        break;
+                    case 'G':
+                        northing = 4600000;
+                        break;
+                    case 'H':
+                        northing = 5500000;
+                        break;
+                    case 'J':
+                        northing = 6400000;
+                        break;
+                    case 'K':
+                        northing = 7300000;
+                        break;
+                    case 'L':
+                        northing = 8200000;
+                        break;
+                    case 'M':
+                        northing = 9100000;
+                        break;
+                    case 'N':
+                        northing = 0;
+                        break;
+                    case 'P':
+                        northing = 800000;
+                        break;
+                    case 'Q':
+                        northing = 1700000;
+                        break;
+                    case 'R':
+                        northing = 2600000;
+                        break;
+                    case 'S':
+                        northing = 3500000;
+                        break;
+                    case 'T':
+                        northing = 4400000;
+                        break;
+                    case 'U':
+                        northing = 5300000;
+                        break;
+                    case 'V':
+                        northing = 6200000;
+                        break;
+                    case 'W':
+                        northing = 7000000;
+                        break;
+                    case 'X':
+                        northing = 7900000;
+                        break;
+                    default:
+                        northing = -1;
+                    }
+                    if (northing >= 0) {
+                        return northing;
+                    } else {
+                        throw 'Invalid zone letter: ' + zoneLetter;
+                    }
+                }
+                return exports;
+            },
+            {}
+        ],
+        67: [
+            function (_dereq_, module, exports) {
+                module.exports = {
+                    'name': 'proj4',
+                    'version': '2.2.1',
+                    'description': 'Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.',
+                    'main': 'lib/index.js',
+                    'directories': {
+                        'test': 'test',
+                        'doc': 'docs'
+                    },
+                    'scripts': { 'test': './node_modules/istanbul/lib/cli.js test ./node_modules/mocha/bin/_mocha test/test.js' },
+                    'repository': {
+                        'type': 'git',
+                        'url': 'git://github.com/proj4js/proj4js.git'
+                    },
+                    'author': '',
+                    'license': 'MIT',
+                    'jam': {
+                        'main': 'dist/proj4.js',
+                        'include': [
+                            'dist/proj4.js',
+                            'README.md',
+                            'AUTHORS',
+                            'LICENSE.md'
+                        ]
+                    },
+                    'devDependencies': {
+                        'grunt-cli': '~0.1.13',
+                        'grunt': '~0.4.2',
+                        'grunt-contrib-connect': '~0.6.0',
+                        'grunt-contrib-jshint': '~0.8.0',
+                        'chai': '~1.8.1',
+                        'mocha': '~1.17.1',
+                        'grunt-mocha-phantomjs': '~0.4.0',
+                        'browserify': '~3.24.5',
+                        'grunt-browserify': '~1.3.0',
+                        'grunt-contrib-uglify': '~0.3.2',
+                        'curl': 'git://github.com/cujojs/curl.git',
+                        'istanbul': '~0.2.4',
+                        'tin': '~0.4.0'
+                    },
+                    'dependencies': { 'mgrs': '0.0.0' }
+                };
+                return exports;
+            },
+            {}
+        ],
+        './includedProjections': [
+            function (_dereq_, module, exports) {
+                module.exports = _dereq_('gWUPNW');
+                return exports;
+            },
+            {}
+        ],
+        'gWUPNW': [
+            function (_dereq_, module, exports) {
+                var projs = [
+                    _dereq_('./lib/projections/tmerc'),
+                    _dereq_('./lib/projections/utm'),
+                    _dereq_('./lib/projections/sterea'),
+                    _dereq_('./lib/projections/stere'),
+                    _dereq_('./lib/projections/somerc'),
+                    _dereq_('./lib/projections/omerc'),
+                    _dereq_('./lib/projections/lcc'),
+                    _dereq_('./lib/projections/krovak'),
+                    _dereq_('./lib/projections/cass'),
+                    _dereq_('./lib/projections/laea'),
+                    _dereq_('./lib/projections/aea'),
+                    _dereq_('./lib/projections/gnom'),
+                    _dereq_('./lib/projections/cea'),
+                    _dereq_('./lib/projections/eqc'),
+                    _dereq_('./lib/projections/poly'),
+                    _dereq_('./lib/projections/nzmg'),
+                    _dereq_('./lib/projections/mill'),
+                    _dereq_('./lib/projections/sinu'),
+                    _dereq_('./lib/projections/moll'),
+                    _dereq_('./lib/projections/eqdc'),
+                    _dereq_('./lib/projections/vandg'),
+                    _dereq_('./lib/projections/aeqd')
+                ];
+                module.exports = function (proj4) {
+                    projs.forEach(function (proj) {
+                        proj4.Proj.projections.add(proj);
+                    });
+                };
+                return exports;
+            },
+            {
+                './lib/projections/aea': 39,
+                './lib/projections/aeqd': 40,
+                './lib/projections/cass': 41,
+                './lib/projections/cea': 42,
+                './lib/projections/eqc': 43,
+                './lib/projections/eqdc': 44,
+                './lib/projections/gnom': 46,
+                './lib/projections/krovak': 47,
+                './lib/projections/laea': 48,
+                './lib/projections/lcc': 49,
+                './lib/projections/mill': 52,
+                './lib/projections/moll': 53,
+                './lib/projections/nzmg': 54,
+                './lib/projections/omerc': 55,
+                './lib/projections/poly': 56,
+                './lib/projections/sinu': 57,
+                './lib/projections/somerc': 58,
+                './lib/projections/stere': 59,
+                './lib/projections/sterea': 60,
+                './lib/projections/tmerc': 61,
+                './lib/projections/utm': 62,
+                './lib/projections/vandg': 63
+            }
+        ]
+    }, {}, [35])(35);
+});
+!function (root, factory) {
+    if (true) {
+        proj4leaflet07x = function (leaflet, proj4) {
+            return typeof factory === 'function' ? factory(leaflet, proj4) : factory;
+        }(leaflet, proj4);
+    } else if (typeof module === 'object' && typeof module.exports === 'object') {
+        L = leaflet;
+        proj4 = proj4;
+        module.exports = factory(L, proj4);
+    } else {
+        if (typeof root.L === 'undefined' || typeof root.proj4 === 'undefined')
+            throw 'Leaflet and proj4 must be loaded first';
+        factory(root.L, root.proj4);
+    }
+}(this, function (L, proj4) {
+    L.Proj = {};
+    L.Proj._isProj4Obj = function (a) {
+        return typeof a.inverse !== 'undefined' && typeof a.forward !== 'undefined';
+    };
+    L.Proj.ScaleDependantTransformation = function (scaleTransforms) {
+        this.scaleTransforms = scaleTransforms;
+    };
+    L.Proj.ScaleDependantTransformation.prototype.transform = function (point, scale) {
+        return this.scaleTransforms[scale].transform(point, scale);
+    };
+    L.Proj.ScaleDependantTransformation.prototype.untransform = function (point, scale) {
+        return this.scaleTransforms[scale].untransform(point, scale);
+    };
+    L.Proj.Projection = L.Class.extend({
+        initialize: function (a, def) {
+            if (L.Proj._isProj4Obj(a)) {
+                this._proj = a;
+            } else {
+                var code = a;
+                if (def) {
+                    proj4.defs(code, def);
+                } else if (proj4.defs[code] === undefined) {
+                    var urn = code.split(':');
+                    if (urn.length > 3) {
+                        code = urn[urn.length - 3] + ':' + urn[urn.length - 1];
+                    }
+                    if (proj4.defs[code] === undefined) {
+                        throw 'No projection definition for code ' + code;
+                    }
+                }
+                this._proj = proj4(code);
+            }
+        },
+        project: function (latlng) {
+            var point = this._proj.forward([
+                latlng.lng,
+                latlng.lat
+            ]);
+            return new L.Point(point[0], point[1]);
+        },
+        unproject: function (point, unbounded) {
+            var point2 = this._proj.inverse([
+                point.x,
+                point.y
+            ]);
+            return new L.LatLng(point2[1], point2[0], unbounded);
+        }
+    });
+    L.Proj.CRS = L.Class.extend({
+        includes: L.CRS,
+        options: { transformation: new L.Transformation(1, 0, -1, 0) },
+        initialize: function (a, b, c) {
+            var code, proj, def, options;
+            if (L.Proj._isProj4Obj(a)) {
+                proj = a;
+                code = proj.srsCode;
+                options = b || {};
+                this.projection = new L.Proj.Projection(proj);
+            } else {
+                code = a;
+                def = b;
+                options = c || {};
+                this.projection = new L.Proj.Projection(code, def);
+            }
+            L.Util.setOptions(this, options);
+            this.code = code;
+            this.transformation = this.options.transformation;
+            if (this.options.origin) {
+                this.transformation = new L.Transformation(1, -this.options.origin[0], -1, this.options.origin[1]);
+            }
+            if (this.options.scales) {
+                this._scales = this.options.scales;
+            } else if (this.options.resolutions) {
+                this._scales = [];
+                for (var i = this.options.resolutions.length - 1; i >= 0; i--) {
+                    if (this.options.resolutions[i]) {
+                        this._scales[i] = 1 / this.options.resolutions[i];
+                    }
+                }
+            }
+        },
+        scale: function (zoom) {
+            var iZoom = Math.floor(zoom), baseScale, nextScale, scaleDiff, zDiff;
+            if (zoom === iZoom) {
+                return this._scales[zoom];
+            } else {
+                baseScale = this._scales[iZoom];
+                nextScale = this._scales[iZoom + 1];
+                scaleDiff = nextScale - baseScale;
+                zDiff = zoom - iZoom;
+                return baseScale + scaleDiff * zDiff;
+            }
+        },
+        getSize: function (zoom) {
+            var b = this.options.bounds, s, min, max;
+            if (b) {
+                s = this.scale(zoom);
+                min = this.transformation.transform(b.min, s);
+                max = this.transformation.transform(b.max, s);
+                return L.point(Math.abs(max.x - min.x), Math.abs(max.y - min.y));
+            } else {
+                s = 256 * Math.pow(2, zoom);
+                return L.point(s, s);
+            }
+        }
+    });
+    L.Proj.CRS.TMS = L.Proj.CRS.extend({
+        options: { tileSize: 256 },
+        initialize: function (a, b, c, d) {
+            var code, def, proj, projectedBounds, options;
+            if (L.Proj._isProj4Obj(a)) {
+                proj = a;
+                projectedBounds = b;
+                options = c || {};
+                options.origin = [
+                    projectedBounds[0],
+                    projectedBounds[3]
+                ];
+                L.Proj.CRS.prototype.initialize.call(this, proj, options);
+            } else {
+                code = a;
+                def = b;
+                projectedBounds = c;
+                options = d || {};
+                options.origin = [
+                    projectedBounds[0],
+                    projectedBounds[3]
+                ];
+                L.Proj.CRS.prototype.initialize.call(this, code, def, options);
+            }
+            this.projectedBounds = projectedBounds;
+            this._sizes = this._calculateSizes();
+        },
+        _calculateSizes: function () {
+            var sizes = [], crsBounds = this.projectedBounds, projectedTileSize, i, x, y;
+            for (i = this._scales.length - 1; i >= 0; i--) {
+                if (this._scales[i]) {
+                    projectedTileSize = this.options.tileSize / this._scales[i];
+                    x = Math.ceil(parseFloat((crsBounds[2] - crsBounds[0]) / projectedTileSize).toPrecision(3)) * projectedTileSize * this._scales[i];
+                    y = Math.ceil(parseFloat((crsBounds[3] - crsBounds[1]) / projectedTileSize).toPrecision(3)) * projectedTileSize * this._scales[i];
+                    sizes[i] = L.point(x, y);
+                }
+            }
+            return sizes;
+        },
+        getSize: function (zoom) {
+            return this._sizes[zoom];
+        }
+    });
+    L.Proj.TileLayer = {};
+    L.Proj.TileLayer.TMS = L.TileLayer.extend({
+        options: { continuousWorld: true },
+        initialize: function (urlTemplate, crs, options) {
+            var boundsMatchesGrid = true, scaleTransforms, upperY, crsBounds, i;
+            if (!(crs instanceof L.Proj.CRS.TMS)) {
+                throw 'CRS is not L.Proj.CRS.TMS.';
+            }
+            L.TileLayer.prototype.initialize.call(this, urlTemplate, options);
+            this.options.tms = false;
+            this.crs = crs;
+            crsBounds = this.crs.projectedBounds;
+            for (i = this.options.minZoom; i < this.options.maxZoom && boundsMatchesGrid; i++) {
+                var gridHeight = (crsBounds[3] - crsBounds[1]) / this._projectedTileSize(i);
+                boundsMatchesGrid = Math.abs(gridHeight - Math.round(gridHeight)) > 0.001;
+            }
+            if (!boundsMatchesGrid) {
+                scaleTransforms = {};
+                for (i = this.options.minZoom; i < this.options.maxZoom; i++) {
+                    upperY = crsBounds[1] + Math.ceil((crsBounds[3] - crsBounds[1]) / this._projectedTileSize(i)) * this._projectedTileSize(i);
+                    scaleTransforms[this.crs.scale(i)] = new L.Transformation(1, -crsBounds[0], -1, upperY);
+                }
+                this.crs = new L.Proj.CRS.TMS(this.crs.projection._proj, crsBounds, this.crs.options);
+                this.crs.transformation = new L.Proj.ScaleDependantTransformation(scaleTransforms);
+            }
+        },
+        getTileUrl: function (tilePoint) {
+            var zoom = this._map.getZoom(), gridHeight = Math.ceil((this.crs.projectedBounds[3] - this.crs.projectedBounds[1]) / this._projectedTileSize(zoom));
+            return L.Util.template(this._url, L.Util.extend({
+                s: this._getSubdomain(tilePoint),
+                z: this._getZoomForUrl(),
+                x: tilePoint.x,
+                y: gridHeight - tilePoint.y - 1
+            }, this.options));
+        },
+        _projectedTileSize: function (zoom) {
+            return this.options.tileSize / this.crs.scale(zoom);
+        }
+    });
+    L.Proj.GeoJSON = L.GeoJSON.extend({
+        initialize: function (geojson, options) {
+            this._callLevel = 0;
+            L.GeoJSON.prototype.initialize.call(this, null, options);
+            if (geojson) {
+                this.addData(geojson);
+            }
+        },
+        addData: function (geojson) {
+            var crs;
+            if (geojson) {
+                if (geojson.crs && geojson.crs.type === 'name') {
+                    crs = new L.Proj.CRS(geojson.crs.properties.name);
+                } else if (geojson.crs && geojson.crs.type) {
+                    crs = new L.Proj.CRS(geojson.crs.type + ':' + geojson.crs.properties.code);
+                }
+                if (crs !== undefined) {
+                    this.options.coordsToLatLng = function (coords) {
+                        var point = L.point(coords[0], coords[1]);
+                        return crs.projection.unproject(point);
+                    };
+                }
+            }
+            this._callLevel++;
+            try {
+                L.GeoJSON.prototype.addData.call(this, geojson);
+            } finally {
+                this._callLevel--;
+                if (this._callLevel === 0) {
+                    delete this.options.coordsToLatLng;
+                }
+            }
+        }
+    });
+    L.Proj.geoJson = function (geojson, options) {
+        return new L.Proj.GeoJSON(geojson, options);
+    };
+    L.Proj.ImageOverlay = L.ImageOverlay.extend({
+        initialize: function (url, bounds, options) {
+            L.ImageOverlay.prototype.initialize.call(this, url, null, options);
+            this._projBounds = bounds;
+        },
+        _animateZoom: function (e) {
+            var northwest = L.point(this._projBounds.min.x, this._projBounds.max.y), southeast = L.point(this._projBounds.max.x, this._projBounds.min.y), topLeft = this._projectedToNewLayerPoint(northwest, e.zoom, e.center), size = this._projectedToNewLayerPoint(southeast, e.zoom, e.center).subtract(topLeft), origin = topLeft.add(size._multiplyBy((1 - 1 / e.scale) / 2));
+            this._image.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(origin) + ' scale(' + this._map.getZoomScale(e.zoom) + ') ';
+        },
+        _reset: function () {
+            var zoom = this._map.getZoom(), pixelOrigin = this._map.getPixelOrigin(), bounds = L.bounds(this._transform(this._projBounds.min, zoom)._subtract(pixelOrigin), this._transform(this._projBounds.max, zoom)._subtract(pixelOrigin)), size = bounds.getSize(), image = this._image;
+            L.DomUtil.setPosition(image, bounds.min);
+            image.style.width = size.x + 'px';
+            image.style.height = size.y + 'px';
+        },
+        _projectedToNewLayerPoint: function (point, newZoom, newCenter) {
+            var topLeft = this._map._getNewTopLeftPoint(newCenter, newZoom).add(this._map._getMapPanePos());
+            return this._transform(point, newZoom)._subtract(topLeft);
+        },
+        _transform: function (p, zoom) {
+            var crs = this._map.options.crs, transformation = crs.transformation, scale = crs.scale(zoom);
+            return transformation.transform(p, scale);
+        }
+    });
+    L.Proj.imageOverlay = function (url, bounds, options) {
+        return new L.Proj.ImageOverlay(url, bounds, options);
+    };
+    if (typeof L.CRS !== 'undefined') {
+        L.CRS.proj4js = function () {
+            return function (code, def, transformation, options) {
+                options = options || {};
+                if (transformation) {
+                    options.transformation = transformation;
+                }
+                return new L.Proj.CRS(code, def, options);
+            };
+        }();
+    }
+    return L.Proj;
+});
+!function (root, factory) {
+    if (true) {
+        proj4leaflet10x = function (leaflet, proj4) {
+            return typeof factory === 'function' ? factory(leaflet, proj4) : factory;
+        }(leaflet, proj4);
+    } else if (typeof module === 'object' && typeof module.exports === 'object') {
+        L = leaflet;
+        proj4 = proj4;
+        module.exports = factory(L, proj4);
+    } else {
+        if (typeof root.L === 'undefined' || typeof root.proj4 === 'undefined')
+            throw 'Leaflet and proj4 must be loaded first';
+        factory(root.L, root.proj4);
+    }
+}(this, function (L, proj4) {
+    L.Proj = {};
+    L.Proj._isProj4Obj = function (a) {
+        return typeof a.inverse !== 'undefined' && typeof a.forward !== 'undefined';
+    };
+    L.Proj.Projection = L.Class.extend({
+        initialize: function (code, def, bounds) {
+            var isP4 = L.Proj._isProj4Obj(code);
+            this._proj = isP4 ? code : this._projFromCodeDef(code, def);
+            this.bounds = isP4 ? def : bounds;
+        },
+        project: function (latlng) {
+            var point = this._proj.forward([
+                latlng.lng,
+                latlng.lat
+            ]);
+            return new L.Point(point[0], point[1]);
+        },
+        unproject: function (point, unbounded) {
+            var point2 = this._proj.inverse([
+                point.x,
+                point.y
+            ]);
+            return new L.LatLng(point2[1], point2[0], unbounded);
+        },
+        _projFromCodeDef: function (code, def) {
+            if (def) {
+                proj4.defs(code, def);
+            } else if (proj4.defs[code] === undefined) {
+                var urn = code.split(':');
+                if (urn.length > 3) {
+                    code = urn[urn.length - 3] + ':' + urn[urn.length - 1];
+                }
+                if (proj4.defs[code] === undefined) {
+                    throw 'No projection definition for code ' + code;
+                }
+            }
+            return proj4(code);
+        }
+    });
+    L.Proj.CRS = L.Class.extend({
+        includes: L.CRS,
+        options: { transformation: new L.Transformation(1, 0, -1, 0) },
+        initialize: function (a, b, c) {
+            var code, proj, def, options;
+            if (L.Proj._isProj4Obj(a)) {
+                proj = a;
+                code = proj.srsCode;
+                options = b || {};
+                this.projection = new L.Proj.Projection(proj, options.bounds);
+            } else {
+                code = a;
+                def = b;
+                options = c || {};
+                this.projection = new L.Proj.Projection(code, def, options.bounds);
+            }
+            L.Util.setOptions(this, options);
+            this.code = code;
+            this.transformation = this.options.transformation;
+            if (this.options.origin) {
+                this.transformation = new L.Transformation(1, -this.options.origin[0], -1, this.options.origin[1]);
+            }
+            if (this.options.scales) {
+                this._scales = this.options.scales;
+            } else if (this.options.resolutions) {
+                this._scales = [];
+                for (var i = this.options.resolutions.length - 1; i >= 0; i--) {
+                    if (this.options.resolutions[i]) {
+                        this._scales[i] = 1 / this.options.resolutions[i];
+                    }
+                }
+            }
+            this.infinite = !this.options.bounds;
+        },
+        scale: function (zoom) {
+            var iZoom = Math.floor(zoom), baseScale, nextScale, scaleDiff, zDiff;
+            if (zoom === iZoom) {
+                return this._scales[zoom];
+            } else {
+                baseScale = this._scales[iZoom];
+                nextScale = this._scales[iZoom + 1];
+                scaleDiff = nextScale - baseScale;
+                zDiff = zoom - iZoom;
+                return baseScale + scaleDiff * zDiff;
+            }
+        },
+        zoom: function (scale) {
+            var downScale = this._closestElement(this._scales, scale), downZoom = this._scales.indexOf(downScale), nextZoom, scaleDiff;
+            if (scale === downScale) {
+                return downZoom;
+            }
+            nextZoom = downZoom + 1;
+            scaleDiff = this._scales[nextZoom] - downScale;
+            return (scale - downScale) / scaleDiff + downZoom;
+        },
+        _closestElement: function (array, element) {
+            var low;
+            for (var i = array.length; i--;) {
+                if (array[i] <= element && (low === undefined || low < array[i])) {
+                    low = array[i];
+                }
+            }
+            return low;
+        }
+    });
+    L.Proj.GeoJSON = L.GeoJSON.extend({
+        initialize: function (geojson, options) {
+            if (geojson.crs && geojson.crs.type === 'name') {
+                var crs = new L.Proj.CRS(geojson.crs.properties.name);
+                options = options || {};
+                options.coordsToLatLng = function (coords) {
+                    var point = L.point(coords[0], coords[1]);
+                    return crs.projection.unproject(point);
+                };
+            }
+            L.GeoJSON.prototype.initialize.call(this, geojson, options);
+        }
+    });
+    L.Proj.geoJson = function (geojson, options) {
+        return new L.Proj.GeoJSON(geojson, options);
+    };
+    return L.Proj;
+});
+LeafletCRSProj4Leaflet = function (require, L, proj4) {
+    return {
+        load: function () {
+            console.log('loading lib proj4leaflet ...');
+            var proj4leaflet = null;
+            if (L.version.lastIndexOf('0.7', 0) === 0) {
+                proj4leaflet = proj4leaflet07x;
+                console.log('loaded version for leaflet 0.7.7 ...');
+            } else if (L.version.lastIndexOf('1.0', 0) === 0) {
+                proj4leaflet = proj4leaflet10x;
+                console.log('loaded version for leaflet 1.0.0 ...');
+            } else {
+                console.log('version leaflet incompatible !');
+                return;
+            }
+            L.Proj = proj4leaflet;
+            return L.Proj;
+        }
+    };
+}({}, leaflet, proj4);
+CommonUtilsRegister = function (proj4) {
+    var Register = {
+        isLoaded: false,
+        get: function (name) {
+            if (name === '' || name === null || typeof name === 'undefined') {
+                return;
+            }
+            var s = name.split(':');
+            if (s.length !== 2) {
+                return;
+            }
+            var register = s[0];
+            var code = s[1];
+            if (!this.hasOwnProperty(register)) {
+                return;
+            }
+            if (!this[register].hasOwnProperty(code)) {
+                return;
+            }
+            return this[register][code];
+        },
+        load: function () {
+            if (!this.isLoaded) {
+                var registers = [
+                    'IGNF',
+                    'EPSG',
+                    'CRS'
+                ];
+                for (var i = 0; i < registers.length; i++) {
+                    var register = registers[i];
+                    var codes = this[register];
+                    for (var code in codes) {
+                        if (codes.hasOwnProperty(code)) {
+                            var name = register + ':' + code;
+                            proj4.defs(name, this.get(name));
+                        }
+                    }
+                }
+                this.isLoaded = true;
+            }
+        },
+        EPSG: {
+            4149: '+title=CH1903 +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs ',
+            4150: '+title=CH1903plus +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs ',
+            4151: '+title=CHTRF95 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ',
+            4171: '+title=RGF93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ',
+            4230: '+title=ED50 +proj=longlat +ellps=intl +no_defs ',
+            4235: '+title=Guyane Francaise +proj=longlat +ellps=intl +no_defs ',
+            4258: '+title=ETRS89 +proj=longlat +ellps=GRS80 +no_defs ',
+            4275: '+title=NTF +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +no_defs ',
+            4322: '+title=WGS 72 +proj=longlat +ellps=WGS72 +no_defs ',
+            4326: '+title=WGS 84 +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ',
+            4467: '+proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            4470: '+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ',
+            4471: '+proj=utm +zone=38 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            4474: '+proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs ',
+            4558: '+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ',
+            4559: '+proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            4621: '+title=Fort Marigot +proj=longlat +ellps=intl +towgs84=137,248,-430,0,0,0,0 +no_defs ',
+            4622: '+title=Guadeloupe 1948 +proj=longlat +ellps=intl +no_defs ',
+            4623: '+title=CSG67 +proj=longlat +ellps=intl +towgs84=-186,230,110,0,0,0,0 +no_defs ',
+            4624: '+title=RGFG95 +proj=longlat +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +no_defs ',
+            4625: '+title=Martinique 1938 +proj=longlat +ellps=intl +no_defs ',
+            4626: '+title=Reunion 1947 +proj=longlat +ellps=intl +no_defs ',
+            4627: '+title=RGR92 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ',
+            4628: '+title=Tahiti 52 +proj=longlat +ellps=intl +towgs84=162,117,154,0,0,0,0 +no_defs ',
+            4629: '+title=Tahaa 54 +proj=longlat +ellps=intl +no_defs ',
+            4630: '+title=IGN72 Nuku Hiva +proj=longlat +ellps=intl +no_defs ',
+            4632: '+title=Combani 1950 +proj=longlat +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +no_defs ',
+            4633: '+title=IGN56 Lifou +proj=longlat +ellps=intl +no_defs ',
+            4634: '+title=IGN72 Grand Terre +proj=longlat +ellps=intl +no_defs ',
+            4637: '+title=Perroud 1950 +proj=longlat +ellps=intl +towgs84=325,154,172,0,0,0,0 +no_defs ',
+            4638: '+title=Saint Pierre et Miquelon 1950 +proj=longlat +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +no_defs ',
+            4640: '+title=RRAF 1991 +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs ',
+            4641: '+title=IGN53 Mare +proj=longlat +ellps=intl +no_defs ',
+            4645: '+title=RGNC 1991 +proj=longlat +ellps=intl +towgs84=0,0,0,0,0,0,0 +no_defs ',
+            4687: '+proj=longlat +ellps=GRS80 +no_defs ',
+            4662: '+title=IGN72 Grande Terre +proj=longlat +ellps=intl +no_defs ',
+            4689: '+title=IGN63 Hiva Oa +proj=longlat +ellps=intl +no_defs ',
+            4690: '+title=Tahiti 79 +proj=longlat +ellps=intl +no_defs ',
+            4691: '+title=Moorea 87 +proj=longlat +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +no_defs ',
+            4692: '+title=Maupiti 83 +proj=longlat +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +no_defs ',
+            4698: '+title=IGN 1962 Kerguelen +proj=longlat +ellps=intl +towgs84=145,-187,103,0,0,0,0 +no_defs ',
+            4749: '+title=RGNC91-93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ',
+            4750: '+title=ST87 Ouvea +proj=longlat +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +no_defs ',
+            4807: '+title=NTF (Paris) +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +no_defs ',
+            2056: '+title=CH1903+ / LV95 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs ',
+            2154: '+title=RGF93 / Lambert-93 +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            2213: '+title=ETRS89 / TM 30 NE +proj=tmerc +lat_0=0 +lon_0=30 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs ',
+            2969: '+title=Fort Marigot / UTM zone 20N +proj=utm +zone=20 +ellps=intl +towgs84=137,248,-430,0,0,0,0 +units=m +no_defs ',
+            2970: '+title=Guadeloupe 1948 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs ',
+            2971: '+title=CSG67 / UTM zone 22N +proj=utm +zone=22 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs ',
+            2972: '+title=RGFG95 / UTM zone 22N +proj=utm +zone=22 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs ',
+            2973: '+title=Martinique 1938 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs ',
+            2975: '+title=RGR92 / UTM zone 40S +proj=utm +zone=40 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            2976: '+title=Tahiti 52 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=162,117,154,0,0,0,0 +units=m +no_defs ',
+            2977: '+title=Tahaa 54 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +units=m +no_defs ',
+            2978: '+title=IGN72 Nuku Hiva / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs ',
+            2980: '+title=Combani 1950 / UTM zone 38S +proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs ',
+            2981: '+title=IGN56 Lifou / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ',
+            2982: '+title=IGN72 Grand Terre / UTM zone 58S (deprecated) +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ',
+            2984: '+title=RGNC 1991 / Lambert New Caledonia (deprecated) +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=intl +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            2986: '+title=Terre Adelie 1950 +proj=stere +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-90.000000000 +lon_0=140.000000000 +lat_ts=-67.000000000 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs',
+            2987: '+title=Saint Pierre et Miquelon 1950 / UTM zone 21N +proj=utm +zone=21 +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +units=m +no_defs ',
+            2989: '+title=RRAF 1991 / UTM zone 20N +proj=utm +zone=20 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            2990: '+title=Reunion 1947 / TM Reunion (deprecated) +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=50000 +y_0=160000 +ellps=intl +units=m +no_defs ',
+            2995: '+title=IGN53 Mare / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ',
+            3038: '+proj=utm +zone=26 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3039: '+proj=utm +zone=27 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3040: '+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3041: '+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3045: '+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3046: '+proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3047: '+proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3048: '+proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3049: '+proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3050: '+proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3051: '+proj=utm +zone=39 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3034: '+title=ETRS89 / ETRS-LCC +proj=lcc +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=4000000 +y_0=2800000 +ellps=GRS80 +units=m +no_defs ',
+            3035: '+title=ETRS89 / ETRS-LAEA +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs ',
+            3042: '+title=ETRS89 / ETRS-TM30 +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs ',
+            3043: '+title=ETRS89 / ETRS-TM31 +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs ',
+            3044: '+title=ETRS89 / ETRS-TM32 +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs ',
+            25828: '+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            25829: '+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            25833: '+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            25834: '+proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            25835: '+proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            25836: '+proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            25837: '+proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            25838: '+proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3060: '+title=IGN72 Grande Terre / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ',
+            3163: '+title=RGNC91-93 / Lambert New Caledonia +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3164: '+title=ST87 Ouvea / UTM zone 58S +proj=utm +zone=58 +south +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +units=m +no_defs ',
+            3165: '+title=NEA74 Noumea / Noumea Lambert +proj=lcc +lat_1=-22.24469175 +lat_2=-22.29469175 +lat_0=-22.26969175 +lon_0=166.44242575 +x_0=0.66 +y_0=1.02 +ellps=intl +units=m +no_defs ',
+            3166: '+title=NEA74 Noumea / Noumea Lambert 2 +proj=lcc +lat_1=-22.24472222222222 +lat_2=-22.29472222222222 +lat_0=-22.26972222222222 +lon_0=166.4425 +x_0=8.313000000000001 +y_0=-2.354 +ellps=intl +units=m +no_defs ',
+            3169: '+title=RGNC91-93 / UTM zone 57S +proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3170: '+title=RGNC91-93 / UTM zone 58S +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3171: '+title=RGNC91-93 / UTM zone 59S +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
+            3172: '+title=IGN53 Mare / UTM zone 59S +proj=utm +zone=59 +south +ellps=intl +units=m +no_defs ',
+            3296: '+title=RGPF / UTM zone 5S +proj=utm +zone=5 +south +ellps=GRS80 +units=m +no_defs ',
+            3297: '+title=RGPF / UTM zone 6S +proj=utm +zone=6 +south +ellps=GRS80 +units=m +no_defs ',
+            3298: '+title=RGPF / UTM zone 7S +proj=utm +zone=7 +south +ellps=GRS80 +units=m +no_defs ',
+            3299: '+title=RGPF / UTM zone 8S +proj=utm +zone=8 +south +ellps=GRS80 +units=m +no_defs ',
+            3302: '+title=IGN63 Hiva Oa / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs ',
+            3303: '+title=Fatu Iva 72 / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +towgs84=347.103,1078.12,2623.92,-33.8875,70.6773,-9.3943,186.074 +units=m +no_defs ',
+            3304: '+title=Tahiti 79 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +units=m +no_defs ',
+            3305: '+title=Moorea 87 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +units=m +no_defs ',
+            3306: '+title=Maupiti 83 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +units=m +no_defs ',
+            3312: '+title=CSG67 / UTM zone 21N +proj=utm +zone=21 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs ',
+            3313: '+title=RGFG95 / UTM zone 21N +proj=utm +zone=21 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs ',
+            3336: '+title=IGN 1962 Kerguelen / UTM zone 42S +proj=utm +zone=42 +south +ellps=intl +towgs84=145,-187,103,0,0,0,0 +units=m +no_defs ',
+            3395: '+title=WGS 84 / World Mercator +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            3727: '+title=Reunion 1947 / TM Reunion +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=160000 +y_0=50000 +ellps=intl +units=m +no_defs ',
+            21781: '+title=CH1903 / LV03 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs ',
+            25830: '+title=ETRS89 / UTM zone 30N +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs ',
+            25831: '+title=ETRS89 / UTM zone 31N +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs ',
+            25832: '+title=ETRS89 / UTM zone 32N +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs ',
+            27561: '+title=NTF (Paris) / Lambert Nord France +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            27562: '+title=NTF (Paris) / Lambert Centre France +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            27563: '+title=NTF (Paris) / Lambert Sud France +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            27564: '+title=NTF (Paris) / Lambert Corse +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            27571: '+title=NTF (Paris) / Lambert zone I +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            27572: '+title=NTF (Paris) / Lambert zone II +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            27573: '+title=NTF (Paris) / Lambert zone III +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            27574: '+title=NTF (Paris) / Lambert zone IV +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            27581: '+title=NTF (Paris) / France I (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            27582: '+title=NTF (Paris) / France II (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            27583: '+title=NTF (Paris) / France III (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            27584: '+title=NTF (Paris) / France IV (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            27591: '+title=NTF (Paris) / Nord France (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            27592: '+title=NTF (Paris) / Centre France (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            27593: '+title=NTF (Paris) / Sud France (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            27594: '+title=NTF (Paris) / Corse (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
+            32601: '+proj=utm +zone=1 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32602: '+proj=utm +zone=2 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32603: '+proj=utm +zone=3 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32604: '+proj=utm +zone=4 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32605: '+proj=utm +zone=5 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32606: '+proj=utm +zone=6 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32607: '+proj=utm +zone=7 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32608: '+proj=utm +zone=8 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32609: '+proj=utm +zone=9 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32610: '+proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32611: '+proj=utm +zone=11 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32612: '+proj=utm +zone=12 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32613: '+proj=utm +zone=13 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32614: '+proj=utm +zone=14 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32615: '+proj=utm +zone=15 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32616: '+proj=utm +zone=16 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32617: '+proj=utm +zone=17 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32618: '+proj=utm +zone=18 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32619: '+proj=utm +zone=19 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32620: '+proj=utm +zone=20 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32621: '+proj=utm +zone=21 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32622: '+proj=utm +zone=22 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32623: '+proj=utm +zone=23 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32624: '+proj=utm +zone=24 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32625: '+proj=utm +zone=25 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32626: '+proj=utm +zone=26 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32627: '+proj=utm +zone=27 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32628: '+proj=utm +zone=28 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32629: '+proj=utm +zone=29 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32630: '+proj=utm +zone=30 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32631: '+proj=utm +zone=31 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32632: '+proj=utm +zone=32 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32633: '+proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32634: '+proj=utm +zone=34 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32635: '+proj=utm +zone=35 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32636: '+proj=utm +zone=36 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32637: '+proj=utm +zone=37 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32638: '+proj=utm +zone=38 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32639: '+proj=utm +zone=39 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32640: '+proj=utm +zone=40 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32641: '+proj=utm +zone=41 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32642: '+proj=utm +zone=42 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32643: '+proj=utm +zone=43 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32644: '+proj=utm +zone=44 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32645: '+proj=utm +zone=45 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32646: '+proj=utm +zone=46 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32647: '+proj=utm +zone=47 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32648: '+proj=utm +zone=48 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32649: '+proj=utm +zone=49 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32650: '+proj=utm +zone=50 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32651: '+proj=utm +zone=51 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32652: '+proj=utm +zone=52 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32653: '+proj=utm +zone=53 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32654: '+proj=utm +zone=54 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32655: '+proj=utm +zone=55 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32656: '+proj=utm +zone=56 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32657: '+proj=utm +zone=57 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32658: '+proj=utm +zone=58 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32659: '+proj=utm +zone=59 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32660: '+proj=utm +zone=60 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32661: '+proj=stere +lat_0=90 +lat_ts=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32662: '+title=WGS 84 / Plate Carree +proj=eqc +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32701: '+proj=utm +zone=1 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32702: '+proj=utm +zone=2 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32703: '+proj=utm +zone=3 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32704: '+proj=utm +zone=4 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32705: '+proj=utm +zone=5 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32706: '+proj=utm +zone=6 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32707: '+proj=utm +zone=7 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32708: '+proj=utm +zone=8 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32709: '+proj=utm +zone=9 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32710: '+proj=utm +zone=10 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32711: '+proj=utm +zone=11 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32712: '+proj=utm +zone=12 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32713: '+proj=utm +zone=13 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32714: '+proj=utm +zone=14 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32715: '+proj=utm +zone=15 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32716: '+proj=utm +zone=16 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32717: '+proj=utm +zone=17 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32718: '+proj=utm +zone=18 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32719: '+proj=utm +zone=19 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32720: '+proj=utm +zone=20 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32721: '+proj=utm +zone=21 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32722: '+proj=utm +zone=22 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32723: '+proj=utm +zone=23 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32724: '+proj=utm +zone=24 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32725: '+proj=utm +zone=25 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32726: '+proj=utm +zone=26 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32727: '+proj=utm +zone=27 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32728: '+proj=utm +zone=28 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32729: '+proj=utm +zone=29 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32730: '+proj=utm +zone=30 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32731: '+proj=utm +zone=31 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32732: '+proj=utm +zone=32 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32733: '+proj=utm +zone=33 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32734: '+proj=utm +zone=34 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32735: '+proj=utm +zone=35 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32736: '+proj=utm +zone=36 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32737: '+proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32738: '+proj=utm +zone=38 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32739: '+proj=utm +zone=39 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32740: '+proj=utm +zone=40 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32741: '+proj=utm +zone=41 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32742: '+proj=utm +zone=42 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32743: '+proj=utm +zone=43 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32744: '+proj=utm +zone=44 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32745: '+proj=utm +zone=45 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32746: '+proj=utm +zone=46 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32747: '+proj=utm +zone=47 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32748: '+proj=utm +zone=48 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32749: '+proj=utm +zone=49 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32750: '+proj=utm +zone=50 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32751: '+proj=utm +zone=51 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32752: '+proj=utm +zone=52 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32753: '+proj=utm +zone=53 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32754: '+proj=utm +zone=54 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32755: '+proj=utm +zone=55 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32756: '+proj=utm +zone=56 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32757: '+proj=utm +zone=57 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32758: '+proj=utm +zone=58 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32759: '+proj=utm +zone=59 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32760: '+proj=utm +zone=60 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            32761: '+proj=stere +lat_0=-90 +lat_ts=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
+            310024802: '+title=Geoportail - France metropolitaine +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=46.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            310915814: '+title=Geoportail - Antilles francaises +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            310486805: '+title=Geoportail - Guyane +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=4.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            310700806: '+title=Geoportail - Reunion et dependances +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-21.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            310702807: '+title=Geoportail - Mayotte +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-12.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            310706808: '+title=Geoportail - Saint-Pierre et Miquelon +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=47.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            310547809: '+title=Geoportail - Nouvelle-Caledonie +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-22.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            310642810: '+title=Geoportail - Wallis et Futuna +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-14.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            310032811: '+title=Geoportail - Polynesie francaise +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            310642812: '+title=Geoportail - Kerguelen +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-49.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            310642801: '+title=Geoportail - Crozet +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-46.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            310642813: '+title=Geoportail - Amsterdam et Saint-Paul +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-38.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            310642901: '+title=Geoportail - Monde +proj=mill +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lon_0=0.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            5489: '+title=RGAF09 geographiques (dms) +proj=longlat +nadgrids=@null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137 +rf=298.257222101 +units=m +no_defs',
+            5490: '+title=RGAF09 UTM Nord Fuseau 20 +proj=tmerc +nadgrids=@null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137 +rf=298.257222101 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs'
+        },
+        CRS: { 84: '+title=WGS 84 longitude-latitude +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ' },
+        IGNF: {
+            AMST63: '+title=Amsterdam 1963 +proj=geocent +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            CROZ63: '+title=Crozet 1963 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            CSG67: '+title=Guyane CSG67 +proj=geocent +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            ED50: '+title=ED50 +proj=geocent +towgs84=-84.0000,-97.0000,-117.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            ETRS89: '+title=Systeme de reference terrestre Europeen (1989) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            GUAD48: '+title=Guadeloupe Ste Anne +proj=geocent +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            GUADFM49: '+title=Guadeloupe Fort Marigot +proj=geocent +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            IGN63: '+title=IGN 1963 (Hiva Oa, Tahuata, Mohotani) +proj=geocent +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            IGN72: '+title=IGN 1972 Grande-Terre / Ile des Pins +proj=geocent +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            KERG62CAR: '+title=Kerguelen - K0 +proj=geocent +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            MART38: '+title=Martinique Fort-Desaix +proj=geocent +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            MAYO50: '+title=Mayotte Combani +proj=geocent +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            MOOREA87: '+title=Moorea 1987 +proj=geocent +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            NTF: '+title=Nouvelle Triangulation Francaise +proj=geocent +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +units=m +no_defs',
+            NUKU72: '+title=IGN 1972 Nuku Hiva +proj=geocent +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            REUN47: '+title=Reunion 1947 +proj=geocent +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            RGF93: '+title=Reseau geodesique francais 1993 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            RGFG95: '+title=Reseau geodesique francais de Guyane 1995 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            RGM04: '+title=RGM04 (Reseau Geodesique de Mayotte 2004) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            RGNC: '+title=Reseau Geodesique de Nouvelle-Caledonie +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            RGPF: '+title=RGPF (Reseau Geodesique de Polynesie Francaise) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            RGR92: '+title=Reseau geodesique Reunion 1992 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            RGSPM06: '+title=Reseau Geodesique Saint-Pierre-et-Miquelon (2006) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            RGTAAF07: '+title=Reseau Geodesique des TAAF (2007) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            RRAF91: '+title=RRAF 1991 (Reseau de Reference des Antilles Francaises) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            STPL69: '+title=Saint-Paul 1969 +proj=geocent +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            STPM50: '+title=St Pierre et Miquelon 1950 +proj=geocent +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +units=m +no_defs',
+            TAHAA: '+title=Raiatea - Tahaa 51-54 (Tahaa, Base Terme Est) +proj=geocent +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            TAHI79: '+title=IGN79 (Tahiti) Iles de la Societe +proj=geocent +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            TERA50: '+title=Pointe Geologie - Perroud 1950 +proj=geocent +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            WALL78: '+title=Wallis-Uvea 1978 (MOP78) +proj=geocent +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            WGS72: '+title=World Geodetic System 1972 +proj=geocent +towgs84=0.0000,12.0000,6.0000 +a=6378135.0000 +rf=298.2600000000000 +units=m +no_defs',
+            WGS84: '+title=World Geodetic System 1984 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            AMST63GEO: '+title=Amsterdam 1963 +proj=longlat +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            CROZ63GEO: '+title=Crozet 1963 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            CSG67GEO: '+title=Guyane CSG67 +proj=longlat +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            ED50G: '+title=ED50 +proj=longlat +towgs84=-84.0000,-97.0000,-117.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            GUAD48GEO: '+title=Guadeloupe Ste Anne +proj=longlat +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            GUADFM49GEO: '+title=Guadeloupe Fort Marigot +proj=longlat +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            IGN63GEO: '+title=IGN 1963 (Hiva Oa, Tahuata, Mohotani) +proj=longlat +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            IGN72GEO: '+title=IGN 1972 Grande-Terre / Ile des Pins +proj=longlat +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            KERG62GEO: '+title=Kerguelen - K0 +proj=longlat +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            MART38GEO: '+title=Martinique Fort-Desaix +proj=longlat +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            MAYO50GEO: '+title=Mayotte Combani +proj=longlat +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            MOOREA87GEO: '+title=Moorea 1987 +proj=longlat +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            NTFG: '+title=Nouvelle Triangulation Francaise Greenwich degres sexagesimaux +proj=longlat +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +units=m +no_defs',
+            NTFP: '+title=Nouvelle Triangulation Francaise Paris grades +proj=longlat +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +units=m +no_defs',
+            NUKU72GEO: '+title=IGN 1972 Nuku Hiva +proj=longlat +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            REUN47GEO: '+title=Reunion 1947 +proj=longlat +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            RGF93G: '+title=Reseau geodesique francais 1993 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            RGFG95GEO: '+title=Reseau geodesique francais de Guyane 1995 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            RGM04GEO: '+title=RGM04 (Reseau Geodesique de Mayotte 2004) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            RGNCGEO: '+title=Reseau Geodesique de Nouvelle-Caledonie +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            RGPFGEO: '+title=RGPF (Reseau Geodesique de Polynesie Francaise) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            RGR92GEO: '+title=Reseau geodesique de la Reunion 1992 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            RGSPM06GEO: '+title=Saint-Pierre-et-Miquelon (2006) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            RGTAAF07G: '+title=Reseau Geodesique des TAAF (2007) (dms) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            STPL69GEO: '+title=Saint-Paul 1969 +proj=longlat +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            STPM50GEO: '+title=St Pierre et Miquelon 1950  +proj=longlat +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +units=m +no_defs',
+            TAHAAGEO: '+title=Raiatea - Tahaa 51-54 (Tahaa, Base Terme Est) +proj=longlat +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            TAHI79GEO: '+title=IGN79 (Tahiti) Iles de la Societe +proj=longlat +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            TERA50G: '+title=Pointe Geologie - Perroud 1950 +proj=longlat +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            WALL78GEO: '+title=Wallis - Uvea 1978 (MOP78) +proj=longlat +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
+            WGS72G: '+title=WGS72 +proj=longlat +towgs84=0.0000,12.0000,6.0000 +a=6378135.0000 +rf=298.2600000000000 +units=m +no_defs',
+            WGS84G: '+title=World Geodetic System 1984 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            WGS84RRAFGEO: '+title=Reseau de reference des Antilles francaises (1988-1991) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            XGEO: '+title=Systeme CIO-BIH +proj=longlat +towgs84=0.0000,0.0000,0.5000,0.0000,0.0000,0.0140,-0.100000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            AMST63UTM43S: '+title=Amsterdam 1963 UTM fuseau 43 Sud +proj=tmerc +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            CROZ63UTM39S: '+title=Crozet 1963 +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            CSG67UTM21: '+title=Guyane CSG67 UTM fuseau 21 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            CSG67UTM22: '+title=Guyane CSG67 UTM fuseau 22 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            GEOPORTALANF: '+title=Geoportail - Antilles francaises +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            GEOPORTALASP: '+title=Geoportail - Amsterdam et Saint-Paul +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-38.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            GEOPORTALCRZ: '+title=Geoportail - Crozet +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-46.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            GEOPORTALFXX: '+title=Geoportail - France metropolitaine +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=46.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            GEOPORTALGUF: '+title=Geoportail - Guyane +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=4.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            GEOPORTALKER: '+title=Geoportail - Kerguelen +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-49.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            GEOPORTALMYT: '+title=Geoportail - Mayotte +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-12.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            GEOPORTALNCL: '+title=Geoportail - Nouvelle-Caledonie +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-22.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            GEOPORTALPYF: '+title=Geoportail - Polynesie francaise +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            GEOPORTALREU: '+title=Geoportail - Reunion et dependances +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-21.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            GEOPORTALSPM: '+title=Geoportail - Saint-Pierre et Miquelon +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=47.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            GEOPORTALWLF: '+title=Geoportail - Wallis et Futuna +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-14.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            GUAD48UTM20: '+title=Guadeloupe Ste Anne +proj=tmerc +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            GUADFM49U20: '+title=Guadeloupe Fort Marigot  +proj=tmerc +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            IGN63UTM7S: '+title=IGN 1963 - Hiva Oa, Tahuata, Mohotani - UTM fuseau 7 Sud +proj=tmerc +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            IGN72UTM58S: '+title=IGN 1972 - UTM fuseau 58 Sud +proj=tmerc +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            KERG62UTM42S: '+title=Kerguelen 1962 +proj=tmerc +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            LAMB1: '+title=Lambert I +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs',
+            LAMB1C: '+title=Lambert I Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=1200000.000 +units=m +no_defs',
+            LAMB2: '+title=Lambert II +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs',
+            LAMB2C: '+title=Lambert II Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs',
+            LAMB3: '+title=Lambert III +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs',
+            LAMB3C: '+title=Lambert III Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=3200000.000 +units=m +no_defs',
+            LAMB4: '+title=Lambert IV +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=185861.369 +units=m +no_defs',
+            LAMB4C: '+title=Lambert IV Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=4185861.369 +units=m +no_defs',
+            LAMB93: '+title=Lambert 93 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.500000000 +lon_0=3.000000000 +lat_1=44.000000000 +lat_2=49.000000000 +x_0=700000.000 +y_0=6600000.000 +units=m +no_defs',
+            RGF93CC42: '+title=Lambert conique conforme Zone 1 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=42.000000000 +lon_0=3.000000000 +lat_1=41.200000000 +lat_2=42.800000000 +x_0=1700000.000 +y_0=1200000.000 +units=m +no_defs',
+            RGF93CC43: '+title=Lambert conique conforme Zone 2 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=43.000000000 +lon_0=3.000000000 +lat_1=42.200000000 +lat_2=43.800000000 +x_0=1700000.000 +y_0=2200000.000 +units=m +no_defs',
+            RGF93CC44: '+title=Lambert conique conforme Zone 3 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=44.000000000 +lon_0=3.000000000 +lat_1=43.200000000 +lat_2=44.800000000 +x_0=1700000.000 +y_0=3200000.000 +units=m +no_defs',
+            RGF93CC45: '+title=Lambert conique conforme Zone 4 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=45.000000000 +lon_0=3.000000000 +lat_1=44.200000000 +lat_2=45.800000000 +x_0=1700000.000 +y_0=4200000.000 +units=m +no_defs',
+            RGF93CC46: '+title=Lambert conique conforme Zone 5 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.000000000 +lon_0=3.000000000 +lat_1=45.200000000 +lat_2=46.800000000 +x_0=1700000.000 +y_0=5200000.000 +units=m +no_defs',
+            RGF93CC47: '+title=Lambert conique conforme Zone 6 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=47.000000000 +lon_0=3.000000000 +lat_1=46.200000000 +lat_2=47.800000000 +x_0=1700000.000 +y_0=6200000.000 +units=m +no_defs',
+            RGF93CC48: '+title=Lambert conique conforme Zone 7 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=48.000000000 +lon_0=3.000000000 +lat_1=47.200000000 +lat_2=48.800000000 +x_0=1700000.000 +y_0=7200000.000 +units=m +no_defs',
+            RGF93CC49: '+title=Lambert conique conforme Zone 8 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=49.000000000 +lon_0=3.000000000 +lat_1=48.200000000 +lat_2=49.800000000 +x_0=1700000.000 +y_0=8200000.000 +units=m +no_defs',
+            RGF93CC50: '+title=Lambert conique conforme Zone 9 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=50.000000000 +lon_0=3.000000000 +lat_1=49.200000000 +lat_2=50.800000000 +x_0=1700000.000 +y_0=9200000.000 +units=m +no_defs',
+            LAMBE: '+title=Lambert II etendu +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs',
+            MART38UTM20: '+title=Martinique Fort-Desaix +proj=tmerc +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            MAYO50UTM38S: '+title=Mayotte Combani +proj=tmerc +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            MILLER: '+title=Geoportail - Monde +proj=mill +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lon_0=0.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
+            MOOREA87U6S: '+title=Moorea 1987 - UTM fuseau 6 Sud +proj=tmerc +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            NUKU72U7S: '+title=IGN 1972 Nuku Hiva - UTM fuseau 7 Sud +proj=tmerc +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            REUN47GAUSSL: '+title=Reunion Gauss Laborde +proj=gstmerc +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-21.116666667 +lon_0=55.533333333 +k_0=1.00000000 +x_0=160000.000 +y_0=50000.000 +units=m +no_defs',
+            RGM04UTM38S: '+title=UTM fuseau 38 Sud (Reseau Geodesique de Mayotte 2004) +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            RGNCUTM57S: '+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 57 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=159.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            RGNCUTM58S: '+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 58 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            RGNCUTM59S: '+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 59 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=171.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            RGPFUTM5S: '+title=RGPF - UTM fuseau 5 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            RGPFUTM6S: '+title=RGPF - UTM fuseau 6 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            RGPFUTM7S: '+title=RGPF - UTM fuseau 7 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            RGR92UTM40S: '+title=RGR92 UTM fuseau 40 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            RGSPM06U21: '+title=Saint-Pierre-et-Miquelon (2006) UTM Fuseau 21 Nord +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            STPL69UTM43S: '+title=Saint-Paul 1969 UTM fuseau 43 Sud +proj=tmerc +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            STPM50UTM21: '+title=St Pierre et Miquelon 1950 +proj=tmerc +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            TAHAAUTM05S: '+title=Tahaa 1951 +proj=tmerc +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            TAHI51UTM06S: '+title=Tahiti-Terme Nord UTM fuseau 6 Sud +proj=tmerc +towgs84=162.0000,117.0000,154.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            TAHI79UTM6S: '+title=Tahiti 1979 +proj=tmerc +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            TERA50STEREO: '+title=Terre Adelie 1950 +proj=stere +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-90.000000000 +lon_0=140.000000000 +lat_ts=-67 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs',
+            UTM01SW84: '+title=World Geodetic System 1984 UTM fuseau 01 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            UTM20W84GUAD: '+title=World Geodetic System 1984 UTM fuseau 20 Nord-Guadeloupe +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            UTM20W84MART: '+title=World Geodetic System 1984 UTM fuseau 20 Nord-Martinique +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            UTM22RGFG95: '+title=RGFG95 UTM fuseau 22 Nord-Guyane +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            UTM39SW84: '+title=World Geodetic System 1984 UTM fuseau 39 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            UTM42SW84: '+title=World Geodetic System 1984 UTM fuseau 42 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            UTM43SW84: '+title=World Geodetic System 1984 UTM fuseau 43 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            WALL78UTM1S: '+title=Wallis-Uvea 1978 (MOP78) UTM 1 SUD +proj=tmerc +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
+            ETRS89GEO: '+title=ETRS89 geographiques (dms) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
+            ETRS89LAEA: '+title=ETRS89 Lambert Azimutal Equal Area +proj=laea +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=52.000000000 +lon_0=10.000000000 +x_0=4321000.000 +y_0=3210000.000 +units=m +no_defs',
+            ETRS89LCC: '+title=ETRS89 Lambert Conformal Conic +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=52.000000000 +lon_0=9.999999995 +lat_1=35.000000000 +lat_2=65.000000000 +x_0=4000000.000 +y_0=2800000.000 +units=m +no_defs',
+            UTM26ETRS89: '+title=Europe - de 30d a 24d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-27.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            UTM27ETRS89: '+title=Europe - de 24d a 18d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-21.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            UTM28ETRS89: '+title=Europe - de 18d a 12d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-15.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            UTM29ETRS89: '+title=Europe - de 12d a 6d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-9.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            UTM30ETRS89: '+title=Europe - de -6d a 0d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-3.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            UTM31ETRS89: '+title=Europe - de 0d a 6d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=3.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            UTM32ETRS89: '+title=Europe - de 6d a 12d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=9.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            UTM33ETRS89: '+title=Europe - de 12d a 18d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=15.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            UTM34ETRS89: '+title=Europe - de 18d a 24d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=21.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            UTM35ETRS89: '+title=Europe - de 24d a 30d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=27.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            UTM36ETRS89: '+title=Europe - de 30d a 36d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=33.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            UTM37ETRS89: '+title=Europe - de 36d a 42d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=39.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
+            UTM38ETRS89: '+title=Europe - de 42d a 48d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs'
+        }
+    };
+    return Register;
+}(proj4);
+LeafletCRSEPSG2154 = function (Config, Register, L) {
+    var EPSG2154 = {
+        instance: null,
+        build: function () {
+            if (!this.instance) {
+                var crs = new L.Proj.CRS('EPSG:2154', Register.get('EPSG:2154'), {
+                    resolutions: this._getResolutions(),
+                    origin: this._getOrigin()
+                });
+                this.instance = crs;
+            }
+            return this.instance;
+        },
+        _getResolutions: function () {
+            var resolutions = [];
+            if (Config.isConfigLoaded()) {
+                var o = Config.getTileMatrix('LAMB93');
+                resolutions = o.nativeResolutions;
+            }
+            if (resolutions.length) {
+                return resolutions;
+            }
+            return [
+                104579.22454989408,
+                52277.53235379051,
+                26135.487078595408,
+                13066.891381800004,
+                6533.228604113456,
+                3266.5595244626675,
+                1633.2660045974187,
+                816.6295549860224,
+                408.31391467683596,
+                204.15674151090204,
+                102.07831678324082,
+                51.0391448966112,
+                25.519569074269395,
+                12.759783693647506,
+                6.379891635966491,
+                3.18994576530532,
+                1.5949728694977277,
+                0.7974864315474559,
+                0.398743214900604,
+                0.19937160727567999,
+                0.099685803696052,
+                0.049842901818919996
+            ];
+        },
+        _getOrigin: function () {
+            return [
+                0,
+                12000000
+            ];
+        }
+    };
+    return EPSG2154;
+}(CommonUtilsConfig, CommonUtilsRegister, leaflet);
+LeafletCRSEPSG27572 = function (Config, Register, L) {
+    var EPSG27572 = {
+        instance: null,
+        build: function () {
+            if (!this.instance) {
+                var crs = new L.Proj.CRS('EPSG:27572', Register.get('EPSG:27572'), {
+                    resolutions: this._getResolutions(),
+                    origin: this._getOrigin()
+                });
+                this.instance = crs;
+            }
+            return this.instance;
+        },
+        _getResolutions: function () {
+            var resolutions = [];
+            if (Config.isConfigLoaded()) {
+                var o = Config.getTileMatrix('LAMB2E');
+                if (o && Object.keys(o)) {
+                    resolutions = o.nativeResolutions;
+                }
+            }
+            if (resolutions.length) {
+                return resolutions;
+            }
+            return [
+                104579.22454989408,
+                52277.53235379051,
+                26135.487078595408,
+                13066.891381800004,
+                6533.228604113456,
+                3266.5595244626675,
+                1633.2660045974187,
+                816.6295549860224,
+                408.31391467683596,
+                204.15674151090204,
+                102.07831678324082,
+                51.0391448966112,
+                25.519569074269395,
+                12.759783693647506,
+                6.379891635966491,
+                3.18994576530532,
+                1.5949728694977277,
+                0.7974864315474559,
+                0.398743214900604,
+                0.19937160727567999,
+                0.099685803696052,
+                0.049842901818919996
+            ];
+        },
+        _getOrigin: function () {
+            return [
+                0,
+                12000000
+            ];
+        }
+    };
+    return EPSG27572;
+}(CommonUtilsConfig, CommonUtilsRegister, leaflet);
+LeafletCRSEPSG4326 = function (Config, Register, L) {
+    var EPSG4326 = {
+        instance: null,
+        build: function () {
+            if (!this.instance) {
+                var crs = new L.Proj.CRS('EPSG:4326', Register.get('EPSG:4326'), {
+                    resolutions: this._getResolutions(),
+                    origin: [
+                        -180,
+                        90
+                    ]
+                });
+                this.instance = crs;
+            }
+            return this.instance;
+        },
+        _getResolutions: function () {
+            var resolutions = [];
+            if (Config.isConfigLoaded()) {
+                resolutions = Config.getResolutions();
+            }
+            if (resolutions.length) {
+                return resolutions;
+            }
+            return [
+                1.40625,
+                0.703125,
+                0.3515625,
+                0.17578125,
+                0.087890625,
+                0.0439453125,
+                0.02197265625,
+                0.010986328125,
+                0.0054931640625,
+                0.00274658203125,
+                0.001373291015625,
+                0.0006866455078125,
+                0.00034332275390625,
+                0.000171661376953126,
+                0.0000858306884765628,
+                0.0000429153442382813,
+                0.0000214576721191407,
+                0.0000107288360595703,
+                0.00000536441802978517,
+                0.00000268220901489259,
+                0.0000013411045074463,
+                6.70552253723145e-7,
+                3.3527612686157e-7
+            ];
+        },
+        _getOrigin: function () {
+        }
+    };
+    return EPSG4326;
+}(CommonUtilsConfig, CommonUtilsRegister, leaflet);
+LeafletCRSCRS = function (Proj4, Register, Epsg2154, Epsg27572, Epsg4326) {
+    (function () {
+        Proj4.load();
+        Register.load();
+    }());
+    var CRS = {
+        EPSG2154: function () {
+            return Epsg2154.build();
+        },
+        EPSG27572: function () {
+            return Epsg27572.build();
+        },
+        EPSG4326: function () {
+            return Epsg4326.build();
+        }
+    };
+    return CRS;
+}(LeafletCRSProj4Leaflet, CommonUtilsRegister, LeafletCRSEPSG2154, LeafletCRSEPSG27572, LeafletCRSEPSG4326);
+LeafletControlsMousePosition = function (L, woodman, Gp, RightManagement, ID, MousePositionDOM, PositionFormater, CRS) {
+    var MousePosition = L.Control.extend({
+        includes: MousePositionDOM,
+        options: {
+            position: 'bottomleft',
+            collapsed: true,
+            units: [],
+            systems: [],
+            displayAltitude: true,
+            displayCoordinates: true,
+            altitude: {
+                triggerDelay: 200,
+                responseDelay: 500,
+                noDataValue: -99999,
+                noDataValueTolerance: 90000,
+                serviceOptions: {}
+            }
+        },
+        initialize: function (options) {
+            L.Util.extend(this.options, options);
+            this._uid = ID.generate();
+            this._projectionSystems = [];
+            this._initProjectionSystems();
+            this._projectionUnits = {};
+            this._initProjectionUnits();
+            this._isDesktop = this._detectSupport();
+            if (this.options.altitude.triggerDelay < 100) {
+                this.options.altitude.triggerDelay = 100;
+            }
+            this._timer = this.options.altitude.triggerDelay;
+            this._currentProjectionSystems = this._projectionSystems[0];
+            this._projectionSystemsContainer = null;
+            this._currentProjectionType = this._projectionSystems[0].type;
+            this._currentProjectionUnits = this._projectionUnits[this._currentProjectionType][0].code;
+            this._projectionUnitsContainer = null;
+            this._showMousePositionContainer = null;
+            if (!this.options.displayAltitude && !this.options.displayCoordinates) {
+                this.options.displayCoordinates = true;
+            }
+            this._noRightManagement = false;
+            if (this.options.displayAltitude) {
+                this._checkRightsManagement();
+            }
+            L.Util.setOptions(this, this.options);
+        },
+        onAdd: function (map) {
+            var container = this._container = this._initLayout();
+            if (!this.options.collapsed) {
+                if (this._isDesktop) {
+                    map.on('mousemove', this.onMouseMove, this);
+                } else {
+                    map.on('move', this.onMapMove, this);
+                }
+            }
+            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
+            L.DomEvent.addListener(container, 'mousemove', L.DomEvent.stopPropagation).addListener(container, 'mousemove', L.DomEvent.preventDefault);
+            return container;
+        },
+        onRemove: function (map) {
+            map.off('mousemove', this.onMouseMove);
+        },
+        _initProjectionSystems: function () {
+            var projectionSystemsByDefault = [
+                {
+                    label: 'Géographique',
+                    crs: L.CRS.Simple,
+                    type: 'Geographical'
+                },
+                {
+                    label: 'Web Mercator',
+                    crs: L.CRS.EPSG3395,
+                    type: 'Metric'
+                },
+                {
+                    label: 'Lambert 93',
+                    crs: CRS.EPSG2154,
+                    type: 'Metric',
+                    geoBBox: {
+                        left: -9.86,
+                        bottom: 41.15,
+                        right: 10.38,
+                        top: 51.56
+                    }
+                },
+                {
+                    label: 'Lambert II étendu',
+                    crs: CRS.EPSG27572,
+                    type: 'Metric',
+                    geoBBox: {
+                        left: -4.87,
+                        bottom: 42.33,
+                        right: 8.23,
+                        top: 51.14
+                    }
+                }
+            ];
+            var systems = this.options.systems;
+            for (var i = 0; i < systems.length; i++) {
+                var sys = systems[i];
+                if (!sys.label) {
+                    continue;
+                }
+                if (!sys.crs) {
+                    continue;
+                }
+                if (!sys.type) {
+                    sys.type = 'Metric';
+                }
+                this._projectionSystems.push(systems[i]);
+                var found = false;
+                for (var j = 0; j < projectionSystemsByDefault.length; j++) {
+                    var obj = projectionSystemsByDefault[j];
+                    if (sys.crs === obj.crs) {
+                        found = true;
+                    }
+                }
+                if (!found) {
+                }
+            }
+            if (this._projectionSystems.length === 0) {
+                this._projectionSystems = projectionSystemsByDefault;
+            }
+            for (var k = 0; k < this._projectionSystems.length; ++k) {
+                this._projectionSystems[k].code = k;
+            }
+        },
+        _initProjectionUnits: function () {
+            var projectionUnitsByDefault = {
+                Geographical: [
+                    {
+                        code: 'DEC',
+                        label: 'degrés décimaux',
+                        convert: this._displayDEC
+                    },
+                    {
+                        code: 'DMS',
+                        label: 'degrés sexagésimaux',
+                        convert: this._displayDMS
+                    },
+                    {
+                        code: 'RAD',
+                        label: 'radians',
+                        convert: this._displayRAD
+                    },
+                    {
+                        code: 'GON',
+                        label: 'grades',
+                        convert: this._displayGON
+                    }
+                ],
+                Metric: [
+                    {
+                        code: 'M',
+                        label: 'mètres',
+                        convert: this._displayMeter
+                    },
+                    {
+                        code: 'KM',
+                        label: 'kilomètres',
+                        convert: this._displayKMeter
+                    }
+                ]
+            };
+            var units = this.options.units;
+            for (var type in projectionUnitsByDefault) {
+                if (projectionUnitsByDefault.hasOwnProperty(type)) {
+                    var found = false;
+                    for (var j = 0; j < projectionUnitsByDefault[type].length; j++) {
+                        var obj = projectionUnitsByDefault[type][j];
+                        for (var i = 0; i < units.length; i++) {
+                            var unit = units[i];
+                            if (obj.code === unit) {
+                                found = true;
+                                if (!this._projectionUnits[type]) {
+                                    this._projectionUnits[type] = [];
+                                }
+                                this._projectionUnits[type].push(obj);
+                            }
+                        }
+                    }
+                    if (!found) {
+                        this._projectionUnits[type] = projectionUnitsByDefault[type];
+                    }
+                }
+            }
+            if (Object.keys(this._projectionUnits).length === 0) {
+                this._projectionUnits = projectionUnitsByDefault;
+            }
+        },
+        _checkRightsManagement: function () {
+            var rightManagement = RightManagement.check({
+                key: this.options.apiKey,
+                resources: ['SERVICE_CALCUL_ALTIMETRIQUE_RSC'],
+                services: ['Elevation']
+            });
+            if (!rightManagement) {
+                this._noRightManagement = true;
+            }
+            if (!this.options.apiKey) {
+                this.options.apiKey = rightManagement.key;
+            }
+        },
+        _detectSupport: function () {
+            var isDesktop = true;
+            var userAgent = window.navigator.userAgent.toLowerCase();
+            if (userAgent.indexOf('iphone') !== -1 || userAgent.indexOf('ipod') !== -1 || userAgent.indexOf('ipad') !== -1 || userAgent.indexOf('android') !== -1 || userAgent.indexOf('mobile') !== -1 || userAgent.indexOf('blackberry') !== -1 || userAgent.indexOf('tablet') !== -1 || userAgent.indexOf('phone') !== -1 || userAgent.indexOf('touch') !== -1) {
+                isDesktop = false;
+            }
+            if (userAgent.indexOf('msie') !== -1 || userAgent.indexOf('trident') !== -1) {
+                isDesktop = true;
+            }
+            return isDesktop;
+        },
+        _initLayout: function () {
+            var container = this._createMainContainerElement();
+            var inputShow = this._showMousePositionContainer = this._createShowMousePositionElement();
+            container.appendChild(inputShow);
+            if (!this.options.collapsed) {
+                inputShow.checked = true;
+            }
+            var picto = this._createShowMousePositionPictoElement(this._isDesktop);
+            container.appendChild(picto);
+            var panel = this._createMousePositionPanelElement(this.options.displayAltitude, this.options.displayCoordinates);
+            var settings = this._createMousePositionSettingsElement();
+            var systems = this._projectionSystemsContainer = this._createMousePositionSettingsSystemsElement(this._projectionSystems);
+            var units = this._projectionUnitsContainer = this._createMousePositionSettingsUnitsElement(this._projectionUnits[this._currentProjectionType]);
+            settings.appendChild(systems);
+            settings.appendChild(units);
+            panel.appendChild(settings);
+            container.appendChild(panel);
+            var center = this._createMapCenter();
+            var map = this._map;
+            map.getContainer().appendChild(center);
+            return container;
+        },
+        _setElevationPanel: function (active) {
+            var div = null;
+            if (!active) {
+                div = L.DomUtil.get(this._addUID('GPmousePositionAltitude'));
+                div.style.display = 'none';
+            }
+            if (active && this._noRightManagement) {
+                div = L.DomUtil.get(this._addUID('GPmousePositionAlt'));
+                div.innerHTML = 'no right !';
+            }
+        },
+        _setCoordinatePanel: function (active) {
+            if (!active) {
+                var div = L.DomUtil.get(this._addUID('GPmousePositionCoordinate'));
+                div.style.display = 'none';
+            }
+        },
+        _setSettingsPanel: function (active) {
+            if (!active) {
+                var divPicto = L.DomUtil.get('GPshowMousePositionSettingsPicto');
+                var divPanel = L.DomUtil.get(this._addUID('GPmousePositionSettings'));
+                divPicto.style.display = 'none';
+                divPanel.style.display = 'none';
+            }
+        },
+        _setTypeUnitsPanel: function (type) {
+            var container = this._projectionUnitsContainer;
+            while (container.firstChild) {
+                container.removeChild(container.firstChild);
+            }
+            var units = this._projectionUnits[type];
+            for (var j = 0; j < units.length; j++) {
+                var obj = units[j];
+                var option = document.createElement('option');
+                option.value = obj.code ? obj.code : j;
+                option.text = obj.label || j;
+                container.appendChild(option);
+            }
+            this._currentProjectionType = type;
+            this._currentProjectionUnits = this._projectionUnits[type][0].code;
+        },
+        _displayDEC: function (oLatLng) {
+            var coordinate = {};
+            coordinate.lat = PositionFormater.roundToDecimal(oLatLng.lat, 6);
+            coordinate.lng = PositionFormater.roundToDecimal(oLatLng.lng, 6);
+            return coordinate;
+        },
+        _displayDMS: function (oLatLng) {
+            var coordinate = {};
+            coordinate.lat = PositionFormater.decimalLatToDMS(oLatLng.lat);
+            coordinate.lng = PositionFormater.decimalLongToDMS(oLatLng.lng);
+            return coordinate;
+        },
+        _displayRAD: function (oLatLng) {
+            var coordinate = {};
+            coordinate.lat = PositionFormater.decimalToRadian(oLatLng.lat);
+            coordinate.lng = PositionFormater.decimalToRadian(oLatLng.lng);
+            return coordinate;
+        },
+        _displayGON: function (oLatLng) {
+            var coordinate = {};
+            coordinate.lat = PositionFormater.decimalToGrade(oLatLng.lat);
+            coordinate.lng = PositionFormater.decimalToGrade(oLatLng.lng);
+            return coordinate;
+        },
+        _displayMeter: function (oXY) {
+            var coordinate = {};
+            coordinate.x = L.Util.formatNum(oXY.x, 2);
+            coordinate.y = L.Util.formatNum(oXY.y, 2);
+            coordinate.unit = 'm';
+            return coordinate;
+        },
+        _displayKMeter: function (oXY) {
+            var coordinate = {};
+            coordinate.x = L.Util.formatNum(oXY.x / 1000, 2);
+            coordinate.y = L.Util.formatNum(oXY.y / 1000, 2);
+            coordinate.unit = 'km';
+            return coordinate;
+        },
+        _project: function (oLatLng, crs) {
+            if (typeof crs === 'function') {
+                crs = crs();
+            }
+            if (typeof crs !== 'object') {
+                return;
+            }
+            if (crs === L.CRS.Simple) {
+                return oLatLng;
+            }
+            if (!crs.projection || typeof crs.projection !== 'object') {
+                return;
+            }
+            var oPoint = crs.projection.project(oLatLng);
+            if (this._currentProjectionType === 'Geographical') {
+                oPoint.lat = oPoint.y;
+                oPoint.lng = oPoint.x;
+            }
+            if (!oPoint || Object.keys(oPoint).length === 0) {
+            }
+            return oPoint;
+        },
+        _setCoordinate: function (oLatLng) {
+            var type = this._currentProjectionSystems.type;
+            var convert = null;
+            var units = this._projectionUnits[type];
+            for (var i = 0; i < units.length; i++) {
+                if (units[i].code === this._currentProjectionUnits) {
+                    convert = units[i].convert;
+                    break;
+                }
+            }
+            var coordinate = {};
+            var oSrs = this._currentProjectionSystems.crs;
+            if (!oSrs) {
+                return;
+            }
+            coordinate = convert(this._project(oLatLng, oSrs));
+            if (!coordinate || Object.keys(coordinate).lenght === 0) {
+                return;
+            }
+            this.GPdisplayCoords(coordinate);
+        },
+        _setElevation: function (oLatLng) {
+            var delay = this.options.altitude.responseDelay;
+            var noDataValue = this.options.altitude.noDataValue;
+            var noDataValueTolerance = this.options.altitude.noDataValueTolerance;
+            this.GPdisplayElevation(oLatLng, delay, noDataValue, noDataValueTolerance);
+        },
+        onMoveStopped: function (oLatLng) {
+            if (this._noRightManagement) {
+                return;
+            }
+            this._setElevation(oLatLng);
+        },
+        onMouseMove: function (e) {
+            var self = this;
+            var oLatLng = e.latlng;
+            this._setCoordinate(oLatLng);
+            clearTimeout(this._timer);
+            this._timer = setTimeout(function () {
+                self.onMoveStopped(oLatLng);
+            }, this.options.altitude.triggerDelay);
+        },
+        onMapMove: function () {
+            var self = this;
+            var map = this._map;
+            var oLatLng = map.getCenter();
+            this._setCoordinate(oLatLng);
+            clearTimeout(this._timer);
+            this._timer = setTimeout(function () {
+                self.onMoveStopped(oLatLng);
+            }, this.options.altitude.triggerDelay);
+        },
+        onRequestAltitude: function (coordinate, callback) {
+            if (!coordinate || Object.keys(coordinate).length === 0) {
+                return;
+            }
+            if (!this.options.displayAltitude) {
+                return;
+            }
+            if (this._noRightManagement) {
+                return;
+            }
+            var options = {};
+            L.Util.extend(options, this.options.altitude.serviceOptions);
+            L.Util.extend(options, {
+                zonly: true,
+                positions: [{
+                        lon: coordinate.lon || coordinate.lng,
+                        lat: coordinate.lat
+                    }]
+            });
+            L.Util.extend(options, {
+                scope: this,
+                onSuccess: function (results) {
+                    if (results && Object.keys(results)) {
+                        callback.call(this, results.elevations[0].z);
+                    }
+                },
+                onFailure: function (error) {
+                }
+            });
+            L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey });
+            Gp.Services.getAltitude(options);
+        },
+        onShowMousePositionClick: function (e) {
+            var map = this._map;
+            if (this._showMousePositionContainer.checked) {
+                this._isDesktop ? map.off('mousemove', this.onMouseMove, this) : map.off('move', this.onMapMove, this);
+            } else {
+                this._isDesktop ? map.on('mousemove', this.onMouseMove, this) : map.on('move', this.onMapMove, this);
+            }
+            this._setElevationPanel(this.options.displayAltitude);
+            this._setCoordinatePanel(this.options.displayCoordinates);
+            if (!this.options.displayCoordinates) {
+                this._setSettingsPanel(false);
+            }
+        },
+        onMousePositionProjectionSystemChange: function (e) {
+            var idx = e.target.selectedIndex;
+            var value = e.target.options[idx].value;
+            var label = e.target.options[idx].label;
+            this._setCurrentSystem(value);
+        },
+        _setCurrentSystem: function (systemCode) {
+            var type = null;
+            for (var i = 0; i < this._projectionSystems.length; ++i) {
+                if (this._projectionSystems[i].code == systemCode) {
+                    type = this._projectionSystems[i].type;
+                    break;
+                }
+            }
+            if (!type) {
+                return;
+            }
+            if (type !== this._currentProjectionType) {
+                this._setTypeUnitsPanel(type);
+            }
+            this._currentProjectionSystems = this._projectionSystems[Number(systemCode)];
+            if (!this._isDesktop) {
+                this.onMapMove();
+            }
+        },
+        onMousePositionProjectionSystemMouseOver: function (e) {
+            var map = this._map;
+            if (!map) {
+                return;
+            }
+            var systemList = document.getElementById(this._addUID('GPmousePositionProjectionSystem'));
+            systemList.innerHTML = '';
+            for (var j = 0; j < this._projectionSystems.length; j++) {
+                var proj = this._projectionSystems[j];
+                if (proj.geoBBox) {
+                    if (map.getBounds()._southWest.lng > proj.geoBBox.right || map.getBounds()._southWest.lat > proj.geoBBox.top || map.getBounds()._northEast.lng < proj.geoBBox.left || map.getBounds()._northEast.lat < proj.geoBBox.bottom) {
+                        if (proj === this._currentProjectionSystems) {
+                            var option = document.createElement('option');
+                            option.value = proj.code;
+                            option.text = proj.label || j;
+                            option.setAttribute('selected', 'selected');
+                            option.setAttribute('disabled', 'disabled');
+                            systemList.appendChild(option);
+                        }
+                        continue;
+                    }
+                }
+                var option = document.createElement('option');
+                option.value = proj.code;
+                option.text = proj.label || j;
+                if (proj === this._currentProjectionSystems) {
+                    option.setAttribute('selected', 'selected');
+                }
+                systemList.appendChild(option);
+            }
+        },
+        onMousePositionProjectionUnitsChange: function (e) {
+            var idx = e.target.selectedIndex;
+            var value = e.target.options[idx].value;
+            var label = e.target.options[idx].label;
+            this._currentProjectionUnits = value;
+            if (!this._isDesktop) {
+                this.onMapMove();
+            }
+        }
+    });
+    return MousePosition;
+}(leaflet, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, CommonControlsMousePositionDOM, LeafletControlsUtilsPositionFormater, LeafletCRSCRS);
+CommonControlsReverseGeocodingDOM = function () {
+    var ReverseGeocodingDOM = {
+        _addUID: function (id) {
+            return id + '-' + this._uid;
+        },
+        _createMainContainerElement: function () {
+            var container = document.createElement('div');
+            container.id = this._addUID('GPreverseGeocoding');
+            container.className = 'GPwidget';
+            return container;
+        },
+        _createShowReverseGeocodingElement: function () {
+            var input = document.createElement('input');
+            input.id = this._addUID('GPshowReverseGeocoding');
+            input.type = 'checkbox';
+            return input;
+        },
+        _createShowReverseGeocodingPictoElement: function () {
+            var self = this;
+            var label = document.createElement('label');
+            label.id = this._addUID('GPshowReverseGeocodingPicto');
+            label.className = 'GPshowAdvancedToolPicto';
+            label.htmlFor = this._addUID('GPshowReverseGeocoding');
+            label.title = 'Ouvrir la recherche inverse';
+            if (label.addEventListener) {
+                label.addEventListener('click', function () {
+                    self.onShowReverseGeocodingClick();
+                });
+            } else if (label.attachEvent) {
+                label.attachEvent('onclick', function () {
+                    self.onShowReverseGeocodingClick();
+                });
+            }
+            var spanOpen = document.createElement('span');
+            spanOpen.id = this._addUID('GPshowReverseGeocodingOpen');
+            spanOpen.className = 'GPshowAdvancedToolOpen';
+            label.appendChild(spanOpen);
+            return label;
+        },
+        _createReverseGeocodingWaitingElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPreverseGeocodingCalcWaitingContainer');
+            div.className = 'GPreverseGeocodingCalcWaitingContainerHidden';
+            var p = document.createElement('p');
+            p.className = 'GPreverseGeocodingCalcWaiting';
+            p.innerHTML = 'Recherche en cours...';
+            div.appendChild(p);
+            return div;
+        },
+        _createReverseGeocodingResultsPanelElement: function () {
+            var resultsPanelDiv = document.createElement('div');
+            resultsPanelDiv.id = this._addUID('GPreverseGeocodingResultsPanel');
+            resultsPanelDiv.className = 'GPpanel GPreverseGeocodingComponentHidden';
+            return resultsPanelDiv;
+        },
+        _createReverseGeocodingResultsListElement: function () {
+            var container = document.createElement('div');
+            container.id = this._addUID('GPreverseGeocodingResultsList');
+            return container;
+        },
+        _createReverseGeocodingResultElement: function (locationDescription, id) {
+            var context = this;
+            var container = document.getElementById(this._addUID('GPreverseGeocodingResultsList'));
+            var div = document.createElement('div');
+            div.id = this._addUID('ReverseGeocodedLocation_' + id);
+            div.className = 'GPautoCompleteProposal';
+            div.innerHTML = locationDescription;
+            div.title = locationDescription;
+            if (div.addEventListener) {
+                div.addEventListener('mouseover', function (e) {
+                    context.onReverseGeocodingResultMouseOver(e);
+                });
+                div.addEventListener('mouseout', function (e) {
+                    context.onReverseGeocodingResultMouseOut(e);
+                });
+                div.addEventListener('click', function (e) {
+                    if (typeof context.onReverseGeocodingResultClick === 'function') {
+                        context.onReverseGeocodingResultClick(e);
+                    }
+                });
+            } else if (div.attachEvent) {
+                div.attachEvent('onmouseover', function (e) {
+                    context.onReverseGeocodingResultMouseOver(e);
+                });
+                div.attachEvent('onmouseout', function (e) {
+                    context.onReverseGeocodingResultMouseOut(e);
+                });
+                div.attachEvent('onclick', function (e) {
+                    if (typeof context.onReverseGeocodingResultClick === 'function') {
+                        context.onReverseGeocodingResultClick(e);
+                    }
+                });
+            }
+            container.appendChild(div);
+        },
+        _createReverseGeocodingPanelElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPreverseGeocodingPanel');
+            div.className = 'GPpanel';
+            return div;
+        },
+        _createReverseGeocodingPanelHeaderElement: function () {
+            var container = document.createElement('div');
+            container.className = 'GPpanelHeader';
+            return container;
+        },
+        _createReverseGeocodingPanelReturnPictoElement: function () {
+            var self = this;
+            var divNew = document.createElement('div');
+            divNew.id = this._addUID('GPreverseGeocodingReturnPicto');
+            divNew.title = 'Nouvelle recherche';
+            divNew.className = 'GPreverseGeocodingReturnPictoHidden';
+            if (divNew.addEventListener) {
+                divNew.addEventListener('click', function (e) {
+                    document.getElementById(self._addUID('GPreverseGeocodingResultsPanel')).className = 'GProuteComponentHidden';
+                    document.getElementById(self._addUID('GPreverseGeocodingForm')).className = '';
+                    document.getElementById(self._addUID('GPreverseGeocodingHeaderTitle')).innerHTML = 'Recherche inverse';
+                    document.getElementById(self._addUID('GPreverseGeocodingReturnPicto')).className = 'GPreverseGeocodingReturnPictoHidden';
+                    self.onGPreverseGeocodingReturnPictoClick(e);
+                });
+            } else if (divNew.attachEvent) {
+                divNew.attachEvent('onclick', function (e) {
+                    document.getElementById(self._addUID('GPreverseGeocodingResultsPanel')).className = 'GProuteComponentHidden';
+                    document.getElementById(self._addUID('GPreverseGeocodingForm')).className = '';
+                    document.getElementById(self._addUID('GPreverseGeocodingHeaderTitle')).innerHTML = 'Recherche inverse';
+                    document.getElementById(self._addUID('GPreverseGeocodingReturnPicto')).className = 'GPreverseGeocodingReturnPictoHidden';
+                    self.onGPreverseGeocodingReturnPictoClick(e);
+                });
+            }
+            return divNew;
+        },
+        _createReverseGeocodingPanelTitleElement: function () {
+            var div = document.createElement('div');
+            div.className = 'GPpanelTitle';
+            div.id = this._addUID('GPreverseGeocodingHeaderTitle');
+            div.innerHTML = 'Recherche inverse';
+            return div;
+        },
+        _createReverseGeocodingPanelCloseElement: function () {
+            var self = this;
+            var divClose = document.createElement('div');
+            divClose.id = this._addUID('GPreverseGeocodingPanelClose');
+            divClose.className = 'GPpanelClose';
+            divClose.title = 'Fermer le panneau';
+            if (divClose.addEventListener) {
+                divClose.addEventListener('click', function () {
+                    document.getElementById(self._addUID('GPshowReverseGeocodingPicto')).click();
+                }, false);
+            } else if (divClose.attachEvent) {
+                divClose.attachEvent('onclick', function () {
+                    document.getElementById(self._addUID('GPshowReverseGeocodingPicto')).click();
+                });
+            }
+            return divClose;
+        },
+        _createReverseGeocodingPanelFormElement: function () {
+            var self = this;
+            var form = document.createElement('form');
+            form.id = this._addUID('GPreverseGeocodingForm');
+            if (form.addEventListener) {
+                form.addEventListener('submit', function (e) {
+                    e.preventDefault();
+                    self.onReverseGeocodingSubmit();
+                });
+            } else if (form.attachEvent) {
+                form.attachEvent('onsubmit', function (e) {
+                    e.preventDefault();
+                    self.onReverseGeocodingSubmit();
+                });
+            }
+            return form;
+        },
+        _createReverseGeocodingFormModeChoiceGeocodingTypeElement: function (resources) {
+            var context = this;
+            var div = document.createElement('div');
+            div.className = 'GPflexInput';
+            var label = document.createElement('label');
+            label.className = 'GPreverseGeocodingCodeLabel';
+            label.innerHTML = 'Recherche par';
+            label.title = 'Recherche par';
+            div.appendChild(label);
+            var select = document.createElement('select');
+            select.className = 'GPreverseGeocodingCode';
+            if (select.addEventListener) {
+                select.addEventListener('change', function (e) {
+                    context.onReverseGeocodingTypeChange(e);
+                });
+            } else if (select.attachEvent) {
+                select.attachEvent('onchange', function (e) {
+                    context.onReverseGeocodingTypeChange(e);
+                });
+            }
+            if (!resources || !Array.isArray(resources)) {
+                resources = [
+                    'StreetAddress',
+                    'PositionOfInterest',
+                    'CadastralParcel'
+                ];
+            }
+            for (var i = 0; i < resources.length; i++) {
+                switch (resources[i]) {
+                case 'PositionOfInterest':
+                    var POIOption = document.createElement('option');
+                    POIOption.value = 'PositionOfInterest';
+                    POIOption.text = 'Lieux/toponymes';
+                    select.appendChild(POIOption);
+                    break;
+                case 'StreetAddress':
+                    var SAOption = document.createElement('option');
+                    SAOption.value = 'StreetAddress';
+                    SAOption.text = 'Adresses';
+                    select.appendChild(SAOption);
+                    break;
+                case 'CadastralParcel':
+                    var CPOption = document.createElement('option');
+                    CPOption.value = 'CadastralParcel';
+                    CPOption.text = 'Parcelles cadastrales';
+                    select.appendChild(CPOption);
+                    break;
+                case 'Administratif':
+                    var adminOption = document.createElement('option');
+                    adminOption.value = 'Administratif';
+                    adminOption.text = 'Unités administratives';
+                    select.appendChild(adminOption);
+                    break;
+                default:
+                    break;
+                }
+            }
+            div.appendChild(select);
+            return div;
+        },
+        _createReverseGeocodingFormModeChoiceGeocodingDelimitationElement: function (delimitations) {
+            var context = this;
+            var div = document.createElement('div');
+            div.className = 'GPflexInput';
+            var label = document.createElement('label');
+            label.className = 'GPreverseGeocodingCodeLabel';
+            label.innerHTML = 'Délimitation';
+            label.title = 'Délimitation';
+            div.appendChild(label);
+            var select = document.createElement('select');
+            select.className = 'GPreverseGeocodingCode';
+            if (select.addEventListener) {
+                select.addEventListener('change', function (e) {
+                    context.onReverseGeocodingDelimitationChange(e);
+                });
+            } else if (select.attachEvent) {
+                select.attachEvent('onchange', function (e) {
+                    context.onReverseGeocodingDelimitationChange(e);
+                });
+            }
+            if (!delimitations || !Array.isArray(delimitations)) {
+                delimitations = [
+                    'Point',
+                    'Circle',
+                    'Extent'
+                ];
+            }
+            for (var i = 0; i < delimitations.length; i++) {
+                switch (delimitations[i].toLowerCase()) {
+                case 'point':
+                    var pointOption = document.createElement('option');
+                    pointOption.value = 'point';
+                    pointOption.text = 'Pointer un lieu';
+                    select.appendChild(pointOption);
+                    break;
+                case 'circle':
+                    var circleOption = document.createElement('option');
+                    circleOption.value = 'circle';
+                    circleOption.text = 'Dessiner un cercle';
+                    select.appendChild(circleOption);
+                    break;
+                case 'extent':
+                    var extentOption = document.createElement('option');
+                    extentOption.value = 'extent';
+                    extentOption.text = 'Dessiner une emprise';
+                    select.appendChild(extentOption);
+                    break;
+                default:
+                    break;
+                }
+            }
+            div.appendChild(select);
+            return div;
+        },
+        _createReverseGeocodingSubmitFormElement: function () {
+            var input = document.createElement('input');
+            input.id = this._addUID('GPreverseGeocodingSubmit');
+            input.className = 'GPinputSubmit';
+            input.type = 'submit';
+            input.value = 'Rechercher';
+            return input;
+        }
+    };
+    return ReverseGeocodingDOM;
+}();
+LeafletControlsReverseGeocoding = function (L, P, woodman, Gp, RightManagement, ID, IconDefault, ReverseGeocodingDOM) {
+    var ReverseGeocoding = L.Control.extend({
+        includes: ReverseGeocodingDOM,
+        options: {
+            position: 'bottomleft',
+            collapsed: true,
+            resources: [
+                'StreetAddress',
+                'PositionOfInterest'
+            ],
+            delimitations: [
+                'Point',
+                'Circle',
+                'Extent'
+            ],
+            reverseGeocodeOptions: {}
+        },
+        initialize: function (options) {
+            L.Util.extend(this.options, options);
+            this._noRightManagement = false;
+            this._servicesRightManagement = {};
+            this._checkRightsManagement();
+            this._checkInputOptions();
+            this._uid = ID.generate();
+            this._currentGeocodingType = null;
+            this._initGeocodingType();
+            this._currentGeocodingDelimitation = null;
+            this._initGeocodingDelimitation();
+            this._showReverseGeocodingContainer = null;
+            this._panelHeaderContainer = null;
+            this._panelTitleContainer = null;
+            this._returnPictoContainer = null;
+            this._formContainer = null;
+            this._resultsContainer = null;
+            this._resultsListContainer = null;
+            this._waitingContainer = null;
+            this._inputFeaturesLayer = null;
+            this._inputResultsLayer = null;
+            this._lastIdLayer = 0;
+            this._currentIdLayer = 0;
+            this._currentFeature = null;
+            this._requestPosition = null;
+            this._requestCircleFilter = null;
+            this._requestBboxFilter = null;
+            this._waiting = false;
+            this._timer = null;
+            this._reverseGeocodingLocations = [];
+        },
+        onAdd: function (map) {
+            var container = this._container = this._initLayout();
+            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
+            if (map) {
+                if (!this.options.collapsed) {
+                    this._activateMapInteraction(map);
+                }
+            }
+            return container;
+        },
+        onRemove: function () {
+        },
+        _checkRightsManagement: function () {
+            var _resources = [];
+            var _key;
+            var _opts = null;
+            _key = this.options.reverseGeocodeOptions.apiKey;
+            _opts = this.options.reverseGeocodeOptions.filterOptions;
+            _resources = _opts ? _opts.type : [];
+            if (!_resources || _resources.length === 0) {
+                _resources = this.options.resources;
+            }
+            if (!_resources || _resources.length === 0) {
+                _resources = [
+                    'StreetAddress',
+                    'PositionOfInterest'
+                ];
+            }
+            var rightManagementGeocode = RightManagement.check({
+                key: _key || this.options.apiKey,
+                resources: _resources,
+                services: ['Geocode']
+            });
+            if (!rightManagementGeocode) {
+                this._noRightManagement = true;
+                return;
+            }
+            if (!this.options.apiKey) {
+                this.options.apiKey = rightManagementGeocode.key;
+            }
+            if (rightManagementGeocode) {
+                this._servicesRightManagement['Geocode'] = rightManagementGeocode['Geocode'];
+            }
+        },
+        _checkInputOptions: function () {
+            var i;
+            if (this.options.resources) {
+                var resources = this.options.resources;
+                if (!Array.isArray(resources)) {
+                    console.log('[ReverseGeocoding] \'options.resources\' parameter should be an array');
+                    resources = null;
+                }
+                var resourcesList = [
+                    'StreetAddress',
+                    'PositionOfInterest',
+                    'CadastralParcel',
+                    'Administratif'
+                ];
+                for (i = 0; i < resources.length; i++) {
+                    if (resourcesList.indexOf(resources[i]) === -1) {
+                        console.log('[ReverseGeocoding] options.resources : ' + resources[i] + ' is not a resource for reverse geocode');
+                    }
+                }
+            }
+            if (this.options.delimitations) {
+                var delimitations = this.options.delimitations;
+                if (!Array.isArray(delimitations)) {
+                    console.log('[ReverseGeocoding] \'options.delimitations\' parameter should be an array');
+                    delimitations = null;
+                }
+                var delimitationsList = [
+                    'Circle',
+                    'Point',
+                    'Extent'
+                ];
+                for (i = 0; i < delimitations.length; i++) {
+                    if (delimitationsList.indexOf(delimitations[i]) === -1) {
+                        console.log('[ReverseGeocoding] options.delimitations : ' + delimitations[i] + ' is not a delimitation for reverse geocode');
+                    }
+                }
+            }
+        },
+        _initGeocodingType: function () {
+            this._currentGeocodingType = 'StreetAddress';
+            var resources = this.options.resources;
+            if (!resources || resources.length === 0) {
+                this.options.resources = [
+                    'StreetAddress',
+                    'PositionOfInterest',
+                    'CadastralParcel'
+                ];
+            }
+            if (Array.isArray(resources) && resources.length) {
+                var noRightsIndexes = [];
+                for (var i = 0; i < resources.length; i++) {
+                    if (this._servicesRightManagement['Geocode'].indexOf(resources[i]) < 0) {
+                        noRightsIndexes.push(i);
+                        console.log('[ReverseGeocode] no rights for options.resources : ' + resources[i]);
+                    }
+                }
+                if (noRightsIndexes.length !== 0) {
+                    for (var j = 0; j < noRightsIndexes.length; j++) {
+                        resources.splice(noRightsIndexes[j], 1);
+                    }
+                }
+                if (resources[0] === 'StreetAddress' || resources[0] === 'PositionOfInterest' || resources[0] === 'CadastralParcel' || resources[0] === 'Administratif') {
+                    this._currentGeocodingType = resources[0];
+                }
+            }
+            var serviceOptions = this.options.reverseGeocodeOptions;
+            if (serviceOptions.filterOptions && Array.isArray(serviceOptions.filterOptions.type) && serviceOptions.filterOptions.type.length !== 0) {
+                this._currentGeocodingType = serviceOptions.filterOptions.type[0];
+            }
+        },
+        _initGeocodingDelimitation: function () {
+            this._currentGeocodingDelimitation = 'Point';
+            var delimitations = this.options.delimitations;
+            if (!delimitations || delimitations.length === 0) {
+                this.options.delimitations = [
+                    'Point',
+                    'Circle',
+                    'Extent'
+                ];
+            }
+            if (Array.isArray(delimitations) && delimitations.length) {
+                var d = delimitations[0].toLowerCase();
+                if (d === 'point' || d === 'circle' || d === 'extent') {
+                    this._currentGeocodingDelimitation = delimitations[0];
+                }
+            }
+        },
+        _initLayout: function () {
+            var container = this._createMainContainerElement();
+            var inputShow = this._showReverseGeocodingContainer = this._createShowReverseGeocodingElement();
+            container.appendChild(inputShow);
+            if (!this.options.collapsed) {
+                inputShow.checked = true;
+            }
+            var picto = this._createShowReverseGeocodingPictoElement();
+            container.appendChild(picto);
+            var reverseGeocodingPanel = this._createReverseGeocodingPanelElement();
+            var panelHeader = this._panelHeaderContainer = this._createReverseGeocodingPanelHeaderElement();
+            var returnPicto = this._returnPictoContainer = this._createReverseGeocodingPanelReturnPictoElement();
+            panelHeader.appendChild(returnPicto);
+            var panelTitle = this._panelTitleContainer = this._createReverseGeocodingPanelTitleElement();
+            panelHeader.appendChild(panelTitle);
+            var closeDiv = this._createReverseGeocodingPanelCloseElement();
+            panelHeader.appendChild(closeDiv);
+            reverseGeocodingPanel.appendChild(panelHeader);
+            var reverseGeocodingForm = this._formContainer = this._createReverseGeocodingPanelFormElement();
+            reverseGeocodingForm.appendChild(this._createReverseGeocodingFormModeChoiceGeocodingTypeElement(this.options.resources));
+            reverseGeocodingForm.appendChild(this._createReverseGeocodingFormModeChoiceGeocodingDelimitationElement(this.options.delimitations));
+            var submit = this._createReverseGeocodingSubmitFormElement();
+            reverseGeocodingForm.appendChild(submit);
+            reverseGeocodingPanel.appendChild(reverseGeocodingForm);
+            var waiting = this._waitingContainer = this._createReverseGeocodingWaitingElement();
+            reverseGeocodingPanel.appendChild(waiting);
+            var resultsPanel = this._resultsContainer = this._createReverseGeocodingResultsPanelElement();
+            var reverseGeocodingResultsList = this._resultsListContainer = this._createReverseGeocodingResultsListElement();
+            resultsPanel.appendChild(reverseGeocodingResultsList);
+            reverseGeocodingPanel.appendChild(resultsPanel);
+            container.appendChild(reverseGeocodingPanel);
+            return container;
+        },
+        _activateMapInteraction: function (map) {
+            if (this._inputFeaturesLayer === null) {
+                this._inputFeaturesLayer = new L.FeatureGroup();
+                map.addLayer(this._inputFeaturesLayer);
+                var self = this;
+                map.on('draw:created', function (e) {
+                    var layer = e.layer;
+                    var type = e.layerType;
+                    self._setFeaturePosition(layer, type);
+                    self._currentIdLayer = L.Util.stamp(layer);
+                    self._setFeatureLayer(layer);
+                });
+                map.on('draw:drawstart', function () {
+                    self._removeFeatureLayer(self._lastIdLayer);
+                    self._lastIdLayer = self._currentIdLayer;
+                });
+                map.on('draw:drawstop', function () {
+                });
+            }
+            var delimitation = this._currentGeocodingDelimitation.toLowerCase();
+            switch (delimitation) {
+            case 'point':
+                this._activatePointInteraction(map);
+                break;
+            case 'circle':
+                this._activateCircleInteraction(map);
+                break;
+            case 'extent':
+                this._activateBoxInteraction(map);
+                break;
+            default:
+                break;
+            }
+        },
+        _removeMapInteraction: function (map) {
+            if (!map) {
+                return;
+            }
+            if (this._inputFeaturesLayer !== null) {
+                map.off('draw:created');
+                map.off('draw:drawstart');
+                map.off('draw:drawstop');
+                map.removeLayer(this._inputFeaturesLayer);
+                this._inputFeaturesLayer = null;
+            }
+            this._lastIdLayer = this._currentIdLayer = 0;
+            if (this._currentFeature) {
+                this._currentFeature.disable();
+            }
+        },
+        _activatePointInteraction: function (map) {
+            if (this._currentFeature) {
+                this._currentFeature.disable();
+            }
+            L.drawLocal.draw.handlers.marker.tooltip.start = 'click map to place search point';
+            var markerOptions = { repeatMode: true };
+            this._currentFeature = new L.Draw.Marker(map, markerOptions);
+            this._currentFeature.enable();
+        },
+        _activateCircleInteraction: function (map) {
+            if (this._currentFeature) {
+                this._currentFeature.disable();
+            }
+            var circleOptions = { repeatMode: true };
+            this._currentFeature = new L.Draw.Circle(map, circleOptions);
+            this._currentFeature.enable();
+        },
+        _activateBoxInteraction: function (map) {
+            if (this._currentFeature) {
+                this._currentFeature.disable();
+            }
+            var rectangleOptions = { repeatMode: true };
+            this._currentFeature = new L.Draw.Rectangle(map, rectangleOptions);
+            this._currentFeature.enable();
+        },
+        _setFeaturePosition: function (layer, type) {
+            var oLatLng = null;
+            if (type === 'marker') {
+                oLatLng = layer.getLatLng();
+                this._requestPosition = {
+                    x: oLatLng.lat,
+                    y: oLatLng.lng
+                };
+            } else if (type === 'circle') {
+                oLatLng = layer.getLatLng();
+                this._requestPosition = {
+                    x: oLatLng.lat,
+                    y: oLatLng.lng
+                };
+                this._requestCircleFilter = {
+                    x: oLatLng.lat,
+                    y: oLatLng.lng,
+                    radius: layer.getRadius()
+                };
+            } else if (type === 'rectangle') {
+                oLatLng = layer.getBounds();
+                var center = {
+                    lng: (oLatLng.getSouthWest().lng + oLatLng.getNorthEast().lng) / 2,
+                    lat: (oLatLng.getSouthWest().lat + oLatLng.getNorthEast().lat) / 2
+                };
+                this._requestPosition = {
+                    x: center.lat,
+                    y: center.lng
+                };
+                this._requestBboxFilter = {
+                    left: oLatLng.getSouthWest().lat,
+                    right: oLatLng.getNorthEast().lat,
+                    bottom: oLatLng.getSouthWest().lng,
+                    top: oLatLng.getNorthEast().lng
+                };
+            } else {
+            }
+        },
+        _setFeatureLayer: function (layer) {
+            if (!this._inputFeaturesLayer) {
+                return;
+            }
+            this._inputFeaturesLayer.addLayer(layer);
+        },
+        _removeFeatureLayer: function (id) {
+            if (!this._inputFeaturesLayer) {
+                return;
+            }
+            if (id === 0) {
+                return;
+            }
+            if (!id) {
+                this._inputFeaturesLayer.clearLayers();
+            } else {
+                this._inputFeaturesLayer.removeLayer(id);
+            }
+        },
+        _reverseGeocodingRequest: function (settings) {
+            var map = this._map;
+            this._removeMapInteraction(map);
+            var options = {};
+            L.Util.extend(options, this.options.reverseGeocodeOptions);
+            L.Util.extend(options, settings);
+            L.Util.extend(options, {
+                apiKey: this.options.apiKey,
+                srs: 'EPSG:4326',
+                returnFreeForm: false,
+                timeOut: 30000,
+                protocol: 'XHR'
+            });
+            var _type = options.filterOptions.type;
+            if (this._currentGeocodingDelimitation.toLowerCase() === 'circle' && this._requestCircleFilter) {
+                if (this._requestCircleFilter.radius > 1000) {
+                    this._requestCircleFilter.radius = 1000;
+                }
+                L.Util.extend(options, {
+                    filterOptions: {
+                        type: _type,
+                        circle: this._requestCircleFilter
+                    }
+                });
+            }
+            if (this._currentGeocodingDelimitation.toLowerCase() === 'extent' && this._requestBboxFilter) {
+                L.Util.extend(options, {
+                    filterOptions: {
+                        type: _type,
+                        bbox: this._requestBboxFilter
+                    }
+                });
+            }
+            this._displayWaitingContainer();
+            Gp.Services.reverseGeocode(options);
+        },
+        _displayGeocodedLocations: function (locations) {
+            this._clearLocations();
+            this._clearLocationsFeature();
+            this._reverseGeocodingLocations = locations;
+            if (!locations || locations.length === 0) {
+                this._clearInputRequest();
+                return;
+            }
+            this._formContainer.className = 'GPreverseGeocodingComponentHidden';
+            this._hideWaitingContainer();
+            this._panelTitleContainer.innerHTML = 'Résultats de la recherche';
+            this._returnPictoContainer.className = '';
+            this._resultsContainer.className = 'GPpanel';
+            this._fillGeocodedLocationListContainer(locations);
+            this._displayGeocodedLocationsOnMap(locations);
+            var map = this._map;
+            map.fitBounds(this._inputResultsLayer.getBounds());
+        },
+        _fillGeocodedLocationListContainer: function (locations) {
+            for (var i = 0; i < locations.length; i++) {
+                var location = locations[i];
+                var locationDescription = this._fillGeocodedLocationDescription(location);
+                if (locationDescription.length !== 0) {
+                    this._createReverseGeocodingResultElement(locationDescription, i);
+                }
+            }
+        },
+        _fillGeocodedLocationDescription: function (location) {
+            if (!location || !location.placeAttributes) {
+                return;
+            }
+            var attr = location.placeAttributes;
+            var locationDescription = '';
+            switch (location.type) {
+            case 'StreetAddress':
+                if (attr.street) {
+                    locationDescription += attr.number ? attr.number + ' ' : '';
+                    locationDescription += attr.street + ', ';
+                }
+                locationDescription += attr.postalCode + ' ' + attr.commune;
+                break;
+            case 'PositionOfInterest':
+                if (location.matchType === 'City' && attr.commune) {
+                    locationDescription += attr.commune;
+                    locationDescription += attr.postalCode ? ', ' + attr.postalCode : '';
+                } else if (location.matchType === 'Département' && attr.municipality) {
+                    locationDescription += attr.municipality;
+                    locationDescription += attr.postalCode ? ', ' + attr.postalCode : '';
+                } else if (location.matchType === 'Toponym' && attr.municipality) {
+                    locationDescription += attr.municipality;
+                    locationDescription += attr.postalCode ? ', ' + attr.postalCode : '';
+                    locationDescription += attr.commune ? ' ' + attr.commune : '';
+                } else {
+                    locationDescription += attr.municipality ? attr.municipality : '';
+                }
+                locationDescription += attr.nature ? ' (' + attr.nature + ') ' : '';
+                break;
+            case 'CadastralParcel':
+                locationDescription += attr.cadastralParcel ? attr.cadastralParcel : '';
+                locationDescription += attr.municipality ? ' (' + attr.municipality + ')' : '';
+                break;
+            case 'Administratif':
+                locationDescription += attr.municipality ? attr.municipality : '';
+                if (attr.inseeDepartment) {
+                    locationDescription += '(Département)';
+                } else if (attr.inseeRegion) {
+                    locationDescription += '(Région)';
+                }
+                break;
+            default:
+                locationDescription += attr.municipality ? attr.municipality : '';
+                break;
+            }
+            return locationDescription;
+        },
+        _displayGeocodedLocationsOnMap: function (locations) {
+            var map = this._map;
+            var self = this;
+            function _setHighLight(e) {
+                var layer = e.target;
+                layer.setIcon(new IconDefault('red'));
+                var div = L.DomUtil.get('ReverseGeocodedLocation_' + layer.options.id + '-' + self._uid);
+                L.DomUtil.addClass(div, 'GPreverseGeocodedLocationHighlight');
+                div.scrollIntoView(false);
+            }
+            function _resetHighLight(e) {
+                var layer = e.target;
+                layer.setIcon(new IconDefault('green'));
+                var div = L.DomUtil.get('ReverseGeocodedLocation_' + layer.options.id + '-' + self._uid);
+                L.DomUtil.removeClass(div, 'GPreverseGeocodedLocationHighlight');
+            }
+            this._inputResultsLayer = new L.FeatureGroup();
+            map.addLayer(this._inputResultsLayer);
+            for (var i = 0; i < locations.length; i++) {
+                var location = locations[i];
+                if (!location) {
+                    continue;
+                }
+                var options = {
+                    id: i,
+                    icon: new IconDefault('green'),
+                    riseOnHover: true,
+                    draggable: false,
+                    clickable: true,
+                    zIndexOffset: 1000
+                };
+                var _marker = L.marker(L.latLng(location.position.x, location.position.y), options);
+                var popupContent = '<ul>';
+                var attributes = location.placeAttributes;
+                for (var attr in attributes) {
+                    if (attributes.hasOwnProperty(attr)) {
+                        if (attr !== 'bbox') {
+                            popupContent += '<li>';
+                            popupContent += '<span class="gp-attname-others-span">' + attr.toUpperCase() + ' : </span>';
+                            popupContent += attributes[attr];
+                            popupContent += ' </li>';
+                        }
+                    }
+                }
+                popupContent += ' </ul>';
+                _marker.bindPopup(popupContent);
+                _marker.on('mouseover', _setHighLight);
+                _marker.on('mouseout', _resetHighLight);
+                this._inputResultsLayer.addLayer(_marker);
+            }
+        },
+        onShowReverseGeocodingClick: function () {
+            var map = this._map;
+            if (this._showReverseGeocodingContainer.checked) {
+                this._removeMapInteraction(map);
+            } else {
+                if (!this._waiting && !this._reverseGeocodingLocations.length) {
+                    this._activateMapInteraction(map);
+                }
+            }
+        },
+        onReverseGeocodingTypeChange: function (e) {
+            var idx = e.target.selectedIndex;
+            var value = e.target.options[idx].value;
+            if (!value) {
+                return;
+            }
+            this._currentGeocodingType = value;
+        },
+        onReverseGeocodingDelimitationChange: function (e) {
+            var idx = e.target.selectedIndex;
+            var value = e.target.options[idx].value;
+            if (!value) {
+                return;
+            }
+            this._currentGeocodingDelimitation = value;
+            this._clearInputRequest();
+            var map = this._map;
+            this._removeMapInteraction(map);
+            this._activateMapInteraction(map);
+        },
+        onGPreverseGeocodingReturnPictoClick: function () {
+            this._clearLocations();
+            this._clearLocationsFeature();
+            this._clearInputRequest();
+            this._activateMapInteraction(this._map);
+        },
+        onReverseGeocodingSubmit: function () {
+            if (!this._requestPosition) {
+                return;
+            }
+            if (this._noRightManagement) {
+                return;
+            }
+            var self = this;
+            this._reverseGeocodingRequest({
+                position: self._requestPosition,
+                filterOptions: { type: [self._currentGeocodingType] },
+                onSuccess: function (results) {
+                    if (results) {
+                        var locations = results.locations;
+                        self._displayGeocodedLocations(locations);
+                        self._hideWaitingContainer();
+                    }
+                },
+                onFailure: function (error) {
+                    self._hideWaitingContainer();
+                    self._clearLocations();
+                    self._clearLocationsFeature();
+                    self._clearInputRequest();
+                }
+            });
+        },
+        onReverseGeocodingResultClick: function (e) {
+        },
+        onReverseGeocodingResultMouseOver: function (e) {
+            var idx = ID.index(e.target.id);
+            if (e.target.classList) {
+                e.target.classList.add('GPreverseGeocodedLocationHighlight');
+            }
+            if (!this._inputResultsLayer) {
+                return;
+            }
+            this._inputResultsLayer.eachLayer(function (layer) {
+                if (layer.options.id === parseInt(idx, 10)) {
+                    layer.fire('mouseover');
+                }
+            });
+        },
+        onReverseGeocodingResultMouseOut: function (e) {
+            var idx = ID.index(e.target.id);
+            if (e.target.classList) {
+                e.target.classList.remove('GPreverseGeocodedLocationHighlight');
+            }
+            if (!this._inputResultsLayer) {
+                return;
+            }
+            this._inputResultsLayer.eachLayer(function (layer) {
+                if (layer.options.id === parseInt(idx, 10)) {
+                    layer.fire('mouseout');
+                }
+            });
+        },
+        _clearLocations: function () {
+            this._reverseGeocodingLocations = [];
+            if (this._resultsListContainer) {
+                while (this._resultsListContainer.firstChild) {
+                    this._resultsListContainer.removeChild(this._resultsListContainer.firstChild);
+                }
+            }
+        },
+        _clearLocationsFeature: function () {
+            var map = this._map;
+            if (this._inputResultsLayer !== null) {
+                map.removeLayer(this._inputResultsLayer);
+                this._inputResultsLayer = null;
+            }
+        },
+        _clearInputRequest: function () {
+            this._requestPosition = null;
+            this._requestCircleFilter = null;
+            this._requestBboxFilter = null;
+        },
+        _displayWaitingContainer: function () {
+            this._waitingContainer.className = 'GPreverseGeocodingCalcWaitingContainerVisible';
+            this._waiting = true;
+            if (this._timer) {
+                clearTimeout(this._timer);
+                this._timer = null;
+            }
+            var context = this;
+            this._timer = setTimeout(function () {
+                if (context._waiting === true) {
+                    context._hideWaitingContainer();
+                } else {
+                    if (context._timer) {
+                        clearTimeout(context._timer);
+                    }
+                }
+            }, 16000);
+        },
+        _hideWaitingContainer: function () {
+            if (this._waiting) {
+                this._waitingContainer.className = 'GPreverseGeocodingCalcWaitingContainerHidden';
+                this._waiting = false;
+                clearTimeout(this._timer);
+                this._timer = null;
+            }
+        }
+    });
+    return ReverseGeocoding;
+}(leaflet, leafletDraw, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, LeafletControlsUtilsIconDefault, CommonControlsReverseGeocodingDOM);
+CommonControlsRouteDOM = function (ID) {
+    var RouteDOM = {
+        _addUID: function (id) {
+            return id + '-' + this._uid;
+        },
+        _createMainContainerElement: function () {
+            var container = document.createElement('div');
+            container.id = this._addUID('GProute');
+            container.className = 'GPwidget';
+            return container;
+        },
+        _createShowRouteElement: function () {
+            var input = document.createElement('input');
+            input.id = this._addUID('GPshowRoute');
+            input.type = 'checkbox';
+            return input;
+        },
+        _createShowRoutePictoElement: function () {
+            var context = this;
+            var label = document.createElement('label');
+            label.id = this._addUID('GPshowRoutePicto');
+            label.className = 'GPshowAdvancedToolPicto';
+            label.htmlFor = this._addUID('GPshowRoute');
+            label.title = 'Ouvrir le calcul d\'itinéraire';
+            if (label.addEventListener) {
+                label.addEventListener('click', function (e) {
+                    context.onShowRoutePanelClick(e);
+                });
+            } else if (label.attachEvent) {
+                label.attachEvent('onclick', function (e) {
+                    context.onShowRoutePanelClick(e);
+                });
+            }
+            var spanOpen = document.createElement('span');
+            spanOpen.id = this._addUID('GPshowRouteOpen');
+            spanOpen.className = 'GPshowAdvancedToolOpen';
+            label.appendChild(spanOpen);
+            return label;
+        },
+        _createRoutePanelElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GProutePanel');
+            div.className = 'GPpanel';
+            return div;
+        },
+        _createRoutePanelHeaderElement: function () {
+            var self = this;
+            var container = document.createElement('div');
+            container.className = 'GPpanelHeader';
+            var div = document.createElement('div');
+            div.className = 'GPpanelTitle';
+            div.innerHTML = 'Calcul d\'itinéraire';
+            container.appendChild(div);
+            var divClose = document.createElement('div');
+            divClose.id = this._addUID('GProutePanelClose');
+            divClose.className = 'GPpanelClose';
+            divClose.title = 'Masquer le panneau';
+            if (divClose.addEventListener) {
+                divClose.addEventListener('click', function () {
+                    document.getElementById(self._addUID('GPshowRoutePicto')).click();
+                }, false);
+            } else if (divClose.attachEvent) {
+                divClose.attachEvent('onclick', function () {
+                    document.getElementById(self._addUID('GPshowRoutePicto')).click();
+                });
+            }
+            container.appendChild(divClose);
+            return container;
+        },
+        _createRoutePanelFormElement: function () {
+            var self = this;
+            var form = document.createElement('form');
+            form.id = this._addUID('GProuteForm');
+            form.setAttribute('onkeypress', 'return event.keyCode != 13;');
+            form.addEventListener('submit', function (e) {
+                console.log(e);
+                e.preventDefault();
+                var points = document.getElementsByClassName(self._addUID('GPlocationPoint'));
+                var start = points[0].childNodes[0].id;
+                var end = points[points.length - 1].childNodes[0].id;
+                var startID = ID.index(start);
+                var endID = ID.index(end);
+                if (document.getElementById(self._addUID('GPlocationOrigin_' + startID)).value == '' && document.getElementById(self._addUID('GPlocationOriginCoords_' + startID)).value == '' || document.getElementById(self._addUID('GPlocationOrigin_' + endID)).value == '' && document.getElementById(self._addUID('GPlocationOriginCoords_' + endID)).value == '') {
+                    return false;
+                }
+                var id;
+                document.getElementById(self._addUID('GProuteResultsStages')).innerHTML = '';
+                for (var i = 0; i < points.length; i++) {
+                    var tag = points[i].childNodes[0].id;
+                    id = ID.index(tag);
+                    if (document.getElementById(self._addUID('GPlocationPoint_' + id)).className == 'GPflexInput GPlocationStageFlexInput') {
+                        var resultStage = document.createElement('div');
+                        resultStage.className = 'GProuteResultsStages';
+                        var resultStageLabel = document.createElement('div');
+                        resultStageLabel.className = 'GProuteResultStageLabel';
+                        resultStageLabel.innerHTML = document.getElementById(self._addUID('GPlocationOriginLabel_' + id)).innerHTML + ' :';
+                        resultStage.appendChild(resultStageLabel);
+                        var resultStageValue = document.createElement('div');
+                        resultStageValue.className = 'GProuteResultStageValue';
+                        var elementCoords = document.getElementById(self._addUID('GPlocationOriginCoords_' + id));
+                        var stageCoords = elementCoords.value;
+                        var visible = elementCoords.className === 'GPlocationOriginVisible' ? true : false;
+                        if (stageCoords != null && stageCoords != '' && visible) {
+                            resultStageValue.innerHTML = stageCoords;
+                        } else {
+                            resultStageValue.innerHTML = document.getElementById(self._addUID('GPlocationOrigin_' + id)).value;
+                        }
+                        resultStage.appendChild(resultStageValue);
+                        if (resultStageValue.innerHTML != '') {
+                            document.getElementById(self._addUID('GProuteResultsStages')).appendChild(resultStage);
+                        }
+                    }
+                }
+                var modeComputation = null;
+                if (document.getElementById(self._addUID('GProuteComputationSelect'))) {
+                    var select = document.getElementById(self._addUID('GProuteResultsComputationSelect'));
+                    select.selectedIndex = document.getElementById(self._addUID('GProuteComputationSelect')).selectedIndex;
+                    modeComputation = select.options[select.selectedIndex].value;
+                }
+                var modeTransport = null;
+                if (document.getElementById(self._addUID('GProuteTransportCar'))) {
+                    if (document.getElementById(self._addUID('GProuteTransportCar')).checked) {
+                        modeTransport = document.getElementById(self._addUID('GProuteTransportCar')).value;
+                    }
+                }
+                if (document.getElementById(self._addUID('GProuteTransportPedestrian'))) {
+                    if (document.getElementById(self._addUID('GProuteTransportPedestrian')).checked) {
+                        modeTransport = document.getElementById(self._addUID('GProuteTransportPedestrian')).value;
+                    }
+                }
+                var exclusions = [];
+                var exclusionsElement = document.getElementsByClassName('GProuteExclusionsOption');
+                for (var j = 0; j < exclusionsElement.length; j++) {
+                    id = exclusionsElement[j].htmlFor;
+                    var el = document.getElementById(id);
+                    if (!el.checked) {
+                        exclusions.push(el.value);
+                    }
+                }
+                self.onRouteComputationSubmit({
+                    computation: modeComputation,
+                    transport: modeTransport,
+                    exclusions: exclusions
+                });
+                return false;
+            });
+            return form;
+        },
+        _createRoutePanelResultsElement: function () {
+            var container = document.createElement('div');
+            container.id = this._addUID('GProuteResultsPanel');
+            container.className = 'GProuteComponentHidden';
+            container.appendChild(this._createRouteResultsStagesElement());
+            container.appendChild(this._createRouteResultsElement());
+            var divBorderUp = document.createElement('div');
+            divBorderUp.className = 'GPfakeBorder GPfakeBorderLeft';
+            container.appendChild(divBorderUp);
+            container.appendChild(this._createRouteShowResultsDetailsElement());
+            var labelShow = document.createElement('label');
+            labelShow.htmlFor = this._addUID('GProuteResultsShowDetails');
+            labelShow.innerHTML = 'Afficher le détail';
+            container.appendChild(labelShow);
+            var labelHide = document.createElement('label');
+            labelHide.htmlFor = this._addUID('GProuteResultsShowDetails');
+            labelHide.innerHTML = 'Masquer le détail';
+            container.appendChild(labelHide);
+            var divBorderDown = document.createElement('div');
+            divBorderDown.className = 'GPfakeBorder';
+            container.appendChild(divBorderDown);
+            container.appendChild(this._createRouteResultsDetailsElement());
+            return container;
+        },
+        _createRouteWaitingElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GProuteCalcWaitingContainer');
+            div.className = 'GProuteCalcWaitingContainerHidden';
+            var p = document.createElement('p');
+            p.className = 'GProuteCalcWaiting';
+            p.innerHTML = 'Calcul en cours...';
+            div.appendChild(p);
+            return div;
+        },
+        _createRouteResultsStagesElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GProuteResultsStages');
+            return div;
+        },
+        _createRouteResultsElement: function () {
+            var self = this;
+            var container = document.createElement('div');
+            container.id = this._addUID('GProuteResults');
+            var divValue = document.createElement('div');
+            divValue.id = this._addUID('GProuteResultsValues');
+            container.appendChild(divValue);
+            var divMode = document.createElement('div');
+            divMode.id = this._addUID('GProuteResultsMode');
+            var select = document.createElement('select');
+            select.id = this._addUID('GProuteResultsComputationSelect');
+            select.className = 'GPinputSelect';
+            select.addEventListener('change', function (e) {
+                self.onRouteModeComputationChangeAndRun(e);
+            });
+            var computes = [
+                {
+                    code: 'fastest',
+                    label: 'Plus rapide'
+                },
+                {
+                    code: 'shortest',
+                    label: 'Plus court'
+                }
+            ];
+            for (var i = 0; i < computes.length; i++) {
+                var option = document.createElement('option');
+                option.value = computes[i].code;
+                option.text = computes[i].label;
+                select.appendChild(option);
+            }
+            divMode.appendChild(select);
+            container.appendChild(divMode);
+            var divNew = document.createElement('div');
+            divNew.id = this._addUID('GProuteResultsNew');
+            divNew.title = 'Modifier le calcul';
+            divNew.addEventListener('click', function (e) {
+                document.getElementById(self._addUID('GProuteResultsPanel')).className = 'GProuteComponentHidden';
+                document.getElementById(self._addUID('GProuteForm')).className = '';
+                self.onShowRouteResultsNewClick(e);
+            });
+            container.appendChild(divNew);
+            return container;
+        },
+        _addRouteResultsValuesElement: function (distance, duration, fconvert) {
+            var div = document.getElementById(this._addUID('GProuteResultsValues'));
+            if (div.childElementCount) {
+                while (div.firstChild) {
+                    div.removeChild(div.firstChild);
+                }
+            }
+            var containerDistance = document.createElement('div');
+            containerDistance.className = 'GProuteResultsValue';
+            var labelDistance = document.createElement('label');
+            labelDistance.className = 'GProuteResultsValueLabel';
+            labelDistance.innerHTML = 'Distance :';
+            containerDistance.appendChild(labelDistance);
+            var distanceLabel = 0;
+            var isKm = parseInt(distance / 1000, 10);
+            if (!isKm) {
+                distanceLabel = Math.round(distance) + ' m';
+            } else {
+                var distanceArrondi = Math.round(distance);
+                distanceArrondi = distanceArrondi / 1000;
+                distanceLabel = distanceArrondi + ' km';
+            }
+            var divDistance = document.createElement('div');
+            divDistance.id = this._addUID('GProuteResultsValueDist');
+            divDistance.innerHTML = distanceLabel;
+            containerDistance.appendChild(divDistance);
+            div.appendChild(containerDistance);
+            var containerDuration = document.createElement('div');
+            containerDuration.className = 'GProuteResultsValue';
+            var labelDuration = document.createElement('label');
+            labelDuration.className = 'GProuteResultsValueLabel';
+            labelDuration.innerHTML = 'Durée :';
+            containerDuration.appendChild(labelDuration);
+            var divDuration = document.createElement('div');
+            divDuration.id = this._addUID('GProuteResultsValueDist');
+            divDuration.innerHTML = fconvert(duration);
+            containerDuration.appendChild(divDuration);
+            div.appendChild(containerDuration);
+            return div;
+        },
+        _createRouteShowResultsDetailsElement: function () {
+            var input = document.createElement('input');
+            input.id = this._addUID('GProuteResultsShowDetails');
+            input.type = 'checkbox';
+            return input;
+        },
+        _createRouteResultsDetailsElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GProuteResultsDetails');
+            return div;
+        },
+        _addRouteResultsDetailsElement: function (instructions, fconvert) {
+            var context = this;
+            var div = document.getElementById(this._addUID('GProuteResultsDetails'));
+            if (div.childElementCount) {
+                while (div.firstChild) {
+                    div.removeChild(div.firstChild);
+                }
+            }
+            var distanceCumul = 0;
+            var durationCumul = 0;
+            for (var i = 0; i < instructions.length; i++) {
+                var id = i + 1;
+                var o = instructions[i];
+                var divNum = document.createElement('div');
+                divNum.className = 'GProuteResultsDetailsNumber';
+                divNum.innerHTML = id + '.';
+                div.appendChild(divNum);
+                durationCumul += parseFloat(o.duration);
+                distanceCumul += parseFloat(o.distance);
+                var distance = 0;
+                var isCumulKm = parseInt(distanceCumul / 1000, 10);
+                if (!isCumulKm) {
+                    distance = Math.round(distanceCumul) + ' m';
+                } else {
+                    var distanceArrondi = Math.round(distanceCumul);
+                    distanceArrondi = distanceArrondi / 1000;
+                    distance = distanceArrondi + ' km';
+                }
+                var divIns = document.createElement('div');
+                divIns.className = 'GProuteResultsDetailsInstruction';
+                divIns.id = this._addUID('GProuteResultsDetailsInstruction_' + id);
+                divIns.title = 'distance : ' + distance + ' / ' + 'temps : ' + fconvert(durationCumul);
+                divIns.innerHTML = o.instruction;
+                divIns.addEventListener('mouseover', function (e) {
+                    context.onRouteResultsDetailsMouseOver(e);
+                });
+                divIns.addEventListener('mouseout', function (e) {
+                    context.onRouteResultsDetailsMouseOut(e);
+                });
+                divIns.addEventListener('click', function (e) {
+                    if (typeof context.onRouteResultsDetailsClick === 'function') {
+                        context.onRouteResultsDetailsClick(e);
+                    }
+                });
+                div.appendChild(divIns);
+            }
+            return div;
+        },
+        _createRoutePanelFormPointElement: function (n, text, visibility) {
+            var context = this;
+            var div = document.createElement('div');
+            div.id = 'GProutePoint' + n;
+            div.className = visibility ? 'GPflexInput GProuteStageFlexInput' : 'GPflexInput GProuteStageFlexInputHidden';
+            var labelOrigin = document.createElement('label');
+            labelOrigin.id = 'GProuteOriginLabel' + n;
+            labelOrigin.htmlFor = 'GProuteOrigin' + n;
+            labelOrigin.innerHTML = text;
+            labelOrigin.addEventListener('click', function () {
+                var i = this.id.charAt(this.id.length - 1);
+                document.getElementById('GProuteOriginCoords' + i).value = '';
+                for (var j = 1; j < 8; j++) {
+                    document.getElementById('GProutePoint' + j).style.display = 'flex';
+                }
+                document.getElementById('GProuteForm').className = '';
+                document.getElementById('GProuteOriginPointer' + i).checked = false;
+                document.getElementById('GProuteOrigin' + i).className = 'GProuteOriginVisible';
+                document.getElementById('GProuteOriginCoords' + i).className = 'GProuteOriginHidden';
+            });
+            div.appendChild(labelOrigin);
+            var inputOrigin = document.createElement('input');
+            inputOrigin.id = 'GProuteOrigin' + n;
+            inputOrigin.className = 'GProuteOriginVisible';
+            inputOrigin.type = 'text';
+            inputOrigin.placeholder = 'Saisir une adresse';
+            inputOrigin.addEventListener('keyup', function (e) {
+                var charCode = e.which || e.keyCode;
+                if (charCode === 13 || charCode === 10) {
+                    return;
+                }
+                var i = this.id.charAt(this.id.length - 1);
+                if (document.getElementById('GProuteOrigin' + i).value.length > 2) {
+                    document.getElementById('GProuteAutoCompleteList' + i).style.display = 'block';
+                } else {
+                    document.getElementById('GProuteAutoCompleteList' + i).style.display = 'none';
+                }
+                context.onAutoCompleteSearchText(e);
+            });
+            inputOrigin.addEventListener('blur', function () {
+                var i = this.id.charAt(this.id.length - 1);
+                document.getElementById('GProuteAutoCompleteList' + i).style.display = 'none';
+            });
+            div.appendChild(inputOrigin);
+            var inputOriginCoord = document.createElement('input');
+            inputOriginCoord.id = 'GProuteOriginCoords' + n;
+            inputOriginCoord.className = 'GProuteOriginHidden';
+            inputOriginCoord.type = 'text';
+            inputOriginCoord.disabled = true;
+            div.appendChild(inputOriginCoord);
+            var inputOriginPointer = document.createElement('input');
+            inputOriginPointer.id = 'GProuteOriginPointer' + n;
+            inputOriginPointer.type = 'checkbox';
+            div.appendChild(inputOriginPointer);
+            var labelOriginPointer = document.createElement('label');
+            labelOriginPointer.id = 'GProuteOriginPointerImg' + n;
+            labelOriginPointer.htmlFor = 'GProuteOriginPointer' + n;
+            labelOriginPointer.className = 'GProuteOriginPointerImg';
+            labelOriginPointer.title = 'Pointer un lieu sur la carte';
+            labelOriginPointer.addEventListener('click', function (evt) {
+                evt.preventDefault();
+                evt.stopPropagation();
+                var i = this.id.charAt(this.id.length - 1);
+                var j;
+                for (j = 1; j < 8; j++) {
+                    if (i != j) {
+                        document.getElementById('GProuteOriginPointer' + j).checked = false;
+                        if (document.getElementById('GProuteOriginCoords' + j).value == 'Pointer un lieu sur la carte') {
+                            document.getElementById('GProuteOriginCoords' + j).value = '';
+                            document.getElementById('GProuteOrigin' + j).className = 'GProuteOriginVisible';
+                            document.getElementById('GProuteOriginCoords' + j).className = 'GProuteOriginHidden';
+                        }
+                    }
+                }
+                if (document.getElementById('GProuteOriginPointer' + i).checked) {
+                    document.getElementById('GProuteOriginCoords' + i).value = '';
+                    for (j = 1; j < 8; j++) {
+                        document.getElementById('GProutePoint' + j).style.display = 'flex';
+                    }
+                    document.getElementById('GProuteForm').className = '';
+                    document.getElementById('GProuteOriginPointer' + i).checked = false;
+                    document.getElementById('GProuteOrigin' + i).className = 'GProuteOriginVisible';
+                    document.getElementById('GProuteOriginCoords' + i).className = 'GProuteOriginHidden';
+                } else {
+                    document.getElementById('GProuteOriginCoords' + i).value = 'Pointer un lieu sur la carte';
+                    for (j = 1; j < 8; j++) {
+                        if (i == j) {
+                            document.getElementById('GProutePoint' + j).style.display = 'flex';
+                        } else {
+                            document.getElementById('GProutePoint' + j).style.display = 'none';
+                        }
+                    }
+                    document.getElementById('GProuteForm').className = 'GProuteFormMini';
+                    document.getElementById('GProuteOriginPointer' + i).checked = true;
+                    document.getElementById('GProuteOrigin' + i).className = 'GProuteOriginHidden';
+                    document.getElementById('GProuteOriginCoords' + i).className = 'GProuteOriginVisible';
+                }
+                context.onRouteMapPointClick(evt);
+            });
+            div.appendChild(labelOriginPointer);
+            return div;
+        },
+        _createRoutePanelFormRemoveStageElement: function (n) {
+            var context = this;
+            var divRm = document.createElement('div');
+            divRm.id = 'GProuteStageRemove' + n;
+            divRm.className = 'GProuteStageRemove';
+            divRm.title = 'Supprimer l\'étape';
+            if (n != 1 && n != 7) {
+                divRm.addEventListener('click', function (e) {
+                    var i = this.id.charAt(this.id.length - 1);
+                    document.getElementById('GProutePoint' + i).className = 'GPflexInput GProuteStageFlexInputHidden';
+                    document.getElementById('GProuteOrigin' + i).value = '';
+                    document.getElementById('GProuteOrigin' + i).className = 'GProuteOriginVisible';
+                    document.getElementById('GProuteOriginCoords' + i).value = '';
+                    document.getElementById('GProuteOriginCoords' + i).className = 'GProuteOriginHidden';
+                    document.getElementById('GProuteStageAdd').style.display = '';
+                    var exclusionsPictoTop = document.getElementById('GPshowRouteExclusionsPicto').style.top;
+                    document.getElementById('GPshowRouteExclusionsPicto').style.top = (parseInt(exclusionsPictoTop, 10) - 33).toString() + 'px';
+                    context.onRouteRemovePointClick(e);
+                });
+            }
+            return divRm;
+        },
+        _createRoutePanelFormAddStageElement: function () {
+            var context = this;
+            var divAdd = document.createElement('div');
+            divAdd.id = 'GProuteStageAdd';
+            divAdd.title = 'Ajouter une étape';
+            divAdd.addEventListener('click', function (e) {
+                var lastStage = 1;
+                var nbStages = 0;
+                for (var i = 2; i < 7; i++) {
+                    if (document.getElementById('GProutePoint' + i).className == 'GPflexInput GProuteStageFlexInputHidden') {
+                        if (lastStage == 1) {
+                            lastStage = i;
+                        }
+                    } else {
+                        nbStages++;
+                    }
+                }
+                if (lastStage < 7) {
+                    document.getElementById('GProutePoint' + lastStage).className = 'GPflexInput GProuteStageFlexInput';
+                    var exclusionsPictoTop = document.getElementById('GPshowRouteExclusionsPicto').style.top;
+                    document.getElementById('GPshowRouteExclusionsPicto').style.top = (parseInt(exclusionsPictoTop, 10) + 33).toString() + 'px';
+                }
+                if (nbStages == 4) {
+                    document.getElementById('GProuteStageAdd').style.display = 'none';
+                }
+                context.onRouteAddPointClick(e);
+            });
+            return divAdd;
+        },
+        _createRoutePanelFormAutoCompleteListElement: function (n) {
+            var context = this;
+            var div = document.createElement('div');
+            div.id = 'GProuteAutoCompleteList' + n;
+            div.className = 'GPadvancedAutoCompleteList';
+            if (div.addEventListener) {
+                div.addEventListener('click', function (e) {
+                    context.onAutoCompletedResultsItemClick(e);
+                    document.getElementById('GProuteAutoCompleteList' + n).style.display = 'none';
+                }, false);
+            } else if (div.attachEvent) {
+                div.attachEvent('onclick', function (e) {
+                    context.onAutoCompletedResultsItemClick(e);
+                    document.getElementById('GProuteAutoCompleteList' + n).style.display = 'none';
+                });
+            }
+            return div;
+        },
+        _createRouteAutoCompletedLocationElement: function (location, n, id) {
+            var container = document.getElementById('GProuteAutoCompleteList' + n);
+            var div = document.createElement('div');
+            div.id = 'AutoCompletedLocation' + id;
+            div.className = 'GPautoCompleteProposal';
+            div.innerHTML = location.fullText;
+            container.appendChild(div);
+        },
+        _createRoutePanelFormModeChoiceElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GProuteModeChoice');
+            return div;
+        },
+        _createRoutePanelFormModeChoiceTransportElement: function (transports) {
+            var context = this;
+            var div = document.createElement('div');
+            div.id = this._addUID('GProuteTransportChoice');
+            var span = document.createElement('span');
+            span.className = 'GProuteModeLabel';
+            span.innerHTML = 'Mode de transport';
+            div.appendChild(span);
+            for (var i = 0; i < transports.length; i++) {
+                var transport = transports[i];
+                if (transport === 'Voiture') {
+                    var inputCar = document.createElement('input');
+                    inputCar.id = this._addUID('GProuteTransportCar');
+                    inputCar.type = 'radio';
+                    inputCar.name = 'GProuteTransport';
+                    inputCar.value = 'Voiture';
+                    if (i === 0) {
+                        inputCar.checked = true;
+                    }
+                    if (inputCar.addEventListener) {
+                        inputCar.addEventListener('change', function (e) {
+                            context.onRouteModeTransportChange(e);
+                        });
+                    } else if (inputCar.attachEvent) {
+                        inputCar.attachEvent('onchange', function (e) {
+                            context.onRouteModeTransportChange(e);
+                        });
+                    }
+                    div.appendChild(inputCar);
+                    var labelCar = document.createElement('label');
+                    labelCar.className = 'GProuteTransportImg';
+                    labelCar.htmlFor = this._addUID('GProuteTransportCar');
+                    labelCar.title = 'Voiture';
+                    div.appendChild(labelCar);
+                }
+                if (transport === 'Pieton') {
+                    var inputPedestrian = document.createElement('input');
+                    inputPedestrian.id = this._addUID('GProuteTransportPedestrian');
+                    inputPedestrian.type = 'radio';
+                    inputPedestrian.name = 'GProuteTransport';
+                    inputPedestrian.value = 'Pieton';
+                    if (i === 0) {
+                        inputPedestrian.checked = true;
+                    }
+                    if (inputPedestrian.addEventListener) {
+                        inputPedestrian.addEventListener('change', function (e) {
+                            context.onRouteModeTransportChange(e);
+                        });
+                    } else if (inputPedestrian.attachEvent) {
+                        inputPedestrian.attachEvent('onchange', function (e) {
+                            context.onRouteModeTransportChange(e);
+                        });
+                    }
+                    div.appendChild(inputPedestrian);
+                    var labelPedestrian = document.createElement('label');
+                    labelPedestrian.className = 'GProuteTransportImg';
+                    labelPedestrian.htmlFor = this._addUID('GProuteTransportPedestrian');
+                    labelPedestrian.title = 'Piéton';
+                    div.appendChild(labelPedestrian);
+                }
+            }
+            return div;
+        },
+        _createRoutePanelFormModeChoiceComputeElement: function () {
+            var context = this;
+            var div = document.createElement('div');
+            div.id = this._addUID('GProuteComputationChoice');
+            var span = document.createElement('span');
+            span.className = 'GProuteModeLabel';
+            span.innerHTML = 'Mode de calcul';
+            div.appendChild(span);
+            var select = document.createElement('select');
+            select.id = this._addUID('GProuteComputationSelect');
+            select.className = 'GPinputSelect';
+            select.addEventListener('change', function (e) {
+                context.onRouteModeComputationChange(e);
+            });
+            var computes = [
+                {
+                    code: 'fastest',
+                    label: 'Plus rapide'
+                },
+                {
+                    code: 'shortest',
+                    label: 'Plus court'
+                }
+            ];
+            for (var i = 0; i < computes.length; i++) {
+                var option = document.createElement('option');
+                option.value = computes[i].code;
+                option.text = computes[i].label;
+                select.appendChild(option);
+            }
+            div.appendChild(select);
+            return div;
+        },
+        _createShowRouteExclusionsElement: function () {
+            var input = document.createElement('input');
+            input.id = this._addUID('GPshowRouteExclusions');
+            input.type = 'checkbox';
+            return input;
+        },
+        _createShowRouteExclusionsPictoElement: function () {
+            var context = this;
+            var label = document.createElement('label');
+            label.id = this._addUID('GPshowRouteExclusionsPicto');
+            label.className = 'GPshowMoreOptions GPshowRouteExclusionsPicto';
+            label.htmlFor = this._addUID('GPshowRouteExclusions');
+            label.title = 'Exclusions';
+            label.style.top = '185px';
+            if (label.addEventListener) {
+                label.addEventListener('click', function (e) {
+                    context.onShowRouteExclusionsClick(e);
+                });
+            } else if (label.attachEvent) {
+                label.attachEvent('onclick', function (e) {
+                    context.onShowRouteExclusionsClick(e);
+                });
+            }
+            return label;
+        },
+        _createRoutePanelFormExclusionsElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GProuteExclusions');
+            var span = document.createElement('span');
+            span.className = 'GProuteExclusionsLabel';
+            span.innerHTML = 'Passages autorisés';
+            div.appendChild(span);
+            return div;
+        },
+        _createRoutePanelFormExclusionOptionsElement: function (exclusions) {
+            var context = this;
+            var div = document.createElement('div');
+            div.className = 'GProuteExclusionsOptions';
+            for (var value in exclusions) {
+                if (exclusions.hasOwnProperty(value)) {
+                    var status = exclusions[value];
+                    switch (value) {
+                    case 'toll':
+                        var inputToll = document.createElement('input');
+                        inputToll.id = this._addUID('GProuteExclusionsToll');
+                        inputToll.type = 'checkbox';
+                        inputToll.value = 'Toll';
+                        inputToll.checked = !status;
+                        if (inputToll.addEventListener) {
+                            inputToll.addEventListener('change', function (e) {
+                                context.onRouteExclusionsChange(e);
+                            });
+                        } else if (inputToll.attachEvent) {
+                            inputToll.attachEvent('onchange', function (e) {
+                                context.onRouteExclusionsChange(e);
+                            });
+                        }
+                        div.appendChild(inputToll);
+                        var labelToll = document.createElement('label');
+                        labelToll.className = 'GProuteExclusionsOption';
+                        labelToll.htmlFor = this._addUID('GProuteExclusionsToll');
+                        labelToll.innerHTML = 'Péages';
+                        div.appendChild(labelToll);
+                        break;
+                    case 'tunnel':
+                        var inputTunnel = document.createElement('input');
+                        inputTunnel.id = this._addUID('GProuteExclusionsTunnel');
+                        inputTunnel.type = 'checkbox';
+                        inputTunnel.value = 'Tunnel';
+                        inputTunnel.checked = !status;
+                        if (inputTunnel.addEventListener) {
+                            inputTunnel.addEventListener('change', function (e) {
+                                context.onRouteExclusionsChange(e);
+                            });
+                        } else if (inputTunnel.attachEvent) {
+                            inputTunnel.attachEvent('onchange', function (e) {
+                                context.onRouteExclusionsChange(e);
+                            });
+                        }
+                        div.appendChild(inputTunnel);
+                        var labelTunnel = document.createElement('label');
+                        labelTunnel.className = 'GProuteExclusionsOption';
+                        labelTunnel.htmlFor = this._addUID('GProuteExclusionsTunnel');
+                        labelTunnel.innerHTML = 'Tunnels';
+                        div.appendChild(labelTunnel);
+                        break;
+                    case 'bridge':
+                        var inputBridge = document.createElement('input');
+                        inputBridge.id = this._addUID('GProuteExclusionsBridge');
+                        inputBridge.type = 'checkbox';
+                        inputBridge.value = 'Bridge';
+                        inputBridge.checked = !status;
+                        if (inputBridge.addEventListener) {
+                            inputBridge.addEventListener('change', function (e) {
+                                context.onRouteExclusionsChange(e);
+                            });
+                        } else if (inputBridge.attachEvent) {
+                            inputBridge.attachEvent('onchange', function (e) {
+                                context.onRouteExclusionsChange(e);
+                            });
+                        }
+                        div.appendChild(inputBridge);
+                        var labelBridge = document.createElement('label');
+                        labelBridge.className = 'GProuteExclusionsOption';
+                        labelBridge.htmlFor = this._addUID('GProuteExclusionsBridge');
+                        labelBridge.innerHTML = 'Ponts';
+                        div.appendChild(labelBridge);
+                        break;
+                    }
+                }
+            }
+            return div;
+        },
+        _createRouteSubmitFormElement: function () {
+            var input = document.createElement('input');
+            input.id = this._addUID('GProuteSubmit');
+            input.className = 'GPinputSubmit';
+            input.type = 'submit';
+            input.value = 'Calculer';
+            return input;
+        },
+        _createRouteFormResetElement: function () {
+            var self = this;
+            var divReset = document.createElement('div');
+            divReset.id = this._addUID('GProuteReset');
+            divReset.title = 'Réinitialiser les paramètres';
+            divReset.addEventListener('click', function (e) {
+                self.onRouteResetClick(e);
+            });
+            return divReset;
+        }
+    };
+    return RouteDOM;
+}(CommonUtilsSelectorID);
+LeafletControlsRoute = function (L, woodman, Gp, RightManagement, ID, LocationSelector, RouteDOM) {
+    var Route = L.Control.extend({
+        includes: RouteDOM,
+        options: {
+            position: 'topleft',
+            collapsed: true,
+            graphs: [
+                'Voiture',
+                'Pieton'
+            ],
+            exclusions: {
+                toll: false,
+                tunnel: false,
+                bridge: false
+            },
+            disableReverse: false,
+            routeOptions: {},
+            autocompleteOptions: {}
+        },
+        initialize: function (options) {
+            L.Util.setOptions(this, options);
+            this._uid = ID.generate();
+            this._initTransport();
+            this._initExclusions();
+            this._initComputation();
+            this._waitingContainer = null;
+            this._formRouteContainer = null;
+            this._resultsRouteContainer = null;
+            this._isDesktop = this._detectSupport();
+            this._currentPoints = [];
+            this._currentTransport = null;
+            this._currentComputation = null;
+            this._currentExclusions = [];
+            this._geojsonRoute = null;
+            this._geojsonSections = null;
+            this._waiting = false;
+            this._timer = null;
+            this._currentRouteInformations = null;
+            this._resources = {};
+            this._noRightManagement = false;
+            this._checkRightsManagement();
+        },
+        onAdd: function (map) {
+            var container = this._container = this._initLayout(map);
+            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
+            return container;
+        },
+        onRemove: function () {
+        },
+        _initTransport: function () {
+            this._currentTransport = 'Voiture';
+            var transport = this.options.graphs;
+            if (!transport || transport.length === 0) {
+                this.options.graphs = [
+                    'Voiture',
+                    'Pieton'
+                ];
+            }
+            if (L.Util.isArray(transport) && transport.length) {
+                if (transport[0] === 'Voiture' || transport[0] === 'Pieton') {
+                    this._currentTransport = transport[0];
+                }
+            }
+            var serviceOptions = this.options.routeOptions;
+            if (serviceOptions.graph) {
+                this._currentTransport = serviceOptions.graph;
+            }
+        },
+        _initComputation: function () {
+            this._currentComputation = 'fastest';
+            var serviceOptions = this.options.routeOptions;
+            if (serviceOptions.routePreference) {
+                this._currentComputation = serviceOptions.routePreference;
+            }
+        },
+        _initExclusions: function () {
+            this._currentExclusions = [];
+            var exclusion = this.options.exclusions;
+            if (!exclusion || Object.keys(exclusion).length === 0) {
+                this.options.exclusions = {
+                    toll: false,
+                    tunnel: false,
+                    bridge: false
+                };
+            }
+            if (exclusion && Object.keys(exclusion).length) {
+                for (var k in exclusion) {
+                    if (exclusion.hasOwnProperty(k)) {
+                        if (exclusion.k) {
+                            this._currentExclusions.push(k);
+                        }
+                    }
+                }
+            }
+            var serviceOptions = this.options.routeOptions;
+            if (L.Util.isArray(serviceOptions.exclusions)) {
+                this._currentExclusions = serviceOptions.exclusions;
+            }
+        },
+        _checkRightsManagement: function () {
+            var _opts = null;
+            var _res = [];
+            var _key = null;
+            _key = this.options.routeOptions.apiKey;
+            _opts = this.options.routeOptions.filterOptions;
+            _res = _opts ? _opts.type : [];
+            if (!_res || _res.length === 0) {
+                _res = [
+                    'Voiture',
+                    'Pieton'
+                ];
+            }
+            var rightManagementRoute = RightManagement.check({
+                key: _key || this.options.apiKey,
+                resources: _res,
+                services: ['Itineraire']
+            });
+            _key = this.options.autocompleteOptions.apiKey;
+            _opts = this.options.autocompleteOptions.filterOptions;
+            _res = _opts ? _opts.type : [];
+            if (!_res || _res.length === 0) {
+                _res = [
+                    'StreetAddress',
+                    'PositionOfInterest'
+                ];
+            }
+            var rightManagementAutoComplete = RightManagement.check({
+                key: _key || this.options.apiKey,
+                resources: _res,
+                services: ['AutoCompletion']
+            });
+            if (!rightManagementRoute && !rightManagementAutoComplete) {
+                this._noRightManagement = true;
+            }
+            if (rightManagementAutoComplete) {
+                this._resources['AutoCompletion'] = {};
+                this._resources['AutoCompletion']['resources'] = rightManagementAutoComplete['AutoCompletion'];
+                this._resources['AutoCompletion']['key'] = rightManagementAutoComplete['key'];
+            }
+            if (rightManagementRoute) {
+                this._resources['Itineraire'] = {};
+                this._resources['Itineraire']['resources'] = rightManagementRoute['Itineraire'];
+                this._resources['Itineraire']['key'] = rightManagementRoute['key'];
+            }
+        },
+        _detectSupport: function () {
+            var isDesktop = true;
+            var userAgent = window.navigator.userAgent.toLowerCase();
+            if (userAgent.indexOf('iphone') !== -1 || userAgent.indexOf('ipod') !== -1 || userAgent.indexOf('ipad') !== -1 || userAgent.indexOf('android') !== -1 || userAgent.indexOf('mobile') !== -1 || userAgent.indexOf('blackberry') !== -1 || userAgent.indexOf('tablet') !== -1 || userAgent.indexOf('phone') !== -1 || userAgent.indexOf('touch') !== -1) {
+                isDesktop = false;
+            }
+            if (userAgent.indexOf('msie') !== -1 || userAgent.indexOf('trident') !== -1) {
+                isDesktop = true;
+            }
+            return isDesktop;
+        },
+        _initLayout: function (map) {
+            var container = this._createMainContainerElement();
+            var inputShow = this._showRouteContainer = this._createShowRouteElement();
+            container.appendChild(inputShow);
+            if (!this.options.collapsed) {
+                inputShow.checked = true;
+            }
+            var picto = this._createShowRoutePictoElement();
+            container.appendChild(picto);
+            var routePanel = this._createRoutePanelElement();
+            var routeHeader = this._createRoutePanelHeaderElement();
+            routePanel.appendChild(routeHeader);
+            var routeForm = this._formRouteContainer = this._createRoutePanelFormElement();
+            var points = this._createRoutePanelFormPointsElement(map);
+            for (var i = 0; i < points.length; i++) {
+                routeForm.appendChild(points[i]);
+            }
+            var choice = this._createRoutePanelFormModeChoiceElement();
+            choice.appendChild(this._createRoutePanelFormModeChoiceTransportElement(this.options.graphs));
+            choice.appendChild(this._createRoutePanelFormModeChoiceComputeElement());
+            routeForm.appendChild(choice);
+            routeForm.appendChild(this._createShowRouteExclusionsElement());
+            routeForm.appendChild(this._createShowRouteExclusionsPictoElement());
+            var exclusion = this._createRoutePanelFormExclusionsElement();
+            exclusion.appendChild(this._createRoutePanelFormExclusionOptionsElement(this.options.exclusions));
+            routeForm.appendChild(exclusion);
+            var submit = this._createRouteSubmitFormElement();
+            routeForm.appendChild(submit);
+            routePanel.appendChild(routeForm);
+            var routeResults = this._resultsRouteContainer = this._createRoutePanelResultsElement();
+            routePanel.appendChild(routeResults);
+            var waiting = this._waitingContainer = this._createRouteWaitingElement();
+            routePanel.appendChild(waiting);
+            container.appendChild(routePanel);
+            return container;
+        },
+        _createRoutePanelFormPointsElement: function (map) {
+            var points = [];
+            var count = 1;
+            var start = new LocationSelector({
+                apiKey: this.options.apiKey || null,
+                tag: {
+                    id: count,
+                    unique: this._uid,
+                    label: 'Départ',
+                    color: 'blue',
+                    display: true
+                },
+                disableReverse: this.options.disableReverse,
+                autocompleteOptions: this.options.autocompleteOptions || null
+            });
+            start.setMap(map);
+            points.push(start.getContainer());
+            this._currentPoints.push(start);
+            for (count = 2; count < 7; count++) {
+                var step = new LocationSelector({
+                    apiKey: this.options.apiKey || null,
+                    tag: {
+                        id: count,
+                        unique: this._uid,
+                        label: 'Etape',
+                        color: 'green',
+                        display: false,
+                        removeOption: true
+                    },
+                    disableReverse: this.options.disableReverse,
+                    autocompleteOptions: this.options.autocompleteOptions || null
+                });
+                step.setMap(map);
+                points.push(step.getContainer());
+                this._currentPoints.push(step);
+            }
+            var end = new LocationSelector({
+                apiKey: this.options.apiKey || null,
+                tag: {
+                    id: count,
+                    unique: this._uid,
+                    label: 'Arrivée',
+                    color: 'red',
+                    display: true,
+                    addOption: true,
+                    removeOption: false
+                },
+                disableReverse: this.options.disableReverse,
+                autocompleteOptions: this.options.autocompleteOptions || null
+            });
+            end.setMap(map);
+            points.push(end.getContainer());
+            this._currentPoints.push(end);
+            return points;
+        },
+        onShowRoutePanelClick: function (e) {
+            if (!this._geojsonSections) {
+                this._clear();
+            }
+        },
+        onRouteModeComputationChange: function (e) {
+            var idx = e.target.selectedIndex;
+            var value = e.target.options[idx].value;
+            if (!value) {
+                return;
+            }
+            this._currentComputation = value;
+        },
+        onRouteModeComputationChangeAndRun: function (e) {
+            this.onRouteModeComputationChange(e);
+            this._clearRouteResultsDetails();
+            this._clearRouteResultsGeometry();
+            this._clearRouteResultsFeatureGeometry();
+            this.onRouteComputationSubmit({
+                computation: this._currentComputation,
+                transport: this._currentTransport,
+                exclusions: this._currentExclusions
+            });
+        },
+        onRouteModeTransportChange: function (e) {
+            var value = e.target.value;
+            if (!value) {
+                return;
+            }
+            this._currentTransport = value;
+        },
+        onShowRouteExclusionsClick: function (e) {
+        },
+        onRouteExclusionsChange: function (e) {
+            var value = e.target.value;
+            var checked = e.target.checked;
+            if (!value) {
+                return;
+            }
+            var bFound = false;
+            var iFound = null;
+            for (var i = 0; i < this._currentExclusions.length; i++) {
+                if (this._currentExclusions[i] === value) {
+                    iFound = i;
+                    bFound = true;
+                }
+            }
+            if (!bFound && checked) {
+                this._currentExclusions.push(value);
+            }
+            if (bFound && !checked) {
+                this._currentExclusions[iFound] = null;
+            }
+        },
+        onRouteComputationSubmit: function (options) {
+            var points = this._currentPoints;
+            var start = points[0].getCoordinate();
+            points[0].dragging(false);
+            var end = points[points.length - 1].getCoordinate();
+            points[points.length - 1].dragging(false);
+            var step = [];
+            for (var i = 1; i < points.length - 1; i++) {
+                var coordinate = points[i].getCoordinate();
+                points[i].dragging(false);
+                if (coordinate) {
+                    step.push(coordinate);
+                }
+            }
+            if (this._noRightManagement) {
+                return;
+            }
+            this._currentTransport = options.transport;
+            this._currentComputation = options.computation;
+            this._currentExclusions = options.exclusions;
+            this._displayWaitingContainer();
+            var context = this;
+            this._requestRouting({
+                startPoint: start,
+                endPoint: end,
+                viaPoints: step,
+                graph: this._currentTransport,
+                routePreference: this._currentComputation,
+                exclusions: this._currentExclusions,
+                geometryInInstructions: true,
+                distanceUnit: 'm',
+                onSuccess: function (results) {
+                    if (results) {
+                        context._fillRouteResultsDetails(results);
+                    }
+                },
+                onFailure: function (error) {
+                    context._hideWaitingContainer();
+                    context._clearRouteResultsDetails();
+                }
+            });
+        },
+        onShowRouteResultsNewClick: function (e) {
+            var points = this._currentPoints;
+            for (var i = 0; i < points.length; i++) {
+                points[i].dragging(true);
+            }
+            this._clearRouteResultsDetails();
+            this._clearRouteResultsGeometry();
+            this._clearRouteResultsFeatureGeometry();
+        },
+        onRouteResultsDetailsMouseOver: function (e) {
+            var idx = ID.index(e.target.id);
+            if (!this._isDesktop) {
+                return;
+            }
+            if (!this._geojsonSections) {
+                return;
+            }
+            this._geojsonSections.eachLayer(function (layer) {
+                if (layer.feature.id === parseInt(idx, 10)) {
+                    layer.setStyle({
+                        weight: 10,
+                        color: '#0F9DE8',
+                        opacity: 0.5
+                    });
+                }
+            });
+        },
+        onRouteResultsDetailsMouseOut: function (e) {
+            var idx = ID.index(e.target.id);
+            if (!this._isDesktop) {
+                return;
+            }
+            if (!this._geojsonSections) {
+                return;
+            }
+            this._geojsonSections.eachLayer(function (layer) {
+                if (layer.feature.id === parseInt(idx, 10)) {
+                    layer.setStyle({
+                        color: '#ED7F10',
+                        weight: 5,
+                        opacity: 0.75
+                    });
+                }
+            });
+        },
+        onRouteResultsDetailsClick: function (e) {
+            var idx = ID.index(e.target.id);
+            var self = this;
+            if (this._isDesktop) {
+                return;
+            }
+            if (!this._geojsonSections) {
+                return;
+            }
+            var newInstruction = e.target.title;
+            var oldInstruction = e.target.innerHTML;
+            this._geojsonSections.eachLayer(function (layer) {
+                if (layer.feature.id === parseInt(idx, 10)) {
+                    e.target.innerHTML = newInstruction;
+                    layer.setStyle({
+                        weight: 10,
+                        color: '#0F9DE8',
+                        opacity: 0.5
+                    });
+                }
+            });
+            clearTimeout(1000);
+            setTimeout(function () {
+                self._geojsonSections.eachLayer(function (layer) {
+                    if (layer.feature.id === parseInt(idx, 10)) {
+                        e.target.innerHTML = oldInstruction;
+                        layer.setStyle({
+                            color: '#ED7F10',
+                            weight: 5,
+                            opacity: 0.75
+                        });
+                    }
+                });
+            }, 1000);
+        },
+        _requestRouting: function (settings) {
+            if (!settings || Object.keys(settings).length === 0) {
+                return;
+            }
+            if (!settings.startPoint) {
+                return;
+            }
+            if (!settings.endPoint) {
+                return;
+            }
+            if (this._noRightManagement) {
+                console.log('no rights for all service !?');
+                return;
+            }
+            if (!this._resources['Itineraire']) {
+                console.log('no rights for this service !?');
+                return;
+            }
+            var resources = this._resources['Itineraire'].resources;
+            if (!resources || Object.keys(resources).length === 0) {
+                return;
+            }
+            var key = this._resources['Itineraire']['key'];
+            var options = {};
+            L.Util.extend(options, this.options.routeOptions);
+            L.Util.extend(options, settings);
+            var bFound = false;
+            for (var i = 0; i < resources.length; i++) {
+                if (resources[i] === options.graph) {
+                    bFound = true;
+                }
+            }
+            if (!bFound) {
+                console.log('no rights for this service !?');
+                return;
+            }
+            L.Util.extend(options, { apiKey: this.options.routeOptions.apiKey || this.options.apiKey || key });
+            Gp.Services.route(options);
+        },
+        _fillRouteResultsDetails: function (results) {
+            var distance = results.totalDistance;
+            var duration = results.totalTime;
+            var instructions = this._simplifiedInstructions(results.routeInstructions);
+            if (instructions) {
+                this._fillRouteResultsDetailsContainer(distance, duration, instructions);
+            }
+            var geometry = results.routeGeometry;
+            if (geometry) {
+                this._fillRouteResultsDetailsGeometry(geometry);
+            }
+            var bGeometryInstructions = instructions[0].geometry.length !== 0 ? true : false;
+            if (instructions && bGeometryInstructions) {
+                this._fillRouteResultsDetailsFeatureGeometry(instructions);
+            }
+            var bbox = results.bbox;
+            if (bbox) {
+                var map = this._map;
+                var bounds = L.latLngBounds([
+                    bbox.bottom,
+                    bbox.left
+                ], [
+                    bbox.top,
+                    bbox.right
+                ]);
+                map.fitBounds(bounds, {
+                    padding: [
+                        1,
+                        1
+                    ]
+                });
+            }
+            this._currentRouteInformations = results;
+            this._formRouteContainer.className = 'GProuteComponentHidden';
+            this._hideWaitingContainer();
+            this._resultsRouteContainer.className = '';
+        },
+        _fillRouteResultsDetailsContainer: function (distance, duration, instructions) {
+            this._resultsRouteValuesContainer = this._addRouteResultsValuesElement(distance, duration, this._convertSecondsToTime);
+            this._resultsRouteDetailsContainer = this._addRouteResultsDetailsElement(instructions, this._convertSecondsToTime);
+        },
+        _fillRouteResultsDetailsGeometry: function (geometry) {
+            this._clearRouteResultsGeometry();
+            var map = this._map;
+            var _style = {
+                color: '#ff7800',
+                weight: 5,
+                opacity: 0.65
+            };
+            this._geojsonRoute = L.geoJson(geometry, { style: _style }).addTo(map);
+        },
+        _fillRouteResultsDetailsFeatureGeometry: function (instructions) {
+            this._clearRouteResultsFeatureGeometry();
+            var map = this._map;
+            var _style = {
+                color: '#ED7F10',
+                weight: 5,
+                opacity: 0.75
+            };
+            var _geometry = {
+                type: 'FeatureCollection',
+                features: []
+            };
+            for (var i = 0; i < instructions.length; i++) {
+                var o = instructions[i];
+                var id = i + 1;
+                _geometry.features.push({
+                    id: id,
+                    type: 'Feature',
+                    geometry: o.geometry,
+                    properties: { popupContent: '(' + id + ') distance : ' + this._convertDistance(o.distance) + ' / temps : ' + this._convertSecondsToTime(o.duration) }
+                });
+            }
+            var self = this;
+            function resetHighlight(e) {
+                var layer = e.target;
+                self._geojsonSections.resetStyle(layer);
+                var div = L.DomUtil.get('GProuteResultsDetailsInstruction_' + layer.feature.id + '-' + self._uid);
+                L.DomUtil.removeClass(div, 'GProuteResultsDetailsHighlight');
+            }
+            function highlightFeature(e) {
+                var layer = e.target;
+                layer.setStyle({
+                    weight: 10,
+                    color: '#0F9DE8',
+                    opacity: 0.5
+                });
+                var div = L.DomUtil.get('GProuteResultsDetailsInstruction_' + layer.feature.id + '-' + self._uid);
+                L.DomUtil.addClass(div, 'GProuteResultsDetailsHighlight');
+            }
+            this._geojsonSections = L.geoJson(_geometry, {
+                style: _style,
+                onEachFeature: function (feature, layer) {
+                    layer.on({
+                        mouseover: highlightFeature,
+                        mouseout: resetHighlight
+                    });
+                    layer.bindPopup(feature.properties.popupContent);
+                }
+            }).addTo(map);
+        },
+        _clear: function () {
+            this._currentTransport = null;
+            this._currentExclusions = [];
+            this._currentComputation = null;
+            this._clearRouteResultsDetails();
+            this._clearRouteResultsGeometry();
+            this._clearRouteResultsFeatureGeometry();
+            for (var i = 0; i < this._currentPoints.length; i++) {
+                this._currentPoints[i].clear();
+            }
+        },
+        _clearRouteResultsDetails: function () {
+            this._currentRouteInformations = null;
+            if (this._resultsRouteDetailsContainer) {
+                var divD = this._resultsRouteDetailsContainer;
+                if (divD.childElementCount) {
+                    while (divD.firstChild) {
+                        divD.removeChild(divD.firstChild);
+                    }
+                }
+            }
+            if (this._resultsRouteValuesContainer) {
+                var divV = this._resultsRouteValuesContainer;
+                if (divV.childElementCount) {
+                    while (divV.firstChild) {
+                        divV.removeChild(divV.firstChild);
+                    }
+                }
+            }
+        },
+        _clearRouteResultsGeometry: function () {
+            var map = this._map;
+            if (this._geojsonRoute != null) {
+                map.removeLayer(this._geojsonRoute);
+                this._geojsonRoute = null;
+            }
+        },
+        _clearRouteResultsFeatureGeometry: function () {
+            var map = this._map;
+            if (this._geojsonSections != null) {
+                map.removeLayer(this._geojsonSections);
+                this._geojsonSections = null;
+            }
+        },
+        _displayWaitingContainer: function () {
+            this._waitingContainer.className = 'GProuteCalcWaitingContainerVisible';
+            this._waiting = true;
+            if (this._timer) {
+                clearTimeout(this._timer);
+                this._timer = null;
+            }
+            var context = this;
+            this._timer = setTimeout(function () {
+                if (context._waiting === true) {
+                    context._hideWaitingContainer();
+                } else {
+                    if (context._timer) {
+                        clearTimeout(context._timer);
+                    }
+                }
+            }, 16000);
+        },
+        _hideWaitingContainer: function () {
+            if (this._waiting) {
+                this._waitingContainer.className = 'GProuteCalcWaitingContainerHidden';
+                this._waiting = false;
+                clearTimeout(this._timer);
+                this._timer = null;
+            }
+        },
+        _simplifiedInstructions: function (instructions) {
+            var newInstructions = [];
+            var current = instructions[0];
+            if (instructions.length === 1) {
+                newInstructions.push(current);
+            }
+            for (var i = 1; i < instructions.length; i++) {
+                var o = instructions[i];
+                if (o.instruction === current.instruction) {
+                    current.distance = (parseFloat(o.distance) + parseFloat(current.distance)).toString();
+                    current.duration = (parseFloat(o.duration) + parseFloat(current.duration)).toString();
+                    for (var j = 1; j < o.geometry.coordinates.length; j++) {
+                        current.geometry.coordinates.push(o.geometry.coordinates[j]);
+                    }
+                    if (i === instructions.length - 1) {
+                        newInstructions.push(current);
+                        current = null;
+                    }
+                } else {
+                    newInstructions.push(current);
+                    current = o;
+                    if (i === instructions.length - 1) {
+                        newInstructions.push(o);
+                        current = null;
+                    }
+                }
+            }
+            return newInstructions;
+        },
+        _convertSecondsToTime: function (duration) {
+            var time = '';
+            duration = Math.round(duration);
+            var hours = Math.floor(duration / (60 * 60));
+            if (!hours) {
+                hours = '00';
+            }
+            var divisor4minutes = duration % (60 * 60);
+            var minutes = Math.floor(divisor4minutes / 60);
+            if (!minutes) {
+                minutes = '00';
+            }
+            var divisor4seconds = divisor4minutes % 60;
+            var seconds = Math.ceil(divisor4seconds);
+            if (!seconds) {
+                seconds = '00';
+            }
+            time = hours + 'h ' + minutes + 'm ' + seconds + 's';
+            return time;
+        },
+        _convertDistance: function (distance) {
+            var d = '';
+            var distanceKm = parseInt(distance / 1000, 10);
+            if (!distanceKm) {
+                d = parseInt(distance, 10) + ' m';
+            } else {
+                d = distanceKm + ' km';
+            }
+            return d;
+        }
+    });
+    return Route;
+}(leaflet, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, LeafletControlsLocationSelector, CommonControlsRouteDOM);
+CommonControlsSearchEngineDOM = function (ID) {
+    var SearchEngineDOM = {
+        _addUID: function (id) {
+            return id + '-' + this._uid;
+        },
+        _createMainContainerElement: function () {
+            var container = document.createElement('div');
+            container.id = this._addUID('GPsearchEngine');
+            container.className = 'GPwidget';
+            return container;
+        },
+        _createShowSearchEngineElement: function () {
+            var input = document.createElement('input');
+            input.id = this._addUID('GPshowSearchEngine');
+            input.type = 'checkbox';
+            return input;
+        },
+        _createShowSearchEnginePictoElement: function () {
+            var self = this;
+            var label = document.createElement('label');
+            label.id = this._addUID('GPshowSearchEnginePicto');
+            label.className = 'GPshowAdvancedToolPicto';
+            label.htmlFor = this._addUID('GPshowSearchEngine');
+            label.title = 'Afficher/masquer la recherche par lieux';
+            label.addEventListener('click', function () {
+                document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none';
+                document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
+                var showAdvancedSearch = document.getElementById(self._addUID('GPshowAdvancedSearch'));
+                if (showAdvancedSearch) {
+                    showAdvancedSearch.style.display = null;
+                    document.getElementById(self._addUID('GPadvancedSearchPanel')).style.display = 'none';
+                }
+                var id = '#GPsearchInput-' + self._uid;
+                document.querySelector(id + ' input').disabled = false;
+                self.onShowSearchEngineClick();
+            });
+            var spanOpen = document.createElement('span');
+            spanOpen.id = this._addUID('GPshowSearchEngineOpen');
+            spanOpen.className = 'GPshowAdvancedToolOpen';
+            label.appendChild(spanOpen);
+            return label;
+        },
+        _createSearchInputElement: function () {
+            var self = this;
+            var form = document.createElement('form');
+            form.id = this._addUID('GPsearchInput');
+            form.addEventListener('submit', function (e) {
+                e.preventDefault();
+                document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'block';
+                document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none';
+                self.onGeocodingSearchSubmit(e);
+                return false;
+            });
+            var input = document.createElement('input');
+            input.id = this._addUID('GPsearchInputText');
+            input.type = 'text';
+            input.placeholder = 'Rechercher un lieu, une adresse';
+            input.autocomplete = 'off';
+            input.addEventListener('keyup', function (e) {
+                var charCode = e.which || e.keyCode;
+                if (charCode === 13 || charCode === 10 || charCode === 38 || charCode === 40) {
+                    return;
+                }
+                document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
+                if (input.value.length > 2) {
+                    document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'block';
+                } else {
+                    document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none';
+                }
+                self.onAutoCompleteSearchText(e);
+            });
+            input.addEventListener('keydown', function (e) {
+                if (true) {
+                    return;
+                }
+                var charCode = e.which || e.keyCode;
+                var container = document.getElementById(self._addUID('GPautocompleteResults'));
+                if (!container) {
+                    return;
+                }
+                var curr = container.getElementsByClassName('GPautoCompleteProposal current');
+                var list = container.getElementsByClassName('GPautoCompleteProposal');
+                var length = list.length;
+                if (!length) {
+                    return;
+                }
+                var current = null;
+                if (!curr.length) {
+                    current = list[0];
+                    current.className = 'GPautoCompleteProposal current';
+                    current.style.color = '#000000';
+                    current.style['background-color'] = '#CEDBEF';
+                    return;
+                } else {
+                    current = curr[0];
+                }
+                var index = parseInt(ID.index(current.id), 10);
+                var next = index === length - 1 ? list[0] : list[index + 1];
+                var prev = index === 0 ? list[length - 1] : list[index - 1];
+                current.style['background-color'] = '';
+                current.style.color = '';
+                prev.style['background-color'] = '';
+                prev.style.color = '';
+                next.style['background-color'] = '';
+                next.style.color = '';
+                switch (charCode) {
+                case 38:
+                    current.className = 'GPautoCompleteProposal';
+                    prev.className = 'GPautoCompleteProposal current';
+                    prev.style.color = '#000000';
+                    prev.style['background-color'] = '#CEDBEF';
+                    break;
+                case 40:
+                    current.className = 'GPautoCompleteProposal';
+                    next.className = 'GPautoCompleteProposal current';
+                    next.style.color = '#000000';
+                    next.style['background-color'] = '#CEDBEF';
+                    break;
+                case 13:
+                    current.click(e);
+                    break;
+                }
+                current.focus();
+            });
+            form.appendChild(input);
+            var div = document.createElement('div');
+            div.id = this._addUID('GPsearchInputReset');
+            div.addEventListener('click', function () {
+                document.getElementById(self._addUID('GPsearchInputText')).value = '';
+                document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none';
+                document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
+                self.onSearchResetClick();
+            });
+            form.appendChild(div);
+            return form;
+        },
+        _createShowAdvancedSearchElement: function () {
+            var self = this;
+            var div = document.createElement('div');
+            div.id = this._addUID('GPshowAdvancedSearch');
+            div.className = 'GPshowAdvancedToolPicto';
+            div.title = 'Ouvrir la recherche avancée';
+            div.addEventListener('click', function () {
+                var id = '#GPsearchInput-' + self._uid;
+                document.querySelector(id + ' input').disabled = true;
+                document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none';
+                document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
+                document.getElementById(self._addUID('GPshowAdvancedSearch')).style.display = 'none';
+                document.getElementById(self._addUID('GPadvancedSearchPanel')).style.display = 'inline-block';
+            });
+            var span = document.createElement('span');
+            span.id = this._addUID('GPshowAdvancedSearchOpen');
+            span.className = 'GPshowAdvancedToolOpen';
+            div.appendChild(span);
+            return div;
+        },
+        _createAdvancedSearchPanelElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPadvancedSearchPanel');
+            div.className = 'GPpanel';
+            div.style.display = 'none';
+            return div;
+        },
+        _createGeocodeResultsElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPgeocodeResultsList');
+            div.className = 'GPpanel';
+            div.style.display = 'none';
+            div.appendChild(this._createGeocodeResultsHeaderElement());
+            return div;
+        },
+        _createAutoCompleteElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPautoCompleteList');
+            div.className = 'GPautoCompleteList';
+            div.style.display = 'none';
+            return div;
+        },
+        _createAutoCompleteListElement: function () {
+            var self = this;
+            var container = document.createElement('div');
+            container.id = this._addUID('GPautocompleteResults');
+            if (container.addEventListener) {
+                container.addEventListener('click', function (e) {
+                    self.onAutoCompletedResultsItemClick(e);
+                    document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none';
+                }, false);
+            } else if (container.attachEvent) {
+                container.attachEvent('onclick', function (e) {
+                    self.onAutoCompletedResultsItemClick(e);
+                    document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none';
+                });
+            }
+            return container;
+        },
+        _createAutoCompletedLocationElement: function (location, id) {
+            var container = document.getElementById(this._addUID('GPautocompleteResults'));
+            var div = document.createElement('div');
+            div.id = this._addUID('AutoCompletedLocation_' + id);
+            div.className = 'GPautoCompleteProposal';
+            div.innerHTML = location.fullText;
+            if (div.addEventListener) {
+                div.addEventListener('click', function (e) {
+                    container.click(e);
+                }, false);
+            } else if (div.attachEvent) {
+                div.attachEvent('onclick', function (e) {
+                    container.click(e);
+                });
+            }
+            container.appendChild(div);
+        },
+        _createAdvancedSearchPanelHeaderElement: function () {
+            var self = this;
+            var container = document.createElement('div');
+            container.className = 'GPpanelHeader';
+            var divTitle = document.createElement('div');
+            divTitle.className = 'GPpanelTitle';
+            divTitle.innerHTML = 'Recherche avancée';
+            container.appendChild(divTitle);
+            var divClose = document.createElement('div');
+            divClose.id = this._addUID('GPadvancedSearchClose');
+            divClose.className = 'GPpanelClose';
+            divClose.title = 'Fermer la recherche avancée';
+            if (divClose.addEventListener) {
+                divClose.addEventListener('click', function () {
+                    var id = '#GPsearchInput-' + self._uid;
+                    document.querySelector(id + ' input').disabled = false;
+                    document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
+                    document.getElementById(self._addUID('GPshowAdvancedSearch')).style.display = 'inline-block';
+                    document.getElementById(self._addUID('GPadvancedSearchPanel')).style.display = 'none';
+                }, false);
+            } else if (divClose.attachEvent) {
+                divClose.attachEvent('onclick', function () {
+                    var id = '#GPsearchInput-' + self._uid;
+                    document.querySelector(id + ' input').disabled = false;
+                    document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
+                    document.getElementById(self._addUID('GPshowAdvancedSearch')).style.display = 'inline-block';
+                    document.getElementById(self._addUID('GPadvancedSearchPanel')).style.display = 'none';
+                });
+            }
+            container.appendChild(divClose);
+            return container;
+        },
+        _createAdvancedSearchPanelFormElement: function (advancedSearchCodes) {
+            var self = this;
+            var form = document.createElement('form');
+            form.id = this._addUID('GPadvancedSearchForm');
+            form.addEventListener('submit', function (e) {
+                e.preventDefault();
+                var data = [];
+                var id = '#GPadvancedSearchFilters-' + self._uid;
+                var matchesFilters = document.querySelectorAll(id + ' > div > div > input');
+                for (var i = 0; i < matchesFilters.length; i++) {
+                    var element = matchesFilters[i];
+                    data.push({
+                        key: element.name,
+                        value: element.value
+                    });
+                }
+                self.onGeocodingAdvancedSearchSubmit(e, data);
+                document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'block';
+                return false;
+            });
+            var div = document.createElement('div');
+            div.className = 'GPflexInput';
+            var label = document.createElement('label');
+            label.className = 'GPadvancedSearchCodeLabel';
+            label.innerHTML = 'Recherche par';
+            div.appendChild(label);
+            var select = this._createAdvancedSearchFormCodeElement(advancedSearchCodes);
+            div.appendChild(select);
+            form.appendChild(div);
+            return form;
+        },
+        _createAdvancedSearchFormCodeElement: function (codes) {
+            var self = this;
+            var select = document.createElement('select');
+            select.id = this._addUID('GPadvancedSearchCode');
+            select.className = 'GPadvancedSearchCode';
+            select.addEventListener('change', function (e) {
+                self.onGeocodingAdvancedSearchCodeChange(e);
+            }, false);
+            if (!codes) {
+                codes = [
+                    {
+                        id: 'PositionOfInterest',
+                        title: 'Lieux/toponymes'
+                    },
+                    {
+                        id: 'StreetAddress',
+                        title: 'Adresses'
+                    },
+                    {
+                        id: 'CadastralParcel',
+                        title: 'Parcelles cadastrales'
+                    },
+                    {
+                        id: 'Administratif',
+                        title: 'Administratif'
+                    }
+                ];
+            }
+            for (var i = 0; i < codes.length; i++) {
+                var option = document.createElement('option');
+                option.value = codes[i].id;
+                option.text = codes[i].title;
+                select.appendChild(option);
+            }
+            return select;
+        },
+        _createAdvancedSearchFormInputElement: function () {
+            var input = document.createElement('input');
+            input.type = 'submit';
+            input.id = this._addUID('GPadvancedSearchSubmit');
+            input.className = 'GPinputSubmit';
+            input.value = 'Chercher';
+            return input;
+        },
+        _createAdvancedSearchFormFiltersElement: function () {
+            var container = document.createElement('div');
+            container.id = this._addUID('GPadvancedSearchFilters');
+            return container;
+        },
+        _createAdvancedSearchFiltersTableElement: function (code, display) {
+            var container = document.createElement('div');
+            container.id = this._addUID(code);
+            if (!display) {
+                container.style.display = 'none';
+            }
+            return container;
+        },
+        _createAdvancedSearchFiltersAttributElement: function (filterAttributes) {
+            var container = null;
+            var name = filterAttributes.name;
+            var title = filterAttributes.title;
+            var description = filterAttributes.description;
+            var code = filterAttributes.code;
+            var value = filterAttributes.value;
+            var div = document.createElement('div');
+            div.className = 'GPflexInput';
+            var label = document.createElement('label');
+            label.className = 'GPadvancedSearchFilterLabel';
+            label.htmlFor = name;
+            label.title = description || title;
+            label.innerHTML = title;
+            div.appendChild(label);
+            var input = document.createElement('input');
+            input.id = name;
+            input.className = 'GPadvancedSearchFilterInput';
+            input.type = 'text';
+            input.name = name;
+            if (value) {
+                input.value = value;
+            }
+            div.appendChild(input);
+            container = document.getElementById(this._addUID(code));
+            if (container) {
+                container.appendChild(div);
+            } else {
+                container = div;
+            }
+            return container;
+        },
+        _createGeocodeResultsHeaderElement: function () {
+            var self = this;
+            var container = document.createElement('div');
+            container.className = 'GPpanelHeader';
+            var divTitle = document.createElement('div');
+            divTitle.className = 'GPpanelTitle';
+            divTitle.innerHTML = 'Résultats de la recherche';
+            container.appendChild(divTitle);
+            var divClose = document.createElement('div');
+            divClose.id = this._addUID('GPgeocodeResultsClose');
+            divClose.className = 'GPpanelClose';
+            divClose.title = 'Fermer la fenêtre de résultats';
+            if (divClose.addEventListener) {
+                divClose.addEventListener('click', function () {
+                    document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
+                }, false);
+            } else if (divClose.attachEvent) {
+                divClose.attachEvent('onclick', function () {
+                    document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
+                });
+            }
+            container.appendChild(divClose);
+            return container;
+        },
+        _createGeocodeResultsListElement: function () {
+            var self = this;
+            var container = document.createElement('div');
+            container.id = this._addUID('GPgeocodeResults');
+            if (container.addEventListener) {
+                container.addEventListener('click', function (e) {
+                    if (!e.ctrlKey) {
+                        document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
+                    }
+                    self.onGeocodedResultsItemClick(e);
+                }, false);
+            } else if (container.attachEvent) {
+                container.attachEvent('onclick', function (e) {
+                    if (!e.ctrlKey) {
+                        document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
+                    }
+                    self.onGeocodedResultsItemClick(e);
+                });
+            }
+            return container;
+        },
+        _createGeocodedLocationElement: function (location, id) {
+            var container = document.getElementById(this._addUID('GPgeocodeResults'));
+            var div = document.createElement('div');
+            div.id = this._addUID('GeocodedLocation_' + id);
+            div.className = 'GPautoCompleteProposal';
+            if (typeof location === 'string') {
+                div.innerHTML = location;
+            } else {
+                var places = location.placeAttributes;
+                if (places.freeform) {
+                    div.innerHTML = places.freeform;
+                } else if (places.postalCode) {
+                    div.innerHTML = places.postalCode + ' ' + places.commune;
+                } else if (places.cadastralParcel) {
+                    div.innerHTML = places.cadastralParcel;
+                } else {
+                    div.innerHTML = '...';
+                }
+            }
+            container.appendChild(div);
+        }
+    };
+    return SearchEngineDOM;
+}(CommonUtilsSelectorID);
+CommonControlsSearchEngineUtils = function () {
+    var SearchEngineUtils = {
+        advancedSearchFiltersByDefault: {
+            PositionOfInterest: [
+                {
+                    name: 'importance',
+                    title: 'Importance'
+                },
+                {
+                    name: 'nature',
+                    title: 'Nature'
+                },
+                {
+                    name: 'territory',
+                    title: 'Territoire'
+                },
+                {
+                    name: 'insee',
+                    title: 'Code INSEE'
+                },
+                {
+                    name: 'municipality',
+                    title: 'Ville'
+                },
+                {
+                    name: 'department',
+                    title: 'Département'
+                }
+            ],
+            StreetAddress: [
+                {
+                    name: 'territory',
+                    title: 'Territoire'
+                },
+                {
+                    name: 'insee',
+                    title: 'Code INSEE'
+                },
+                {
+                    name: 'municipality',
+                    title: 'Ville'
+                },
+                {
+                    name: 'department',
+                    title: 'Département'
+                }
+            ],
+            CadastralParcel: [
+                {
+                    name: 'department',
+                    title: 'Département',
+                    description: 'Numéro du département (ex: 01, 94)'
+                },
+                {
+                    name: 'commune',
+                    title: 'Code commune (INSEE)',
+                    description: 'Code commune (INSEE) : 3 chiffres (ex: 067)'
+                },
+                {
+                    name: 'absorbedCity',
+                    title: 'Commune absorbée',
+                    description: 'Commune absorbée : 3 chiffres (ex: 000, 001)'
+                },
+                {
+                    name: 'section',
+                    title: 'Section',
+                    description: 'Section : 2 caractères (ex: AA, 0D)'
+                },
+                {
+                    name: 'number',
+                    title: 'Numéro',
+                    description: 'Numéro de la parcelle : 4 chiffres (ex: 0041, 0250)'
+                }
+            ],
+            Administratif: [
+                {
+                    name: 'prefecture',
+                    title: 'Préfecture'
+                },
+                {
+                    name: 'inseeRegion',
+                    title: 'Code région (INSEE)'
+                },
+                {
+                    name: 'inseeDepartment',
+                    title: 'Code département (INSEE)'
+                },
+                {
+                    name: 'municipality',
+                    title: 'Ville'
+                }
+            ]
+        },
+        zoomToResultsByDefault: function (info) {
+            var zoom = 15;
+            var service = info.service;
+            var fields = info.fields;
+            var type = info.type;
+            var importance = {
+                1: 11,
+                2: 12,
+                3: 13,
+                4: 14,
+                5: 15,
+                6: 16,
+                7: 17,
+                8: 17
+            };
+            if (service === 'SuggestedLocation') {
+                if (type === 'PositionOfInterest') {
+                    zoom = importance[fields.classification];
+                }
+            }
+            if (service === 'DirectGeocodedLocation') {
+                if (type === 'PositionOfInterest') {
+                    zoom = importance[fields.importance] || 14;
+                }
+            }
+            if (type === 'StreetAddress') {
+                zoom = 17;
+            }
+            if (type === 'CadastralParcel') {
+                zoom = 17;
+            }
+            if (type === 'Administratif') {
+                zoom = 12;
+            }
+            return zoom;
+        }
+    };
+    return SearchEngineUtils;
+}();
+LeafletControlsSearchEngine = function (L, woodman, Gp, RightManagement, ID, SearchEngineDOM, SearchEngineUtils) {
+    var SearchEngine = L.Control.extend({
+        includes: SearchEngineDOM,
+        options: {
+            position: 'topleft',
+            collapsed: true,
+            displayInfo: true,
+            zoomTo: '',
+            resources: [],
+            displayAdvancedSearch: true,
+            advancedSearch: {},
+            geocodeOptions: {},
+            autocompleteOptions: {}
+        },
+        initialize: function (options) {
+            L.Util.setOptions(this, options);
+            this._uid = ID.generate();
+            this._inputContainer = null;
+            this._suggestedContainer = null;
+            this._suggestedLocations = [];
+            this._geocodedContainer = null;
+            this._geocodedLocations = [];
+            this._filterContainer = null;
+            this._currentGeocodingCode = null;
+            this._currentGeocodingLocation = null;
+            this._advancedSearchFilters = {};
+            this._advancedSearchCodes = [];
+            this._marker = null;
+            this._servicesRightManagement = {};
+            this._noRightManagement = false;
+            this._checkRightsManagement();
+        },
+        onAdd: function () {
+            this._initAdvancedSearchCodes();
+            this._initAdvancedSearchFilters();
+            var container = this._initLayout();
+            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
+            return container;
+        },
+        onRemove: function () {
+        },
+        _checkRightsManagement: function () {
+            if (!this.options.resources || this.options.resources.length === 0) {
+                this.options.resources = [
+                    'StreetAddress',
+                    'PositionOfInterest'
+                ];
+            }
+            var _opts = null;
+            var _res = [];
+            var _key = null;
+            _key = this.options.geocodeOptions.apiKey;
+            _opts = this.options.geocodeOptions.filterOptions;
+            _res = _opts ? _opts.type : [];
+            if (!_res || _res.length === 0) {
+                _res = this.options.resources || [
+                    'StreetAddress',
+                    'PositionOfInterest'
+                ];
+            }
+            var rightManagementGeocode = RightManagement.check({
+                key: _key || this.options.apiKey,
+                resources: _res,
+                services: ['Geocode']
+            });
+            _key = this.options.autocompleteOptions.apiKey;
+            _opts = this.options.autocompleteOptions.filterOptions;
+            _res = _opts ? _opts.type : [];
+            if (!_res || _res.length === 0) {
+                _res = this.options.resources || [
+                    'StreetAddress',
+                    'PositionOfInterest'
+                ];
+            }
+            var rightManagementAutoComplete = RightManagement.check({
+                key: _key || this.options.apiKey,
+                resources: _res,
+                services: ['AutoCompletion']
+            });
+            if (!rightManagementGeocode && !rightManagementAutoComplete) {
+                this._noRightManagement = true;
+            }
+            if (rightManagementAutoComplete) {
+                this._servicesRightManagement['AutoCompletion'] = {};
+                this._servicesRightManagement['AutoCompletion']['resources'] = rightManagementAutoComplete['AutoCompletion'];
+                this._servicesRightManagement['AutoCompletion']['key'] = rightManagementAutoComplete['key'];
+            }
+            if (rightManagementGeocode) {
+                this._servicesRightManagement['Geocode'] = {};
+                this._servicesRightManagement['Geocode']['resources'] = rightManagementGeocode['Geocode'];
+                this._servicesRightManagement['Geocode']['key'] = rightManagementGeocode['key'];
+            }
+            if (!this.options.advancedSearch || Object.keys(this.options.advancedSearch).length === 0) {
+                var r = this._servicesRightManagement['Geocode']['resources'];
+                for (var i = 0; i < r.length; i++) {
+                    var code = r[i];
+                    this.options.advancedSearch[code] = [];
+                }
+            }
+        },
+        _initLayout: function () {
+            var container = this._createMainContainerElement();
+            var inputShow = this._createShowSearchEngineElement();
+            container.appendChild(inputShow);
+            if (!this.options.collapsed) {
+                inputShow.checked = 'true';
+            }
+            var picto = this._createShowSearchEnginePictoElement();
+            container.appendChild(picto);
+            var search = this._createSearchInputElement();
+            container.appendChild(search);
+            if (this.options.displayAdvancedSearch) {
+                var advancedShow = this._createShowAdvancedSearchElement();
+                container.appendChild(advancedShow);
+                var advancedPanel = this._createAdvancedSearchPanelElement();
+                var advancedHeader = this._createAdvancedSearchPanelHeaderElement();
+                var advancedForm = this._createAdvancedSearchPanelFormElement(this._advancedSearchCodes);
+                var advancedFormFilters = this._filterContainer = this._createAdvancedSearchFormFiltersElement();
+                this._setFilter(this._advancedSearchCodes[0].id);
+                var advancedFormInput = this._createAdvancedSearchFormInputElement();
+                advancedForm.appendChild(advancedFormFilters);
+                advancedForm.appendChild(advancedFormInput);
+                advancedPanel.appendChild(advancedHeader);
+                advancedPanel.appendChild(advancedForm);
+                container.appendChild(advancedPanel);
+            }
+            var autocomplete = this._createAutoCompleteElement();
+            var autocompleteList = this._suggestedContainer = this._createAutoCompleteListElement();
+            autocomplete.appendChild(autocompleteList);
+            container.appendChild(autocomplete);
+            var geocode = this._createGeocodeResultsElement();
+            var geocodeList = this._geocodedContainer = this._createGeocodeResultsListElement();
+            geocode.appendChild(geocodeList);
+            container.appendChild(geocode);
+            return container;
+        },
+        _initAdvancedSearchCodes: function () {
+            var advancedSearchCodesByDefault = [
+                {
+                    id: 'PositionOfInterest',
+                    title: 'Lieux/toponymes'
+                },
+                {
+                    id: 'StreetAddress',
+                    title: 'Adresses'
+                },
+                {
+                    id: 'CadastralParcel',
+                    title: 'Parcelles cadastrales'
+                },
+                {
+                    id: 'Administratif',
+                    title: 'Administratif'
+                }
+            ];
+            var _resources = Object.keys(this.options.advancedSearch);
+            for (var i = 0; i < _resources.length; i++) {
+                var id = _resources[i];
+                for (var j = 0; j < advancedSearchCodesByDefault.length; j++) {
+                    if (advancedSearchCodesByDefault[j].id === id) {
+                        this._advancedSearchCodes.push(advancedSearchCodesByDefault[j]);
+                    }
+                }
+            }
+            if (this._advancedSearchCodes.length === 0) {
+                this._advancedSearchCodes = advancedSearchCodesByDefault;
+            }
+        },
+        _initAdvancedSearchFilters: function () {
+            var advancedSearchFiltersByDefault = {
+                PositionOfInterest: [
+                    {
+                        name: 'city',
+                        title: 'Ville',
+                        filter: false,
+                        sep: true
+                    },
+                    {
+                        name: 'importance',
+                        title: 'Importance',
+                        filter: true
+                    },
+                    {
+                        name: 'nature',
+                        title: 'Nature',
+                        filter: true
+                    },
+                    {
+                        name: 'territory',
+                        title: 'Territoire',
+                        filter: true
+                    },
+                    {
+                        name: 'insee',
+                        title: 'Code commune (INSEE)',
+                        filter: true
+                    },
+                    {
+                        name: 'department',
+                        title: 'Département',
+                        filter: true
+                    }
+                ],
+                StreetAddress: [
+                    {
+                        name: 'number',
+                        title: 'Numéro',
+                        filter: false,
+                        sep: true
+                    },
+                    {
+                        name: 'street',
+                        title: 'Rue',
+                        filter: false,
+                        sep: true
+                    },
+                    {
+                        name: 'postalCode',
+                        title: 'Code Postal',
+                        filter: false,
+                        sep: true
+                    },
+                    {
+                        name: 'city',
+                        title: 'Ville',
+                        filter: false,
+                        sep: true
+                    },
+                    {
+                        name: 'territory',
+                        title: 'Territoire',
+                        filter: true
+                    },
+                    {
+                        name: 'insee',
+                        title: 'Code commune (INSEE)',
+                        filter: true
+                    },
+                    {
+                        name: 'department',
+                        title: 'Département',
+                        filter: true
+                    }
+                ],
+                CadastralParcel: [
+                    {
+                        name: 'department',
+                        title: 'Département',
+                        filter: false,
+                        sep: false,
+                        value: '__'
+                    },
+                    {
+                        name: 'commune',
+                        title: 'Commune',
+                        filter: false,
+                        sep: false,
+                        value: '___'
+                    },
+                    {
+                        name: 'absorbedCity',
+                        title: 'Commune absorbée',
+                        filter: false,
+                        sep: false,
+                        value: '___'
+                    },
+                    {
+                        name: 'section',
+                        title: 'Section',
+                        filter: false,
+                        sep: false,
+                        value: '__'
+                    },
+                    {
+                        name: 'number',
+                        title: 'Numéro',
+                        filter: false,
+                        sep: false,
+                        value: '____'
+                    }
+                ],
+                Administratif: [
+                    {
+                        name: 'prefecture',
+                        title: 'Préfecture',
+                        filter: true
+                    },
+                    {
+                        name: 'inseeRegion',
+                        title: 'Code région (INSEE)',
+                        filter: true
+                    },
+                    {
+                        name: 'inseeDepartment',
+                        title: 'Code département (INSEE)',
+                        filter: true
+                    },
+                    {
+                        name: 'city',
+                        title: 'Ville',
+                        filter: false,
+                        sep: true
+                    }
+                ]
+            };
+            var advancedSearchFiltersCustom = this.options.advancedSearch;
+            for (var code in advancedSearchFiltersCustom) {
+                if (advancedSearchFiltersCustom.hasOwnProperty(code)) {
+                    if (!advancedSearchFiltersCustom[code] || advancedSearchFiltersCustom[code].length === 0) {
+                        advancedSearchFiltersCustom[code] = advancedSearchFiltersByDefault[code];
+                        continue;
+                    }
+                    var filters = advancedSearchFiltersCustom[code];
+                    for (var i = 0; i < filters.length; i++) {
+                        var o = filters[i];
+                        if (!o.hasOwnProperty('filter')) {
+                            o.filter = o.name === 'municipality' ? false : true;
+                        }
+                    }
+                }
+            }
+            L.Util.extend(this._advancedSearchFilters, advancedSearchFiltersByDefault, advancedSearchFiltersCustom);
+        },
+        _setFilter: function (code) {
+            var container = this._filterContainer;
+            var codeFound = false;
+            for (var i = 0; i < this._advancedSearchCodes.length; i++) {
+                if (this._advancedSearchCodes[i].id === code) {
+                    codeFound = true;
+                    break;
+                }
+            }
+            if (!codeFound) {
+                while (container.firstChild) {
+                    container.removeChild(container.firstChild);
+                }
+                return;
+            }
+            this._currentGeocodingCode = code;
+            while (container.firstChild) {
+                container.removeChild(container.firstChild);
+            }
+            var lstAttributs = this._advancedSearchFilters[code];
+            if (!lstAttributs || lstAttributs.length === 0) {
+                return;
+            }
+            var divTable = this._createAdvancedSearchFiltersTableElement(code, true);
+            for (var j = 0; j < lstAttributs.length; j++) {
+                var divFilter = this._createAdvancedSearchFiltersAttributElement(lstAttributs[j]);
+                divTable.appendChild(divFilter);
+            }
+            container.appendChild(divTable);
+            return container;
+        },
+        _requestAutoComplete: function (settings) {
+            if (!settings || Object.keys(settings).length === 0) {
+                return;
+            }
+            if (!settings.text) {
+                return;
+            }
+            if (this._noRightManagement) {
+                console.log('no rights for all service !?');
+                return;
+            }
+            if (!this._servicesRightManagement['AutoCompletion']) {
+                console.log('no rights for this service !?');
+                return;
+            }
+            var options = {};
+            L.Util.extend(options, this.options.autocompleteOptions);
+            L.Util.extend(options, settings);
+            var resources = this._servicesRightManagement['AutoCompletion'].resources;
+            if (!resources || Object.keys(resources).length === 0) {
+                return;
+            }
+            if (resources && L.Util.isArray(resources) && !options.filterOptions) {
+                if (!options.filterOptions) {
+                    options.filterOptions = {};
+                }
+                options.filterOptions.type = resources;
+            }
+            var key = this._servicesRightManagement['AutoCompletion']['key'];
+            L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey || key });
+            Gp.Services.autoComplete(options);
+        },
+        _fillAutoCompletedLocationListContainer: function (locations) {
+            if (!locations || locations.length === 0) {
+                return;
+            }
+            var element = this._suggestedContainer;
+            if (element.childElementCount) {
+                while (element.firstChild) {
+                    element.removeChild(element.firstChild);
+                }
+            }
+            for (var i = 0; i < locations.length; i++) {
+                this._createAutoCompletedLocationElement(locations[i], i);
+            }
+            this._suggestedLocations = locations;
+        },
+        _requestGeocoding: function (settings) {
+            if (!settings || Object.keys(settings).length === 0) {
+                return;
+            }
+            if (!settings.location) {
+                return;
+            }
+            if (this._noRightManagement) {
+                console.log('no rights for all service !?');
+                return;
+            }
+            if (!this._servicesRightManagement['Geocode']) {
+                console.log('no rights for this service !?');
+                return;
+            }
+            var options = {};
+            L.Util.extend(options, this.options.geocodeOptions);
+            L.Util.extend(options, settings);
+            if (!options.hasOwnProperty('returnFreeForm')) {
+                L.Util.extend(options, { returnFreeForm: false });
+            }
+            var resources = this._servicesRightManagement['Geocode'].resources;
+            if (!resources || Object.keys(resources).length === 0) {
+                return;
+            }
+            if (resources && L.Util.isArray(resources) && !options.filterOptions) {
+                if (!options.filterOptions) {
+                    options.filterOptions = {};
+                }
+                options.filterOptions.type = resources;
+            }
+            var key = this._servicesRightManagement['Geocode']['key'];
+            L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey || key });
+            Gp.Services.geocode(options);
+        },
+        _fillGeocodedLocationListContainer: function (locations) {
+            if (!locations || locations.length === 0) {
+                this._clearGeocodedLocation();
+                return;
+            }
+            var element = this._geocodedContainer;
+            if (element.childElementCount) {
+                while (element.firstChild) {
+                    element.removeChild(element.firstChild);
+                }
+            }
+            for (var i = 0; i < locations.length; i++) {
+                this._createGeocodedLocationElement(locations[i], i);
+            }
+            this._geocodedLocations = locations;
+        },
+        _setLabel: function (label) {
+            var element = L.DomUtil.get('GPsearchInputText-' + this._uid);
+            element.value = label || '';
+        },
+        _setPosition: function (position, zoom) {
+            var map = this._map;
+            map.setZoomAround(L.latLng(position.x, position.y), zoom, true);
+            map.panTo(L.latLng(position.x, position.y));
+        },
+        _getZoom: function (info) {
+            var map = this._map;
+            var key = this.options.zoomTo;
+            var zoom = null;
+            if (typeof key === 'function') {
+                zoom = key.call(this, info);
+            }
+            if (typeof key === 'number') {
+                zoom = key;
+            }
+            if (typeof key === 'string') {
+                if (key === 'auto') {
+                    zoom = SearchEngineUtils.zoomToResultsByDefault(info);
+                } else {
+                    var value = parseInt(key, 10);
+                    if (!isNaN(value)) {
+                        zoom = value;
+                    }
+                }
+            }
+            Number.isInteger = Number.isInteger || function (value) {
+                return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
+            };
+            if (!zoom || zoom === '' || !Number.isInteger(zoom)) {
+                zoom = map.getZoom();
+            }
+            var min = map.getMinZoom();
+            var max = map.getMaxZoom();
+            if (zoom < min) {
+                zoom = min;
+            }
+            if (zoom > max) {
+                zoom = max;
+            }
+            return zoom;
+        },
+        _setMarker: function (position, information, display) {
+            var map = this._map;
+            if (this._marker != null) {
+                map.removeLayer(this._marker);
+                this._marker = null;
+            }
+            if (position) {
+                var options = {
+                    clickable: true,
+                    zIndexOffset: 1000
+                };
+                this._marker = L.marker(L.latLng(position.x, position.y), options);
+                this._marker.addTo(map);
+                if (display) {
+                    var popupContent = null;
+                    if (typeof information !== 'string') {
+                        var values = [];
+                        if (information.service === 'DirectGeocodedLocation') {
+                            if (information.fields.freeform) {
+                                popupContent = information.fields.freeform;
+                            } else {
+                                var attributs = this._advancedSearchFilters[information.type];
+                                for (var i = 0; i < attributs.length; i++) {
+                                    var key = attributs[i].name;
+                                    var value = information.fields[key];
+                                    if (typeof value === 'string' || typeof value === 'number') {
+                                        values.push(value);
+                                    }
+                                }
+                                popupContent = values.join(' - ');
+                            }
+                        } else if (information.service === 'SuggestedLocation') {
+                            if (information.fields.fullText) {
+                                popupContent = information.fields.fullText;
+                            } else {
+                                values.push(information.fields.street || '');
+                                values.push(information.fields.postalCode || '');
+                                values.push(information.fields.commune || '');
+                                if (information.type === 'PositionOfInterest') {
+                                    values.push(information.fields.poi || '');
+                                    values.push(information.fields.kind || '');
+                                }
+                                popupContent = values.join(' - ');
+                            }
+                        } else {
+                            popupContent = 'sans informations.';
+                        }
+                    } else {
+                        popupContent = information;
+                    }
+                    this._marker.bindPopup(popupContent);
+                }
+            }
+        },
+        _clearResults: function () {
+            this._currentGeocodingLocation = null;
+            this._clearSuggestedLocation();
+            this._clearGeocodedLocation();
+            this._setMarker();
+        },
+        _clearSuggestedLocation: function () {
+            this._suggestedLocations = [];
+            if (this._suggestedContainer) {
+                while (this._suggestedContainer.firstChild) {
+                    this._suggestedContainer.removeChild(this._suggestedContainer.firstChild);
+                }
+            }
+        },
+        _clearGeocodedLocation: function () {
+            this._geocodedLocations = [];
+            if (this._geocodedContainer) {
+                while (this._geocodedContainer.firstChild) {
+                    this._geocodedContainer.removeChild(this._geocodedContainer.firstChild);
+                }
+            }
+        },
+        onShowSearchEngineClick: function () {
+        },
+        onSearchResetClick: function () {
+            this._clearResults();
+        },
+        onAutoCompleteSearchText: function (e) {
+            var value = e.target.value;
+            if (!value) {
+                return;
+            }
+            if (this._noRightManagement) {
+                return;
+            }
+            this._currentGeocodingLocation = value;
+            if (value.length < 3) {
+                return;
+            }
+            var context = this;
+            this._requestAutoComplete({
+                text: value,
+                onSuccess: function (results) {
+                    if (results) {
+                        var locations = results.suggestedLocations;
+                        context._fillAutoCompletedLocationListContainer(locations);
+                    }
+                },
+                onFailure: function (error) {
+                    context._clearSuggestedLocation();
+                }
+            });
+        },
+        onAutoCompletedResultsItemClick: function (e) {
+            var idx = ID.index(e.target.id);
+            var label = e.target.innerHTML;
+            if (!idx) {
+                return;
+            }
+            var position = {
+                x: this._suggestedLocations[idx].position.y,
+                y: this._suggestedLocations[idx].position.x
+            };
+            var info = {
+                service: 'SuggestedLocation',
+                type: this._suggestedLocations[idx].type,
+                fields: this._suggestedLocations[idx]
+            };
+            var zoom = this._getZoom(info);
+            this._setLabel(label);
+            this._setPosition(position, zoom);
+            this._setMarker(position, info, this.options.displayInfo);
+        },
+        onGeocodingSearchSubmit: function (e) {
+            var value = e.target[0].value;
+            if (!value) {
+                return;
+            }
+            if (this._noRightManagement) {
+                return;
+            }
+            this._currentGeocodingLocation = value;
+            var context = this;
+            this._requestGeocoding({
+                location: value,
+                onSuccess: function (results) {
+                    if (results) {
+                        var locations = results.locations;
+                        context._fillGeocodedLocationListContainer(locations);
+                    }
+                },
+                onFailure: function (error) {
+                    context._clearGeocodedLocation();
+                }
+            });
+        },
+        onGeocodedResultsItemClick: function (e) {
+            var idx = ID.index(e.target.id);
+            var label = e.target.innerHTML;
+            if (!idx) {
+                return;
+            }
+            var position = this._geocodedLocations[idx].position;
+            var info = {
+                service: 'DirectGeocodedLocation',
+                type: this._geocodedLocations[idx].type,
+                fields: this._geocodedLocations[idx].placeAttributes
+            };
+            var zoom = this._getZoom(info);
+            this._setLabel(label);
+            this._setPosition(position, zoom);
+            this._setMarker(position, info, this.options.displayInfo);
+        },
+        onGeocodingAdvancedSearchCodeChange: function (e) {
+            var idx = e.target.selectedIndex;
+            var value = e.target.options[idx].value;
+            if (!value) {
+                return;
+            }
+            this._setFilter(value);
+        },
+        onGeocodingAdvancedSearchSubmit: function (e, data) {
+            if (!data || data.length === 0) {
+                return;
+            }
+            var _filterOptions = {};
+            _filterOptions['type'] = [this._currentGeocodingCode];
+            var _location = this._currentGeocodingLocation || '';
+            if (this._currentGeocodingCode === 'CadastralParcel') {
+                _location = '';
+            }
+            for (var i = 0; i < data.length; i++) {
+                var filter = data[i];
+                if (!filter.value) {
+                    continue;
+                }
+                var filters = this._advancedSearchFilters[this._currentGeocodingCode];
+                for (var j = 0; j < filters.length; j++) {
+                    var o = filters[j];
+                    if (o.name === filter.key) {
+                        if (o.filter) {
+                            _filterOptions[filter.key] = filter.value;
+                        } else {
+                            if (o.value) {
+                                var cur = filter.value.length;
+                                var max = o.value.length;
+                                if (max !== cur) {
+                                    var masked = max - cur;
+                                    var filler = o.value.charAt(0);
+                                    while (filler.length < masked) {
+                                        filler += filler;
+                                    }
+                                    var fillerSlice = filler.slice(0, masked);
+                                    filter.value = filter.value + fillerSlice;
+                                }
+                                _location += filter.value;
+                            } else {
+                                if (typeof _location === 'string') {
+                                    _location = {};
+                                }
+                                _location[filter.key] = filter.value;
+                            }
+                        }
+                    }
+                }
+            }
+            var context = this;
+            this._requestGeocoding({
+                location: _location,
+                filterOptions: _filterOptions,
+                onSuccess: function (results) {
+                    if (results) {
+                        var locations = results.locations;
+                        context._fillGeocodedLocationListContainer(locations);
+                    }
+                },
+                onFailure: function (error) {
+                    context._clearGeocodedLocation();
+                }
+            });
+        }
+    });
+    return SearchEngine;
+}(leaflet, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, CommonControlsSearchEngineDOM, CommonControlsSearchEngineUtils);
+CommonControlsElevationPathDOM = function () {
+    var ElevationPathDOM = {
+        _addUID: function (id) {
+            return id + '-' + this._uid;
+        },
+        _createMainContainerElement: function () {
+            var container = document.createElement('div');
+            container.id = this._addUID('GPelevationPath');
+            container.className = 'GPwidget';
+            return container;
+        },
+        _createShowElevationPathElement: function () {
+            var input = document.createElement('input');
+            input.id = this._addUID('GPshowElevationPath');
+            input.type = 'checkbox';
+            return input;
+        },
+        _createShowElevationPathPictoElement: function () {
+            var context = this;
+            var label = document.createElement('label');
+            label.id = this._addUID('GPshowElevationPathPicto');
+            label.className = 'GPshowAdvancedToolPicto';
+            label.htmlFor = this._addUID('GPshowElevationPath');
+            label.title = 'Calculer un profil';
+            if (label.addEventListener) {
+                label.addEventListener('click', function (e) {
+                    context.onShowElevationPathClick(e);
+                });
+            } else if (label.attachEvent) {
+                label.attachEvent('onclick', function (e) {
+                    context.onShowElevationPathClick(e);
+                });
+            }
+            var spanOpen = document.createElement('span');
+            spanOpen.id = this._addUID('GPshowElevationPathOpen');
+            spanOpen.className = 'GPshowAdvancedToolOpen';
+            label.appendChild(spanOpen);
+            return label;
+        },
+        _createElevationPathPanelElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPelevationPathPanel');
+            div.className = 'GPpanel';
+            return div;
+        },
+        _createElevationPathPanelHeaderElement: function () {
+            var self = this;
+            var container = document.createElement('div');
+            container.className = 'GPpanelHeader';
+            var div = document.createElement('div');
+            div.className = 'GPpanelTitle';
+            div.innerHTML = 'Profil Altimétrique';
+            container.appendChild(div);
+            var divReduce = document.createElement('div');
+            divReduce.id = this._addUID('GPelevationPathPanelReduce');
+            divReduce.className = 'GPpanelReduce';
+            divReduce.title = 'Masquer le panneau';
+            if (divReduce.addEventListener) {
+                divReduce.addEventListener('click', function () {
+                    if (typeof self.onReduceElevationPathPanelClick === 'function') {
+                        document.getElementById(self._addUID('GPshowElevationPath')).checked = false;
+                        self.onReduceElevationPathPanelClick();
+                    }
+                }, false);
+            } else if (divReduce.attachEvent) {
+                divReduce.attachEvent('onclick', function () {
+                    if (typeof self.onReduceElevationPathPanelClick === 'function') {
+                        document.getElementById(self._addUID('GPshowElevationPath')).checked = false;
+                        self.onReduceElevationPathPanelClick();
+                    }
+                });
+            }
+            container.appendChild(divReduce);
+            var divClose = document.createElement('div');
+            divClose.id = this._addUID('GPelevationPathPanelClose');
+            divClose.className = 'GPpanelClose';
+            divClose.title = 'Fermer le panneau';
+            if (divClose.addEventListener) {
+                divClose.addEventListener('click', function () {
+                    document.getElementById(self._addUID('GPshowElevationPathPicto')).click();
+                }, false);
+            } else if (divClose.attachEvent) {
+                divClose.attachEvent('onclick', function () {
+                    document.getElementById(self._addUID('GPshowElevationPathPicto')).click();
+                });
+            }
+            container.appendChild(divClose);
+            return container;
+        },
+        _createElevationPathPanelProfilElement: function () {
+            var div = document.createElement('div');
+            div.id = 'GPelevationPathProfil';
+            return div;
+        },
+        _createElevationPathWaitingElement: function () {
+            var div = document.createElement('div');
+            div.id = this._addUID('GPelevationPathCalcWaitingContainer');
+            div.className = 'GPelevationPathCalcWaitingContainerHidden';
+            var p = document.createElement('p');
+            p.className = 'GPelevationPathCalcWaiting';
+            p.innerHTML = 'Calcul en cours...';
+            div.appendChild(p);
+            return div;
+        }
+    };
+    return ElevationPathDOM;
+}();
+LeafletControlsElevationPath = function (L, P, woodman, Gp, RightManagement, ID, LocationSelector, PositionFormater, IconDefault, ElevationPathDOM) {
+    var ElevationPath = L.Control.extend({
+        includes: ElevationPathDOM,
+        options: {
+            position: 'topleft',
+            active: false,
+            elevationPathOptions: {},
+            stylesOptions: {},
+            displayProfileOptions: {
+                apply: null,
+                target: null
+            }
+        },
+        initialize: function (options) {
+            L.Util.setOptions(this, options);
+            this._uid = ID.generate();
+            this._initDisplayProfileOptions();
+            this._showContainer = null;
+            this._pictoContainer = null;
+            this._panelContainer = null;
+            this._profilContainer = null;
+            this._waitingContainer = null;
+            this._reducePanel = false;
+            this._featuresLayer = null;
+            this._lastIdLayer = 0;
+            this._currentIdLayer = 0;
+            this._currentFeature = null;
+            this._profile = null;
+            this._marker = null;
+            this._geometry = null;
+            this._noRightManagement = false;
+            this._checkRightsManagement();
+        },
+        onAdd: function (map) {
+            var container = this._container = this._initLayout();
+            if (map) {
+                if (this.options.active) {
+                    if (this._profile === null) {
+                        this._panelContainer.style.display = 'none';
+                    }
+                    this._activateMapInteraction(map);
+                }
+            }
+            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
+            return container;
+        },
+        onRemove: function () {
+        },
+        _checkRightsManagement: function () {
+            var rightManagement = RightManagement.check({
+                key: this.options.apiKey,
+                resources: ['SERVICE_CALCUL_ALTIMETRIQUE_RSC'],
+                services: ['ElevationLine']
+            });
+            if (!rightManagement) {
+                this._noRightManagement = true;
+            }
+            if (!this.options.apiKey) {
+                this.options.apiKey = rightManagement.key;
+            }
+        },
+        _initDisplayProfileOptions: function () {
+            var profil = this.options.displayProfileOptions || {};
+            if (typeof profil === 'undefined' || Object.keys(profil).length === 0) {
+                this.options.displayProfileOptions = {
+                    apply: ElevationPath.DISPLAY_PROFILE_BY_DEFAULT,
+                    target: null
+                };
+            } else {
+                this.options.displayProfileOptions = {};
+            }
+            var displayFunction = profil.apply || this.options.displayProfileOptions.apply;
+            this.options.displayProfileOptions.apply = typeof displayFunction === 'function' ? displayFunction : ElevationPath.DISPLAY_PROFILE_BY_DEFAULT;
+            var displayContainer = profil.target || this.options.displayProfileOptions.target;
+            this.options.displayProfileOptions.target = typeof displayContainer === 'undefined' ? null : displayContainer;
+        },
+        _initLayout: function () {
+            var container = this._createMainContainerElement();
+            var inputShow = this._showContainer = this._createShowElevationPathElement();
+            container.appendChild(inputShow);
+            if (this.options.active) {
+                this._showContainer.checked = true;
+            }
+            var picto = this._pictoContainer = this._createShowElevationPathPictoElement();
+            container.appendChild(picto);
+            var panel = this._panelContainer = this._createElevationPathPanelElement();
+            var header = this._createElevationPathPanelHeaderElement();
+            panel.appendChild(header);
+            var profil = this._profilContainer = this._createElevationPathPanelProfilElement();
+            panel.appendChild(profil);
+            var waiting = this._waitingContainer = this._createElevationPathWaitingElement();
+            panel.appendChild(waiting);
+            container.appendChild(panel);
+            return container;
+        },
+        onShowElevationPathClick: function (e) {
+            var map = this._map;
+            if (!this._reducePanel) {
+                if (this._showContainer.checked) {
+                    this._pictoContainer.style.display = 'block';
+                    this._panelContainer.style.display = 'none';
+                    this._removeMapInteraction(map);
+                    this._clear();
+                } else {
+                    if (this._profile === null) {
+                        this._panelContainer.style.display = 'none';
+                    }
+                    this._activateMapInteraction(map);
+                }
+            } else {
+                if (this._profile !== null) {
+                    if (this.options.displayProfileOptions.target === null) {
+                        this._pictoContainer.style.display = 'none';
+                    }
+                    this._panelContainer.style.display = 'block';
+                }
+            }
+            this._reducePanel = false;
+        },
+        onReduceElevationPathPanelClick: function () {
+            this._reducePanel = true;
+            this._pictoContainer.style.display = 'block';
+            this._panelContainer.style.display = 'none';
+        },
+        _activateMapInteraction: function (map) {
+            if (this._featuresLayer === null) {
+                this._featuresLayer = new L.FeatureGroup();
+                map.addLayer(this._featuresLayer);
+                var self = this;
+                map.on('draw:created', function (e) {
+                    self._currentIdLayer = L.Util.stamp(e.layer);
+                    self._getFeatureGeometry(e.layer);
+                    self._addFeatureLayer(e.layer);
+                });
+                map.on('draw:drawstart', function () {
+                    self._removeFeatureLayer(self._lastIdLayer);
+                    self._lastIdLayer = self._currentIdLayer;
+                });
+                map.on('draw:drawstop', function () {
+                    if (typeof self.options.elevationPathOptions.onSuccess === 'undefined' && self.options.displayProfileOptions.target === null) {
+                        self._pictoContainer.style.display = 'none';
+                        self._panelContainer.style.display = 'block';
+                    }
+                    self._altiRequest();
+                });
+            }
+            this._activatePolyLineInteraction(map);
+        },
+        _removeMapInteraction: function (map) {
+            if (!map) {
+                return;
+            }
+            if (this._featuresLayer !== null) {
+                map.off('draw:created');
+                map.off('draw:drawstart');
+                map.off('draw:drawstop');
+                map.removeLayer(this._featuresLayer);
+                this._featuresLayer = null;
+            }
+            this._lastIdLayer = this._currentIdLayer = 0;
+            if (this._currentFeature) {
+                this._currentFeature.disable();
+            }
+        },
+        _activatePolyLineInteraction: function (map) {
+            if (this._currentFeature) {
+                this._currentFeature.disable();
+            }
+            var styles = this.options.stylesOptions || {};
+            var _shapeOptions = Object.keys(styles).length !== 0 ? styles : {
+                stroke: true,
+                color: '#C77A04',
+                weight: 4,
+                opacity: 0.5,
+                fill: false
+            };
+            this._currentFeature = new L.Draw.Polyline(map, { shapeOptions: _shapeOptions });
+            this._currentFeature.enable();
+        },
+        _getFeatureGeometry: function (layer) {
+            if (this._geometry !== null) {
+                this._geometry = null;
+            }
+            this._geometry = [];
+            var geometry = layer.getLatLngs();
+            for (var i = 0; i < geometry.length; i++) {
+                var LatLng = geometry[i];
+                this._geometry.push({
+                    lon: LatLng.lng,
+                    lat: LatLng.lat
+                });
+            }
+        },
+        _addFeatureLayer: function (layer) {
+            if (!this._featuresLayer) {
+                return;
+            }
+            this._featuresLayer.addLayer(layer);
+        },
+        _removeFeatureLayer: function (id) {
+            if (!this._featuresLayer) {
+                return;
+            }
+            if (id === 0) {
+                return;
+            }
+            if (!id) {
+                this._featuresLayer.clearLayers();
+            } else {
+                this._featuresLayer.removeLayer(id);
+            }
+        },
+        _altiRequest: function () {
+            if (!this._geometry) {
+                return;
+            }
+            if (this._noRightManagement) {
+                return;
+            }
+            var options = {};
+            L.Util.extend(options, this.options.elevationPathOptions);
+            L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey });
+            var self = this;
+            L.Util.extend(options, {
+                sampling: options.sampling || 200,
+                onSuccess: this.options.elevationPathOptions.onSuccess || function (result) {
+                    if (result) {
+                        if (self.options.displayProfileOptions.target !== null) {
+                            self._pictoContainer.style.display = 'block';
+                            self._panelContainer.style.display = 'block';
+                        }
+                        self._displayProfil(result.elevations);
+                        self._waitingContainer.className = 'GPelevationPathCalcWaitingContainerHidden';
+                        self._waiting = false;
+                    }
+                },
+                onFailure: this.options.elevationPathOptions.onFailure || function (error) {
+                    self._pictoContainer.style.display = 'block';
+                    self._panelContainer.style.display = 'none';
+                    self._waitingContainer.className = 'GPelevationPathCalcWaitingContainerHidden';
+                    self._waiting = false;
+                    self._clear();
+                }
+            });
+            var positions = this._geometry;
+            L.Util.extend(options, { positions: positions });
+            this._waitingContainer.className = 'GPelevationPathCalcWaitingContainerVisible';
+            Gp.Services.getAltitude(options);
+        },
+        _computeElevationMeasure: function (elevations) {
+            var _haversineDistance = function (c1, c2) {
+                var lat1 = PositionFormater.decimalToRadian(c1[1]);
+                var lat2 = PositionFormater.decimalToRadian(c2[1]);
+                var deltaLatBy2 = (lat2 - lat1) / 2;
+                var deltaLonBy2 = PositionFormater.decimalToRadian(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 * 6378137 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+            };
+            elevations[0].dist = 0;
+            var distance = 0;
+            for (var i = 1; i < elevations.length; i++) {
+                distance += _haversineDistance([
+                    elevations[i].lon,
+                    elevations[i].lat
+                ], [
+                    elevations[i - 1].lon,
+                    elevations[i - 1].lat
+                ]) / 1000;
+                elevations[i].dist = distance;
+                elevations[i].lat = Math.round(elevations[i].lat * 10000) / 10000;
+                elevations[i].lon = Math.round(elevations[i].lon * 10000) / 10000;
+            }
+            var coeffArrond = 100;
+            if (distance > 100) {
+                coeffArrond = 1;
+            } else if (distance > 10) {
+                coeffArrond = 10;
+            }
+            for (var j = 0; j < elevations.length; j++) {
+                var data = elevations[j];
+                if (data.z < 0) {
+                    data.z = 0;
+                }
+                data.dist = Math.round(data.dist * coeffArrond) / coeffArrond;
+            }
+            return elevations;
+        },
+        _displayProfil: function (elevations) {
+            var data = this._computeElevationMeasure(elevations);
+            var container = this.options.displayProfileOptions.target;
+            if (container) {
+                container.appendChild(this._panelContainer);
+            }
+            container = this._profilContainer;
+            var context = this;
+            var displayFunction = this.options.displayProfileOptions.apply;
+            if (typeof AmCharts !== 'undefined' && typeof d3 !== 'undefined') {
+            }
+            displayFunction.call(this, data, container, context);
+        },
+        _activateProfilEvent: function (position) {
+            if (this._profile === null) {
+                return;
+            }
+            var map = this._map;
+            var self = this;
+            if (self._marker) {
+                map.removeLayer(self._marker);
+                self._marker = null;
+            }
+            self._marker = L.marker(L.latLng(position.lat, position.lon), {
+                icon: new IconDefault('orange'),
+                draggable: false,
+                clickable: false,
+                zIndexOffset: 1000
+            });
+            self._marker.addTo(map);
+            var changed = function (e) {
+                var obj = e.chart.dataProvider[e.index];
+                self._marker.setLatLng(L.latLng(obj.lat, obj.lon));
+                self._marker.update();
+            };
+            self._profile.removeListener('changed', changed);
+            self._profile.addListener('changed', changed);
+            var mouseover = function (e) {
+                if (self._profile === null) {
+                    return;
+                }
+                self._marker = L.marker(L.latLng(position.lat, position.lon), {
+                    icon: new IconDefault('orange'),
+                    draggable: false,
+                    clickable: false,
+                    zIndexOffset: 1000
+                });
+                self._marker.addTo(map);
+            };
+            var mouseout = function (e) {
+                if (self._profile === null) {
+                    return;
+                }
+                if (self._marker) {
+                    map.removeLayer(self._marker);
+                    self._marker = null;
+                }
+            };
+            var mousemove = function (e) {
+                if (self._profile === null) {
+                    return;
+                }
+                if (self._marker) {
+                    self._marker.setLatLng(L.latLng(e.lat, e.lon));
+                    self._marker.update();
+                }
+            };
+        },
+        _clear: function () {
+            this._geometry = null;
+            this._profile = null;
+            if (this._profilContainer) {
+                while (this._profilContainer.firstChild) {
+                    this._profilContainer.removeChild(this._profilContainer.firstChild);
+                }
+            }
+            var map = this._map;
+            if (this._marker) {
+                map.removeLayer(this._marker);
+                this._marker = null;
+            }
+        }
+    });
+    ElevationPath.DISPLAY_PROFILE_BY_DEFAULT = function (data, container, context) {
+        if (container) {
+            while (container.firstChild) {
+                container.removeChild(container.firstChild);
+            }
+        }
+        if (!data) {
+            return;
+        }
+        var sortedElev = JSON.parse(JSON.stringify(data));
+        sortedElev.sort(function (e1, e2) {
+            return e1.z - e2.z;
+        });
+        var minZ = sortedElev[0].z;
+        var maxZ = sortedElev[sortedElev.length - 1].z;
+        var diff = maxZ - minZ;
+        var dist = data[data.length - 1].dist;
+        var barwidth = 100 / data.length;
+        var self = this;
+        var map = context._map;
+        var div = document.createElement('div');
+        div.id = 'profileElevationByDefault';
+        div.addEventListener('mouseover', function (e) {
+            var _lon = parseFloat(e.target.dataset['lon']);
+            var _lat = parseFloat(e.target.dataset['lat']);
+            if (_lon && _lat) {
+                self._marker = L.marker(L.latLng(_lat, _lon), {
+                    icon: new IconDefault('orange'),
+                    draggable: false,
+                    clickable: false,
+                    zIndexOffset: 1000
+                });
+                self._marker.addTo(map);
+            }
+        });
+        div.addEventListener('mousemove', function () {
+        });
+        div.addEventListener('mouseout', function () {
+            if (self._marker) {
+                map.removeLayer(self._marker);
+                self._marker = null;
+            }
+        });
+        container.appendChild(div);
+        var divZ = document.createElement('div');
+        divZ.className = 'z-title-vertical';
+        divZ.innerHTML = minZ + ' / ' + maxZ + ' m';
+        div.appendChild(divZ);
+        var ul = document.createElement('ul');
+        ul.id = 'data-default';
+        ul.className = 'z-axis x-axis';
+        div.appendChild(ul);
+        for (var i = 0; i < data.length; i++) {
+            var d = data[i];
+            var li = document.createElement('li');
+            li.setAttribute('data-z', d.z);
+            li.setAttribute('data-lon', d.lon);
+            li.setAttribute('data-lat', d.lat);
+            li.setAttribute('data-dist', d.dist);
+            var pct = Math.floor((d.z - minZ) * 100 / diff);
+            li.setAttribute('class', 'percent v' + pct);
+            li.title = 'altitude : ' + d.z + 'm';
+            li.setAttribute('style', 'width: ' + barwidth + '%');
+            ul.appendChild(li);
+        }
+        var divX = document.createElement('div');
+        divX.className = 'x-title-horizontal';
+        divX.innerHTML = dist + ' km';
+        div.appendChild(divX);
+        context._profile = container;
+    };
+    ElevationPath.DISPLAY_PROFILE_RAW = function (data, container, context) {
+        if (container) {
+            while (container.firstChild) {
+                container.removeChild(container.firstChild);
+            }
+        }
+        var div = document.createElement('textarea');
+        div.id = 'profilElevationResults';
+        div.rows = 10;
+        div.cols = 50;
+        div.style.width = '100%';
+        div.innerHTML = JSON.stringify(data, undefined, 4);
+        container.appendChild(div);
+        context._profile = container;
+    };
+    ElevationPath.DISPLAY_PROFILE_LIB_D3 = function (data, container, context) {
+        if (typeof d3 === 'undefined') {
+            console.log('Lib. D3 is not loaded !');
+            return;
+        }
+        if (container) {
+            while (container.firstChild) {
+                container.removeChild(container.firstChild);
+            }
+        }
+        var margin = {
+            top: 20,
+            right: 20,
+            bottom: 30,
+            left: 40
+        };
+        var width = container.clientWidth - margin.left - margin.right;
+        var height = container.clientHeight - margin.top - margin.bottom;
+        var x = d3.scale.linear().range([
+            0,
+            width
+        ]);
+        var y = d3.scale.linear().range([
+            height,
+            0
+        ]);
+        var xAxis = d3.svg.axis().scale(x).orient('bottom').ticks(5);
+        var yAxis = d3.svg.axis().scale(y).orient('left').ticks(5);
+        var line = d3.svg.line().interpolate('basis').x(function (d) {
+            return x(d.dist);
+        }).y(function (d) {
+            return y(d.z);
+        });
+        var area = d3.svg.area().interpolate('basis').x(function (d) {
+            return x(d.dist);
+        }).y0(height).y1(function (d) {
+            return y(d.z);
+        });
+        var svg = d3.select(container).append('svg').attr('width', width + margin.left + margin.right).attr('height', height + margin.top + margin.bottom).append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
+        var xDomain = d3.extent(data, function (d) {
+            return d.dist;
+        });
+        x.domain(xDomain);
+        var yDomain = [
+            0,
+            d3.max(data, function (d) {
+                return d.z;
+            })
+        ];
+        y.domain(yDomain);
+        svg.append('path').datum(data).attr('class', 'area-d3').attr('d', area);
+        svg.append('g').attr('class', 'x axis-d3').attr('transform', 'translate(0,' + height + ')').call(xAxis).append('text').attr('y', -15).attr('dy', '.71em').attr('x', width).text('Distance (km)');
+        svg.append('g').attr('class', 'y axis-d3').call(yAxis).append('text').attr('transform', 'rotate(-90)').attr('y', 6).attr('dy', '.71em').text('Altitude (m)');
+        svg.append('g').attr('class', 'grid-d3 vertical').attr('transform', 'translate(0,' + height + ')').call(xAxis.orient('bottom').tickSize(-height, 0, 0).tickFormat(''));
+        svg.append('g').attr('class', 'grid-d3 horizontal').call(yAxis.orient('left').tickSize(-width, 0, 0).tickFormat(''));
+        svg.append('path').datum(data).attr('class', 'line-d3').attr('d', line);
+        svg.selectAll('circle').data(data).enter().append('circle').attr('cx', function (d) {
+            return x(d.dist);
+        }).attr('cy', function (d) {
+            return y(d.z);
+        }).attr('r', 0).attr('class', 'circle-d3');
+        var focus = svg.append('g').style('display', 'none');
+        focus.append('line').attr('id', 'focusLineX').attr('class', 'focusLine-d3');
+        focus.append('line').attr('id', 'focusLineY').attr('class', 'focusLine-d3');
+        focus.append('circle').attr('id', 'focusCircle').attr('r', 4).attr('class', 'circle-d3 focusCircle-d3');
+        var div = d3.select(container).append('div').attr('class', 'tooltip-d3').style('opacity', 0);
+        var bisectDist = d3.bisector(function (d) {
+            return d.dist;
+        }).left;
+        var self = this;
+        var map = context._map;
+        svg.append('rect').attr('class', 'overlay-d3').attr('width', width).attr('height', height).on('mouseover', function () {
+            focus.style('display', null);
+            self._marker = L.marker(L.latLng(data[0].lat, data[0].lon), {
+                icon: new IconDefault('orange'),
+                draggable: false,
+                clickable: false,
+                zIndexOffset: 1000
+            });
+            self._marker.addTo(map);
+        }).on('mouseout', function () {
+            focus.style('display', 'none');
+            if (self._marker) {
+                map.removeLayer(self._marker);
+                self._marker = null;
+            }
+            div.transition().duration(500).style('opacity', 0);
+        }).on('mousemove', function () {
+            var m = d3.mouse(this);
+            var distance = x.invert(m[0]);
+            var i = bisectDist(data, distance);
+            var d0 = data[i - 1];
+            var d1 = data[i];
+            var d = distance - d0[0] > d1[0] - distance ? d1 : d0;
+            var xc = x(d.dist);
+            var yc = y(d.z);
+            focus.select('#focusCircle').attr('cx', xc).attr('cy', yc);
+            focus.select('#focusLineX').attr('x1', xc).attr('y1', y(yDomain[0])).attr('x2', xc).attr('y2', y(yDomain[1]));
+            focus.select('#focusLineY').attr('x1', x(xDomain[0])).attr('y1', yc).attr('x2', x(xDomain[1])).attr('y2', yc);
+            self._marker.setLatLng(L.latLng(d.lat, d.lon));
+            self._marker.update();
+            div.transition().duration(200).style('opacity', 0.9);
+            div.html('Alt : ' + d.z + ' m <br/>' + 'Lon : ' + d.lon + ' <br/>' + 'Lat : ' + d.lat).style('left', d3.event.pageX + 'px').style('top', d3.event.pageY - 28 + 'px');
+        });
+        context._profile = d3.selectAll('rect.overlay')[0][0];
+    };
+    ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS = function (data, container, context) {
+        if (typeof AmCharts === 'undefined') {
+            console.log('Lib. AmCharts is not loaded !');
+            return;
+        }
+        AmCharts.addInitHandler(function () {
+        });
+        context._profile = AmCharts.makeChart(container, {
+            type: 'serial',
+            pathToImages: 'http://cdn.amcharts.com/lib/3/images/',
+            categoryField: 'dist',
+            autoMarginOffset: 0,
+            marginRight: 10,
+            marginTop: 10,
+            startDuration: 0,
+            color: '#5E5E5E',
+            fontSize: 10,
+            theme: 'light',
+            thousandsSeparator: '',
+            categoryAxis: {
+                color: '#5E5E5E',
+                gridPosition: 'start',
+                minHorizontalGap: 40,
+                tickPosition: 'start',
+                title: 'Distance (km)',
+                titleColor: '#5E5E5E',
+                startOnAxis: true
+            },
+            chartCursor: {
+                animationDuration: 0,
+                bulletsEnabled: true,
+                bulletSize: 10,
+                categoryBalloonEnabled: false,
+                cursorColor: '#F90',
+                graphBulletAlpha: 1,
+                graphBulletSize: 1,
+                zoomable: false
+            },
+            trendLines: [],
+            graphs: [{
+                    balloonColor: '#CCCCCC',
+                    balloonText: '<span class=\'altiPathValue\'>[[title]] : [[value]]m</span><br/><span class=\'altiPathCoords\'>(lat: [[lat]] / lon:[[lon]])</span>',
+                    bullet: 'round',
+                    bulletAlpha: 0,
+                    bulletBorderColor: '#FFF',
+                    bulletBorderThickness: 2,
+                    bulletColor: '#F90',
+                    bulletSize: 6,
+                    hidden: false,
+                    id: 'AmGraph-1',
+                    fillAlphas: 0.4,
+                    fillColors: '#C77A04',
+                    lineAlpha: 1,
+                    lineColor: '#C77A04',
+                    lineThickness: 1,
+                    title: 'Altitude',
+                    valueField: 'z'
+                }],
+            guides: [],
+            valueAxes: [{
+                    id: 'ValueAxis-1',
+                    minVerticalGap: 20,
+                    title: 'Altitude (m)'
+                }],
+            allLabel: [],
+            balloon: {
+                borderColor: '#CCCCCC',
+                borderThickness: 1,
+                fillColor: '#FFFFFF',
+                showBullet: true
+            },
+            titles: [],
+            dataProvider: data
+        });
+        var _initPosition = data[0];
+        context._activateProfilEvent(_initPosition);
+    };
+    return ElevationPath;
+}(leaflet, leafletDraw, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, LeafletControlsLocationSelector, LeafletControlsUtilsPositionFormater, LeafletControlsUtilsIconDefault, CommonControlsElevationPathDOM);
+LeafletControlsLogo = function (L) {
+    var Logo = L.Control.extend({
+        options: {
+            position: 'topright',
+            picto: null,
+            url: null,
+            text: null,
+            size: '30px'
+        },
+        initialize: function (options) {
+            L.setOptions(this, options);
+        },
+        onAdd: function () {
+            var container = L.DomUtil.create('div', 'gp-control-logo', container);
+            var bLink = this.options.url || this.options.text ? true : false;
+            var link = null;
+            if (bLink) {
+                link = L.DomUtil.create('a', '', container);
+                link.target = '_blank';
+                if (this.options.url) {
+                    link.href = this.options.url;
+                    this.options.text ? link.title = this.options.text : null;
+                }
+            }
+            if (bLink && this.options.text) {
+                link.text = this.options.text;
+            }
+            var bImage = this.options.picto ? true : false;
+            var image = null;
+            if (bImage) {
+                if (bLink) {
+                    image = L.DomUtil.create('img', '', link);
+                } else {
+                    image = L.DomUtil.create('img', '', container);
+                }
+                image.src = this.options.picto;
+                if (typeof this.options.size === 'string') {
+                    image.style.height = image.style.width = this.options.size;
+                } else {
+                    image.style.height = this.options.size.height;
+                    image.style.width = this.options.size.width;
+                }
+            }
+            return container;
+        }
+    });
+    return Logo;
+}(leaflet);
+LeafletControlsControls = function (LayerSwitcher, Isocurve, MousePosition, ReverseGeocoding, Route, SearchEngine, ElevationPath, Logo) {
+    var Controls = {
+        LayerSwitcher: function (options) {
+            return new LayerSwitcher(options);
+        },
+        Isocurve: function (options) {
+            return new Isocurve(options);
+        },
+        MousePosition: function (options) {
+            return new MousePosition(options);
+        },
+        ReverseGeocode: function (options) {
+            return new ReverseGeocoding(options);
+        },
+        Route: function (options) {
+            return new Route(options);
+        },
+        SearchEngine: function (options) {
+            return new SearchEngine(options);
+        },
+        ElevationPath: function (options) {
+            return new ElevationPath(options);
+        },
+        Logo: function (options) {
+            return new Logo(options);
+        }
+    };
+    return Controls;
+}(LeafletControlsLayerSwitcher, LeafletControlsIsocurve, LeafletControlsMousePosition, LeafletControlsReverseGeocoding, LeafletControlsRoute, LeafletControlsSearchEngine, LeafletControlsElevationPath, LeafletControlsLogo);
+CommonUtilsLayerUtils = function () {
+    var LayerUtils = {
+        getZoomLevelFromScaleDenominator: function (scaleDenominator, crs) {
+            var resolutionsNatives = {};
+            switch (crs) {
+            case 'EPSG:2154':
+                resolutionsNatives = {
+                    0: 104579.224549894,
+                    1: 52277.5323537905,
+                    2: 26135.4870785954,
+                    3: 13066.8913818,
+                    4: 6533.2286041135,
+                    5: 3266.5595244627,
+                    6: 1633.2660045974,
+                    7: 816.629554986,
+                    8: 408.3139146768,
+                    9: 204.1567415109,
+                    10: 102.0783167832,
+                    11: 51.0391448966,
+                    12: 25.5195690743,
+                    13: 12.7597836936,
+                    14: 6.379891636,
+                    15: 3.1899457653,
+                    16: 1.5949728695,
+                    17: 0.7974864315,
+                    18: 0.3987432149,
+                    19: 0.1993716073,
+                    20: 0.0996858037,
+                    21: 0.0498429018
+                };
+                break;
+            default:
+                resolutionsNatives = {
+                    0: 156543.033928041,
+                    1: 78271.51696402048,
+                    2: 39135.758482010235,
+                    3: 19567.87924100512,
+                    4: 9783.93962050256,
+                    5: 4891.96981025128,
+                    6: 2445.98490512564,
+                    7: 1222.99245256282,
+                    8: 611.49622628141,
+                    9: 305.7481131407048,
+                    10: 152.8740565703525,
+                    11: 76.43702828517624,
+                    12: 38.21851414258813,
+                    13: 19.10925707129406,
+                    14: 9.554628535647032,
+                    15: 4.777314267823516,
+                    16: 2.388657133911758,
+                    17: 1.194328566955879,
+                    18: 0.5971642834779395,
+                    19: 0.2985821417389697,
+                    20: 0.1492910708694849,
+                    21: 0.0746455354347424
+                };
+                break;
+            }
+            var resolution = scaleDenominator * 0.00028;
+            for (var index in resolutionsNatives) {
+                if (resolutionsNatives.hasOwnProperty(index)) {
+                    if (resolutionsNatives[index] <= resolution) {
+                        return index;
+                    }
+                }
+            }
+            return 0;
+        },
+        getAttributions: function (params) {
+            var zoom = params.zoom;
+            var attributions = [];
+            if (params.originators != null && params.visibility) {
+                var drawLogo;
+                for (var j = 0, jl = params.originators.length; j < jl; j++) {
+                    drawLogo = true;
+                    var originator = params.originators[j];
+                    var constraints = params.originators[j].constraints || [];
+                    for (var k = 0, kl = constraints.length; k < kl; k++) {
+                        var constraint = constraints[k];
+                        drawLogo = true;
+                        var minZoomLevel = this.getZoomLevelFromScaleDenominator(constraint.maxScaleDenominator, params.crs);
+                        var maxZoomLevel = this.getZoomLevelFromScaleDenominator(constraint.minScaleDenominator, params.crs);
+                        if (minZoomLevel && minZoomLevel > zoom) {
+                            drawLogo = false;
+                        }
+                        if (drawLogo && maxZoomLevel && maxZoomLevel < zoom) {
+                            drawLogo = false;
+                        }
+                        var bbox = constraint.bbox;
+                        if (drawLogo && bbox) {
+                            drawLogo = false;
+                            var viewExtent = params.extent;
+                            if (viewExtent) {
+                                var bounds = [
+                                    bbox.top,
+                                    bbox.left,
+                                    bbox.bottom,
+                                    bbox.right
+                                ];
+                                if (this.intersects(viewExtent, bounds)) {
+                                    drawLogo = true;
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                    if (drawLogo) {
+                        var logo = originator.logo;
+                        var url = originator.url;
+                        var name = originator.name ? originator.name : '';
+                        var text = originator.attribution;
+                        var container = document.createElement('div');
+                        container.className = 'gp-control-attribution';
+                        var link = null;
+                        link = document.createElement('a');
+                        link.className = 'gp-control-attribution-link';
+                        link.target = '_blank';
+                        container.appendChild(link);
+                        if (url) {
+                            link.href = url;
+                        }
+                        var bImage = logo ? true : false;
+                        var image = null;
+                        if (bImage) {
+                            image = document.createElement('img');
+                            if (link) {
+                                image.className = 'gp-control-attribution-image';
+                                link.appendChild(image);
+                            } else {
+                                image.className = '';
+                                container.appendChild(image);
+                            }
+                            image.src = logo;
+                            image.title = text || name;
+                            image.style.height = '30px';
+                            image.style.width = '30px';
+                        } else {
+                            if (name) {
+                                link.textContent = name;
+                            } else if (text) {
+                                link.textContent = text;
+                            } else if (url) {
+                                link.textContent = url;
+                            } else {
+                                link.textContent = '';
+                            }
+                        }
+                        attributions.push(container.innerHTML + ' ');
+                    }
+                }
+            }
+            return attributions;
+        },
+        intersects: function (extent1, extent2) {
+            var intersectsX = extent1[1] <= extent2[3] && extent2[1] <= extent1[3];
+            var intersectsY = extent1[2] <= extent2[0] && extent2[2] <= extent1[0];
+            return intersectsX && intersectsY;
+        }
+    };
+    return LayerUtils;
+}();
+LeafletLayersLayerConfig = function (woodman, Config, Util) {
+    var LayerConfig = {
+        get: function (options) {
+            var params = {};
+            if (!Config.isConfigLoaded()) {
+                return;
+            }
+            params = Config.getLayerParams(options.layer, options.service, options.key);
+            if (!params) {
+                return;
+            }
+            params.minZoom = Util.getZoomLevelFromScaleDenominator(params.maxScale) || 1;
+            params.maxZoom = Util.getZoomLevelFromScaleDenominator(params.minScale) || 21;
+            return params;
+        }
+    };
+    return LayerConfig;
+}({}, CommonUtilsConfig, CommonUtilsLayerUtils);
+LeafletLayersLayerEvent = function (woodman, LayerUtil) {
+    var LayerEvent = {
+        _id: null,
+        _attributions: [],
+        _visibility: true,
+        _originators: [],
+        isEnable: function (map) {
+            if (!map.attributionControl) {
+                return false;
+            }
+            return true;
+        },
+        setVisible: function (visibility) {
+            this._visibility = visibility;
+        },
+        getVisible: function () {
+            return this._visibility;
+        },
+        _onRemoveLayer: function (e) {
+            if (e.layer._geoportal_id != this._geoportal_id) {
+                return;
+            }
+            this.setVisible(false);
+        },
+        _onAddLayer: function (e) {
+            if (e.layer._geoportal_id != this._geoportal_id) {
+                return;
+            }
+            this.setVisible(true);
+        },
+        _onMoveEndLayer: function (e) {
+            this.updateAttributions(this._map, this);
+        },
+        updateAttributions: function (map) {
+            if (!this.isEnable(map)) {
+                return;
+            }
+            this.removeAttributions(map);
+            this.addAttributions(map);
+        },
+        removeAttributions: function (map) {
+            if (!this.isEnable(map)) {
+                return;
+            }
+            for (var i = 0; i < this._attributions.length; i++) {
+                map.attributionControl.removeAttribution(this._attributions[i]);
+            }
+            if (this._attributions) {
+                this._attributions = [];
+            }
+        },
+        addAttributions: function (map) {
+            if (!this.isEnable(map)) {
+                return;
+            }
+            var topLeft = map.getBounds().getNorthWest();
+            var bottomRight = map.getBounds().getSouthEast();
+            var arrayBounds = [
+                topLeft.lat,
+                topLeft.lng,
+                bottomRight.lat,
+                bottomRight.lng
+            ];
+            var params = {
+                extent: arrayBounds,
+                zoom: map.getZoom(),
+                originators: this._originators,
+                visibility: this._visibility
+            };
+            var attributionsOriginators = LayerUtil.getAttributions(params);
+            if (attributionsOriginators && attributionsOriginators.length !== 0) {
+                for (var i = 0; i < attributionsOriginators.length; i++) {
+                    this._attributions.push(attributionsOriginators[i]);
+                    map.attributionControl.addAttribution(attributionsOriginators[i]);
+                }
+            }
+        }
+    };
+    return LayerEvent;
+}({}, CommonUtilsLayerUtils);
+LeafletLayersWMS = function (L, Gp, woodman, LayerEvent) {
+    var WMS = L.TileLayer.WMS.extend({
+        includes: LayerEvent,
+        initialize: function (url, options) {
+            var settings = {};
+            L.Util.extend(settings, options.paramsWms, options.paramsNative);
+            L.TileLayer.WMS.prototype.initialize.call(this, Gp.Helper.normalyzeUrl(url, { 'gp-leaflet-ext': '0.8.1' }, false), settings);
+            this._originators = options.originators;
+            this._legends = options.legends;
+            this._metadata = options.metadata;
+            this._title = options.title;
+            this._description = options.description;
+            this._quicklookUrl = options.quicklookUrl;
+            this._geoportal_id = 0;
+        },
+        onAdd: function (map) {
+            this._map = map;
+            this._geoportal_id = L.stamp(this);
+            L.TileLayer.WMS.prototype.onAdd.call(this, map);
+            this.setVisible(true);
+            this.updateAttributions(map);
+            map.on({
+                overlayremove: this._onRemoveLayer,
+                overlayadd: this._onAddLayer,
+                layerremove: this._onRemoveLayer,
+                layeradd: this._onAddLayer,
+                moveend: this._onMoveEndLayer
+            }, this);
+        },
+        onRemove: function (map) {
+            this._map = map;
+            L.TileLayer.prototype.onRemove.call(this, map);
+            this.setVisible(false);
+            this.removeAttributions(map);
+            map.off({
+                overlayremove: this._onRemoveLayer,
+                overlayadd: this._onAddLayer,
+                layerremove: this._onRemoveLayer,
+                layeradd: this._onAddLayer,
+                moveend: this._onMoveEndLayer
+            }, this);
+        },
+        getTileUrl: function (tilePoint) {
+            var lstProjEpsgGeographic = ['EPSG:4326'];
+            var map = this._map;
+            var tileSize = this.options.tileSize;
+            var nwPoint = tilePoint.multiplyBy(tileSize);
+            var sePoint = nwPoint.add([
+                tileSize,
+                tileSize
+            ]);
+            var nw = this._crs.project(map.unproject(nwPoint, tilePoint.z));
+            var se = this._crs.project(map.unproject(sePoint, tilePoint.z));
+            var bbox = this._wmsVersion >= 1.3 && lstProjEpsgGeographic.indexOf(this._crs.code) !== -1 ? [
+                se.y,
+                nw.x,
+                nw.y,
+                se.x
+            ].join(',') : [
+                nw.x,
+                se.y,
+                se.x,
+                nw.y
+            ].join(',');
+            var url = L.Util.template(this._url, { s: this._getSubdomain(tilePoint) });
+            return url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox;
+        }
+    });
+    return WMS;
+}(leaflet, gp, {}, LeafletLayersLayerEvent);
+LeafletLayersWMTS = function (L, Gp, woodman, LayerEvent) {
+    var WMTS = L.TileLayer.extend({
+        includes: LayerEvent,
+        defaultWmtsParams: {
+            service: 'WMTS',
+            request: 'GetTile',
+            version: '1.0.0',
+            layer: '',
+            style: '',
+            tilematrixset: 'PM',
+            format: 'image/jpeg'
+        },
+        initialize: function (url, options) {
+            this._wmtsParams = {};
+            L.Util.extend(this._wmtsParams, this.defaultWmtsParams, options.paramsWmts);
+            L.TileLayer.prototype.initialize.call(this, Gp.Helper.normalyzeUrl(url, { 'gp-leaflet-ext': '0.8.1' }, false), options.paramsNative);
+            this._originators = options.originators;
+            this._legends = options.legends;
+            this._metadata = options.metadata;
+            this._title = options.title;
+            this._description = options.description;
+            this._quicklookUrl = options.quicklookUrl;
+            this._geoportal_id = 0;
+        },
+        onAdd: function (map) {
+            this._map = map;
+            this._geoportal_id = L.stamp(this);
+            L.TileLayer.prototype.onAdd.call(this, map);
+            this.setVisible(true);
+            this.updateAttributions(map);
+            map.on({
+                overlayremove: this._onRemoveLayer,
+                overlayadd: this._onAddLayer,
+                layerremove: this._onRemoveLayer,
+                layeradd: this._onAddLayer,
+                moveend: this._onMoveEndLayer
+            }, this);
+        },
+        onRemove: function (map) {
+            this._map = map;
+            L.TileLayer.prototype.onRemove.call(this, map);
+            this.setVisible(false);
+            this.removeAttributions(map);
+            map.off({
+                overlayremove: this._onRemoveLayer,
+                overlayadd: this._onAddLayer,
+                layerremove: this._onRemoveLayer,
+                layeradd: this._onAddLayer,
+                moveend: this._onMoveEndLayer
+            }, this);
+        },
+        getTileUrl: function (tilePoint) {
+            var zoom = this._getZoomForUrl();
+            var url = L.Util.template(this._url, { s: this._getSubdomain(tilePoint) });
+            return url + L.Util.getParamString(this._wmtsParams, url) + '&tilematrix=' + zoom + '&tilerow=' + tilePoint.y + '&tilecol=' + tilePoint.x;
+        },
+        setParams: function (params, noRedraw) {
+            L.extend(this._wmtsParams, params);
+            if (!noRedraw) {
+                this.redraw();
+            }
+            return this;
+        }
+    });
+    return WMTS;
+}(leaflet, gp, {}, LeafletLayersLayerEvent);
+LeafletLayersLayers = function (L, woodman, LayerConfig, WMS, WMTS) {
+    var Layers = {
+        options: {},
+        params: {},
+        serviceUrl: 'http://localhost?no-rights-found-for=[{layer}]',
+        _initLogger: function () {
+        },
+        _initOptions: function () {
+            if (!this.options || Object.keys(this.options) === 0) {
+                throw new Error('PARAM_MISSING : options !');
+            }
+            if (!this.options.layer) {
+                throw new Error('PARAM_MISSING : layer !');
+            }
+            if (!this.options.apiKey) {
+                console.log('PARAM_MISSING : apiKey !');
+            }
+        },
+        _initParams: function (service) {
+            if (!service) {
+                service = 'WMTS';
+            }
+            this.params = LayerConfig.get({
+                key: this.options.apiKey,
+                layer: this.options.layer,
+                service: service
+            });
+            if (!this.params || Object.keys(this.params) === 0) {
+                this.params = {};
+                if (!this.options.apiKey) {
+                    console.log('WARNING PARAM_MISSING : parameter \'apiKey\' is mandatory if the contract key configuration has not been loaded !');
+                }
+            }
+        },
+        WMS: function (options, settings) {
+            this._initLogger();
+            this.options = options || {};
+            this._initOptions();
+            this.settings = settings || {};
+            this._initParams('WMS');
+            var serviceUrl = null;
+            if (this.params.key || this.options.apiKey) {
+                serviceUrl = this.params.url || L.Util.template('http://wxs.ign.fr/{key}/geoportail/r/wms', { key: this.params.key || this.options.apiKey });
+            } else {
+                serviceUrl = L.Util.template(this.serviceUrl, { layer: this.options.layer });
+            }
+            var paramsWms = {
+                layers: this.options.layer,
+                styles: this.params.styles || 'normal',
+                format: this.params.format || 'image/jpeg',
+                version: this.params.version || '1.3.0'
+            };
+            var paramsNative = {
+                minZoom: this.params.minZoom || 1,
+                maxZoom: this.params.maxZoom || 21
+            };
+            L.Util.extend(paramsNative, this.settings);
+            return new WMS(serviceUrl, {
+                paramsNative: paramsNative,
+                paramsWms: paramsWms,
+                originators: this.params.originators || [],
+                legends: this.params.legends || [],
+                metadata: this.params.metadata || [],
+                title: this.params.title || null,
+                description: this.params.description || null,
+                quicklookUrl: this.params.quicklookUrl || null
+            });
+        },
+        WMTS: function (options, settings) {
+            this._initLogger();
+            this.options = options || {};
+            this._initOptions();
+            this.settings = settings || {};
+            this._initParams('WMTS');
+            var serviceUrl = null;
+            if (this.params.key || this.options.apiKey) {
+                serviceUrl = this.params.url || L.Util.template('http://wxs.ign.fr/{key}/geoportail/wmts', { key: this.params.key || this.options.apiKey });
+            } else {
+                serviceUrl = L.Util.template(this.serviceUrl, { layer: this.options.layer });
+            }
+            var paramsWmts = {
+                layer: this.options.layer,
+                style: this.params.styles || 'normal',
+                format: this.params.format || 'image/jpeg',
+                version: this.params.version || '1.0.0',
+                tilematrixset: this.params.TMSLink || 'PM'
+            };
+            var paramsNative = {
+                minZoom: this.params.minZoom || 1,
+                maxZoom: this.params.maxZoom || 21
+            };
+            L.Util.extend(paramsNative, this.settings);
+            return new WMTS(serviceUrl, {
+                paramsNative: paramsNative,
+                paramsWmts: paramsWmts,
+                originators: this.params.originators || [],
+                legends: this.params.legends || [],
+                metadata: this.params.metadata || [],
+                title: this.params.title || '',
+                description: this.params.description || '',
+                quicklookUrl: this.params.quicklookUrl || ''
+            });
+        }
+    };
+    return Layers;
+}(leaflet, {}, LeafletLayersLayerConfig, LeafletLayersWMS, LeafletLayersWMTS);
+LeafletGpPluginLeaflet = function (L, P, Gp, Controls, ElevationPath, Layers, CRS, Register) {
+    Gp.leafletExtVersion = '0.8.1';
+    Gp.leafletExtDate = '2016-12-02';
+    Gp.Register = Register;
+    L.geoportalLayer = Layers;
+    L.geoportalControl = Controls;
+    L.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_D3 = ElevationPath.DISPLAY_PROFILE_LIB_D3;
+    L.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS = ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS;
+    L.geoportalControl.ElevationPath.DISPLAY_PROFILE_RAW = ElevationPath.DISPLAY_PROFILE_RAW;
+    L.geoportalControl.ElevationPath.DISPLAY_PROFILE_BY_DEFAULT = ElevationPath.DISPLAY_PROFILE_BY_DEFAULT;
+    L.geoportalCRS = CRS;
+    L.geoportalCRS.EPSG2154 = CRS.EPSG2154();
+    L.geoportalCRS.EPSG27572 = CRS.EPSG27572();
+    L.geoportalCRS.EPSG4326 = CRS.EPSG4326();
+    return Gp;
+}(leaflet, leafletDraw, gp, LeafletControlsControls, LeafletControlsElevationPath, LeafletLayersLayers, LeafletCRSCRS, CommonUtilsRegister);
+window.proj4 = proj4;
+
+return Gp;
+}));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-gp-3.0.2.min.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,157 @@
+/*!
+ * @brief Geoportal Extension for Leaflet
+ *
+ * This software is released under the licence CeCILL-B (Free BSD compatible)
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
+ * @see http://www.cecill.info/
+ *
+ * copyright CeCILL-B
+ * copyright IGN
+ * @author IGN
+ * @version 0.9.0
+ * @date 2016-12-04
+ *
+ */
+/*!
+ * @overview es6-promise - a tiny implementation of Promises/A+.
+ * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and cont  ributors (Conversion to ES6 API by Jake Archibald)
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/jakearchibald/es6-promise/  master/LICENSE
+ * @version   3.0.2
+ */
+/*!
+ * Sortable -- minimalist JavaScript library for reorderable drag-and-drop lists
+ *
+ * Released under MIT LICENSE
+ * 
+ * Copyright 2013-2016 Lebedev Konstantin <ibnRubaXa@gmail.com>
+ * http://rubaxa.github.io/Sortable/
+ * 
+ * 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.
+ */
+/*!
+ * Proj4js - Javascript reprojection library. 
+ * 
+ * Authors:
+ * 
+ * - Mike Adair madairATdmsolutions.ca
+ * - Richard Greenwood richATgreenwoodmap.com
+ * - Didier Richard didier.richardATign.fr
+ * - Stephen Irons stephen.ironsATclear.net.nz
+ * - Olivier Terral oterralATgmail.com
+ * - Calvin Metcalf cmetcalfATappgeo.com
+ * 
+ * Copyright (c) 2014, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons, Olivier Terral and Calvin Metcalf
+ * 
+ *  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._
+ * 
+ */
+/*!
+ * Copyright 2012-2016 Jacob Toye and Leaflet
+ *
+ * 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.
+ */
+/*!
+ * Proj4Leaflet --  Smooth Proj4js integration with Leaflet
+ * 
+ * Copyright (c) 2012, Kartena AB
+ * 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 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.
+ */
+;(function(root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    define(['leaflet'], factory);
+  } else if (typeof exports === 'object') {
+    module.exports = factory(require('leaflet'));
+  } else {
+    root.Gp = factory(root.L);
+  }
+}(this, function(leaflet) {
+var gp,CommonUtilsAutoLoadConfig,leafletDraw,sortable,CommonControlsLayerSwitcherDOM,LeafletControlsLayerSwitcher,CommonUtilsConfig,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,CommonControlsLocationSelectorDOM,LeafletControlsUtilsPositionFormater,LeafletControlsUtilsIconDefault,LeafletControlsLocationSelector,CommonControlsIsoDOM,LeafletControlsIsocurve,CommonControlsMousePositionDOM,proj4,proj4leaflet07x,proj4leaflet10x,LeafletCRSProj4Leaflet,CommonUtilsRegister,LeafletCRSEPSG2154,LeafletCRSEPSG27572,LeafletCRSEPSG4326,LeafletCRSCRS,LeafletControlsMousePosition,CommonControlsReverseGeocodingDOM,LeafletControlsReverseGeocoding,CommonControlsRouteDOM,LeafletControlsRoute,CommonControlsSearchEngineDOM,CommonControlsSearchEngineUtils,LeafletControlsSearchEngine,CommonControlsElevationPathDOM,LeafletControlsElevationPath,LeafletControlsLogo,LeafletControlsControls,CommonUtilsLayerUtils,LeafletLayersLayerConfig,LeafletLayersLayerEvent,LeafletLayersWMS,LeafletLayersWMTS,LeafletLayersLayers,LeafletGpPluginLeaflet;!function(t,e){gp=function(){return"function"==typeof e?e():e}()}(this,function(){var t,e,i,n,o,s,r,a,l,c,h,u,d,p,m,f,_,g,v,y,E,P,C,S,M,w,L,R,b,x,G,I,A,T,k,O,D,N,U,j,F,z,B,q,W,H,V,Y,K,X,Z,Q,J,$,tt,et,it,nt,ot,st,rt,at,lt,ct,ht,ut,dt,pt,mt,ft,_t,gt,vt,yt,Et,Pt,Ct,St,Mt,wt,Lt,Rt,bt,xt,Gt,It,At,Tt,kt,Ot,Dt,Nt,Ut,jt,Ft,zt,Bt;return t=void 0,e={loggers:[{root:!0,level:"all",appenders:[{type:"Console",layout:{type:"PatternLayout",pattern:"%d{yyyy-MM-dd HH:mm:ss} [%p] %c - %m%n"}}]}]},i=function(t,e){var i={getLogger:function(i){t.load(e,function(t){if(t)throw t});var n=i||"default";return t.getLogger(n)}};return i}(t,e),n=function(){var t={normalyzeParameters:function(t){var e=null;if(t){var i=[];for(var n in t)if(t.hasOwnProperty(n)){var o=t[n];o||(o=""),i.push(n+"="+o)}e=i.join("&")}return e},normalyzeUrl:function(t,e,i){var n=t;if(t){var o=t.indexOf("?");o===-1&&(n+="?"),o!==-1&&o!==t.length-1&&(n+="&")}return e&&(n+="string"==typeof e?e:this.normalyzeParameters(e)),i&&(n=encodeURIComponent(n)),n},indent:function(t,e){var i=t||0;return new Array(i+1).join("\t")+e}};return t}(),function(){"use strict";function t(t){return"function"==typeof t||"object"==typeof t&&null!==t}function e(t){return"function"==typeof t}function i(t){return"object"==typeof t&&null!==t}function n(t){B=t}function s(t){V=t}function r(){return function(){process.nextTick(u)}}function a(){return function(){z(u)}}function l(){var t=0,e=new X(u),i=document.createTextNode("");return e.observe(i,{characterData:!0}),function(){i.data=t=++t%2}}function c(){var t=new MessageChannel;return t.port1.onmessage=u,function(){t.port2.postMessage(0)}}function h(){return function(){setTimeout(u,1)}}function u(){for(var t=0;t<H;t+=2){var e=J[t],i=J[t+1];e(i),J[t]=void 0,J[t+1]=void 0}H=0}function d(){try{var t=require,e=t("vertx");return z=e.runOnLoop||e.runOnContext,a()}catch(t){return h()}}function p(){}function m(){return new TypeError("You cannot resolve a promise with itself")}function f(){return new TypeError("A promises callback cannot return that same promise.")}function _(t){try{return t.then}catch(t){return it.error=t,it}}function g(t,e,i,n){try{t.call(e,i,n)}catch(t){return t}}function v(t,e,i){V(function(t){var n=!1,o=g(i,e,function(i){n||(n=!0,e!==i?P(t,i):S(t,i))},function(e){n||(n=!0,M(t,e))},"Settle: "+(t._label||" unknown promise"));!n&&o&&(n=!0,M(t,o))},t)}function y(t,e){e._state===tt?S(t,e._result):e._state===et?M(t,e._result):w(e,void 0,function(e){P(t,e)},function(e){M(t,e)})}function E(t,i){if(i.constructor===t.constructor)y(t,i);else{var n=_(i);n===it?M(t,it.error):void 0===n?S(t,i):e(n)?v(t,i,n):S(t,i)}}function P(e,i){e===i?M(e,m()):t(i)?E(e,i):S(e,i)}function C(t){t._onerror&&t._onerror(t._result),L(t)}function S(t,e){t._state===$&&(t._result=e,t._state=tt,0!==t._subscribers.length&&V(L,t))}function M(t,e){t._state===$&&(t._state=et,t._result=e,V(C,t))}function w(t,e,i,n){var o=t._subscribers,s=o.length;t._onerror=null,o[s]=e,o[s+tt]=i,o[s+et]=n,0===s&&t._state&&V(L,t)}function L(t){var e=t._subscribers,i=t._state;if(0!==e.length){for(var n,o,s=t._result,r=0;r<e.length;r+=3)n=e[r],o=e[r+i],n?x(i,n,o,s):o(s);t._subscribers.length=0}}function R(){this.error=null}function b(t,e){try{return t(e)}catch(t){return nt.error=t,nt}}function x(t,i,n,o){var s,r,a,l,c=e(n);if(c){if(s=b(n,o),s===nt?(l=!0,r=s.error,s=null):a=!0,i===s)return void M(i,f())}else s=o,a=!0;i._state!==$||(c&&a?P(i,s):l?M(i,r):t===tt?S(i,s):t===et&&M(i,s))}function G(t,e){try{e(function(e){P(t,e)},function(e){M(t,e)})}catch(e){M(t,e)}}function I(t,e){var i=this;i._instanceConstructor=t,i.promise=new t(p),i._validateInput(e)?(i._input=e,i.length=e.length,i._remaining=e.length,i._init(),0===i.length?S(i.promise,i._result):(i.length=i.length||0,i._enumerate(),0===i._remaining&&S(i.promise,i._result))):M(i.promise,i._validationError())}function A(t){return new ot(this,t).promise}function T(t){function e(t){P(o,t)}function i(t){M(o,t)}var n=this,o=new n(p);if(!W(t))return M(o,new TypeError("You must pass an array to race.")),o;for(var s=t.length,r=0;o._state===$&&r<s;r++)w(n.resolve(t[r]),void 0,e,i);return o}function k(t){var e=this;if(t&&"object"==typeof t&&t.constructor===e)return t;var i=new e(p);return P(i,t),i}function O(t){var e=this,i=new e(p);return M(i,t),i}function D(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function N(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function U(t){this._id=ct++,this._state=void 0,this._result=void 0,this._subscribers=[],p!==t&&(e(t)||D(),this instanceof U||N(),G(this,t))}function j(){var t;if("undefined"!=typeof global)t=global;else if("undefined"!=typeof self)t=self;else try{t=Function("return this")()}catch(t){throw new Error("polyfill failed because global object is unavailable in this environment")}var e=t.Promise;e&&"[object Promise]"===Object.prototype.toString.call(e.resolve())&&!e.cast||(t.Promise=ht)}var F;F=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};var z,B,q,W=F,H=0,V=({}.toString,function(t,e){J[H]=t,J[H+1]=e,H+=2,2===H&&(B?B(u):q())}),Y="undefined"!=typeof window?window:void 0,K=Y||{},X=K.MutationObserver||K.WebKitMutationObserver,Z="undefined"!=typeof process&&"[object process]"==={}.toString.call(process),Q="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,J=new Array(1e3);q=Z?r():X?l():Q?c():void 0===Y&&"function"==typeof require?d():h();var $=void 0,tt=1,et=2,it=new R,nt=new R;I.prototype._validateInput=function(t){return W(t)},I.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},I.prototype._init=function(){this._result=new Array(this.length)};var ot=I;I.prototype._enumerate=function(){for(var t=this,e=t.length,i=t.promise,n=t._input,o=0;i._state===$&&o<e;o++)t._eachEntry(n[o],o)},I.prototype._eachEntry=function(t,e){var n=this,o=n._instanceConstructor;i(t)?t.constructor===o&&t._state!==$?(t._onerror=null,n._settledAt(t._state,e,t._result)):n._willSettleAt(o.resolve(t),e):(n._remaining--,n._result[e]=t)},I.prototype._settledAt=function(t,e,i){var n=this,o=n.promise;o._state===$&&(n._remaining--,t===et?M(o,i):n._result[e]=i),0===n._remaining&&S(o,n._result)},I.prototype._willSettleAt=function(t,e){var i=this;w(t,void 0,function(t){i._settledAt(tt,e,t)},function(t){i._settledAt(et,e,t)})};var st=A,rt=T,at=k,lt=O,ct=0,ht=U;U.all=st,U.race=rt,U.resolve=at,U.reject=lt,U._setScheduler=n,U._setAsap=s,U._asap=V,U.prototype={constructor:U,then:function(t,e){var i=this,n=i._state;if(n===tt&&!t||n===et&&!e)return this;var o=new this.constructor(p),s=i._result;if(n){var r=arguments[n-1];V(function(){x(n,o,r,s)})}else w(i,o,t,e);return o},catch:function(t){return this.then(null,t)}};var ut=j,dt={Promise:ht,polyfill:ut};o=function(){return dt}(),ut()}.call(this),s=function(t,e,i){var n={call:function(t){if(i.polyfill(),!t.url)throw new Error("missing parameter : url is not defined !");if(!t.method)throw new Error("missing parameter : method is not defined !");t.format||(t.format="text");var e={};switch(e.url=t.url,e.data=t.data?t.data:null,e.method=t.method,e.timeOut=t.timeOut||0,e.scope=t.scope||this,t.method){case"DELETE":case"GET":break;case"PUT":case"POST":e.content=t.content?t.content:"application/x-www-form-urlencoded",e.headers=t.headers?t.headers:{referer:"http://localhost"};break;case"HEAD":case"OPTIONS":throw new Error("HTTP method not yet supported !");default:throw new Error("HTTP method unknown !")}switch(t.format){case"text":this.__call(e).then(function(e){t.onResponse.call(this,e)}).catch(function(e){t.onFailure.call(this,e)});break;case"json":this.__callJSON(e).then(function(e){t.onResponse.call(this,e)}).catch(function(e){t.onFailure.call(this,e)});break;case"xml":this.__callXML(e).then(function(e){t.onResponse.call(this,e)}).catch(function(e){t.onFailure.call(this,e)});break;default:throw new Error("This output Format is not yet supported !")}},__call:function(t){var i=new Promise(function(i,n){var o="POST"===t.method||"PUT"===t.method;t.data&&!o&&(t.url=e.normalyzeUrl(t.url,t.data));var s=null;if(window.XMLHttpRequest){s=new XMLHttpRequest,s.open(t.method,t.url,!0),s.overrideMimeType=t.content;var r=null;t.timeOut>0&&(r=window.setTimeout(function(){var t="TimeOut Occured on Http Request with XMLHttpRequest !";n({message:t,status:-1})},t.timeOut)),o&&s.setRequestHeader("Content-type",t.content),s.onerror=function(t){console.log(t),n(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},s.ontimeout=function(){n(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)window.clearTimeout(r),i(s.response);else{var t="Errors Occured on Http Request (status : '"+s.status+"' | response : '"+s.response+"')",e=s.status;n({message:t,status:e})}};var a=t.data&&o?t.data:null;s.send(a)}else{if(!window.XDomainRequest)throw new Error("CORS not supported");s=new XDomainRequest,s.open(t.method,t.url),s.overrideMimeType=t.content,t.timeOut>0&&(s.timeout=t.timeout),o&&s.setRequestHeader("Content-type",t.content),s.onerror=function(){n(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},s.ontimeout=function(){n(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},s.onload=function(){if(200==s.status)i(s.responseText);else{var t="Errors Occured on Http Request (status : '"+s.status+"' | response : '"+s.responseText+"')",e=s.status;n({message:t,status:e})}};var l=t.data&&o?t.data:null;s.send(l)}});return i},__callJSON:function(t){return this.__call(t).then(JSON.parse).catch(function(e){throw console.log("_callJSON failed on : ",t.url,e),e})},__callXML:function(t){return this.__call(t).then(function(t){var e;if(window.DOMParser){var i=new DOMParser;e=i.parseFromString(t,"text/xml")}else e=new window.ActiveXObject("Microsoft.XMLDOM"),e.async=!1,e.loadXML(t);return e}).catch(function(e){throw console.log("__callXML failed on : ",t.url,e),e})}};return n}(i,n,o),r=function(){var t={PARAM_MISSING:"Parameter(s) '%var%' missing",PARAM_EMPTY:"Parameter(s) '%var%' empty",PARAM_TYPE:"Wrong type(s) for parameter(s) '%var%'",PARAM_FORMAT:"Parameter(s) '%var%' not correctly formatted",PARAM_NOT_SUPPORT:"Value(s) for parameter(s) '%var%' not supported",PARAM_UNKNOWN:"Value(s) for parameter(s) '%var%' unknown",SERVICE_REQUEST_BUILD:"An error occurred during the request building of the service",SERVICE_REQUEST_EMPTY:"The request sent to the service is empty",SERVICE_RESPONSE_EXCEPTION:"The service returned an exception : '%var%'",SERVICE_RESPONSE_EXCEPTION_2:"The service returned an exception",SERVICE_RESPONSE_ANALYSE:"An error occurred while parsing the response '%var%' of the service",SERVICE_RESPONSE_ANALYSE_2:"An unknown error occurred while parsing the response",SERVICE_RESPONSE_EMPTY:"The response of the service is empty",SERVICE_RESPONSE_EMPTY_2:"The response from the service could not be analyzed or is empty",SERVICE_RESPONSE_FORMAT:"The format of the service response is not supported (handled format(s) : '%var%')",SERVICE_RESPONSE_FORMAT_2:"The format of the service response is not supported",SERVICE_RESPONSE_FORMAT_3:"No suggestion matching the search",CLASS_CONSTRUCTOR:"'%var%' constructor cannot be called as a function.",getMessage:function(t,e){if(!arguments)return"Message indefined !";var i=Array.prototype.slice.call(arguments),n=i.shift(),o=i,s=this[n];try{s=Array.isArray(o)&&o.length>0?s.replace("%var%",o.join(" - ")):s.replace("%var%","%var% (not specified)")}catch(t){}return s}};return t}(),a=function(){function t(e){if(!(this instanceof t))throw new TypeError("ErrorService constructor cannot be called as a function.");var i=e;"string"==typeof e||e instanceof String?(this.message=e,this.status=-1,this.type=t.TYPE_UNKERR):(this.message=i.message||"undefined!?",this.type=i.type,this.status=i.status||-1),this.name="ErrorService",this.stack=(new Error).stack}return t.TYPE_SRVERR="SERVICE_ERROR",t.TYPE_USEERR="USAGE_ERROR",t.TYPE_UNKERR="UNKNOWN_ERROR",t.prototype=Object.create(Error.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),t}(),l=function(t){var e={uuid:function(){var t=Math.floor(Date.now());return function(){return t++}}(),call:function(t){if(!t)throw new Error("missing parameter : options !");if(!t.url)throw new Error("missing parameter : options.url !");if(t.timeOut||(t.timeOut=0),!t.onResponse)throw new Error("missing parameter : options.onResponse !");var e="string"==typeof t.callbackSuffix?t.callbackSuffix:this.uuid(),i=!1,n=!1,o=t.url.indexOf("callback=");if(o!=-1){i=!0;var s=t.url.indexOf("&",o);s===-1&&(s=t.url.length);var r=t.url.substring(o+9,s);r&&(n=!0,t.callbackName=r)}if(!i){var a=t.url.indexOf("?");a===-1?t.url=t.url+"?callback=":a===t.url.length?t.url=t.url+"callback=":t.url=t.url+"&callback="}var l=!!t.callbackName||n;if(n||(t.callbackName||(t.callbackName="callback",(e||""===e)&&(t.callbackName+=e)),t.url=t.url.replace("callback=","callback="+t.callbackName)),t.onTimeOut||(t.onTimeOut=function(){console.log("TimeOut while invoking url : "+t.url)}),!l){var c=this,h=null;t.timeOut>0&&(h=window.setTimeout(function(){window[t.callbackName]=function(){},t.onTimeOut(),c._deleteScript(e)},t.timeOut)),window[t.callbackName]=function(i){window.clearTimeout(h),t.onResponse(i),c._deleteScript(e)}}this._createScript(e,t.url)},_createScript:function(t,e){var i,n=document.getElementById("results"+t);i=document.createElement("script"),i.setAttribute("type","text/javascript"),i.setAttribute("src",e),i.setAttribute("charset","UTF-8"),i.setAttribute("id","results"+t),i.setAttribute("async","true");var o=document.documentElement||document.getElementsByTagName("head")[0];null===n?o.appendChild(i):o.replaceChild(i,n)},_deleteScript:function(t){var e=document.getElementById("results"+t);if(e){var i=e.parentNode||document.documentElement;if(!i)return;i.removeChild(e)}}};return e}(i),c=function(t,e,i){var n={send:function(n){var o=n||{method:"GET",protocol:"JSONP",timeOut:0,format:null,wrap:!0,nocache:!0,output:"json",callback:null,callbackSuffix:null};if("XHR"===n.protocol||"json"===n.format?o.wrap=!1:"JSONP"===n.protocol&&"xml"===n.format&&(o.wrap=!0),o.callback=("JSONP"==n.protocol,null),o.output=o.wrap?"json":null,o.wrap){var s={};s.output=o.output,s.callback=o.callback,delete s.callback,o.url=t.normalyzeUrl(n.url,s)}switch(o.protocol){case"XHR":"GET"===n.method&&n.nocache&&(o.url=t.normalyzeUrl(o.url,{t:(new Date).getTime()})),e.call(o);break;case"JSONP":o.data&&(o.url=t.normalyzeUrl(o.url,o.data)),i.call(o);break;default:throw new Error("protocol not supported (XHR|JSONP) !")}}};return n}(n,s,l),h=function(){var t=location&&location.protocol&&0===location.protocol.indexOf("https:")?"https://":"http://",e="wxs.ign.fr",i="%KEY%",n=t+e.concat("/",i),o=function(t){return this._key.replace(t?i:null,t)},s={Alti:{_key:{"elevation-json":n+"/alti/rest/elevation.json","elevation-xml":n+"/alti/rest/elevation.xml","profil-json":n+"/alti/rest/elevationLine.json","profil-xml":n+"/alti/rest/elevationLine.xml",wps:n+"/alti/wps"},url:function(t){return{"elevation-json":this._key["elevation-json"].replace(t?i:null,t),"elevation-xml":this._key["elevation-xml"].replace(t?i:null,t),"profil-json":this._key["profil-json"].replace(t?i:null,t),"profil-xml":this._key["profil-xml"].replace(t?i:null,t),wps:this._key.wps.replace(t?i:null,t)}}},ProcessIsoCurve:{_key:{"iso-json":n+"/isochrone/isochrone.json","iso-xml":n+"/isochrone/isochrone.xml"},url:function(t){return{"iso-json":this._key["iso-json"].replace(t?i:null,t),"iso-xml":this._key["iso-xml"].replace(t?i:null,t)}}},AutoComplete:{_key:n+"/ols/apis/completion",url:o},ReverseGeocode:{_key:n+"/geoportail/ols",url:o},AutoConf:{_key:{apiKey:n+"/autoconf",apiKeys:n+"/autoconf?keys=%KEYS%"},url:function(n){var o="";if(Array.isArray(n)&&n.length>0){o=n[0];for(var s=1;s<n.length;s++)o+=","+n[s]}return{apiKey:this._key.apiKey.replace(n?i:null,n),apiKeys:this._key.apiKeys.replace(i,n[0]).replace("%KEYS%",o),aggregate:t+e.concat("/")+n+"/autoconf/id/"}}},Geocode:{_key:n+"/geoportail/ols",url:o},Route:{_key:{ols:n+"/itineraire/ols","route-json":n+"/itineraire/rest/route.json","route-xml":n+"/itineraire/rest/route.xml"},url:function(t){return{ols:this._key.ols.replace(t?i:null,t),"route-json":this._key["route-json"].replace(t?i:null,t),"route-xml":this._key["route-xml"].replace(t?i:null,t)}}}};return s}(),u=function(t,e,i,n,o,s){function r(t){if(!(this instanceof r))throw new TypeError(i.getMessage("CLASS_CONSTRUCTOR"));this.options={protocol:"JSONP",proxyURL:"",callbackSuffix:null,httpMethod:"GET",timeOut:0,rawResponse:!1,scope:this,onSuccess:function(t){console.log("onSuccess - la reponse est la suivante : ",t)},onFailure:function(t){200!==t.status&&t.status?console.log("onFailure - Erreur (",t.status,") : ",t.message):console.log("onFailure : ",t.message)}};for(var e in t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);if(!this.options.apiKey&&!this.options.serverUrl)throw new Error(i.getMessage("PARAM_MISSING","apiKey","serverUrl"));this.options.rawResponse&&!this.options.onSuccess&&(this.options.onSuccess=function(t){console.log("onSuccess - la réponse brute du service est la suivante : ",t)});var n=null!==this.options.onSuccess&&"function"==typeof this.options.onSuccess;if(!n)throw new Error(i.getMessage("PARAM_MISSING","onSuccess()"));if(!this.options.serverUrl){var o=s[this.CLASSNAME].url(this.options.apiKey);"string"==typeof o&&(this.options.serverUrl=o)}if(this.options.serverUrl){var a=this.options.serverUrl,l=a.split("?");this.options.serverUrl=l[0]}switch(this.options.httpMethod="string"==typeof t.httpMethod?t.httpMethod.toUpperCase():"GET",this.options.httpMethod){case"POST":case"GET":break;case"PUT":case"DELETE":case"HEAD":case"OPTIONS":throw new Error(i.getMessage("PARAM_NOT_SUPPORT","httpMethod"));default:throw new Error(i.getMessage("PARAM_UNKNOWN","httpMethod"))}switch(this.options.protocol="string"==typeof t.protocol?t.protocol.toUpperCase():"JSONP",this.options.protocol){case"JSONP":case"XHR":break;default:throw new Error(i.getMessage("PARAM_UNKNOWN","protocol"))}"JSONP"===this.options.protocol&&(this.options.httpMethod="GET"),this.options.nocache=t.nocache||!1,this.options.outputFormat=null,this.request=null,this.response=null}return r.prototype={constructor:r,call:function(){function t(){this.buildRequest.call(this,s,e)}function e(t){this.callService.call(this,s,i)}function i(t){this.analyzeResponse.call(this,s,n)}function n(t){return t?void this.options.onSuccess.call(this,t):s.call(this,new o("Analyse de la reponse en échec !?"))}function s(t){var e=t;e instanceof o||(e=new o(t.message)),this.options.onFailure.call(this,e)}t.call(this)},buildRequest:function(t,e){},callService:function(t,i){var s=null,r=this.request,a=!(!this.options.proxyURL||"XHR"!==this.options.protocol);this.options.serverUrl=e.normalyzeUrl(this.options.serverUrl,{"gp-access-lib":"1.0.0-beta3"},!1),a&&("GET"===this.options.httpMethod&&(s=this.options.proxyURL+e.normalyzeUrl(this.options.serverUrl,this.request,!0),r=null),"POST"===this.options.httpMethod&&(s=this.options.proxyURL+e.normalyzeUrl(this.options.serverUrl,null,!0),r=this.request));var l=this,c={url:s||this.options.serverUrl,method:this.options.httpMethod,protocol:this.options.protocol,timeOut:this.options.timeOut||0,format:this.options.outputFormat,nocache:this.options.nocache||!1,wrap:"XHR"!==this.options.protocol,callbackSuffix:this.options.callbackSuffix,data:r,headers:null,content:this.options.contentType||"application/xml",scope:this.options.scope||this,onResponse:function(e){var n=null;if("XHR"==l.options.protocol&&(n=e),"JSONP"==l.options.protocol){if(!e)return void t.call(l,new o("Le contenu de la reponse est vide !?"));if(e.http){if(200!==e.http.status)return void t.call(l,new o({status:e.http.status,message:e.http.error,type:o.TYPE_SRVERR}));n=e.xml}else n=e}l.response=n,i.call(l,n)},onFailure:function(e){e.type=o.TYPE_SRVERR,t.call(l,new o(e))},onTimeOut:function(){t.call(l,new o("TimeOut!"))}};n.send(c)},analyzeResponse:function(t,e){}},r}(i,n,r,c,a,h),d=function(t){function e(t){if(!(this instanceof e))throw new TypeError("AltiRequest constructor cannot be called as a function.");this.options=t||{},this.positions=this.options.positions||[],this.delimiter=this.options.delimiter||"|",this.indent=this.options.indent||!1,this.crs=this.options.crs||"CRS:84",this.format=this.options.format||"json"}return e.CLASSNAME="AltiRequest",e.prototype={constructor:e,setPositions:function(t){for(var e=[],i=0;i<t.length;i++){var n=t[i];n.lon&&n.lat&&e.push(n)}this.positions=e},getPositions:function(t){if(!t)return this.positions;var e=this.positions.length-1;return t>e||t<e?this.positions:this.positions[t]},addPositions:function(t){for(var e=0;e<t.length;e++){var i=t[e];i.lon&&i.lat&&this.positions.push(t[e])}},getLon:function(){for(var t=[],e=0;e<this.positions.length;e++)t.push(this.positions[e].lon);return t.join(this.delimiter)},getLat:function(){for(var t=[],e=0;e<this.positions.length;e++)t.push(this.positions[e].lat);return t.join(this.delimiter)}},e.prototype.getData=function(){var t=[];return t.push({k:"lon",v:this.getLon()}),t.push({k:"lat",v:this.getLat()}),t.push({k:"delimiter",v:this.delimiter}),t.push({k:"indent",v:this.indent}),t.push({k:"crs",v:this.crs}),t.push({k:"format",v:this.format}),t},e}(i),p=function(t,e){function i(t){if(!(this instanceof i))throw new TypeError("AltiElevationRequest constructor cannot be called as a function.");this.CLASSNAME="AltiElevationRequest",e.apply(this,arguments),this.zonly=this.options.zonly||!1}return i.prototype=Object.create(e.prototype,{zonly:{get:function(){return this._zonly},set:function(t){this._zonly=t}}}),i.prototype.constructor=i,i.prototype.getData=function(){var t=[];return t.push({k:"lon",v:this.getLon()}),t.push({k:"lat",v:this.getLat()}),t.push({k:"indent",v:this.indent}),t.push({k:"crs",v:this.crs}),t.push({k:"zonly",v:this.zonly}),t.push({k:"format",v:this.format}),t},i}(i,d),m=function(t,e){function i(t){if(!(this instanceof i))throw new TypeError("AltiProfilRequest constructor cannot be called as a function.");this.CLASSNAME="AltiProfilRequest",e.apply(this,arguments),this.sampling=this.options.sampling||3}return i.prototype=Object.create(e.prototype,{sampling:{get:function(){return this._sampling},set:function(t){this._sampling=t}}}),i.prototype.constructor=i,i.prototype.getData=function(){var t=[];return t.push({k:"lon",v:this.getLon()}),t.push({k:"lat",v:this.getLat()}),t.push({k:"indent",v:this.indent}),t.push({k:"crs",v:this.crs}),t.push({k:"sampling",v:this.sampling}),t.push({k:"format",v:this.format}),t},i}(i,d),f=function(t,e,i,n){function o(t){if(!(this instanceof o))throw new TypeError("AltiRequestREST constructor cannot be called as a function.");if(this.options=t||{},!this.options)throw new Error(e.getMessage("PARAM_EMPTY","options"));if(!this.options.type)throw new Error(e.getMessage("PARAM_EMPTY","type (Elevation or Profil)"));switch(this.DataObject=null,this.options.type){case"Elevation":this.DataObject=new i(this.options.param);break;case"Profil":this.DataObject=new n(this.options.param);break;default:throw new Error(e.getMessage("PARAM_TYPE","type (Elevation or Profil)"))}this.method=this.options.method||"GET"}return o.prototype={requestString:null,constructor:o,template:{get:{value:"lon=__LON__&lat=__LAT__&indent=__INDENT__&crs='__CRS__'",input:{point:"&zonly=__ZONLY__",profil:"&sampling=__SAMPLING__"}},post:{value:"lon=__LON__\nlat=__LAT__\nindent=__INDENT__\ncrs='__CRS__'\n",input:{point:"zonly=__ZONLY__",profil:"sampling=__SAMPLING__"}}},processRequestString:function(){var t="";return"POST"==this.method?t=this.template.post.value:"GET"==this.method&&(t=this.template.get.value),t=t.replace(/__LON__/g,this.DataObject.getLon()),t=t.replace(/__LAT__/g,this.DataObject.getLat()),t=t.replace(/__INDENT__/g,this.DataObject.indent),t=t.replace(/__CRS__/g,this.DataObject.crs),t+=this.__addDataInputs(),this.requestString=t,this.requestString},__addDataInputs:function(){var t;if("POST"==this.method)t=this.template.post;else{if("GET"!=this.method)throw new Error("No other HTTP method supported by the service !");t=this.template.get}var e=null;if("AltiElevationRequest"==this.DataObject.CLASSNAME)return e=t.input.point,e.replace(/__ZONLY__/g,this.DataObject.zonly);if("AltiProfilRequest"==this.DataObject.CLASSNAME)return e=t.input.profil,e.replace(/__SAMPLING__/g,this.DataObject.sampling);throw new Error("No other object supported than elevation or profil !?")}},o}(i,r,p,m),_=function(t){function e(t){if(!(this instanceof e))throw new TypeError("WPS constructor cannot be called as a function.");if(this.options=t||{},this.DataObject=this.options.data,!this.DataObject)throw new TypeError("This data object is not defined !");this.paramservice=this.options.param.service||"WPS",this.paramversion=this.options.param.version||"1.0.0",this.paramidentifier=this.options.param.identifier||"gs:WPS",this.paramrawdataoutput=this.options.param.rawdataoutput||"result",this.paramrequest=this.options.param.request||"Execute",this.method=this.options.method||"GET"}return e.prototype={requestString:null,constructor:e,template:{get:{value:"service=__SERVICE__&version=__VERSION__&rawdataoutput=__RAWDATAOUTPUT__&identifier=__IDENTIFIER__&request=__REQUEST__&datainputs=<!-- __DATAINPUTS__ -->",input:"__KEY__=__DATA__"},post:{value:'<?xml version="1.0" encoding="UTF-8"?><wps:__REQUEST__ version="__VERSION__" service="__SERVICE__" __NAMESPACE__ __SCHEMALOCATION__><ows:Identifier>__IDENTIFIER__</ows:Identifier><wps:DataInputs><!-- __DATAINPUTS__ --></wps:DataInputs><wps:ResponseForm><wps:RawDataOutput><ows:Identifier>__RAWDATAOUTPUT__</ows:Identifier></wps:RawDataOutput></wps:ResponseForm></wps:__REQUEST__>',input:"<wps:Input><ows:Identifier>__KEY__</ows:Identifier><wps:Data><wps:LiteralData>__DATA__</wps:LiteralData></wps:Data></wps:Input>"}},namespaceByDefault:function(){var t=['xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"','xmlns="http://www.opengis.net/wps/1.0.0"','xmlns:wfs="http://www.opengis.net/wfs"','xmlns:wps="http://www.opengis.net/wps/1.0.0"','xmlns:ows="http://www.opengis.net/ows/1.1"','xmlns:gml="http://www.opengis.net/gml"','xmlns:ogc="http://www.opengis.net/ogc"','xmlns:wcs="http://www.opengis.net/wcs/1.1.1"','xmlns:xlink="http://www.w3.org/1999/xlink"'];return t.join(" ")},schemaLocationByDefault:function(){return'xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd"'},processRequestString:function(){var t="";if("POST"==this.method)t=this.template.post.value;else{if("GET"!=this.method)return!1;t=this.template.get.value}return t=t.replace(/__SERVICE__/g,this.paramservice),t=t.replace(/__VERSION__/g,this.paramversion),t=t.replace(/__RAWDATAOUTPUT__/g,this.paramrawdataoutput),t=t.replace(/__IDENTIFIER__/g,this.paramidentifier),t=t.replace(/__REQUEST__/g,this.paramrequest),"POST"==this.method&&(t=t.replace(/__NAMESPACE__/g,this.namespaceByDefault),t=t.replace(/__SCHEMALOCATION__/g,this.schemaLocationByDefault)),!!(t=t.replace(/<!-- __DATAINPUTS__ -->/g,this.__addDataInputs()))&&(this.requestString=t,!0)},__addDataInputs:function(){for(var t="GET"==this.method?this.template.get.input:this.template.post.input,e="GET"==this.method?";":"",i="",n=this,o=this.DataObject.getData(),s=0;s<o.length;s++)!function(s){e&&(e=s==o.length-1?"":";"),i=i.concat(n.__addDataInput(t,o[s].k,o[s].v),e)}(s);return i},__addDataInput:function(t,e,i){var n=t;return n=n.replace(/__KEY__/g,e),n=n.replace(/__DATA__/g,i)},setMethod:function(t){"GET"!=t&&"POST"!=t||(this.method=t)},getMethod:function(){return this.method}},e}(i),g=function(t,e,i,n,o){var s={build:function(t){if(!t)throw new Error(e.getMessage("PARAM_EMPTY","options"));if(!t.type)throw new Error(e.getMessage("PARAM_EMPTY","type (Elevation or Profil)"));var s=null;switch(t.type){case"Elevation":t.wps.identifier="gs:WPSElevation",s=new n(t.param);break;case"Profil":t.wps.identifier="gs:WPSLineElevation",s=new o(t.param);break;default:throw new Error(e.getMessage("PARAM_TYPE","type (Elevation or Profil)"))}var r={data:s,method:t.method,param:t.wps},a=new i(r);if(!a.processRequestString())throw new Error("Enable to process request !");return a.requestString}};return s}(i,r,_,p,m),v=function(t,e,i,n){var o={build:function(t){var o=null,s={type:t.sampling?"Profil":"Elevation",method:t.httpMethod,param:{positions:null,delimiter:null,indent:null,crs:null,format:null,sampling:null,zonly:null}};s.param.positions=t.positions,s.param.format=t.outputFormat,s.param.sampling=t.sampling,s.param.zonly=t.zonly;var r=null!==t.onError&&"function"==typeof t.onError,a=null!==t.onSuccess&&"function"==typeof t.onSuccess,l=null;switch(t.api){case"REST":var c=new i(s);if(!c.processRequestString()){if(l="Error in process request (rest) !",r)return void t.onError.call(t.scope,new e(l));throw new Error(l)}o=c.requestString;break;case"WPS":if(s.wps={service:null,version:null,identifier:null,rawdataoutput:null,request:null},o=n.build(s),!o){if(l="Error in process request (wps) !",r)return void t.onError.call(t.scope,new e(l));throw new Error(l)}break;default:if(l="Type of API is not supported by service (REST or WPS) !",r)return void t.onError.call(t.scope,new e(l));throw new Error(l)}return a&&t.onSuccess.call(t.scope,o),o}};return o}(i,a,f,g),y=function(t){function e(t){if(!(this instanceof e))throw new TypeError("XML constructor cannot be called as a function.");this.xmlString=null,this.xmlDoc=null,this.reader=null,t&&(t.xmlString&&"string"==typeof t.xmlString&&(this.xmlString=t.xmlString,this.xmlDoc=i(t.xmlString)),t.reader&&this.setReader(t.reader))}function i(t){if("object"==typeof exports){var e=xmldom.DOMParser;return(new e).parseFromString(t,"text/xml")}var i,n,o="Erreur lors du parsing de la réponse du service : XML non conforme";if(window.ActiveXObject){n=new window.ActiveXObject("Microsoft.XMLDOM"),n.async=!1,n.loadXML(t);var s=n.parseError;if(s.errorCode)throw s.line&&s.linepos&&(o+="( ligne "+s.line+", colonne "+s.linepos),s.reason&&(o+=":  "+s.reason+")"),new Error(o);return n}if(window.DOMParser){i=new window.DOMParser;try{n=i.parseFromString(t,"text/xml")}catch(t){throw"SyntaxError"===t.message?new Error(o):new Error("Erreur lors du parsing de la réponse du service : "+t.message)}if(n.getElementsByTagName("parsererror").length>0)for(var r=n.getElementsByTagName("parsererror"),a=0;a<r.length;a++){var l=r[a].innerHTML;if(l.indexOf("Huge input lookup")==-1)throw o+="("+l+")",new Error(o)}else if(!n.documentElement)throw new Error(o);return n}throw new Error("Incompatible DOM Parser pour ce navigateur !")}function n(t){var e;return 9===t.nodeType?e=t.documentElement:1===t.nodeType&&(e=t),e}function o(t){var e={};if(t.attributes.length>0){
+var i=s(t);e.attributes=i}if(t.hasChildNodes())for(var n,r={},a=t.childNodes,l=0;l<a.length;l++)if(n=a[l],3===n.nodeType)e.textContent=n.nodeValue;else if(1===n.nodeType)if(r=o(n),e[n.nodeName]){if(!Array.isArray(e[n.nodeName])){var c=e[n.nodeName];e[n.nodeName]=[],e[n.nodeName].push(c)}e[n.nodeName].push(r)}else e[n.nodeName]=r;return e}function s(t){if(t.attributes.length>0){for(var e={},i=t.attributes,n=0;n<i.length;n++){var o=i[n];e[o.nodeName]=o.nodeValue}return e}}return e.prototype={constructor:e,getXMLString:function(){return this.xmlString},setXMLString:function(t){t&&"string"==typeof t&&(this.xmlString=t,this.xmlDoc=i(t))},getReader:function(){return this.reader},setReader:function(t){t&&t.read&&"function"==typeof t.read&&(this.reader=t)},getXMLDoc:function(){return this.xmlDoc},setXMLDoc:function(t){this.xmlDoc=t},parse:function(){if(!this.xmlDoc&&this.xmlString&&(this.xmlDoc=i(this.xmlString)),this.xmlDoc){var t=n(this.xmlDoc);if(t){var e;return this.reader&&this.reader.read?e=this.reader.read(t):(e={},e[t.nodeName]=o(t)),e}return{}}}},e}(i),E=function(){function t(){if(!(this instanceof t))throw new TypeError("AltiResponse constructor cannot be called as a function.");this.elevations=[]}return t.prototype={constructor:t},t}(),P=function(){function t(){if(!(this instanceof t))throw new TypeError("Elevation constructor cannot be called as a function.");this.z=null}return t.prototype={constructor:t},t}(),C=function(t,e,i){var n={};return n.READERS={elevations:function(t){var i=new e;if(t.hasChildNodes())for(var o,s,r=t.childNodes,a=0;a<r.length;a++)o=r[a],n.READERS[o.nodeName]&&(s=n.READERS[o.nodeName](o),i.elevations.push(s));return i},elevation:function(t){var e=new i;if(t.hasChildNodes())for(var o,s=t.childNodes,r=0;r<s.length;r++)o=s[r],n.READERS[o.nodeName]&&n.READERS[o.nodeName](o,e);return e},lat:function(t,e){var i=t.firstChild;if(!i||3!==i.nodeType)throw new Error("Erreur dans la lecture de la réponse du service: latitude attendue mais absente");e.lat=parseFloat(i.nodeValue)},lon:function(t,e){var i=t.firstChild;if(!i||3!==i.nodeType)throw new Error("Erreur dans la lecture de la réponse du service: longitude attendue mais absente");e.lon=parseFloat(i.nodeValue)},z:function(t,e){var n=t.firstChild;if(!n||3!==n.nodeType)throw new Error("Erreur dans la lecture de la réponse du service: altitude attendue mais absente");return e?void(e.z=parseFloat(n.nodeValue)):(e=new i,e.z=parseFloat(n.nodeValue),e)},acc:function(t,e){var i=t.firstChild;if(!i||3!==i.nodeType)throw new Error("Erreur dans la lecture de la réponse du service: précision (acc) attendue mais absente");e.acc=parseFloat(i.nodeValue)},exceptionreport:function(t){var e={};if(t.hasChildNodes())for(var i,o=t.childNodes,s=0;s<o.length;s++)i=o[s],"Exception"===i.nodeName&&(e.exceptionReport=n.READERS.exception(i));return e},exception:function(t){var e={},i=t.getAttribute("exceptionCode");i&&(e.exceptionCode=i);var n=t.firstChild;return n&&3===n.nodeType&&(e.exception=n.nodeValue),e},error:function(t){var e={error:{}};if(t.hasChildNodes())for(var i,n=t.childNodes,o=0;o<n.length;o++){i=n[o];var s;1===i.nodeType&&"code"===i.nodeName&&(s=i.firstChild,s&&3===s.nodeType&&(e.error.code=s.nodeValue)),1===i.nodeType&&"description"===i.nodeName&&(s=i.firstChild,s&&3===s.nodeType&&(e.error.description=s.nodeValue))}return e}},n.read=function(t){if("elevations"===t.nodeName){var e=n.READERS.elevations(t);return e}if("ExceptionReport"===t.nodeName){var i=n.READERS.exceptionreport(t);return i}if("error"===t.nodeName){var o=n.READERS.error(t);return o}throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.")},n}(i,E,P),S=function(t,e,i,n,o,s,r){var a={build:function(t){var a=null;if(!t.response)return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_EMPTY")));if(t.rawResponse)a=t.response;else{switch(t.outputFormat){case"xml":try{var l=new n({reader:o});if("string"==typeof t.response?l.setXMLString(t.response):l.setXMLDoc(t.response),a=l.parse(),!a)throw new Error(i.getMessage("SERVICE_RESPONSE_EXCEPTION_2"))}catch(n){var c=n.message;return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",c),status:200,type:e.TYPE_SRVERR}))}break;case"json":var h;if(h="string"==typeof t.response?window.JSON.parse(t.response):t.response,h.error)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",h.error.description),status:200,type:e.TYPE_SRVERR}));if(h){var u,d=h.elevations,p=new s;if(Array.isArray(d)&&d.length)for(var m=0;m<d.length;m++)u=new r,"object"==typeof d[m]?(d[m].lon&&(u.lon=d[m].lon),d[m].lat&&(u.lat=d[m].lat),d[m].z&&(u.z=d[m].z),d[m].acc&&(u.acc=d[m].acc)):"number"==typeof d[m]&&(u.z=d[m]),Array.isArray(p.elevations)&&p.elevations.push(u);a=p}if(!a)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_ANALYSE_2"),type:e.TYPE_UNKERR,status:-1}));break;default:return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_FORMAT_2"),type:e.TYPE_UNKERR,status:-1}))}if(a.exceptionReport)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",a.exceptionReport),type:e.TYPE_SRVERR,status:200}));if(a.error){var f=a.error.description;return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",f),type:e.TYPE_SRVERR,status:200}))}}t.onSuccess.call(t.scope,a)}};return a}(i,a,r,y,C,E,P),M=function(t,e,i,n,o,s,r){function a(t){if(!(this instanceof a))throw new TypeError(e.getMessage("CLASS_CONSTRUCTOR","Alti"));if(this.CLASSNAME="Alti",n.apply(this,arguments),!t.positions)throw new Error(e.getMessage("PARAM_MISSING","positions"));if(0===t.positions.length)throw new Error(e.getMessage("PARAM_EMPTY","positions"));if(this.options.positions=t.positions,this.options.outputFormat="string"==typeof t.outputFormat?t.outputFormat.toLowerCase():"xml",this.options.sampling=t.sampling||null,this.options.api="string"==typeof t.api?t.api.toUpperCase():"REST","REST"===this.options.api&&(this.options.httpMethod="GET"),this.options.zonly=t.zonly||!1,!this.options.serverUrl){var i=o.Alti.url(this.options.apiKey),s=null;switch(this.options.api){case"WPS":s=i.wps;break;case"REST":var r=(t.sampling?"profil":"elevation")+"-"+this.options.outputFormat;s=i[r];break;default:throw new Error(e.getMessage("PARAM_UNKNOWN","api"))}if(!s)throw new Error("Url by default not found !");this.options.serverUrl=s}var l=this.options.serverUrl.lastIndexOf(".");if(l!==-1){var c=this.options.serverUrl.substring(l+1);if(c&&c.length<5)switch(c.toLowerCase()){case"json":case"xml":this.options.outputFormat=c.toLowerCase();break;default:throw new Error("type of service : unknown or unsupported (json or xml) !")}}}return a.prototype=Object.create(n.prototype,{}),a.prototype.constructor=a,a.prototype.buildRequest=function(t,e){var i={httpMethod:this.options.httpMethod,onSuccess:function(t){this.request=t,e.call(this,this.request)},onError:t,scope:this,positions:this.options.positions,outputFormat:this.options.outputFormat,sampling:this.options.sampling,api:this.options.api,zonly:this.options.zonly};s.build(i)},a.prototype.analyzeResponse=function(t,n){if(this.response){var o={response:this.response,outputFormat:this.options.outputFormat,rawResponse:this.options.rawResponse,onError:t,onSuccess:n,scope:this};r.build(o)}else t.call(this,new i(e.getMessage("SERVICE_RESPONSE_EMPTY")))},a}(i,r,a,u,h,v,S),w=function(){function t(){if(!(this instanceof t))throw new TypeError("AutoConfResponse constructor cannot be called as a function.");this.generalOptions={apiKeys:{},title:null,defaultGMLGFIStyle:null,theme:null,wgs84Resolutions:[]},this.layers={},this.territories={},this.tileMatrixSets={},this.services={}}return t.prototype={constructor:t,isConfLoaded:function(t){if(t)return!!this.generalOptions.apiKeys[t]},getLayersId:function(t){return this.generalOptions.apiKeys[t]},getLayersConf:function(t){var e={},i=this.getLayersId(t);if(i)for(var n=0;n<i.length;n++){var o=i[n];e[o]=this.layers[o]}return e},getLayerConf:function(t){if(this.layers)return this.layers[t]},getTileMatrixSets:function(){return this.tileMatrixSets},getTMSConf:function(t){if(this.tileMatrixSets)return this.tileMatrixSets[t]},getTerritories:function(){return this.territories},getTerritoryConf:function(t){if(this.territories)return this.territories[t]},getServices:function(){return this.services},getServiceConf:function(t){if(this.services)return this.services[t]}},t}(),L=function(){function t(){if(!(this instanceof t))throw new TypeError("Constraint constructor cannot be called as a function.");this.crs=null,this.bbox={left:null,right:null,top:null,bottom:null},this.minScaleDenominator=null,this.maxScaleDenominator=null,this.temporalExtent=[null,null]}return t.prototype={constructor:t},t}(),R=function(){function t(){if(!(this instanceof t))throw new TypeError("Format constructor cannot be called as a function.");this.current=null,this.name=null}return t.prototype={constructor:t},t}(),b=function(){function t(){if(!(this instanceof t))throw new TypeError("Layer constructor cannot be called as a function.")}return t.prototype={constructor:t,getName:function(){return this.name},getTitle:function(){return this.title},getDescription:function(){return this.description},getLayerId:function(){return this.layerId},getQuicklookUrl:function(){return this.quicklookUrl},getDefaultProjection:function(){return this.defaultProjection},getProjections:function(){var t=[];t.push(this.defaultProjection);var e=t.concat(this.additionalProjections);return e},getBBOX:function(){if(this.globalConstraint)return this.globalConstraint.bbox},getMinScaleDenominator:function(){if(this.globalConstraint)return this.globalConstraint.minScaleDenominator},getMaxScaleDenominator:function(){if(this.globalConstraint)return this.globalConstraint.maxScaleDenominator},getTMSID:function(){if(this.wmtsOptions)return this.wmtsOptions.tileMatrixSetLink},getServiceParams:function(){return this.serviceParams},getServerUrl:function(t){if(t&&this.serviceParams&&this.serviceParams.serverUrl)return this.serviceParams.serverUrl[t]},getLegends:function(){return this.legends},getMetadata:function(){return this.metadata},getStyles:function(){return this.styles},getDefaultStyle:function(){if(this.styles){for(var t,e=this.styles,i=0;i<e.length;i++)if(e[i].current===!0){t=e[i].name;break}return t}},getThematics:function(){return this.thematics},getDefaultFormat:function(){if(this.formats){for(var t,e=this.formats,i=0;i<e.length;i++)if(e[i].current===!0){t=e[i].name;break}return t}},getConstraints:function(){return this.constraints},getOriginators:function(){return this.originators},getDimensions:function(){return this.dimensions},getAggregatedLayers:function(){return this.isAggregate?this.aggregatedLayers:void 0}},t}(),x=function(){function t(){if(!(this instanceof t))throw new TypeError("Legend constructor cannot be called as a function.");this.format=null,this.url=null,this.minScaleDenominator=null}return t.prototype={constructor:t},t}(),G=function(){function t(){if(!(this instanceof t))throw new TypeError("Metadata constructor cannot be called as a function.");this.format=null,this.url=null}return t.prototype={constructor:t},t}(),I=function(){function t(){if(!(this instanceof t))throw new TypeError("Originator constructor cannot be called as a function.");this.name=null,this.attribution=null,this.logo=null,this.url=null,this.constraints=[]}return t.prototype={constructor:t},t}(),A=function(){function t(){if(!(this instanceof t))throw new TypeError("Service constructor cannot be called as a function.");this.title=null,this.serverUrl=null,this.version=null}return t.prototype={constructor:t},t}(),T=function(){function t(){if(!(this instanceof t))throw new TypeError("Style constructor cannot be called as a function.");this.name=null,this.title=null,this.current=null}return t.prototype={constructor:t},t}(),k=function(){function t(){if(!(this instanceof t))throw new TypeError("Territory constructor cannot be called as a function.");this.isDefault=null,this.defaultCRS=null,this.additionalCRS=[],this.geoBBOX={left:null,right:null,top:null,bottom:null},this.geoCenter={lon:null,lat:null},this.defaultOptions={resolution:null,minScaleDenominator:null,maxScaleDenominator:null},this.defaultLayers=[]}return t.prototype={constructor:t},t}(),O=function(){function t(){if(!(this instanceof t))throw new TypeError("Thematic constructor cannot be called as a function.");this.inspire=null,this.name=null}return t.prototype={constructor:t},t}(),D=function(){function t(){if(!(this instanceof t))throw new TypeError("TileMatrixSet constructor cannot be called as a function.");this.projection=null,this.nativeResolutions=[],this.matrixIds=[],this.tileMatrices={}}return t.prototype={constructor:t,getResolutions:function(){return this.nativeResolutions},getMatrixIds:function(){return this.matrixIds},getProjection:function(){return this.projection},getTileMatrices:function(){return this.tileMatrices},getTopLeftCorner:function(){var t,e=this.getTileMatrices();if(e)for(var i in e)if(e.hasOwnProperty(i)){t=e[i].topLeftCorner;break}return t}},t}(),N=function(){function t(){if(!(this instanceof t))throw new TypeError("TileMatrix constructor cannot be called as a function.");this.matrixId=null,this.matrixHeight=null,this.matrixWidth=null,this.scaleDenominator=null,this.tileHeight=null,this.tileWidth=null,this.topLeftCorner=null}return t.prototype={constructor:t,getTopLeftCorner:function(){return this.topLeftCorner},getScaleDenominator:function(){return this.scaleDenominator},getTileHeight:function(){return this.tileHeight},getTileWidth:function(){return this.tileWidth},getMatrixHeight:function(){return this.matrixHeight},getMatrixWidth:function(){return this.matrixWidth}},t}(),U=function(){function t(){if(!(this instanceof t))throw new TypeError("TileMatrixLimit constructor cannot be called as a function.");this.minTileRow=null,this.maxTileRow=null,this.minTileCol=null,this.maxTileCol=null}return t.prototype={constructor:t},t}(),j=function(t,e,i,n,o,s,r,a,l,c,h,u,d,p,m){function f(t){if(t.attributes.length>0){for(var e={},i=t.attributes,n=0;n<i.length;n++){var o=i[n];e[o.nodeName]=o.nodeValue}return e}}function _(t,e){if(t.hasChildNodes())for(var i,n,o,s=t.childNodes,r=0;r<s.length;r++)if(i=s[r],1===i.nodeType)if(n=i.localName||i.baseName||i.nodeName,o=i.prefix||y.DEFAULTPREFIX,y.READERS[o][n]){var a=y.READERS[o][n];a(i,e)}else _(i,e)}function g(t){var e,i="";return t.hasChildNodes()&&(e=t.firstChild,3!==e.nodeType&&4!==e.nodeType||(i=e.nodeValue)),i}function v(t){if(t.attributes.length>0){var e=f(t);for(var i in e)if(e.hasOwnProperty(i)){if("version"===i&&e.version!==y.VERSION)return void console.log("[AutoConfResponseReader] autoconf version is not the expected one : there may be errors in parsing");if("xmlns"===i){if(e[i]!==y.NAMESPACES.xmlns)return void console.log("[AutoConfResponseReader] autoconf response default namespace is not the expected one");continue}var n=i.split(":")[0],o=i.split(":")[1];if("xmlns"===n&&o&&y.NAMESPACES[o]&&y.NAMESPACES[o]!==e[i])return void console.log("[AutoConfResponseReader] autoconf response "+i+" namespace is not the expected one");if("schemaLocation"===o&&e[i]!==y.SCHEMALOCATION[0]&&e[i]!==y.SCHEMALOCATION[1])return void console.log("[AutoConfResponseReader] autoconf response schema location is not the expected one")}}}var y={};return y.VERSION="1.1.0",y.NAMESPACES={xmlns:"http://www.opengis.net/context",gpp:"http://api.ign.fr/geoportail",ows:"http://www.opengis.net/ows/1.1",sld:"http://www.opengis.net/sld",wmts:"http://www.opengis.net/wmts/1.0",xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance"},y.SCHEMALOCATION=["http://www.opengis.net/context http://gpp3-wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://wxs.ign.fr/schemas/autoconf/autoconf.xsd","http://www.opengis.net/context http://gpp3-wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://gpp3-wxs.ign.fr/schemas/autoconf.xsd"],y.DEFAULTPREFIX="context",y.READERS={context:{ViewContext:function(t){v(t);var i=new e;return _(t,i),i},Title:function(t,e){e&&e.generalOptions?e.generalOptions.title=g(t):e&&e.lyr&&(e.lyr.title=g(t))},Abstract:function(t,e){e&&e.lyr&&(e.lyr.description=g(t))},Server:function(t,e){var i=t.getAttribute("service"),n=t.getAttribute("title"),o=t.getAttribute("version");if(i)if(e&&e.services&&"object"==typeof e.services&&!e.services[i]){var s=new l;s.title=n,s.version=o,_(t,s),e.services[i]=s}else e&&e.lyr&&(e.lyr.serviceParams||(e.lyr.serviceParams={}),e.lyr.serviceParams.id=i,e.lyr.serviceParams.version=o)},OnlineResource:function(t,e){e&&e.hasOwnProperty("serverUrl")&&(e.serverUrl=t.getAttribute("xlink:href"))},LayerList:function(t,e){if(_(t,e),e&&e.layers&&e.generalOptions&&e.services)for(var i in e.layers)if(e.layers.hasOwnProperty(i)){var n=e.layers[i],o=n.apiKeys;if(o&&Array.isArray(o))for(var s=0;s<o.length;s++){var r=o[s];e.generalOptions.apiKeys&&(e.generalOptions.apiKeys[r]&&Array.isArray(e.generalOptions.apiKeys[r])||(e.generalOptions.apiKeys[r]=[]),e.generalOptions.apiKeys[r].push(i))}var a=n.serviceParams;if(a&&a.id&&!e.services[a.id]){var c=new l;a.serverUrl&&(c.serverUrl=a.serverUrl),a.version&&(c.version=a.version),e.services[a.id]=c}if(n.wmtsOptions&&n.wmtsOptions.tileMatrixSetLink&&e.tileMatrixSets){var h=n.wmtsOptions.tileMatrixSetLink,u=e.tileMatrixSets;for(var d in u)u.hasOwnProperty(d)&&d===h&&(n.defaultProjection=u[d].projection)}}},Layer:function(t,e){if(e&&e.layers){var i={lyr:new o,lyrId:null},n=t.getAttribute("hidden");"1"===n?i.lyr.hidden=!0:i.lyr.hidden=!1;var s=t.getAttribute("queryable");if("1"===s?i.lyr.queryable=!0:i.lyr.queryable=!1,_(t,i),i.lyrId){if(i.lyr.serviceParams&&i.lyr.serviceParams.id){var r=i.lyr.serviceParams.id;if(r.toUpperCase().indexOf("OPENLS")!==-1||r.toUpperCase().indexOf("ELEVATION")!==-1){var a=i.lyrId.split("$")[0];i.lyrId=a+"$"+r}}i.lyr.layerId=i.lyrId,e.layers[i.lyrId]=i.lyr}}},Name:function(t,e){e&&e.lyr&&(e.lyr.name=g(t))},SRS:function(t,e){e&&e.lyr&&(e.lyr.defaultProjection=g(t))},Format:function(t,e){if(e&&e.lyr){var i=new n,o=t.getAttribute("current");"1"===o?i.current=!0:i.current=!1,i.name=g(t),e.lyr.formats&&Array.isArray(e.lyr.formats)||(e.lyr.formats=[]),e.lyr.formats.push(i)}},Style:function(t,e){if(e&&e.lyr){var i=new c,n=t.getAttribute("current");if("1"===n||1===n?i.current=!0:i.current=!1,t.hasChildNodes)for(var o,s,r=t.childNodes,a=0;a<r.length;a++)o=r[a],1===o.nodeType&&(s=o.localName||o.baseName||o.nodeName,"Name"===s?i.name=g(o):"Title"===s&&(i.title=g(o)));e.lyr.styles&&Array.isArray(e.lyr.styles)||(e.lyr.styles=[]),e.lyr.styles.push(i)}},Dimension:function(t,e){var i=t.getAttribute("name"),n=g(t);e&&e.lyr&&(e.lyr.dimensions||(e.lyr.dimensions={}),"Type"===i?e.lyr.dimensions.type=n:"VisibilityRange"===i?e.lyr.dimensions.visibilityRange=n:"VisibilityMode "===i?e.lyr.dimensions.visibilityMode=n:"GeometricType"===i?e.lyr.dimensions.geometricType=n:"NoDataValue"===i&&(e.lyr.dimensions.noDataValue=n))}},gpp:{Theme:function(t,e){e&&e.generalOptions&&e.generalOptions.hasOwnProperty("theme")&&(e.generalOptions.theme=g(t))},defaultGMLGFIStyleUrl:function(t,e){e&&e.generalOptions&&e.generalOptions.hasOwnProperty("defaultGMLGFIStyle")&&(e.generalOptions.defaultGMLGFIStyle=g(t))},Territory:function(t,e){var i=t.getAttribute("id");if(i){var n=new h,o=t.getAttribute("default");"1"===o?n.isDefault=!0:n.isDefault=!1,_(t,n),e&&e.territories&&"object"==typeof e.territories&&(e.territories[i]=n)}},defaultCRS:function(t,e){e&&e.hasOwnProperty("defaultCRS")&&(e.defaultCRS=g(t))},AdditionalCRS:function(t,e){var i=g(t);i&&e&&(Array.isArray(e.additionalCRS)?e.additionalCRS.push(i):(e.additionalProjections&&Array.isArray(e.additionalProjections)||(e.additionalProjections=[]),e.additionalProjections.push(i)))},DefaultLayer:function(t,e){var i=t.getAttribute("layerId");i&&e&&Array.isArray(e.defaultLayers)&&e.defaultLayers.push(i)},BoundingBox:function(t,e){if(e){var n=g(t).split(",");if(4===n.length){var o={left:parseFloat(n[0]),right:parseFloat(n[2]),top:parseFloat(n[3]),bottom:parseFloat(n[1])},s=t.getAttribute("minT"),r=t.getAttribute("maxT");if(e.hasOwnProperty("geoBBOX"))e.geoBBOX=o;else if(e.hasOwnProperty("bbox"))if(e.bbox.left||e.bbox.right||e.bbox.top||e.bbox.bottom){e.multiConstraints||(e.multiConstraints=[]);var a=new i;a.bbox=o,a.temporalExtent=[s,r],e.multiConstraints.push(a)}else e.bbox=o,e.temporalExtent=[s,r];else e.globalConstraint||(e.globalConstraint=new i),e.globalConstraint.bbox=o,e.globalConstraint.temporalExtent=[s,r]}}},Resolution:function(t,e){var i=g(t);i&&e&&e.defaultOptions&&e.defaultOptions.hasOwnProperty("resolution")&&(e.defaultOptions.resolution=parseFloat(i))},x:function(t,e){var i=g(t);i&&e&&e.geoCenter&&e.geoCenter.hasOwnProperty("lon")&&(e.geoCenter.lon=parseFloat(i))},y:function(t,e){var i=g(t);i&&e&&e.geoCenter&&e.geoCenter.hasOwnProperty("lat")&&(e.geoCenter.lat=parseFloat(i))},Resolutions:function(t,e){e&&e.generalOptions&&e.generalOptions.hasOwnProperty("wgs84Resolutions")&&(e.generalOptions.wgs84Resolutions=g(t).split(","))},Layer:function(t,e){if(e&&e.hasOwnProperty("lyrId")&&e.lyr){e.lyrId=t.getAttribute("id");var i=t.getAttribute("aggregate"),n=t.getAttribute("more");(i||n)&&(e.lyr.isAggregate=!0),_(t,e.lyr)}},Constraint:function(t,e){var n=new i;if(_(t,n),e)if(e.constraints&&Array.isArray(e.constraints)||(e.constraints=[]),n.multiConstraints&&Array.isArray(n.multiConstraints)){var o=new i;o.crs=n.crs,o.bbox=n.bbox,o.minScaleDenominator=n.minScaleDenominator,o.maxScaleDenominator=n.maxScaleDenominator,o.temporalExtent=n.temporalExtent,e.constraints.push(o);for(var s=0;s<n.multiConstraints.length;s++)o=new i,o.crs=n.crs,o.minScaleDenominator=n.minScaleDenominator,o.maxScaleDenominator=n.maxScaleDenominator,o.bbox=n.multiConstraints[s].bbox,o.temporalExtent=n.multiConstraints[s].temporalExtent,e.constraints.push(o)}else e.constraints.push(n)},CRS:function(t,e){e&&e.hasOwnProperty("crs")&&(e.crs=g(t))},Thematic:function(t,e){if(e){var i=new u;i.inspire=!1,i.name=g(t),e.thematics&&Array.isArray(e.thematics)||(e.thematics=[]),e.thematics.push(i)}},InspireThematic:function(t,e){if(e){var i=new u;i.inspire=!0,i.name=g(t),e.thematics&&Array.isArray(e.thematics)||(e.thematics=[]),e.thematics.push(i)}},Originator:function(t,e){if(e){var i=new a;i.name=t.getAttribute("name"),_(t,i),e.originators&&Array.isArray(e.originators)||(e.originators=[]),e.originators.push(i)}},Attribution:function(t,e){e&&e.hasOwnProperty("attribution")&&(e.attribution=g(t))},Logo:function(t,e){e&&e.hasOwnProperty("logo")&&(e.logo=g(t))},URL:function(t,e){e&&e.hasOwnProperty("url")&&(e.url=g(t))},Legend:function(t,e){var i=new s;_(t,i),e&&(e.legends&&Array.isArray(e.legends)||(e.legends=[]),e.legends.push(i))},LegendURL:function(t,e){if(e&&e.hasOwnProperty("format")&&(e.format=t.getAttribute("format"),t.hasChildNodes)){var i=t.childNodes[0],n=i.localName||i.baseName||i.nodeName;"OnlineResource"===n&&e.hasOwnProperty("url")&&(e.url=i.getAttribute("xlink:href"))}},QuickLook:function(t,e){if(t.hasChildNodes){var i=t.childNodes[0],n=i.localName||i.baseName||i.nodeName;"OnlineResource"===n&&e&&(e.quicklookUrl=i.getAttribute("xlink:href"))}},MetadataURL:function(t,e){if(e){var i=new r;if(i.format=t.getAttribute("format"),t.hasChildNodes){var n=t.childNodes[0],o=n.localName||n.baseName||n.nodeName;"OnlineResource"===o&&(i.url=n.getAttribute("xlink:href"))}e.metadata||Array.isArray(e.metadata)||(e.metadata=[]),e.metadata.push(i)}},Key:function(t,e){if(e){var i=t.getAttribute("id");e.apiKeys&&Array.isArray(e.apiKeys)||(e.apiKeys=[]),e.apiKeys.push(i);var n=g(t);e.serviceParams||(e.serviceParams={}),e.serviceParams.serverUrl||(e.serviceParams.serverUrl={}),e.serviceParams.serverUrl[i]||(e.serviceParams.serverUrl[i]=n)}}},ows:{Identifier:function(t,e){e&&e.hasOwnProperty("TMS")?e.identifier=g(t):e&&e.hasOwnProperty("matrixId")&&(e.matrixId=g(t))},SupportedCRS:function(t,e){e&&e.TMS&&e.TMS.hasOwnProperty("projection")&&(e.TMS.projection=g(t))}},sld:{MinScaleDenominator:function(t,e){var n=g(t);n&&e&&(e.hasOwnProperty("defaultOptions")?e.defaultOptions.minScaleDenominator=parseFloat(n):e.lyr?(e.lyr.globalConstraint||(e.lyr.globalConstraint=new i),e.lyr.globalConstraint.minScaleDenominator=parseFloat(n)):e.hasOwnProperty("minScaleDenominator")&&(e.minScaleDenominator=parseFloat(n)))},MaxScaleDenominator:function(t,e){var n=g(t);n&&e&&(e.hasOwnProperty("defaultOptions")?e.defaultOptions.maxScaleDenominator=parseFloat(n):e.lyr?(e.lyr.globalConstraint||(e.lyr.globalConstraint=new i),e.lyr.globalConstraint.maxScaleDenominator=parseFloat(n)):e.hasOwnProperty("maxScaleDenominator")&&(e.maxScaleDenominator=parseFloat(n)))}},wmts:{TileMatrixSetLimits:function(t,e){if(e){var i={};_(t,i),e.wmtsOptions||(e.wmtsOptions={}),e.wmtsOptions.tileMatrixSetLimits=i}},TileMatrixLimits:function(t,e){var i,n=new m;if(t.hasChildNodes){for(var o=t.childNodes,s=0;s<o.length;s++){var r=o[s],a=r.localName||r.baseName||r.nodeName;"TileMatrix"===a?i=g(r):"MinTileRow"===a?n.minTileRow=g(r):"MaxTileRow"===a?n.maxTileRow=g(r):"MinTileCol"===a?n.minTileCol=g(r):"MaxTileCol"===a&&(n.maxTileCol=g(r))}i&&e&&!e[i]&&(e[i]=n)}},TileMatrixSet:function(t,e){if(e&&e.tileMatrixSets){var i={};i.TMS=new d,i.resolutions=[],_(t,i);var n=i.TMS.tileMatrices;for(var o in n)n.hasOwnProperty(o)&&i.TMS.matrixIds.push(o);if(("IGNF:WGS84G"===i.TMS.getProjection()||"EPSG:4326"===i.TMS.getProjection())&&e.generalOptions&&Array.isArray(e.generalOptions.wgs84Resolutions))for(var s=e.generalOptions.wgs84Resolutions,r=0;r<s.length;r++)i.resolutions[r]=parseFloat(s[r]);Array.isArray(i.resolutions)&&void 0!==i.resolutions.sort&&i.resolutions.sort(function(t,e){return e-t}),i.TMS.nativeResolutions=i.resolutions,e.tileMatrixSets[i.identifier]=i.TMS}else e&&!e.wmtsOptions&&(e.wmtsOptions={}),e.wmtsOptions.tileMatrixSetLink=g(t)},TileMatrix:function(t,e){if(e){var i=new p;if(_(t,i),e.TMS&&e.TMS.getProjection()){var n=e.TMS.getProjection();if("EPSG:3857"===n||"EPSG:2154"===n){var o=28e-5*i.scaleDenominator;e.resolutions&&Array.isArray(e.resolutions)&&e.resolutions.push(o)}}e.TMS&&e.TMS.tileMatrices&&(e.TMS.tileMatrices[i.matrixId]=i)}},ScaleDenominator:function(t,e){var i=g(t);i&&e&&e.hasOwnProperty("scaleDenominator")&&(e.scaleDenominator=parseFloat(i))},TopLeftCorner:function(t,e){var i=g(t).split(" ");i&&e&&(e.topLeftCorner={},e.topLeftCorner.x=parseFloat(i[0]),e.topLeftCorner.y=parseFloat(i[1]))},TileWidth:function(t,e){var i=g(t);i&&e&&e.hasOwnProperty("tileWidth")&&(e.tileWidth=parseInt(i,10))},TileHeight:function(t,e){var i=g(t);i&&e&&e.hasOwnProperty("tileHeight")&&(e.tileHeight=parseInt(i,10))},MatrixWidth:function(t,e){var i=g(t);i&&e&&e.hasOwnProperty("matrixWidth")&&(e.matrixWidth=parseInt(i,10))},MatrixHeight:function(t,e){var i=g(t);i&&e&&e.hasOwnProperty("matrixHeight")&&(e.matrixHeight=parseInt(i,10))}},serviceException:function(t){var e={};if(t.hasChildNodes())for(var i,n=t.childNodes,o=0;o<n.length;o++)i=n[o],"exception"===i.nodeName&&(e.exceptionReport=y.READERS.exception(i));return e},exception:function(t){var e={},i=t.getAttribute("code");i&&(e.exceptionCode=i);var n=t.firstChild;return n&&3===n.nodeType&&(e.exception=n.nodeValue),e}},y.read=function(t){if("ViewContext"===t.nodeName){var e=t.prefix||y.DEFAULTPREFIX,i=y.READERS[e][t.nodeName](t);return i}if("serviceException"===t.nodeName){var n=y.READERS[t.nodeName](t);return n}throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.")},y}(i,w,L,R,b,x,G,I,A,T,k,O,D,N,U),F=function(t,e,i,n,o){var s={build:function(t){var s=null;if(!t.response)return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_EMPTY")));if(t.rawResponse)s=t.response;else{try{var r=new n({reader:o});"string"==typeof t.response?r.setXMLString(t.response):r.setXMLDoc(t.response),s=r.parse()}catch(n){var a=n.message;return a+="string"==typeof t.response?"\n(raw response service'"+t.response+"')":"\n(raw response service'"+t.response.documentElement.innerHTML+"')",void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",a),status:200,type:e.TYPE_SRVERR}))}var l=!0;for(var c in s)s.hasOwnProperty(c)&&(l=!1);if(l)return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_EMPTY_2")));if(s.exceptionReport)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",s.exceptionReport),type:e.TYPE_SRVERR,status:200}))}var h="undefined"!=typeof window?window:{};h.Gp||(h.Gp={}),h.Gp.Config?this.mergeConfig(h.Gp.Config,s,t.layerId):h.Gp.Config=s,t.onSuccess.call(t.scope,h.Gp.Config)},mergeConfig:function(t,e,i){if(e&&t){for(var n in e)if(e.hasOwnProperty(n))if("generalOptions"==n)for(var o in e[n].apiKeys)e[n].apiKeys.hasOwnProperty(o)&&!t.generalOptions.apiKeys[o]&&(t.generalOptions.apiKeys[o]=e[n].apiKeys[o]);else if(t[n])for(var s in e[n])e[n].hasOwnProperty(s)&&!t[n][s]&&(t[n][s]=e[n][s]);if(i){var r=[];for(var a in e.layers)e.layers.hasOwnProperty(a)&&r.push(a);t.layers[i]&&(t.layers[i].aggregatedLayers=r)}}}};return s}(i,a,r,y,j),z=function(t,e,i,n,o,s,r){function a(t){if(!(this instanceof a))throw new TypeError(e.getMessage("CLASS_CONSTRUCTOR","AutoConf"));if(this.CLASSNAME="AutoConf",s.apply(this,arguments),!this.options.serverUrl&&!this.options.serverUrl){var i=o.AutoConf.url(this.options.apiKey);this.options.layerId?this.options.serverUrl=i.aggregate+this.options.layerId:Array.isArray(this.options.apiKey)&&this.options.apiKey.length>0?this.options.serverUrl=i.apiKeys:this.options.serverUrl=i.apiKey}"XHR"===this.options.protocol&&"POST"===this.options.httpMethod&&(this.options.httpMethod="GET"),this.options.outputFormat="xml"}return a.prototype=Object.create(s.prototype,{}),a.prototype.constructor=a,a.prototype.buildRequest=function(t,e){var i="undefined"!=typeof window?window:{};if(i.Gp&&i.Gp.Config&&i.Gp.Config.generalOptions&&i.Gp.Config.layers&&i.Gp.Config.generalOptions.apiKeys[this.options.apiKey]){if(!this.options.layerId)return void this.options.onSuccess.call(this,i.Gp.Config);if(i.Gp.Config.layers[this.options.layerId]&&i.Gp.Config.layers[this.options.layerId].aggregatedLayers)return void this.options.onSuccess.call(this,i.Gp.Config)}this.request="";var o;o=this.options.serverUrl.indexOf("http://")===-1,!o&&this.layerId&&(this.request=n.normalyzeParameters({layerId:this.layerId})),e.call(this,this.request)},a.prototype.analyzeResponse=function(t,n){if(this.response){var o={layerId:this.options.layerId,response:this.response,rawResponse:this.options.rawResponse,onSuccess:n,onError:t,scope:this};r.build(o)}else t.call(this,new i(e.getMessage("SERVICE_RESPONSE_EMPTY")))},a}(i,r,a,n,h,u,F),B=function(t){function e(t){if(!(this instanceof e))throw new TypeError("RequestHeader constructor cannot be called as a function.");this.options=t||{srsName:"EPSG:4326"};for(var i in t)t.hasOwnProperty(i)&&(this.options[i]=t[i])}return e.prototype={requestString:null,template:'<RequestHeader srsName="__SRSNAME__"/>',constructor:e,toString:function(){var t=null;return t=this.template,t=t.replace(/__SRSNAME__/g,this.options.srsName),this.requestString=t,this.requestString}},e}(i),q=function(t){function e(t){if(!(this instanceof e))throw new TypeError("Request constructor cannot be called as a function.");this.options=t||{maximumResponses:25,methodName:null,version:"1.2"};for(var i in t)t.hasOwnProperty(i)&&(this.options[i]=t[i])}return e.prototype={requestString:null,template:'<Request maximumResponses="__MAXRESPONSES__" methodName="__METHODNAME__" requestID="__UUID__" version="__VERSION__"><!-- __REQUESTSERVICE__ --></Request>',constructor:e,guid:function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(t){var e=16*Math.random()|0,i="x"===t?e:3&e|8;return i.toString(16)})},toString:function(){var t=null;return t=this.template,t=t.replace(/__MAXRESPONSES__/g,this.options.maximumResponses),
+t=t.replace(/__METHODNAME__/g,this.options.methodName),t=t.replace(/__UUID__/g,this.guid()),t=t.replace(/__VERSION__/g,this.options.version),this.requestString=t,this.requestString}},e}(i),W=function(t){function e(t){if(!(this instanceof e))throw new TypeError("AbstractService constructor cannot be called as a function.");this.options=t||{};for(var i in t)t.hasOwnProperty(i)&&(this.options[i]=t[i])}return e.prototype={strRequest:null,oRequest:null,oFilter:null,constructor:e,addRequest:function(t){},addFilter:function(t){},toString:function(){}},e}(i),H=function(t,e,i,n){function o(t){if(!(this instanceof o))throw new TypeError("XLS constructor cannot be called as a function.");this.options={srsName:"EPSG:4326",maximumResponses:25};for(var e in t)t.hasOwnProperty(e)&&t[e]&&(this.options[e]=t[e])}return o.VERSION="1.2",o.prototype={requestString:null,namespace:!1,oService:null,constructor:o,template:'<?xml version="1.0" encoding="UTF-8"?>\n<XLS version="__VERSION__"\n__NAMESPACE__ \n__SCHEMALOCATION__>\n__REQUESTHEADER__\n__REQUEST__\n</XLS>\n',namespaceByDefault:function(){var t=['xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"','xmlns:xls="http://www.opengis.net/xls"','xmlns:gml="http://www.opengis.net/gml"'];return t.join(" ")},schemaLocationByDefault:function(){return'xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.2/olsAll.xsd"'},setService:function(t){t&&t instanceof n&&(this.oService=t)},getService:function(){return this.oService}},o.prototype.addNamespace=function(t,e){for(var i=t.key,n=!1,o=this.namespaceByDefault().split(" "),s=0;s<o.length;s++){var r=o[s],a=r.split("="),l=a[0];if(l==="xmlns:"+i){n=!0;break}}if(!n)return e;var c,h;return c=/<(\w+[\s>])/g,h="<"+i+":$1",e=e.replace(c,h),c=/<\/(\w+[\s>])/g,h="</"+i+":$1",e=e.replace(c,h)},o.prototype.build=function(){var t=!!this.getService(),n="";n=this.template,n=n.replace(/__VERSION__/g,o.VERSION),n=n.replace(/__NAMESPACE__/g,this.namespaceByDefault),n=n.replace(/__SCHEMALOCATION__/g,this.schemaLocationByDefault);var s=new e({srsName:this.options.srsName});n=n.replace(/__REQUESTHEADER__/g,s.toString());var r=new i({maximumResponses:this.options.maximumResponses,version:o.VERSION,methodName:t?this.getService().CLASSTYPE:null});if(n=n.replace(/__REQUEST__/g,r.toString()),t&&(n=n.replace(/<!-- __REQUESTSERVICE__ -->/g,this.getService().toString())),n)return this.namespace&&(n=this.addNamespace({key:"xls",url:"http://www.opengis.net/xls"},n)),this.requestString=n,this.requestString},o}(i,B,q,W),V=function(t,e){function i(t){if(!(this instanceof i))throw new TypeError("Address constructor cannot be called as a function.");if(this.options=t||{location:{},type:["StreetAddress"],filter:{}},!t.location)throw new Error("l'option 'location' n'est pas renseignée !");for(var e in t)t.hasOwnProperty(e)&&(this.options[e]=t[e])}return i.prototype={constructor:i,requestString:null,template:{address:'<Address countryCode="__COUNTRYCODE__">__LOCATION____PLACE____POSTALCODE____ENVELOPE__</Address>',location:{freeFormAddress:"<freeFormAddress>__FREEFORMADDRESSVALUE__</freeFormAddress>",streetAddress:{container:"<StreetAddress>__STREET____BUILDING__</StreetAddress>",building:'<Building number="__BUILDINGVALUE__"/>',street:"<Street>__STREETVALUE__</Street>"}},place:'<Place type="__PLACETYPE__">__PLACEVALUE__</Place>',postalCode:"<PostalCode>__POSTALCODEVALUE__</PostalCode>",envelope:"<gml:Envelope><gml:lowerCorner>__LEFT__ __BOTTOM__</gml:lowerCorner><gml:upperCorner>__RIGHT__ __TOP__</gml:upperCorner></gml:Envelope>"}},i.prototype.toString=function(){var t=null;if(t=this.template.address,t=t.replace(/__COUNTRYCODE__/g,this.options.type),"string"==typeof this.options.location){var e=this.template.location.freeFormAddress;e=e.replace(/__FREEFORMADDRESSVALUE__/g,this.options.location),t=t.replace(/__LOCATION__/g,e)}else{var i="",n="";this.options.location.number&&(i=this.template.location.streetAddress.building,i=i.replace(/__BUILDINGVALUE__/g,this.options.location.number)),this.options.location.street&&(n=this.template.location.streetAddress.street,n=n.replace(/__STREETVALUE__/g,this.options.location.street));var o=this.template.location.streetAddress.container;o=o.replace(/__STREET__/g,n),o=o.replace(/__BUILDING__/g,i),t=t.replace(/__LOCATION__/g,o)}var s="";this.options.location.postalCode&&(s=this.template.postalCode,s=s.replace(/__POSTALCODEVALUE__/g,this.options.location.postalCode));var r="";if(this.options.filter){var a=this.options.filter.bbox;a&&(r=this.template.envelope,r=r.replace(/__LEFT__/g,a.left),r=r.replace(/__BOTTOM__/g,a.bottom),r=r.replace(/__RIGHT__/g,a.right),r=r.replace(/__TOP__/g,a.top))}var l=[],c="";if(this.options.filter){var h=this.options.filter;for(var u in h)"bbox"!==u&&(c=this.template.place,c=c.replace(/__PLACETYPE__/g,u),c=c.replace(/__PLACEVALUE__/g,h[u]),l.push(c))}var d="";return this.options.location.city&&(d=this.template.place,d=d.replace(/__PLACETYPE__/g,"Municipality"),d=d.replace(/__PLACEVALUE__/g,this.options.location.city),l.push(d)),t=t.replace(/__POSTALCODE__/g,s),t=t.replace(/__PLACE__/g,l.join("\n")),t=t.replace(/__ENVELOPE__/g,r),this.requestString=t,this.requestString},i}(Bt,i),Y=function(t){function e(){if(!(this instanceof e))throw new TypeError("GeocodeFilterExtension constructor cannot be called as a function.");this.filters=[]}return e.prototype={constructor:e,addFilterExtensions:function(t){t&&this.filters.push(t)},getNames:function(){var t=[];for(var e in this.filters)t.push(this.filters[e].CLASSNAME);return t},getFilter:function(t){var e=null;for(var i in this.filters)this.filters[i].CLASSNAME==t&&(e=this.filters[i]);return e},getFilters:function(){return this.filters},getAttributs:function(t){var e=[];for(var i in this.filters)this.filters[i].CLASSNAME==t&&(e=this.filters[i].attributesList);return e},setPlaceAttributs:function(t,e){var i=this.getFilter(t),n=this.getAttributs(t);for(var o in n){var s=n[o];e[s]&&(i.placeAttributes[s]=e[s])}},getPlaceAttributs:function(t){var e={};for(var i in this.filters)this.filters[i].CLASSNAME==t&&(e=this.filters[i].placeAttributes);return e}},e}(i),K=function(t,e,i){function n(t){if(!(this instanceof n))throw new TypeError("GeocodeRequest constructor cannot be called as a function.");this.options=t||{};for(var e in t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);this.CLASSNAME="GeocodeRequest"}return n.prototype={strRequest:null,oAddress:null,oFilter:null,template:'<GeocodeRequest returnFreeForm="__RETURNFREEFORM__">__ADDRESS__</GeocodeRequest>',addAddress:function(t){t instanceof e&&(this.oAddress=t)},addFilter:function(t){t instanceof i&&(this.oFilter=t)},constructor:n,toString:function(){var t="";if(t=this.template,!this.oAddress){var i={};if(i.location=this.options.location,i.type=this.options.filterOptions.type||["StreetAddress"],i.filter=this.options.filterOptions,delete i.filter.type,this.oFilter){i.filter={};for(var n in i.type){var o=i.type[n],s=this.oFilter.getFilter(o);if(s){for(var r=this.options.filterOptions,a=s.attributesList,l=0;l<a.length;l++){var c=a[l];if(r[c]){var h=s.serviceAttributes[l];s.placeAttributes[h]=r[c]}}var u=s.placeAttributes;for(var d in u)u.hasOwnProperty(d)&&(i.filter[d]=u[d])}}}if(this.oAddress=new e(i),!this.oAddress)throw new Error("La construction de l'adresse n'est pas correctement definie !?")}return t=t.replace(/__ADDRESS__/g,this.oAddress.toString()),t=t.replace(/__RETURNFREEFORM__/g,this.options.returnFreeForm?"true":"false"),this.strRequest=t,this.strRequest}},n}(i,V,Y),X=function(t){function e(t){if(!(this instanceof e))throw new TypeError("Position constructor cannot be called as a function.");if(this.options=t||{},!t.position)throw new Error("l'option 'position' n'est pas renseignée !");for(var i in t)t.hasOwnProperty(i)&&(this.options[i]=t[i])}return e.prototype={constructor:e,requestString:null,template:{position:"<Position>__GMLPOINT____GMLFILTER__</Position>",gml:{point:'<gml:Point xmlns:gml="http://www.opengis.net/gml"><gml:pos>__X__ __Y__</gml:pos></gml:Point>',pos:null,filter:{bbox:'<gml:Envelope xmlns:gml="http://www.opengis.net/gml"><gml:lowerCorner>__LEFT__ __BOTTOM__</gml:lowerCorner><gml:upperCorner>__RIGHT__ __TOP__</gml:upperCorner></gml:Envelope>',circle:'<gml:CircleByCenterPoint xmlns:gml="http://www.opengis.net/gml"><gml:pos>__X__ __Y__</gml:pos><gml:radius>__RADIUS__</gml:radius></gml:CircleByCenterPoint>',polygon:'<gml:Polygon xmlns:gml="http://www.opengis.net/gml"><gml:exterior><gml:LinearRing><gml:posList>__XY__</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>',multipolygon:null}}}},e.prototype.toString=function(){var t=this.template.position,e=this.template.gml.point;e=e.replace(/__X__/g,this.options.position.x),e=e.replace(/__Y__/g,this.options.position.y);var i="";if(this.options.filter){var n=this.options.filter;for(var o in n)switch(o){case"circle":i=this.template.gml.filter[o],i=i.replace(/__X__/g,n[o].x),i=i.replace(/__Y__/g,n[o].y),i=i.replace(/__RADIUS__/g,n[o].radius);break;case"bbox":i=this.template.gml.filter[o],i=i.replace(/__LEFT__/g,n[o].left),i=i.replace(/__BOTTOM__/g,n[o].bottom),i=i.replace(/__RIGHT__/g,n[o].right),i=i.replace(/__TOP__/g,n[o].top);break;case"polygon":i=this.template.gml.filter[o];for(var s="",r=n[o],a=0;a<r.length;a++){var l=r[a];if(Array.isArray(l))break;(l.x&&l.y||0===l.x||0===l.y)&&(s+=l.x+" "+l.y),r.length!==a+1&&(s+=" ")}i=i.replace(/__XY__/g,s);break;case"multipolygon":}}return t=t.replace(/__GMLPOINT__/g,e),t=t.replace(/__GMLFILTER__/g,i),this.requestString=t,this.requestString},e}(i),Z=function(t){function e(t){if(!(this instanceof e))throw new TypeError("Preference constructor cannot be called as a function.");this.type=t}return e.prototype={constructor:e,requestString:null,template:"<ReverseGeocodePreference>__TYPE__</ReverseGeocodePreference>"},e.prototype.toString=function(){for(var t=[],e="",i=0;i<this.type.length;i++)e=this.template,e=e.replace(/__TYPE__/g,this.type[i]),t.push(e);return this.strRequest=t.join("\n"),this.strRequest},e}(i),Q=function(t,e,i){function n(t){if(!(this instanceof n))throw new TypeError("ReverseGeocodeRequest constructor cannot be called as a function.");this.options=t||{};for(var e in t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);this.CLASSNAME="ReverseGeocodeRequest"}return n.prototype={strRequest:null,oPosition:null,oPreference:null,constructor:n,template:'<ReverseGeocodeRequest returnFreeForm="__RETURNFREEFORM__">__POSITION____PREFERENCE__</ReverseGeocodeRequest>',addPosition:function(t){t instanceof e&&(this.oPosition=t)},addPreferences:function(t){t instanceof i&&(this.oPreference=t)},toString:function(){var t="";if(t=this.template,!this.oPreference&&(this.oPreference=new i(this.options.filterOptions.type||["StreetAddress"]),!this.oPreference))throw new Error("Les preferences ne sont pas definies !?");if(t=t.replace(/__PREFERENCE__/g,this.oPreference.toString()),!this.oPosition){var n={position:this.options.position,filter:{}};if(this.options.filterOptions&&(n.filter=this.options.filterOptions,delete n.filter.type),this.oPosition=new e(n),!this.oPosition)throw new Error("La position et ses filtres ne sont pas definis !?")}return t=t.replace(/__POSITION__/g,this.oPosition.toString()),t=t.replace(/__RETURNFREEFORM__/g,this.options.returnFreeForm?"true":"false"),this.strRequest=t,this.strRequest}},n}(i,X,Z),J=function(t,e,i,n,o){function s(t){if(!(this instanceof s))throw new TypeError("LocationUtilityService constructor cannot be called as a function.");this.CLASSNAME="LocationUtilityService",this.CLASSTYPE=null,e.apply(this,arguments),this.options&&(this.CLASSTYPE=this.options.location?"GeocodeRequest":this.options.position?"ReverseGeocodeRequest":null)}return s.prototype=Object.create(e.prototype,{}),s.prototype.constructor=s,s.prototype.addRequest=function(t){switch(this.CLASSTYPE=t.CLASSNAME,this.CLASSTYPE){case"GeocodeRequest":case"ReverseGeocodeRequest":this.oRequest=t;break;default:throw new Error("Ce n'est pas un objet de type 'LUS Request' !?")}},s.prototype.addFilter=function(t){t instanceof o&&(this.oFilter=t)},s.prototype.toString=function(){if(!this.oRequest){if(!this.options)throw new Error("Les options ne sont pas renseignées, impossible de construire la requête !");if("GeocodeRequest"===this.CLASSTYPE){var t={location:this.options.location,returnFreeForm:this.options.returnFreeForm,filterOptions:this.options.filterOptions||{}};this.oRequest=new i(t),this.oFilter&&this.oRequest.addFilter(this.oFilter)}else if("ReverseGeocodeRequest"===this.CLASSTYPE){var e={position:this.options.position,returnFreeForm:this.options.returnFreeForm,filterOptions:this.options.filterOptions||{}};this.oRequest=new n(e)}}if(!this.oRequest)throw new Error("Type de Geocodage indefini !");return this.strRequest=this.oRequest.toString(),this.strRequest},s}(i,W,K,Q,Y),$=function(){function t(){if(!(this instanceof t))throw new TypeError("GeocodeLocation constructor cannot be called as a function.");this.placeAttributes={},this.attributesList=[],this.serviceAttributes=[]}return t.prototype={constructor:t},t}(),tt=function(t){function e(){if(!(this instanceof e))throw new TypeError("StreetAddress constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="StreetAddress",this.attributesList=["bbox","ID","IDTR","quality","territory","commune","department","insee","municipality"],this.serviceAttributes=["bbox","ID","IDTR","Qualite","Territoire","Commune","Departement","INSEE","Municipality"]}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}($),et=function(t){function e(){if(!(this instanceof e))throw new TypeError("PositionOfInterest constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="PositionOfInterest",this.attributesList=["bbox","importance","nature","territory","commune","department","insee","municipality"],this.serviceAttributes=["bbox","Importance","Nature","Territoire","Commune","Departement","INSEE","Municipality"]}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}($),it=function(t){function e(){if(!(this instanceof e))throw new TypeError("CadastralParcel constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="CadastralParcel",this.attributesList=["absorbedCity","sheet","number","section","commune","department","insee","municipality","origin"],this.serviceAttributes=["CommuneAbsorbee","Feuille","Numero","Section","Commune","Departement","INSEE","Municipality","Type"]}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}($),nt=function(t){function e(){if(!(this instanceof e))throw new TypeError("Administratif constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="Administratif",this.attributesList=["bbox","prefecture","inseeRegion","inseeDepartment","municipality"],this.serviceAttributes=["bbox","Prefecture","InseeRegion","InseeDepartement","Municipality"]}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}($),ot=function(t,e,i,n,o,s,r,a){var l={build:function(t){var l=null,c=new n;c.addFilterExtensions(new a),c.addFilterExtensions(new o),c.addFilterExtensions(new s),c.addFilterExtensions(new r);var h=new i({location:t.location,returnFreeForm:t.returnFreeForm,filterOptions:t.filterOptions});h.addFilter(c);var u=new e({srsName:t.srs,maximumResponses:t.maximumResponses});if(u.namespace=!0,u.setService(h),l=u.build(),"GET"==t.httpMethod){var d="qxml="+encodeURIComponent(l).replace(/\-/g,"%2D").replace(/\_/g,"%5F").replace(/\./g,"%2E").replace(/\!/g,"%21").replace(/\~/g,"%7E").replace(/\*/g,"%2A").replace(/\'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29");l=d}return l}};return l}(i,H,J,Y,tt,et,it,nt),st=function(){function t(){if(!(this instanceof t))throw new TypeError("GeocodeResponse constructor cannot be called as a function.");this.locations=[]}return t.prototype={constructor:t},t}(),rt=function(){function t(){if(!(this instanceof t))throw new TypeError("GeocodedLocation constructor cannot be called as a function.");this.position={x:null,y:null},this.matchType=null,this.placeAttributes={},this.type=null}return t.prototype={constructor:t},t}(),at=function(t){function e(){if(!(this instanceof e))throw new TypeError("DirectGeocodedLocation constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="DirectGeocodedLocation",this.accuracy=null}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}(rt),lt=function(t,e,i,n,o){function s(t){if(t.attributes.length>0){for(var e={},i=t.attributes,n=0;n<i.length;n++){var o=i[n];e[o.nodeName]=o.nodeValue}return e}}function r(t,e){if(t.hasChildNodes())for(var i,n,o,s=t.childNodes,a=0;a<s.length;a++)if(i=s[a],1===i.nodeType)if(n=i.localName||i.baseName||i.nodeName,o=i.prefix||c.DEFAULTPREFIX,c.READERS[o][n]){var l=c.READERS[o][n];l(i,e)}else r(i,e)}function a(t){var e,i="";return t.hasChildNodes()&&(e=t.firstChild,3===e.nodeType&&(i=e.nodeValue)),i}function l(t){if(t.attributes.length>0){var e=s(t);for(var i in e)if(e.hasOwnProperty(i)){if("version"===i&&e.version!==c.VERSION)return void console.log("[DirectGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing");if("xmlns"===i){if(e[i]!==c.NAMESPACES[c.DEFAULTPREFIX])return void console.log("[DirectGeocodeResponseReader] geocode response default namespace is not the expected one");continue}var n=i.split(":")[0],o=i.split(":")[1];if("xmlns"===n&&o&&c.NAMESPACES[o]&&c.NAMESPACES[o]!==e[i])return void console.log("[DirectGeocodeResponseReader] geocode response "+i+" namespace is not the expected one");if("schemaLocation"===o&&c.SCHEMALOCATION!==e[i])return void console.log("[DirectGeocodeResponseReader] geocode response schema location is not the expected one")}}}var c={};return c.VERSION="1.2",c.NAMESPACES={xmlns:"http://www.opengis.net/xls",gml:"http://www.opengis.net/gml",xls:"http://www.opengis.net/xls",xlsext:"http://www.opengis.net/xlsext",xsi:"http://www.w3.org/2001/XMLSchema-instance"},c.SCHEMALOCATION="http://wxs.ign.fr/schemas/olsAll.xsd",c.DEFAULTPREFIX="xls",c.READERS={xls:{XLS:function(t){var e=new n;return l(t),r(t,e),e},GeocodedAddress:function(t,e){var i=new o;r(t,i),e&&Array.isArray(e.locations)&&e.locations.push(i)},GeocodeMatchCode:function(t,e){var i=t.getAttribute("accuracy");i&&e&&(e.accuracy=parseFloat(i));var n=t.getAttribute("matchType");n&&e&&(e.matchType=n)},Address:function(t,e){var i=t.getAttribute("countryCode");e&&i&&(e.type=i),r(t,e)},freeFormAddress:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&(e.placeAttributes.freeform=a(t))},Building:function(t,e){var i=t.getAttribute("number");e&&e.hasOwnProperty("placeAttributes")&&(i?e.placeAttributes.number=i:t.getAttribute("buildingName")?e.placeAttributes.number=t.getAttribute("buildingName"):t.getAttribute("subdivision")&&(e.placeAttributes.number=t.getAttribute("subdivision")))},Street:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&("StreetAddress"===e.type?e.placeAttributes.street=a(t):"CadastralParcel"===e.type&&(e.placeAttributes.cadastralParcel=a(t)))},Place:function(t,e){var i=t.getAttribute("type"),n=a(t);if(e&&e.hasOwnProperty("placeAttributes"))if("Municipality"===i)e.placeAttributes.municipality=n;else if("Bbox"===i){var o=n.split(";");4===o.length&&(e.placeAttributes.bbox={left:parseFloat(o[0]),right:parseFloat(o[2]),top:parseFloat(o[1]),bottom:parseFloat(o[3])})}else"Commune"===i?e.placeAttributes.commune=n:"Departement"===i?e.placeAttributes.department=n:"INSEE"===i?e.placeAttributes.insee=n:"Qualite"===i?e.placeAttributes.quality=n:"Territoire"===i?e.placeAttributes.territory=n:"ID"===i?e.placeAttributes.ID=n:"ID_TR"===i?e.placeAttributes.IDTR=n:"Importance"===i?e.placeAttributes.importance=parseInt(n,10):"Nature"===i?e.placeAttributes.nature=n:"Numero"===i?e.placeAttributes.number=n:"Feuille"===i?e.placeAttributes.sheet=n:"Section"===i?e.placeAttributes.section=n:"CommuneAbsorbee"===i?e.placeAttributes.absorbedCity=n:"Arrondissement"===i?n&&(e.placeAttributes.arrondissement=n):"Type"===i?e.placeAttributes.origin=n:"Prefecture"===i?e.placeAttributes.prefecture=n:"InseeRegion"===i?e.placeAttributes.inseeRegion=n:"InseeDepartment"===i&&(e.placeAttributes.inseeDepartment=n)},PostalCode:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&(e.placeAttributes.postalCode=a(t))},Error:function(t){var n=t.getAttribute("message"),o=t.getAttribute("errorCode"),s=e.getMessage("SERVICE_RESPONSE_EXCEPTION","("+o+") : "+n);throw new i({message:s,type:i.TYPE_SRVERR})}},gml:{pos:function(t,e){var i=a(t);e&&i&&(e.position={x:parseFloat(i.split(" ")[0]),y:parseFloat(i.split(" ")[1])})}},ExceptionReport:function(t){var e={};if(t.hasChildNodes())for(var i,n=t.childNodes,o=0;o<n.length;o++)i=n[o],"Exception"===i.nodeName&&(e.exceptionReport=c.READERS.Exception(i));return e},Exception:function(t){var e={},i=t.getAttribute("exceptionCode");i&&(e.exceptionCode=i);var n=t.firstChild;return n&&3===n.nodeType&&(e.exception=n.nodeValue),e}},c.read=function(t){if("XLS"===t.nodeName){var n=t.prefix;n||(n=c.DEFAULTPREFIX);var o=c.READERS[n][t.nodeName](t);return o}if("ExceptionReport"===t.nodeName){var s=c.READERS[t.nodeName](t);return s}var r=e.getMessage("SERVICE_RESPONSE_ANALYSE",t.nodeName);throw new i({message:r,type:i.TYPE_UNKERR,status:200})},c}(i,r,a,st,at),ct=function(t,e,i,n,o){var s={build:function(t){var s=null;if(!t.response)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EMPTY"),type:e.TYPE_SRVERR,status:-1}));if(t.rawResponse)s=t.response;else{try{var r=new n({reader:o});if("string"==typeof t.response?r.setXMLString(t.response):r.setXMLDoc(t.response),s=r.parse(),!s)throw new Error("L'analyse de la réponse du service !?")}catch(n){var a=n.message;return a+="string"==typeof t.response?"('"+t.response+"')":"('"+t.response.documentElement.innerHTML+"')",void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_ANALYSE",a),type:e.TYPE_UNKERR,status:-1}))}if(s.exceptionReport)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",s.exceptionReport),type:e.TYPE_SRVERR,status:200}))}t.onSuccess.call(t.scope,s)}};return s}(i,a,r,y,lt),ht=function(t,e,i,n,o,s){function r(t){if(!(this instanceof r))throw new TypeError(e.getMessage("CLASS_CONSTRUCTOR","Geocode"));if(this.CLASSNAME="Geocode",n.apply(this,arguments),!t.location)throw new Error(e.getMessage("PARAM_MISSING","location"));if("object"==typeof t.location&&0===Object.keys(t.location).length)throw new Error(e.getMessage("PARAM_EMPTY","location"));if("string"==typeof t.location&&0===t.location.length)throw new Error(e.getMessage("PARAM_EMPTY","location"));this.options.location=t.location,t.filterOptions&&"object"==typeof t.filterOptions||(this.options.filterOptions=t.filterOptions={type:["StreetAddress"]}),0===Object.keys(t.filterOptions).length&&(this.options.filterOptions={type:["StreetAddress"]});for(var i=Object.keys(t.filterOptions),o=0;o<i.length;o++){var s=i[o],a=["department","number","postalCode","insee","importance","ID","IDTR","absorbedCity","sheet","section","inseeRegion","inseeDepartment"];a.indexOf(s)!==-1&&"string"!=typeof t.filterOptions[s]&&(t.filterOptions[s]=t.filterOptions[s].toString()),t.filterOptions[s]||delete this.options.filterOptions[s]}this.options.filterOptions.type=t.filterOptions.type||["StreetAddress"],this.options.maximumResponses=t.maximumResponses||25,this.options.returnFreeForm=t.returnFreeForm||!1,this.options.srs=t.srs||"EPSG:4326",this.options.outputFormat="xml"}return r.prototype=Object.create(n.prototype,{}),r.prototype.constructor=r,r.prototype.buildRequest=function(t,n){var s={httpMethod:this.options.httpMethod,location:this.options.location,returnFreeForm:this.options.returnFreeForm,filterOptions:this.options.filterOptions,srs:this.options.srs,maximumResponses:this.options.maximumResponses};this.request=o.build(s),this.request?n.call(this,this.request):t.call(this,new i(e.getMessage("SERVICE_REQUEST_BUILD")))},r.prototype.analyzeResponse=function(t,n){if(this.response){var o={response:this.response,rawResponse:this.options.rawResponse,onError:t,onSuccess:n,scope:this};s.build(o)}else t.call(this,new i(e.getMessage("SERVICE_RESPONSE_EMPTY")))},r}(i,r,a,u,ot,ct),ut=function(t,e,i){var n={build:function(t){var n=t||{},o=null,s=new i({position:n.position,returnFreeForm:n.returnFreeForm,filterOptions:n.filterOptions}),r=new e({srsName:n.srs,maximumResponses:n.maximumResponses});if(r.namespace=!0,r.setService(s),o=r.build(),"GET"==n.httpMethod){var a="qxml="+encodeURIComponent(o).replace(/\-/g,"%2D").replace(/\_/g,"%5F").replace(/\./g,"%2E").replace(/\!/g,"%21").replace(/\~/g,"%7E").replace(/\*/g,"%2A").replace(/\'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29");o=a}return o}};return n}(i,H,J),dt=function(t){function e(){if(!(this instanceof e))throw new TypeError("ReverseGeocodedLocation constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="ReverseGeocodedLocation",this.searchCenterDistance=null}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}(rt),pt=function(t,e,i,n,o){function s(t){if(t.attributes.length>0){for(var e={},i=t.attributes,n=0;n<i.length;n++){var o=i[n];e[o.nodeName]=o.nodeValue}return e}}function r(t,e){if(t.hasChildNodes())for(var i,n,o,s=t.childNodes,a=0;a<s.length;a++)if(i=s[a],1===i.nodeType)if(n=i.localName||i.baseName||i.nodeName,o=i.prefix||c.DEFAULTPREFIX,c.READERS[o][n]){var l=c.READERS[o][n];l(i,e)}else r(i,e)}function a(t){var e,i="";return t.hasChildNodes()&&(e=t.firstChild,3===e.nodeType&&(i=e.nodeValue)),i}function l(t){if(t.attributes.length>0){var e=s(t);for(var i in e)if(e.hasOwnProperty(i)){if("version"===i&&e.version!==c.VERSION)return void console.log("[ReverseGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing");if("xmlns"===i){if(e[i]!==c.NAMESPACES[c.DEFAULTPREFIX])return void console.log("[ReverseGeocodeResponseReader] geocode response default namespace is not the expected one");continue}var n=i.split(":")[0],o=i.split(":")[1];if("xmlns"===n&&o&&c.NAMESPACES[o]&&c.NAMESPACES[o]!==e[i])return void console.log("[ReverseGeocodeResponseReader] geocode response "+i+" namespace is not the expected one");if("schemaLocation"===o&&c.SCHEMALOCATION!==e[i])return void console.log("[ReverseGeocodeResponseReader] geocode response schema location is not the expected one")}}}var c={};return c.VERSION="1.2",c.NAMESPACES={xmlns:"http://www.opengis.net/xls",gml:"http://www.opengis.net/gml",xls:"http://www.opengis.net/xls",xlsext:"http://www.opengis.net/xlsext",xsi:"http://www.w3.org/2001/XMLSchema-instance"},c.SCHEMALOCATION="http://wxs.ign.fr/schemas/olsAll.xsd",c.DEFAULTPREFIX="xls",c.READERS={xls:{XLS:function(t){var e=new n;return l(t),r(t,e),e},ReverseGeocodedLocation:function(t,e){var i=new o;r(t,i),e&&Array.isArray(e.locations)&&e.locations.push(i)},Address:function(t,e){var i=t.getAttribute("countryCode");e&&i&&(e.type=i),r(t,e)},Building:function(t,e){var i=t.getAttribute("number");e&&e.hasOwnProperty("placeAttributes")&&(i?e.placeAttributes.number=i:t.getAttribute("buildingName")?e.placeAttributes.number=t.getAttribute("buildingName"):t.getAttribute("subdivision")&&(e.placeAttributes.number=t.getAttribute("subdivision")))},Street:function(t,e){"StreetAddress"===e.type?e.placeAttributes.street=a(t):"CadastralParcel"===e.type&&(e.placeAttributes.cadastralParcel=a(t))},Place:function(t,e){var i=t.getAttribute("type"),n=a(t);if(e&&e.hasOwnProperty("placeAttributes"))if("Municipality"===i)e.placeAttributes.municipality=n;else if("Bbox"===i){var o=n.split(";");4===o.length&&(e.placeAttributes.bbox={left:parseFloat(o[0]),right:parseFloat(o[2]),top:parseFloat(o[1]),bottom:parseFloat(o[3])})}else"Commune"===i?e.placeAttributes.commune=n:"Departement"===i?e.placeAttributes.department=n:"INSEE"===i?e.placeAttributes.insee=n:"Qualite"===i?e.placeAttributes.quality=n:"Territoire"===i?e.placeAttributes.territory=n:"ID"===i?e.placeAttributes.ID=n:"ID_TR"===i?e.placeAttributes.IDTR=n:"Importance"===i?e.placeAttributes.importance=parseInt(n,10):"Nature"===i?e.placeAttributes.nature=n:"Numero"===i?e.placeAttributes.number=n:"Feuille"===i?e.placeAttributes.sheet=n:"Section"===i?e.placeAttributes.section=n:"CommuneAbsorbee"===i?e.placeAttributes.absorbedCity=n:"Arrondissement"===i?n&&(e.placeAttributes.arrondissement=n):"Type"===i?e.placeAttributes.origin=n:"Prefecture"===i?e.placeAttributes.prefecture=n:"InseeRegion"===i?e.placeAttributes.inseeRegion=n:"InseeDepartment"===i&&(e.placeAttributes.inseeDepartment=n)},PostalCode:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&(e.placeAttributes.postalCode=a(t))},SearchCentreDistance:function(t,e){e&&(e.searchCenterDistance=parseFloat(t.getAttribute("value")))},Error:function(t){var n=t.getAttribute("message"),o=t.getAttribute("errorCode"),s=e.getMessage("SERVICE_RESPONSE_EXCEPTION","("+o+") : "+n);throw new i({message:s,type:i.TYPE_SRVERR})}},gml:{pos:function(t,e){var i=a(t);e&&i&&(e.position={x:parseFloat(i.split(" ")[0]),y:parseFloat(i.split(" ")[1])})}},xlsext:{ExtendedGeocodeMatchCode:function(t,e){e&&(e.matchType=a(t))}},ExceptionReport:function(t){var e={};if(t.hasChildNodes())for(var i,n=t.childNodes,o=0;o<n.length;o++)i=n[o],"Exception"===i.nodeName&&(e.exceptionReport=c.READERS.Exception(i));return e},Exception:function(t){var e={},i=t.getAttribute("exceptionCode");i&&(e.exceptionCode=i);var n=t.firstChild;return n&&3===n.nodeType&&(e.exception=n.nodeValue),e}},c.read=function(t){if("XLS"===t.nodeName){var e=t.prefix;e||(e=c.DEFAULTPREFIX);var i=c.READERS[e][t.nodeName](t);return i}if("ExceptionReport"===t.nodeName){var n=c.READERS[t.nodeName](t);return n}throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.")},c}(i,r,a,st,dt),mt=function(t,e,i,n,o){var s={build:function(t){var s=null;if(!t.response)return void t.onError.call(t.scope,new i({message:e.getMessage("SERVICE_RESPONSE_EMPTY"),type:i.TYPE_SRVERR,status:-1}));if(t.rawResponse)s=t.response;else{try{var r=new n({reader:o});if("string"==typeof t.response?r.setXMLString(t.response):r.setXMLDoc(t.response),s=r.parse(),!s)throw new Error("L'analyse de la réponse du service !?")}catch(e){return e.status=200,void t.onError.call(t.scope,e)}if(s.exceptionReport)return void t.onError.call(t.scope,new i({message:e.getMessage("SERVICE_RESPONSE_EXCEPTION",s.exceptionReport),type:i.TYPE_SRVERR,status:200}));if(t.scope&&t.scope.options&&t.scope.options.srs&&"EPSG:4326"!==t.scope.options.srs){var a,l;if(s||s.locations||s.locations.length)for(var c=0;c<s.locations.length;c++)a=s.locations[c],a&&(l=a.position,l&&(a.position={x:l.y,y:l.x}))}}t.onSuccess.call(t.scope,s)}};return s}(i,r,a,y,pt),ft=function(t,e,i,n,o,s){function r(t){if(!(this instanceof r))throw new TypeError(e.getMessage("CLASS_CONSTRUCTOR","ReverseGeocode"));if(this.CLASSNAME="ReverseGeocode",n.apply(this,arguments),!t.position)throw new Error(e.getMessage("PARAM_MISSING","position"));if(null==t.position.x)throw new Error(e.getMessage("PARAM_MISSING","position.x"));if(null==t.position.y)throw new Error(e.getMessage("PARAM_MISSING","position.y"));this.options.position=t.position,t.filterOptions&&"object"==typeof t.filterOptions||(this.options.filterOptions=t.filterOptions={type:["StreetAddress"]}),0===Object.keys(t.filterOptions).length&&(this.options.filterOptions={type:["StreetAddress"]});for(var i=Object.keys(t.filterOptions),o=0;o<i.length;o++){var s=i[o];t.filterOptions[s]&&0!==Object.keys(t.filterOptions[s]).length||delete this.options.filterOptions[s]}if(this.options.filterOptions.type=t.filterOptions.type||["StreetAddress"],!Array.isArray(this.options.filterOptions.type))throw new Error(e.getMessage("PARAM_TYPE","filterOptions.type"));if(this.options.maximumResponses=t.maximumResponses||25,this.options.returnFreeForm=t.returnFreeForm||!1,this.options.srs=t.srs||"CRS:84",r.geoEPSG.indexOf(this.options.srs)===-1){
+if(this.options.position={x:this.options.position.y,y:this.options.position.x},this.options.filterOptions&&this.options.filterOptions.circle){var a=this.options.filterOptions.circle;this.options.filterOptions.circle={x:a.y,y:a.x,radius:a.radius}}if(this.options.filterOptions&&this.options.filterOptions.polygon){var l=this.options.filterOptions.polygon;for(o=0;o<l.length;o++){var c=l[o];this.options.filterOptions.polygon[o]={x:c.y,y:c.x}}}}this.options.outputFormat="xml"}return r.prototype=Object.create(n.prototype,{}),r.prototype.constructor=r,r.prototype.buildRequest=function(t,n){var s={httpMethod:this.options.httpMethod,position:this.options.position,returnFreeForm:this.options.returnFreeForm,filterOptions:this.options.filterOptions,srs:"EPSG:4326",maximumResponses:this.options.maximumResponses};this.request=o.build(s),this.request?n.call(this,this.request):t.call(this,new i(e.getMessage("SERVICE_REQUEST_BUILD")))},r.prototype.analyzeResponse=function(t,n){if(this.response){var o={response:this.response,rawResponse:this.options.rawResponse,onError:t,onSuccess:n,scope:this};s.build(o)}else t.call(this,new i(e.getMessage("SERVICE_RESPONSE_EMPTY")))},r.geoEPSG=["EPSG:4326"],r}(i,r,a,u,ut,mt),_t=function(){function t(){if(!(this instanceof t))throw new TypeError("AutoCompleteResponse constructor cannot be called as a function.");this.suggestedLocations=[]}return t.prototype={constructor:t},t}(),gt=function(){function t(){if(!(this instanceof t))throw new TypeError("SuggestedLocation constructor cannot be called as a function.");this.type=null,this.position={x:null,y:null},this.commune=null,this.fullText=null,this.postalCode=null,this.classification=null,this.street=null,this.poi=null,this.kind=null}return t.prototype={constructor:t},t}(),vt=function(t,e,i,n,o,s){var r={build:function(t){var n=null;if(!t.response)return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_EMPTY")));if(t.rawResponse)n=t.response;else{var r;if(r="string"==typeof t.response?window.JSON.parse(t.response):t.response){if(r.error)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",r.error.description),status:r.error.code,type:e.TYPE_SRVERR}));if(n=new o,!r.results||!Array.isArray(r.results))return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_FORMAT_3")));for(var a,l=0;l<r.results.length;l++){var c=r.results[l];a=new s,a&&(c&&"StreetAddress"===c.country?(a.street=c.street,a.type="StreetAddress"):c&&"PositionOfInterest"===c.country&&(a.poi=c.street,a.kind=c.kind,a.type="PositionOfInterest"),a.position&&(a.position.x=c.x,a.position.y=c.y),a.commune=c.city,a.fullText=c.fulltext,a.postalCode=c.zipcode,a.classification=c.classification),n.suggestedLocations.push(a)}if(!n.suggestedLocations.length)return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_FORMAT_3")))}if(!n)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_ANALYSE_2"),type:e.TYPE_UNKERR,status:-1}));if(n.exceptionReport)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",n.exceptionReport),type:e.TYPE_SRVERR,status:200}))}t.onSuccess.call(t.scope,n)}};return r}(i,a,r,y,_t,gt),yt=function(t,e,i,n,o,s){function r(e){if(!(this instanceof r))throw new TypeError(n.getMessage("CLASS_CONSTRUCTOR","AutoComplete"));if(this.CLASSNAME="AutoComplete",t.apply(this,arguments),!e.text)throw new Error(n.getMessage("PARAM_MISSING","text"));this.options.text=e.text,e.filterOptions&&"object"==typeof e.filterOptions||(this.options.filterOptions=e.filterOptions={territory:[],type:["StreetAddress"]}),0===Object.keys(e.filterOptions).length&&(this.options.filterOptions={territory:[],type:["StreetAddress"]}),this.options.filterOptions.type=e.filterOptions.type||["StreetAddress"],this.options.filterOptions.territory=e.filterOptions.territory||[],this.options.maximumResponses=e.maximumResponses||10,"XHR"===this.options.protocol&&"POST"===this.options.httpMethod&&(this.options.httpMethod="GET"),this.options.outputFormat="json"}return r.prototype=Object.create(t.prototype,{}),r.prototype.constructor=r,r.prototype.buildRequest=function(t,e){var i="";this.options.filterOptions.territory&&(i=this.options.filterOptions.territory.join(";"));var n="";this.options.filterOptions.type&&(n=this.options.filterOptions.type.join(",")),this.request=s.normalyzeParameters({text:encodeURIComponent(this.options.text),type:n,terr:i,maximumResponses:this.options.maximumResponses}),e.call(this,this.request)},r.prototype.analyzeResponse=function(t,i){if(this.response){var s={response:this.response,rawResponse:this.options.rawResponse,onSuccess:i,onError:t,scope:this};e.build(s)}else t.call(this,new o(n.getMessage("SERVICE_RESPONSE_EMPTY")))},r}(u,vt,i,r,a,n),Et=function(t){function e(t){if(!(this instanceof e))throw new TypeError("RoutePlan constructor cannot be called as a function.");if(this.options=t||{},!t.startPoint)throw new Error("l'option 'startPoint' n'est pas renseignée !");if(!t.endPoint)throw new Error("l'option 'endPoint' n'est pas renseignée !");for(var i in t)t.hasOwnProperty(i)&&(this.options[i]=t[i])}return e.prototype={constructor:e,requestString:null,template:{routePlan:"<RoutePlan>__ROUTEPREFERENCE____GRAPH____WAYPOINTLIST____AVOIDLIST__</RoutePlan>",routePreference:"<RoutePreference>__VALUEROUTEPREFERENCE__</RoutePreference>",graph:'<xlsext:graphName xmlns:xlsext="http://www.opengis.net/xlsext" name="__VALUEGRAPH__"/>',wayPointList:{container:"<WayPointList>__STARTPOINT____VIAPOINT____ENDPOINT__</WayPointList>",point:'<Position><gml:Point xmlns:gml="http://www.opengis.net/gml"><gml:pos>__X__ __Y__</gml:pos></gml:Point></Position>',startPoint:"<StartPoint>__POINT__</StartPoint>",endPoint:"<EndPoint>__POINT__</EndPoint>",viaPoint:"<ViaPoint>__POINT__</ViaPoint>"},avoidList:{container:"<AvoidList>__AVOIDFEATURE__</AvoidList>",avoidFeature:"<AvoidFeature>__VALUEAVOIDFEATURE__</AvoidFeature>"}},toString:function(){var t="";if(t=this.template.routePlan,this.options.routePreference){var e=this.template.routePreference;e=e.replace(/__VALUEROUTEPREFERENCE__/,this.options.routePreference),t=t.replace(/__ROUTEPREFERENCE__/g,e)}if(t=t.replace(/__ROUTEPREFERENCE__/g,""),this.options.avoidFeature){for(var i=this.template.avoidList.container,n=[],o=0;o<this.options.avoidFeature.length;o++){var s=this.template.avoidList.avoidFeature;s=s.replace(/__VALUEAVOIDFEATURE__/,this.options.avoidFeature[o]),n.push(s)}i=i.replace(/__AVOIDFEATURE__/,n.join("\n")),t=t.replace(/__AVOIDLIST__/g,i)}if(t=t.replace(/__AVOIDLIST__/g,""),this.options.graph){var r=this.template.graph;r=r.replace(/__VALUEGRAPH__/,this.options.graph),t=t.replace(/__GRAPH__/g,r)}t=t.replace(/__GRAPH__/g,"");var a=this.template.wayPointList.container,l="";if(l=this.template.wayPointList.point,l=l.replace(/__X__/,this.options.startPoint.x),l=l.replace(/__Y__/,this.options.startPoint.y),a=a.replace(/__STARTPOINT__/,this.template.wayPointList.startPoint.replace(/__POINT__/,l)),l=this.template.wayPointList.point,l=l.replace(/__X__/,this.options.endPoint.x),l=l.replace(/__Y__/,this.options.endPoint.y),a=a.replace(/__ENDPOINT__/,this.template.wayPointList.endPoint.replace(/__POINT__/,l)),this.options.viaPoint){for(var c=[],h=0;h<this.options.viaPoint.length;h++){var u=this.options.viaPoint[h];l=this.template.wayPointList.point,l=l.replace(/__X__/,u.x),l=l.replace(/__Y__/,u.y),c.push(l)}a=a.replace(/__VIAPOINT__/,this.template.wayPointList.viaPoint.replace(/__POINT__/,c.join("\n")))}else a=a.replace(/__VIAPOINT__/,"");return t=t.replace(/__WAYPOINTLIST__/g,a),this.requestString=t,this.requestString}},e}(i),Pt=function(t,e){function i(t){if(!(this instanceof i))throw new TypeError("DetermineRouteRequest constructor cannot be called as a function.");this.options=t||{};for(var e in t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);this.CLASSNAME="DetermineRouteRequest"}return i.prototype={strRequest:null,oRoutePlan:null,template:{determineRouteRequest:'<DetermineRouteRequest distanceUnit="__DISTANCEUNIT__">__ROUTEPLAN____ROUTEINSTRUCTIONREQUEST____ROUTEGEOMETRYREQUEST____ROUTEMAPREQUEST__</DetermineRouteRequest>',routeInstructionRequest:'<RouteInstructionsRequest provideGeometry="__PROVIDEGEOMETRY__" provideBoundingBox="__PROVIDEBBOX__" />',routeGeometryRequest:"<RouteGeometryRequest />",routeMapRequest:""},addRoute:function(t){t instanceof e&&(this.oRoutePlan=t)},constructor:i,toString:function(){var t="";if(t=this.template.determineRouteRequest,t=t.replace(/__DISTANCEUNIT__/g,this.options.distanceUnit||"KM"),!this.oRoutePlan){var i=this.options.route;if(this.oRoutePlan=new e(i),!this.oRoutePlan)throw new Error("La construction du calcul d'initineraire n'est pas correctement definie !?")}t=t.replace(/__ROUTEPLAN__/g,this.oRoutePlan.toString());var n=this.template.routeInstructionRequest;n=n.replace(/__PROVIDEGEOMETRY__/g,this.options.provideGeometry||!1),n=n.replace(/__PROVIDEBBOX__/g,this.options.provideBoundingBox||!1),t=t.replace(/__ROUTEINSTRUCTIONREQUEST__/g,n);var o=this.template.routeGeometryRequest;t=t.replace(/__ROUTEGEOMETRYREQUEST__/g,o);var s=this.template.routeMapRequest;return t=t.replace(/__ROUTEMAPREQUEST__/g,s),this.strRequest=t,this.strRequest}},i}(i,Et),Ct=void 0,St=function(t,e,i,n){function o(t){if(!(this instanceof o))throw new TypeError("RouteService constructor cannot be called as a function.");this.CLASSNAME="RouteService",this.CLASSTYPE="RouteRequest",e.apply(this,arguments)}return o.prototype=Object.create(e.prototype,{}),o.prototype.constructor=o,o.prototype.addRequest=function(t){if("DetermineRouteRequest"!==t.CLASSNAME)throw new Error("Ce n'est pas un objet de type 'Route Request' !?");this.oRequest=t},o.prototype.addFilter=function(t){t instanceof n&&(this.oFilter=t)},o.prototype.toString=function(){if(!this.oRequest){if(!this.options)throw new Error("Les options ne sont pas renseignées, impossible de construire la requête !");if("RouteRequest"===this.CLASSTYPE){var t={distanceUnit:this.options.distanceUnit||null,provideGeometry:this.options.provideGeometry||null,provideBoundingBox:this.options.provideBoundingBox||null,route:{routePreference:this.options.routePreference||null,startPoint:this.options.startPoint,viaPoint:this.options.viaPoint||null,endPoint:this.options.endPoint,avoidFeature:this.options.avoidFeature||null,graph:this.options.graph||null,expectedStartTime:this.options.expectedStartTime||null}};this.oRequest=new i(t),this.oFilter&&this.oRequest.addFilter(this.oFilter)}}if(!this.oRequest)throw new Error("Type de requête indefini !");return this.strRequest=this.oRequest.toString(),this.strRequest},o}(i,W,Pt,Ct),Mt=function(t,e,i){var n={build:function(t){var n=null,o={startPoint:t.startPoint,endPoint:t.endPoint,viaPoint:t.viaPoints,provideBoundingBox:t.provideBbox,avoidFeature:t.exclusions,expectedStartTime:t.expectedStartTime,distanceUnit:t.distanceUnit,graph:t.graph,provideGeometry:t.geometryInInstructions,routePreference:t.routePreference},s=new i(o),r=new e({srsName:t.srs,maximumResponses:t.maximumResponses});if(r.namespace=!0,r.setService(s),n=r.build(),"GET"==t.httpMethod){var a="qxml="+encodeURIComponent(n).replace(/\-/g,"%2D").replace(/\_/g,"%5F").replace(/\./g,"%2E").replace(/\!/g,"%21").replace(/\~/g,"%7E").replace(/\*/g,"%2A").replace(/\'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29");n=a}return n}};return n}(i,H,St),wt=function(t){function e(t){if(!(this instanceof e))throw new TypeError("RouteParamREST constructor cannot be called as a function.");if(this.options=t||{},this.origin=this.options.startPoint.x+","+this.options.startPoint.y,this.destination=this.options.endPoint.x+","+this.options.endPoint.y,this.waypoints=this.options.viaPoints||null,this.startDateTime=this.options.expectedStartTime||null,this.graphName=this.options.graph,this.srs=this.options.srs,this.exclusions=this.options.exclusions,this.method="TIME",this.options.routePreference){var i=this.options.routePreference;switch(i){case"fastest":this.method="TIME";break;case"shortest":this.method="DISTANCE";break;default:this.method="TIME"}}this.format=this.options.geometryInInstructions?"STANDARDEXT":"STANDARD",this.tolerance=10,this.profileId=null,this.profileName=null}return e.CLASSNAME="RouteParamREST",e.prototype={constructor:e,getWaypoints:function(){if(this.waypoints){for(var t=[],e=0;e<this.waypoints.length;e++){var i=this.waypoints[e];t.push(i.x+","+i.y)}return t.join(";")}},getExclusions:function(){return this.exclusions.join(";")}},e.prototype.getParams=function(){var t=[];return t.push({k:"origin",v:this.origin}),t.push({k:"destination",v:this.destination}),t.push({k:"method",v:this.method}),this.waypoints&&t.push({k:"waypoints",v:this.getWaypoints()}),this.startDateTime&&t.push({k:"startDateTime",v:this.startDateTime}),this.graphName&&t.push({k:"graphName",v:this.graphName}),this.exclusions&&t.push({k:"exclusions",v:this.getExclusions()}),this.srs&&t.push({k:"srs",v:this.srs}),this.format&&t.push({k:"format",v:this.format}),t},e}(i),Lt=function(t,e,i){function n(t){if(!(this instanceof n))throw new TypeError("RouteRequestREST constructor cannot be called as a function.");if(!t)throw new Error(e.getMessage("PARAM_EMPTY","options"));this.settings=t}return n.prototype={requestString:null,constructor:n,processRequestString:function(){for(var t=new i(this.settings),e=t.getParams(),n="",o=0;o<e.length;o++){var s=e[o];n&&(n+="&"),n+=s.k+"="+s.v}return this.requestString=n,this.requestString}},n}(i,r,wt),Rt=function(t,e,i,n){var o={build:function(t){var o=null,s=t||{},r=null!==t.onError&&"function"==typeof t.onError,a=null;switch(t.api){case"REST":var l=new n(s);if(!l.processRequestString()){if(a="Error process request (rest) !",r)return void t.onError.call(t.scope,new e(a));throw new Error(a)}o=l.requestString;break;case"OLS":if(o=i.build(s),!o){if(a="Error process request (ols) !",r)return void t.onError.call(t.scope,new e(a));throw new Error(a)}break;default:if(a="Type of API is not supported by service (REST or OLS) !",r)return void t.onError.call(t.scope,new e(a));throw new Error(a)}return o}};return o}(i,a,Mt,Lt),bt=function(t){var e={toJson:function(t,e,i){var n=null;try{if(!t)throw new Error("La chaine WKT n'est pas renseignée !");e||(e=function(t){console.log(t)}),i||(i=function(t){console.log(t)});var o,s,r;if(o=/(-?\d+\.?[0-9]*)\s(-?\d+\.?[0-9]+)/g,s="[$1,$2]",t=t.replace(o,s),o=/^(\w+)/,r=o.exec(t),"POLYGON"===RegExp.$1?(s='{"type" : "Polygon",',t=t.replace(RegExp.$1,s),o=/(\({2}?)/,s='"coordinates" : [[',t=t.replace(o,s),o=/(\){2}?)/,s="]]}",t=t.replace(o,s),o=/(\()/g,s="[",t=t.replace(o,s),o=/(\))/g,s="]",t=t.replace(o,s)):"LINESTRING"===RegExp.$1&&(s='{"type" : "LineString",',t=t.replace(RegExp.$1,s),o=/(\(\(?)/,s='"coordinates" : [',t=t.replace(o,s),o=/(\)\)?)/,s="]}",t=t.replace(o,s)),n=JSON.parse(t),!n)throw new Error("Le JSON est vide !");if(!n.type)throw new Error("Le type de geometrie n'est pas connu !");if(!n.coordinates)throw new Error("La liste des points est vide !");e.call(this,n)}catch(t){if("SyntaxError"===t.name)return void i.call(this,"Erreur de parsing JSON !");i.call(this,t)}}};return e}(i),xt=function(){function t(){if(!(this instanceof t))throw new TypeError("RouteResponse constructor cannot be called as a function.");this.totalTime=null,this.totalDistance=null,this.bbox={left:null,right:null,top:null,bottom:null},this.routeGeometry=null,this.routeInstructions=[]}return t.prototype={constructor:t},t}(),Gt=function(){function t(){if(!(this instanceof t))throw new TypeError("RouteInstruction constructor cannot be called as a function.");this.duration=null,this.distance=null,this.code=null,this.instruction=null,this.geometry=null}return t.prototype={constructor:t},t}(),It=function(t,e,i,n,o,s){function r(t){var e,i="";return t.hasChildNodes()&&(e=t.firstChild,e&&3===e.nodeType&&(i=e.nodeValue)),i}function a(t,e){if(t.hasChildNodes())for(var i,n,o=t.childNodes,s=0;s<o.length;s++)if(i=o[s],1===i.nodeType)if(n=i.localName||i.baseName||i.nodeName,l.READERS[n]){var r=l.READERS[n];r(i,e)}else a(i,e)}var l={};return l.READERS={routeResult:function(t){var e=new o;if(a(t,e),"error"===e.status){var s=i.getMessage("SERVICE_RESPONSE_EXCEPTION",e.message);throw new n({message:s,type:n.TYPE_SRVERR})}return e},status:function(t,e){var i=r(t);"ERROR"!==i&&"error"!==i||e&&(e.status="error")},message:function(t,e){e&&(e.message=r(t))},distance:function(t,e){e&&(e.totalDistance=r(t))},durationSeconds:function(t,e){e&&(e.totalTime=parseFloat(r(t)))},bounds:function(t,e){if(e&&e.bbox){var i=r(t).split(/[,;]/);e.bbox.left=parseFloat(i[0]),e.bbox.bottom=parseFloat(i[1]),e.bbox.right=parseFloat(i[2]),e.bbox.top=parseFloat(i[3])}},geometryWkt:function(t,n){if(n){var o=t.innerHTML,s=function(t){n.routeGeometry=t},r=function(){var t=i.getMessage("PARAM_FORMAT",["geometryWkt"]);throw new Error(t)};e.toJson(o,s,r)}},step:function(t,e){var i,n=new s;if(t.hasChildNodes)for(var o,a,l=t.childNodes,c=0;c<l.length;c++)o=l[c],1===o.nodeType&&(a=o.localName||o.baseName||o.nodeName,"durationSeconds"===a?n.duration=r(o):"distance"===a?n.distance=r(o):"navInstruction"===a?n.code=r(o):"name"===a&&(i=r(o)));if(n.code)switch(n.code){case"F":"Valeur non renseignée"!=i?n.instruction="Tout droit "+i:n.instruction="Continuer tout droit ";break;case"B":n.instruction="Demi-tour "+i;break;case"L":n.instruction="Tourner à gauche "+i;break;case"R":n.instruction="Tourner à droite "+i;break;case"BL":n.instruction="Tourner très à gauche "+i;break;case"BR":n.instruction="Tourner très à droite "+i;break;case"FL":n.instruction="Tourner légèrement à gauche "+i;break;case"FR":n.instruction="Tourner légèrement à droite "+i;break;case"round_about_entry":n.instruction="Entrée rond-point "+i;break;case"round_about_exit":n.instruction="Sortie rond-point "+i;break;case null:n.instruction="Prendre "+i;break;default:n.instruction="?"+n.code+"? "+i}Array.isArray(e.routeInstructions)&&e.routeInstructions.push(n)}},l.read=function(t){var e;if("routeResult"===t.nodeName)return e=l.READERS.routeResult(t);throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.")},l}(i,bt,r,a,xt,Gt),At=function(t){var e={};return e.READERS={},e.read=function(t){},e}(i),Tt=function(t,e,i,n,o,s,r,a,l){var c={build:function(t){var c=null;if(!t.response)return void t.onError.call(t.scope,new e(o.getMessage("SERVICE_RESPONSE_EMPTY")));if(t.rawResponse)c=t.response;else{switch(t.outputFormat){case"xml":var h="REST"===t.api?s:r;try{var u=new i({reader:h});if("string"==typeof t.response?u.setXMLString(t.response):u.setXMLDoc(t.response),c=u.parse(),!c)throw new e(o.getMessage("SERVICE_RESPONSE_FORMAT","xml"))}catch(i){return void t.onError.call(t.scope,new e(o.getMessage("SERVICE_RESPONSE_ANALYSE",t.response)))}break;case"json":var d;if(d="string"==typeof t.response?window.JSON.parse(t.response):t.response,d.message)return void t.onError.call(t.scope,new e(o.getMessage("SERVICE_RESPONSE_EXCEPTION",d.message)));if(d){var p=[],m=[],f=[];if(c=new a,c.hasOwnProperty("totalTime")&&(c.totalTime=parseFloat(d.durationSeconds)),c.hasOwnProperty("totalDistance")&&(c.totalDistance="m"===t.distanceUnit?d.distanceMeters:d.distance),c.hasOwnProperty("bbox")){var _=d.bounds.split(/[,;]/);c.bbox.left=parseFloat(_[0]),c.bbox.bottom=parseFloat(_[1]),c.bbox.right=parseFloat(_[2]),c.bbox.top=parseFloat(_[3])}var g=function(t){c.routeGeometry=t},v=function(i){console.log(i),t.onError.call(t.scope,new e(o.getMessage("PARAM_FORMAT",["geometryWkt"])))};if(c.hasOwnProperty("routeGeometry")){var y=d.geometryWkt||d.simplifiedWkt;if(y&&(n.toJson(y,g,v),!c.routeGeometry))return}if(c.hasOwnProperty("routeInstructions")){var E,P=d.legs;if(Array.isArray(P)&&P.length)for(E=0;E<P.length;E++)p.push(P[E]);if(Array.isArray(p)&&p.length)for(E=0;E<p.length;E++)m.push(p[E].steps);if(Array.isArray(m)&&m.length)for(E=0;E<m.length;E++)f=f.concat(m[E]);f.forEach(function(e){c.routeInstructions.push(new l),c.routeInstructions[c.routeInstructions.length-1].duration=e.durationSeconds,c.routeInstructions[c.routeInstructions.length-1].distance="m"===t.distanceUnit?e.distanceMeters:e.distance,c.routeInstructions[c.routeInstructions.length-1].code=e.navInstruction;for(var i=[],n=0;n<e.points.length;n++){var o=e.points[n].split(",");o&&i.push(o)}switch(i&&0!==i.length?c.routeInstructions[c.routeInstructions.length-1].geometry={coordinates:i,type:"LineString"}:c.routeInstructions[c.routeInstructions.length-1].geometry=null,"Valeur non renseignée"==e.name&&(e.name=""),e.navInstruction){case"F":e.name?c.routeInstructions[c.routeInstructions.length-1].instruction="Tout droit "+e.name:c.routeInstructions[c.routeInstructions.length-1].instruction="Continuer tout droit ";break;case"B":c.routeInstructions[c.routeInstructions.length-1].instruction="Demi-tour "+e.name;break;case"L":c.routeInstructions[c.routeInstructions.length-1].instruction="Tourner à gauche "+e.name;break;case"R":c.routeInstructions[c.routeInstructions.length-1].instruction="Tourner à droite "+e.name;break;case"BL":c.routeInstructions[c.routeInstructions.length-1].instruction="Tourner très à gauche "+e.name;break;case"BR":c.routeInstructions[c.routeInstructions.length-1].instruction="Tourner très à droite "+e.name;break;case"FL":c.routeInstructions[c.routeInstructions.length-1].instruction="Tourner légèrement à gauche "+e.name;break;case"FR":c.routeInstructions[c.routeInstructions.length-1].instruction="Tourner légèrement à droite "+e.name;break;case"round_about_entry":c.routeInstructions[c.routeInstructions.length-1].instruction="Entrée rond-point "+e.name;break;case"round_about_exit":c.routeInstructions[c.routeInstructions.length-1].instruction="Sortie rond-point "+e.name;break;case null:c.routeInstructions[c.routeInstructions.length-1].instruction="Prendre tout droit "+e.name;break;default:c.routeInstructions[c.routeInstructions.length-1].instruction="?"+e.navInstruction+"? "+e.name}})}}if(!c)return void t.onError.call(t.scope,new e(o.getMessage("SERVICE_RESPONSE_ANALYSE","json")));break;default:return void t.onError.call(t.scope,new e(o.getMessage("SERVICE_RESPONSE_FORMAT","json","xml")))}if(c&&c.exceptionReport)return void t.onError.call(t.scope,new e(o.getMessage("SERVICE_RESPONSE_EXCEPTION_2")))}t.onSuccess.call(t.scope,c)}};return c}(i,a,y,bt,r,It,At,xt,Gt),kt=function(t,e,i,n,o,s,r){function a(t){if(!(this instanceof a))throw new TypeError(e.getMessage("CLASS_CONSTRUCTOR","Route"));if(this.CLASSNAME="Route",n.apply(this,arguments),!t.startPoint)throw new Error(e.getMessage("PARAM_MISSING","startPoint"));if(null==t.startPoint.x)throw new Error(e.getMessage("PARAM_MISSING","startPoint.x"));if(null==t.startPoint.y)throw new Error(e.getMessage("PARAM_MISSING","startPoint.y"));if(!t.endPoint)throw new Error(e.getMessage("PARAM_MISSING","endPoint"));if(null==t.endPoint.x)throw new Error(e.getMessage("PARAM_MISSING","endPoint.x"));if(null==t.endPoint.y)throw new Error(e.getMessage("PARAM_MISSING","endPoint.y"));if(this.options.api="string"==typeof t.api?t.api.toUpperCase():"REST",this.options.outputFormat="string"==typeof t.outputFormat?t.outputFormat.toLowerCase():"json",this.options.startPoint=t.startPoint,this.options.endPoint=t.endPoint,this.options.viaPoints=t.viaPoints||null,this.options.exclusions=t.exclusions||null,this.options.routePreference=t.routePreference||"fastest",this.options.graph=t.graph||"Voiture",this.options.geometryInInstructions=t.geometryInInstructions||!1,this.options.provideBbox=t.provideBbox||!0,this.options.distanceUnit=t.distanceUnit||"km",this.options.expectedStartTime=null,this.options.srs=t.srs||"EPSG:4326",this.options.api="REST","XHR"===this.options.protocol&&(this.options.httpMethod="GET"),!this.options.serverUrl){var i=o.Route.url(this.options.apiKey),s=null;switch(this.options.api){case"OLS":s=i.ols;break;case"REST":var r="route-"+this.options.outputFormat;s=i[r];break;default:throw new Error(e.getMessage("PARAM_UNKNOWN","api"))}if(!s)throw new Error("Url by default not found !");this.options.serverUrl=s}var l=this.options.serverUrl.lastIndexOf(".");if(l!==-1){var c=this.options.serverUrl.substring(l+1);if(c&&c.length<5)switch(c.toLowerCase()){case"json":case"xml":this.options.outputFormat=c.toLowerCase();break;default:throw new Error("type of service : unknown or unsupported (json or xml) !")}}}return a.prototype=Object.create(n.prototype,{}),a.prototype.constructor=a,a.prototype.buildRequest=function(t,n){var o={api:this.options.api,startPoint:this.options.startPoint,endPoint:this.options.endPoint,viaPoints:this.options.viaPoints,provideBbox:this.options.provideBbox,exclusions:this.options.exclusions,distanceUnit:this.options.distanceUnit,graph:this.options.graph,geometryInInstructions:this.options.geometryInInstructions,routePreference:this.options.routePreference,srs:this.options.srs};this.request=s.build(o),this.request?n.call(this,this.request):t.call(this,new i(e.getMessage("SERVICE_REQUEST_BUILD")))},a.prototype.analyzeResponse=function(t,n){if(this.response){var o={distanceUnit:this.options.distanceUnit,response:this.response,outputFormat:this.options.outputFormat,api:this.options.api,rawResponse:this.options.rawResponse,onError:t,onSuccess:n,scope:this};r.build(o)}else t.call(this,new i(e.getMessage("SERVICE_RESPONSE_EMPTY")))},a}(i,r,a,u,h,Rt,Tt),Ot=function(t){function e(t){if(!(this instanceof e))throw new TypeError("ProcessIsoCurveParam constructor cannot be called as a function.");this.options=t||{},this.id=this.options.id,this.location=this.options.position,this.srs=this.options.srs,this.graphName=this.options.graph,this.profileId=this.options.profileId||null,this.profileName=this.options.profileName||null,this.exclusions=this.options.exclusions,this.reverse=this.options.reverse,this.smoothing=this.options.smoothing,this.holes=this.options.holes;var i=this.options.method;switch(i){case"time":this.method="time",this.time=this.options.time;break;case"distance":this.method="distance",this.distance=this.options.distance;break;default:this.method="time"}}return e.CLASSNAME="ProcessIsoCurveParam",e.prototype={constructor:e,getLocation:function(){return this.location.x+","+this.location.y},getExclusions:function(){return this.exclusions.join(";")}},e.prototype.getParams=function(){var t=[];return t.push({k:"location",v:this.getLocation()}),t.push({k:"smoothing",v:this.smoothing}),t.push({k:"holes",v:this.holes}),t.push({k:"reverse",v:this.reverse}),t.push({k:"method",v:this.method}),this.time&&t.push({k:"time",v:this.time}),this.distance&&t.push({k:"distance",v:this.distance}),t.push({k:"graphName",v:this.graphName}),this.exclusions&&t.push({k:"exclusions",v:this.getExclusions()}),this.srs&&t.push({k:"srs",v:this.srs}),t},e}(i),Dt=function(t,e,i){function n(t){if(!(this instanceof n))throw new TypeError("ProcessIsoCurveRequest constructor cannot be called as a function.");if(!t)throw new Error(e.getMessage("PARAM_EMPTY","options"));this.settings=t,this.mode=this.settings.httpMethod||"GET"}return n.prototype={requestString:null,constructor:n,template:{container:'<?xml version="1.0" encoding="UTF-8"?>\n<isochroneRequest>\n__ID__\t<location>\n\t\t<x>__X__</x>\n\t\t<y>__Y__</y>\n\t</location>\n\t<srs>__SRS__</srs>\n\t<graphName>__GRAPHNAME__</graphName>\n__PROFIL____EXCLUSIONS__\t<method>__METHOD__</method>\n__TIME____DISTANCE__\t<reverse>__REVERSE__</reverse>\n\t<smoothing>__SMOOTHING__</smoothing>\n\t<holes>__HOLES__</holes>\n</isochroneRequest>',id:"\t<id>__IDVALUE__</id>\n",profil:"\t<profileId>__PROFILID__</profileId>\n\t<profileName>__PROFILNAME__</profileName>\n",exclusions:{container:"\t<exclusions>\n__EXCLUSIONFEATURE__\n\t</exclusions>\n",feature:"\t\t<exclusion>__EXCLUSIONVALUE__</exclusion>"},time:"\t<time>__TIMEVALUE__</time>\n",distance:"\t<distance>__DISTANCEVALUE__</distance>\n"},processRequestString:function(){var t="",e=0;switch(this.mode){case"GET":var n=new i(this.settings),o=n.getParams();for(e=0;e<o.length;e++){var s=o[e];t&&(t+="&"),t+=s.k+"="+s.v}break;case"POST":if(t=this.template.container,t=t.replace(/__ID__/g,""),t=t.replace(/__PROFIL__/g,""),t=t.replace(/__X__/g,this.settings.position.x),t=t.replace(/__Y__/g,this.settings.position.y),t=t.replace(/__GRAPHNAME__/g,this.settings.graph),t=t.replace(/__SRS__/g,this.settings.srs),t=t.replace(/__SMOOTHING__/g,this.settings.smoothing),t=t.replace(/__HOLES__/g,this.settings.holes),t=t.replace(/__REVERSE__/g,this.settings.reverse),this.settings.exclusions){var r=this.template.exclusions.container,a=[];for(e=0;e<this.settings.exclusions.length;e++){var l=this.template.exclusions.feature;l=l.replace(/__EXCLUSIONVALUE__/,this.settings.exclusions[e]),a.push(l)}r=r.replace(/__EXCLUSIONFEATURE__/,a.join("\n")),t=t.replace(/__EXCLUSIONS__/g,r)}if(t=t.replace(/__EXCLUSIONS__/g,""),this.settings.distance){var c=this.template.distance;c=c.replace(/__DISTANCEVALUE__/g,this.settings.distance),t=t.replace(/__DISTANCE__/g,c),t=t.replace(/__METHOD__/g,"distance")}if(t=t.replace(/__DISTANCE__/g,""),this.settings.time){var h=this.template.time;h=h.replace(/__TIMEVALUE__/g,this.settings.time),t=t.replace(/__TIME__/g,h),t=t.replace(/__METHOD__/g,"time")}t=t.replace(/__TIME__/g,"")}return this.requestString=t,this.requestString}},n}(i,r,Ot),Nt=function(){function t(){if(!(this instanceof t))throw new TypeError("ProcessIsoCurveResponse constructor cannot be called as a function.");this.message=null,this.id=null,this.location={},this.location.x=null,this.location.y=null,this.srs=null,this.geometry=null,this.time=null,this.distance=null}return t.prototype={constructor:t},t}(),Ut=function(t,e,i,n,o){function s(t){var e,i="";return t.hasChildNodes()&&(e=t.firstChild,e&&3===e.nodeType&&(i=e.nodeValue)),i}var r={};return r.READERS={isochronResult:function(t){var e=new o;if(t.hasChildNodes())for(var s,a=t.childNodes,l=0;l<a.length;l++)s=a[l],r.READERS[s.nodeName]&&r.READERS[s.nodeName](s,e);if("error"===e.status){var c=n.getMessage("SERVICE_RESPONSE_EXCEPTION",e.message);throw new i({message:c,type:i.TYPE_SRVERR})}return e},message:function(t,e){e&&(e.message=s(t))},status:function(t,e){var i=s(t);"ERROR"!==i&&"error"!==i||e&&(e.status="error")},id:function(t,e){e&&(e.id=s(t))},location:function(t,e){var i=s(t);e&&e.location&&(e.location.x=parseFloat(i.split(",")[0]),e.location.y=parseFloat(i.split(",")[1]))},srs:function(t,e){e&&(e.srs=s(t))},distance:function(t,e){e&&(e.distance=parseFloat(s(t)))},time:function(t,e){e&&(e.time=parseFloat(s(t)))},wktGeometry:function(t,i){if(i){var o=t.innerHTML,s=function(t){i.geometry=t},r=function(){var t=n.getMessage("PARAM_FORMAT",["wktGeometry"]);throw new Error(t)};i.hasOwnProperty("geometry")&&e.toJson(o,s,r)}},serviceResult:function(t){var e={};if(t.hasChildNodes())for(var i,n=t.childNodes,o=0;o<n.length;o++)i=n[o],r.READERS[i.nodeName]&&r.READERS[i.nodeName](i,e);return e},ExceptionReport:function(t){var e={};if(t.hasChildNodes())for(var i,n=t.childNodes,o=0;o<n.length;o++)i=n[o],"Exception"===i.nodeName&&(e.exceptionReport=r.READERS.Exception(i));return e},Exception:function(t){var e={},i=t.getAttribute("exceptionCode");i&&(e.exceptionCode=i);var n=t.firstChild;return n&&3===n.nodeType&&(e.exception=n.nodeValue),e}},r.read=function(t){var e;if("isochronResult"===t.nodeName||"isochroneResult"===t.nodeName||"IsochroneResult"===t.nodeName)return e=r.READERS.isochronResult(t);if("ExceptionReport"===t.nodeName)return e=r.READERS[t.nodeName](t);if(r.READERS[t.nodeName]){if(e=r.READERS[t.nodeName](t),"error"===e.status){var o=n.getMessage("SERVICE_RESPONSE_EXCEPTION",e.message);throw new i({message:o,type:i.TYPE_SRVERR})}return e}throw new i({message:n.getMessage("SERVICE_RESPONSE_ANALYSE",t.nodeName),type:i.TYPE_UNKERR})},r}(i,bt,a,r,Nt),jt=function(t,e,i,n,o,s,r){var a={build:function(t){var a=null;if(!t.response)return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_EMPTY")));if(t.rawResponse)a=t.response;else{switch(t.outputFormat){case"xml":try{var l=new n({reader:s});if("string"==typeof t.response?l.setXMLString(t.response):l.setXMLDoc(t.response),
+a=l.parse(),!a)throw new Error(i.getMessage("SERVICE_RESPONSE_EXCEPTION_2"))}catch(n){var c=n.message;return c+="\n(raw response service : '"+t.response+"')",void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",c),status:200,type:e.TYPE_SRVERR}))}break;case"json":var h;if(h="string"==typeof t.response?window.JSON.parse(t.response):t.response,"OK"===h.status||"ok"===h.status){if(a=new r,!a)return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_ANALYSE",t.response)));a.time=h.time,a.distance=h.distance,a.message=h.message,a.id=h.id,a.srs=h.srs;var u=function(t){a.geometry=t},d=function(){t.onError.call(t.scope,new e({message:i.getMessage("PARAM_FORMAT","wktGeometry")}))};if(a.hasOwnProperty("geometry")&&(o.toJson(h.wktGeometry,u,d),!a.geometry))return;var p=h.location.split(",");a.location&&(a.location.x=p[0],a.location.y=p[1])}else if("ERROR"===h.status||"error"===h.status){var m=h.message;return m+="\n(raw response service : '"+h+"')",void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_EXCEPTION",m)))}break;default:return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_FORMAT","json","xml")))}if(a&&a.exceptionReport)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",a.exceptionReport),type:e.TYPE_SRVERR,status:200}))}t.onSuccess.call(t.scope,a)}};return a}(i,a,r,y,bt,Ut,Nt),Ft=function(t,e,i,n,o,s,r){function a(t){if(!(this instanceof a))throw new TypeError(e.getMessage("CLASS_CONSTRUCTOR","ProcessIsoCurve"));if(this.CLASSNAME="ProcessIsoCurve",n.apply(this,arguments),!t.position)throw new Error(e.getMessage("PARAM_MISSING","position"));if(null==t.position.x)throw new Error(e.getMessage("PARAM_MISSING","position.x"));if(null==t.position.y)throw new Error(e.getMessage("PARAM_MISSING","position.y"));if(!t.time&&!t.distance)throw new Error("Parameter(s) 'distance' missing. Parameter time to calculate an isochrone, parameter distance for an isodistance");if(!t.time&&t.distance&&(this.options.method="distance",this.options.time&&delete this.options.time),t.time&&!t.distance&&(this.options.method="time",this.options.distance&&delete this.options.distance),this.options.method=this.options.method||"time",this.options.exclusions=t.exclusions||null,this.options.graph=t.graph||"Voiture",this.options.reverse=t.reverse||!1,this.options.smoothing=t.smoothing||!1,this.options.holes=t.holes||!1,this.options.srs=t.srs||"EPSG:4326",this.options.outputFormat="string"==typeof t.outputFormat?t.outputFormat.toLowerCase():"json",!this.options.serverUrl){var i=o.ProcessIsoCurve.url(this.options.apiKey),s=i["iso-"+this.options.outputFormat];if(!s)throw new Error("Url by default not found !");this.options.serverUrl=s}var r=this.options.serverUrl.lastIndexOf(".");if(r!==-1){var l=this.options.serverUrl.substring(r+1);if(l&&l.length<5)switch(l.toLowerCase()){case"json":case"xml":this.options.outputFormat=l.toLowerCase();break;default:throw new Error("type of service : unknown or unsupported (json or xml) !")}}}return a.prototype=Object.create(n.prototype,{}),a.prototype.constructor=a,a.prototype.buildRequest=function(t,n){try{var o=new s(this.options);if(!o.processRequestString())throw new Error(e.getMessage("SERVICE_REQUEST_BUILD"));this.request=o.requestString}catch(e){return void t.call(this,new i(e.message))}n.call(this,this.request)},a.prototype.analyzeResponse=function(t,n){if(this.response){var o={response:this.response,outputFormat:this.options.outputFormat,rawResponse:this.options.rawResponse,onSuccess:n,onError:t,scope:this};r.build(o)}else t.call(this,new i(e.getMessage("SERVICE_RESPONSE_EMPTY")))},a}(i,r,a,u,h,Dt,jt),zt=function(t,e,i,n,o,s,r){var a={getConfig:function(t){var i=new e(t);i.call()},getAltitude:function(e){var i=new t(e);i.call()},geocode:function(t){var e=new i(t);e.call()},reverseGeocode:function(t){var e=new n(t);e.call()},autoComplete:function(t){var e=new o(t);e.call()},route:function(t){var e=new s(t);e.call()},isoCurve:function(t){var e=new r(t);e.call()}};return a}(M,z,ht,ft,yt,kt,Ft),Bt=function(t,e,i,n,o,s,r,a,l,c,h,u,d,p,m,f,_,g,v,y,E,P,C,S,M,w,L,R,b){var x="undefined"!=typeof window?window:{},G=x.Gp||{servicesVersion:"1.0.0-beta3",servicesDate:"2016-12-01",extend:function(t,e){var i,n=t.split("."),o=this;i=n.length;for(var s=0;s<i;s++){"undefined"==typeof o[n[s]]&&(o[n[s]]={});var r=i-1;s===r&&(o[n[s]]=e),o=o[n[s]]}return this}};return G.extend("Protocols",{}),G.extend("Protocols.XHR",t),G.extend("Services",e),G.extend("Services.AltiResponse",i),G.extend("Services.Alti.Elevation",n),G.extend("Services.AutoCompleteResponse",o),G.extend("Services.AutoComplete.SuggestedLocation",s),G.extend("Services.GetConfigResponse",r),G.extend("Services.Config.Constraint",a),G.extend("Services.Config.Format",l),G.extend("Services.Config.Layer",c),G.extend("Services.Config.Legend",h),G.extend("Services.Config.Metadata",u),G.extend("Services.Config.Originator",d),G.extend("Services.Config.Service",p),G.extend("Services.Config.Style",m),G.extend("Services.Config.Territory",f),G.extend("Services.Config.Thematic",s),G.extend("Services.Config.TileMatrix",g),G.extend("Services.Config.TileMatrixLimit",v),G.extend("Services.Config.TileMatrixSet",y),G.extend("Services.GeocodeResponse",E),G.extend("Services.Geocode.GeocodedLocation",P),G.extend("Services.Geocode.DirectGeocodedLocation",C),G.extend("Services.Geocode.ReverseGeocodedLocation",S),G.extend("Services.IsoCurveResponse",M),G.extend("Services.RouteResponse",w),G.extend("Services.Route.RouteInstruction",L),G.extend("Error",R),G.extend("Helper",b),x.Gp=G,x.Gp}(s,zt,E,P,_t,gt,w,L,R,b,x,G,I,A,T,k,O,N,U,D,st,rt,at,dt,Nt,xt,Gt,a,n)}),CommonUtilsAutoLoadConfig=function(t){!function(){var e=document.getElementsByTagName("script"),i=e[e.length-1].getAttribute("data-key");if(i){var n=i.split(/;|,|\|/);if(i&&n.length>1){for(var o=[],s=0;s<n.length;s++)o.push(n[s]);i=o}}var r=e[e.length-1].getAttribute("data-url"),a=e[e.length-1].getAttribute("data-timeout"),l=function(){},c=function(t){throw new Error("Configuration load failed : "+t.message)};if(i||r){var h={apiKey:i,onSuccess:l,onFailure:c};r&&(h.serverUrl=r,h.callbackSuffix=""),a&&(h.timeOut=a),t.Config||t.Services.getConfig(h)}}()}(gp),!function(t,e,i){L.drawVersion="0.3.0-dev",L.drawLocal={draw:{toolbar:{actions:{title:"Cancel drawing",text:"Cancel"},finish:{title:"Finish drawing",text:"Finish"},undo:{title:"Delete last point drawn",text:"Delete last point"},buttons:{polyline:"Draw a polyline",polygon:"Draw a polygon",rectangle:"Draw a rectangle",circle:"Draw a circle",marker:"Draw a marker"}},handlers:{circle:{tooltip:{start:"Click and drag to draw circle."},radius:"Radius"},marker:{tooltip:{start:"Click map to place marker."}},polygon:{tooltip:{start:"Click to start drawing shape.",cont:"Click to continue drawing shape.",end:"Click first point to close this shape."}},polyline:{error:"<strong>Error:</strong> shape edges cannot cross!",tooltip:{start:"Click to start drawing line.",cont:"Click to continue drawing line.",end:"Click last point to finish line."}},rectangle:{tooltip:{start:"Click and drag to draw rectangle."}},simpleshape:{tooltip:{end:"Release mouse to finish drawing."}}}},edit:{toolbar:{actions:{save:{title:"Save changes.",text:"Save"},cancel:{title:"Cancel editing, discards all changes.",text:"Cancel"}},buttons:{edit:"Edit layers.",editDisabled:"No layers to edit.",remove:"Delete layers.",removeDisabled:"No layers to delete."}},handlers:{edit:{tooltip:{text:"Drag handles, or marker to edit feature.",subtext:"Click cancel to undo changes."}},remove:{tooltip:{text:"Click on a feature to remove"}}}}},L.Draw={},L.Draw.Feature=L.Handler.extend({includes:L.Mixin.Events,initialize:function(t,e){this._map=t,this._container=t._container,this._overlayPane=t._panes.overlayPane,this._popupPane=t._panes.popupPane,e&&e.shapeOptions&&(e.shapeOptions=L.Util.extend({},this.options.shapeOptions,e.shapeOptions)),L.setOptions(this,e)},enable:function(){this._enabled||(L.Handler.prototype.enable.call(this),this.fire("enabled",{handler:this.type}),this._map.fire("draw:drawstart",{layerType:this.type}))},disable:function(){this._enabled&&(L.Handler.prototype.disable.call(this),this._map.fire("draw:drawstop",{layerType:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(L.DomUtil.disableTextSelection(),t.getContainer().focus(),this._tooltip=new L.Tooltip(this._map),L.DomEvent.on(this._container,"keyup",this._cancelDrawing,this))},removeHooks:function(){this._map&&(L.DomUtil.enableTextSelection(),this._tooltip.dispose(),this._tooltip=null,L.DomEvent.off(this._container,"keyup",this._cancelDrawing,this))},setOptions:function(t){L.setOptions(this,t)},_fireCreatedEvent:function(t){this._map.fire("draw:created",{layer:t,layerType:this.type})},_cancelDrawing:function(t){27===t.keyCode&&this.disable()}}),L.Draw.Polyline=L.Draw.Feature.extend({statics:{TYPE:"polyline"},Poly:L.Polyline,options:{allowIntersection:!0,repeatMode:!1,drawError:{color:"#b00b00",timeout:2500},icon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"}),touchIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-touch-icon"}),guidelineDistance:20,maxGuideLineLength:4e3,shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!1,clickable:!0},metric:!0,feet:!0,showLength:!0,zIndexOffset:2e3},initialize:function(t,e){L.Browser.touch&&(this.options.icon=this.options.touchIcon),this.options.drawError.message=L.drawLocal.draw.handlers.polyline.error,e&&e.drawError&&(e.drawError=L.Util.extend({},this.options.drawError,e.drawError)),this.type=L.Draw.Polyline.TYPE,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._markers=[],this._markerGroup=new L.LayerGroup,this._map.addLayer(this._markerGroup),this._poly=new L.Polyline([],this.options.shapeOptions),this._tooltip.updateContent(this._getTooltipText()),this._mouseMarker||(this._mouseMarker=L.marker(this._map.getCenter(),{icon:L.divIcon({className:"leaflet-mouse-marker",iconAnchor:[20,20],iconSize:[40,40]}),opacity:0,zIndexOffset:this.options.zIndexOffset})),this._mouseMarker.on("mousedown",this._onMouseDown,this).on("mouseout",this._onMouseOut,this).on("mouseup",this._onMouseUp,this).on("mousemove",this._onMouseMove,this).addTo(this._map),this._map.on("mouseup",this._onMouseUp,this).on("mousemove",this._onMouseMove,this).on("zoomlevelschange",this._onZoomEnd,this).on("click",this._onTouch,this).on("zoomend",this._onZoomEnd,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._clearHideErrorTimeout(),this._cleanUpShape(),this._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers,this._map.removeLayer(this._poly),delete this._poly,this._mouseMarker.off("mousedown",this._onMouseDown,this).off("mouseout",this._onMouseOut,this).off("mouseup",this._onMouseUp,this).off("mousemove",this._onMouseMove,this),this._map.removeLayer(this._mouseMarker),delete this._mouseMarker,this._clearGuides(),this._map.off("mouseup",this._onMouseUp,this).off("mousemove",this._onMouseMove,this).off("mouseup",this._onMouseUp,this).off("zoomend",this._onZoomEnd,this).off("click",this._onTouch,this)},deleteLastVertex:function(){if(!(this._markers.length<=1)){var t=this._markers.pop(),e=this._poly,i=this._poly.spliceLatLngs(e.getLatLngs().length-1,1)[0];this._markerGroup.removeLayer(t),e.getLatLngs().length<2&&this._map.removeLayer(e),this._vertexChanged(i,!1)}},addVertex:function(t){var e=this._markers.length;return e>0&&!this.options.allowIntersection&&this._poly.newLatLngIntersects(t)?void this._showErrorTooltip():(this._errorShown&&this._hideErrorTooltip(),this._markers.push(this._createMarker(t)),this._poly.addLatLng(t),2===this._poly.getLatLngs().length&&this._map.addLayer(this._poly),void this._vertexChanged(t,!0))},completeShape:function(){this._markers.length<=1||(this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable())},_finishShape:function(){var t=this._poly.newLatLngIntersects(this._poly.getLatLngs()[0],!0);return!this.options.allowIntersection&&t||!this._shapeIsValid()?void this._showErrorTooltip():(this._fireCreatedEvent(),this.disable(),void(this.options.repeatMode&&this.enable()))},_shapeIsValid:function(){return!0},_onZoomEnd:function(){this._updateGuide()},_onMouseMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent),i=this._map.layerPointToLatLng(e);this._currentLatLng=i,this._updateTooltip(i),this._updateGuide(e),this._mouseMarker.setLatLng(i),L.DomEvent.preventDefault(t.originalEvent)},_vertexChanged:function(t,e){this._map.fire("draw:drawvertex",{layers:this._markerGroup}),this._updateFinishHandler(),this._updateRunningMeasure(t,e),this._clearGuides(),this._updateTooltip()},_onMouseDown:function(t){var e=t.originalEvent;this._mouseDownOrigin=L.point(e.clientX,e.clientY)},_onMouseUp:function(e){if(this._mouseDownOrigin){var i=L.point(e.originalEvent.clientX,e.originalEvent.clientY).distanceTo(this._mouseDownOrigin);Math.abs(i)<9*(t.devicePixelRatio||1)&&this.addVertex(e.latlng)}this._mouseDownOrigin=null},_onTouch:function(t){L.Browser.touch&&(this._onMouseDown(t),this._onMouseUp(t))},_onMouseOut:function(){this._tooltip&&this._tooltip._onMouseOut.call(this._tooltip)},_updateFinishHandler:function(){var t=this._markers.length;t>1&&this._markers[t-1].on("click",this._finishShape,this),t>2&&this._markers[t-2].off("click",this._finishShape,this)},_createMarker:function(t){var e=new L.Marker(t,{icon:this.options.icon,zIndexOffset:2*this.options.zIndexOffset});return this._markerGroup.addLayer(e),e},_updateGuide:function(t){var e=this._markers.length;e>0&&(t=t||this._map.latLngToLayerPoint(this._currentLatLng),this._clearGuides(),this._drawGuide(this._map.latLngToLayerPoint(this._markers[e-1].getLatLng()),t))},_updateTooltip:function(t){var e=this._getTooltipText();t&&this._tooltip.updatePosition(t),this._errorShown||this._tooltip.updateContent(e)},_drawGuide:function(t,e){var i,n,o,s=Math.floor(Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))),r=this.options.guidelineDistance,a=this.options.maxGuideLineLength,l=s>a?s-a:r;for(this._guidesContainer||(this._guidesContainer=L.DomUtil.create("div","leaflet-draw-guides",this._overlayPane));s>l;l+=this.options.guidelineDistance)i=l/s,n={x:Math.floor(t.x*(1-i)+i*e.x),y:Math.floor(t.y*(1-i)+i*e.y)},o=L.DomUtil.create("div","leaflet-draw-guide-dash",this._guidesContainer),o.style.backgroundColor=this._errorShown?this.options.drawError.color:this.options.shapeOptions.color,L.DomUtil.setPosition(o,n)},_updateGuideColor:function(t){if(this._guidesContainer)for(var e=0,i=this._guidesContainer.childNodes.length;i>e;e++)this._guidesContainer.childNodes[e].style.backgroundColor=t},_clearGuides:function(){if(this._guidesContainer)for(;this._guidesContainer.firstChild;)this._guidesContainer.removeChild(this._guidesContainer.firstChild)},_getTooltipText:function(){var t,e,i=this.options.showLength;return 0===this._markers.length?t={text:L.drawLocal.draw.handlers.polyline.tooltip.start}:(e=i?this._getMeasurementString():"",t=1===this._markers.length?{text:L.drawLocal.draw.handlers.polyline.tooltip.cont,subtext:e}:{text:L.drawLocal.draw.handlers.polyline.tooltip.end,subtext:e}),t},_updateRunningMeasure:function(t,e){var i,n,o=this._markers.length;1===this._markers.length?this._measurementRunningTotal=0:(i=o-(e?2:1),n=t.distanceTo(this._markers[i].getLatLng()),this._measurementRunningTotal+=n*(e?1:-1))},_getMeasurementString:function(){var t,e=this._currentLatLng,i=this._markers[this._markers.length-1].getLatLng();return t=this._measurementRunningTotal+e.distanceTo(i),L.GeometryUtil.readableDistance(t,this.options.metric,this.options.feet)},_showErrorTooltip:function(){this._errorShown=!0,this._tooltip.showAsError().updateContent({text:this.options.drawError.message}),this._updateGuideColor(this.options.drawError.color),this._poly.setStyle({color:this.options.drawError.color}),this._clearHideErrorTimeout(),this._hideErrorTimeout=setTimeout(L.Util.bind(this._hideErrorTooltip,this),this.options.drawError.timeout)},_hideErrorTooltip:function(){this._errorShown=!1,this._clearHideErrorTimeout(),this._tooltip.removeError().updateContent(this._getTooltipText()),this._updateGuideColor(this.options.shapeOptions.color),this._poly.setStyle({color:this.options.shapeOptions.color})},_clearHideErrorTimeout:function(){this._hideErrorTimeout&&(clearTimeout(this._hideErrorTimeout),this._hideErrorTimeout=null)},_cleanUpShape:function(){this._markers.length>1&&this._markers[this._markers.length-1].off("click",this._finishShape,this)},_fireCreatedEvent:function(){var t=new this.Poly(this._poly.getLatLngs(),this.options.shapeOptions);L.Draw.Feature.prototype._fireCreatedEvent.call(this,t)}}),L.Draw.Polygon=L.Draw.Polyline.extend({statics:{TYPE:"polygon"},Poly:L.Polygon,options:{showArea:!1,shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0}},initialize:function(t,e){L.Draw.Polyline.prototype.initialize.call(this,t,e),this.type=L.Draw.Polygon.TYPE},_updateFinishHandler:function(){var t=this._markers.length;1===t&&this._markers[0].on("click",this._finishShape,this),t>2&&(this._markers[t-1].on("dblclick",this._finishShape,this),t>3&&this._markers[t-2].off("dblclick",this._finishShape,this))},_getTooltipText:function(){var t,e;return 0===this._markers.length?t=L.drawLocal.draw.handlers.polygon.tooltip.start:this._markers.length<3?t=L.drawLocal.draw.handlers.polygon.tooltip.cont:(t=L.drawLocal.draw.handlers.polygon.tooltip.end,e=this._getMeasurementString()),{text:t,subtext:e}},_getMeasurementString:function(){var t=this._area;return t?L.GeometryUtil.readableArea(t,this.options.metric):null},_shapeIsValid:function(){return this._markers.length>=3},_vertexChanged:function(t,e){var i;!this.options.allowIntersection&&this.options.showArea&&(i=this._poly.getLatLngs(),this._area=L.GeometryUtil.geodesicArea(i)),L.Draw.Polyline.prototype._vertexChanged.call(this,t,e)},_cleanUpShape:function(){var t=this._markers.length;t>0&&(this._markers[0].off("click",this._finishShape,this),t>2&&this._markers[t-1].off("dblclick",this._finishShape,this))}}),L.SimpleShape={},L.Draw.SimpleShape=L.Draw.Feature.extend({options:{repeatMode:!1},initialize:function(t,e){this._endLabelText=L.drawLocal.draw.handlers.simpleshape.tooltip.end,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._mapDraggable=this._map.dragging.enabled(),this._mapDraggable&&this._map.dragging.disable(),this._container.style.cursor="crosshair",this._tooltip.updateContent({text:this._initialLabelText}),this._map.on("mousedown",this._onMouseDown,this).on("mousemove",this._onMouseMove,this).on("touchstart",this._onMouseDown,this).on("touchmove",this._onMouseMove,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._map&&(this._mapDraggable&&this._map.dragging.enable(),this._container.style.cursor="",this._map.off("mousedown",this._onMouseDown,this).off("mousemove",this._onMouseMove,this).off("touchstart",this._onMouseDown,this).off("touchmove",this._onMouseMove,this),L.DomEvent.off(e,"mouseup",this._onMouseUp,this),L.DomEvent.off(e,"touchend",this._onMouseUp,this),this._shape&&(this._map.removeLayer(this._shape),delete this._shape)),this._isDrawing=!1},_getTooltipText:function(){return{text:this._endLabelText}},_onMouseDown:function(t){this._isDrawing=!0,this._startLatLng=t.latlng,L.DomEvent.on(e,"mouseup",this._onMouseUp,this).on(e,"touchend",this._onMouseUp,this).preventDefault(t.originalEvent)},_onMouseMove:function(t){var e=t.latlng;this._tooltip.updatePosition(e),this._isDrawing&&(this._tooltip.updateContent(this._getTooltipText()),this._drawShape(e))},_onMouseUp:function(){this._shape&&this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable()}}),L.Draw.Rectangle=L.Draw.SimpleShape.extend({statics:{TYPE:"rectangle"},options:{shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},metric:!0},initialize:function(t,e){this.type=L.Draw.Rectangle.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.rectangle.tooltip.start,L.Draw.SimpleShape.prototype.initialize.call(this,t,e)},_drawShape:function(t){this._shape?this._shape.setBounds(new L.LatLngBounds(this._startLatLng,t)):(this._shape=new L.Rectangle(new L.LatLngBounds(this._startLatLng,t),this.options.shapeOptions),this._map.addLayer(this._shape))},_fireCreatedEvent:function(){var t=new L.Rectangle(this._shape.getBounds(),this.options.shapeOptions);L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this,t)},_getTooltipText:function(){var t,e,i,n=L.Draw.SimpleShape.prototype._getTooltipText.call(this),o=this._shape;return o&&(t=this._shape.getLatLngs(),e=L.GeometryUtil.geodesicArea(t),i=L.GeometryUtil.readableArea(e,this.options.metric)),{text:n.text,subtext:i}}}),L.Draw.Circle=L.Draw.SimpleShape.extend({statics:{TYPE:"circle"},options:{shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},showRadius:!0,metric:!0,feet:!0},initialize:function(t,e){this.type=L.Draw.Circle.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.circle.tooltip.start,L.Draw.SimpleShape.prototype.initialize.call(this,t,e)},_drawShape:function(t){this._shape?this._shape.setRadius(this._startLatLng.distanceTo(t)):(this._shape=new L.Circle(this._startLatLng,this._startLatLng.distanceTo(t),this.options.shapeOptions),this._map.addLayer(this._shape))},_fireCreatedEvent:function(){var t=new L.Circle(this._startLatLng,this._shape.getRadius(),this.options.shapeOptions);L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this,t)},_onMouseMove:function(t){var e,i=t.latlng,n=this.options.showRadius,o=this.options.metric;this._tooltip.updatePosition(i),this._isDrawing&&(this._drawShape(i),e=this._shape.getRadius().toFixed(1),this._tooltip.updateContent({text:this._endLabelText,subtext:n?L.drawLocal.draw.handlers.circle.radius+": "+L.GeometryUtil.readableDistance(e,o,this.options.feet):""}))}}),L.Draw.Marker=L.Draw.Feature.extend({statics:{TYPE:"marker"},options:{icon:new L.Icon.Default,repeatMode:!1,zIndexOffset:2e3},initialize:function(t,e){this.type=L.Draw.Marker.TYPE,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._tooltip.updateContent({text:L.drawLocal.draw.handlers.marker.tooltip.start}),this._mouseMarker||(this._mouseMarker=L.marker(this._map.getCenter(),{icon:L.divIcon({className:"leaflet-mouse-marker",iconAnchor:[20,20],iconSize:[40,40]}),opacity:0,zIndexOffset:this.options.zIndexOffset})),this._mouseMarker.on("click",this._onClick,this).addTo(this._map),this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onTouch,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._map&&(this._marker&&(this._marker.off("click",this._onClick,this),this._map.off("click",this._onClick,this).off("click",this._onTouch,this).removeLayer(this._marker),delete this._marker),this._mouseMarker.off("click",this._onClick,this),this._map.removeLayer(this._mouseMarker),delete this._mouseMarker,this._map.off("mousemove",this._onMouseMove,this))},_onMouseMove:function(t){var e=t.latlng;this._tooltip.updatePosition(e),this._mouseMarker.setLatLng(e),this._marker?(e=this._mouseMarker.getLatLng(),this._marker.setLatLng(e)):(this._marker=new L.Marker(e,{icon:this.options.icon,zIndexOffset:this.options.zIndexOffset}),this._marker.on("click",this._onClick,this),this._map.on("click",this._onClick,this).addLayer(this._marker))},_onClick:function(){this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable()},_onTouch:function(t){this._onMouseMove(t),this._onClick()},_fireCreatedEvent:function(){var t=new L.Marker.Touch(this._marker.getLatLng(),{icon:this.options.icon});L.Draw.Feature.prototype._fireCreatedEvent.call(this,t)}}),L.Edit=L.Edit||{},L.Edit.Marker=L.Handler.extend({initialize:function(t,e){this._marker=t,L.setOptions(this,e)},addHooks:function(){var t=this._marker;t.dragging.enable(),t.on("dragend",this._onDragEnd,t),this._toggleMarkerHighlight()},removeHooks:function(){var t=this._marker;t.dragging.disable(),t.off("dragend",this._onDragEnd,t),this._toggleMarkerHighlight()},_onDragEnd:function(t){var e=t.target;e.edited=!0},_toggleMarkerHighlight:function(){var t=this._marker._icon;t&&(t.style.display="none",L.DomUtil.hasClass(t,"leaflet-edit-marker-selected")?(L.DomUtil.removeClass(t,"leaflet-edit-marker-selected"),this._offsetMarker(t,-4)):(L.DomUtil.addClass(t,"leaflet-edit-marker-selected"),this._offsetMarker(t,4)),t.style.display="")},_offsetMarker:function(t,e){var i=parseInt(t.style.marginTop,10)-e,n=parseInt(t.style.marginLeft,10)-e;t.style.marginTop=i+"px",t.style.marginLeft=n+"px"}}),L.Marker.addInitHook(function(){L.Edit.Marker&&(this.editing=new L.Edit.Marker(this),this.options.editable&&this.editing.enable())}),L.Edit=L.Edit||{},L.Edit.Poly=L.Handler.extend({options:{},initialize:function(t,e){this.latlngs=[t._latlngs],t._holes&&(this.latlngs=this.latlngs.concat(t._holes)),this._verticesHandlers=[];for(var i=0;i<this.latlngs.length;i++)this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(t,this.latlngs[i],e));this._poly=t,L.setOptions(this,e)},_eachVertexHandler:function(t){for(var e=0;e<this._verticesHandlers.length;e++)t(this._verticesHandlers[e])},addHooks:function(){this._eachVertexHandler(function(t){t.addHooks()})},removeHooks:function(){this._eachVertexHandler(function(t){t.removeHooks()})},updateMarkers:function(){this._eachVertexHandler(function(t){t.updateMarkers()})}}),L.Edit.PolyVerticesEdit=L.Handler.extend({options:{icon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"}),touchIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-touch-icon"})},initialize:function(t,e,i){L.Browser.touch&&(this.options.icon=this.options.touchIcon),this._poly=t,this._latlngs=e,L.setOptions(this,i)},addHooks:function(){var t=this._poly;t instanceof L.Polygon||(t.options.editing.fill=!1),t.setStyle(t.options.editing),this._poly._map&&(this._map=this._poly._map,this._markerGroup||this._initMarkers(),this._poly._map.addLayer(this._markerGroup))},removeHooks:function(){var t=this._poly;t.setStyle(t.options.original),t._map&&(t._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers)},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new L.LayerGroup),this._markers=[];var t,e,i,n,o=this._latlngs;for(t=0,i=o.length;i>t;t++)n=this._createMarker(o[t],t),n.on("click",this._onMarkerClick,this),this._markers.push(n);var s,r;for(t=0,e=i-1;i>t;e=t++)(0!==t||L.Polygon&&this._poly instanceof L.Polygon)&&(s=this._markers[e],r=this._markers[t],this._createMiddleMarker(s,r),this._updatePrevNext(s,r))},_createMarker:function(t,e){var i=new L.Marker.Touch(t,{draggable:!0,icon:this.options.icon});return i._origLatLng=t,i._index=e,i.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._fireEdit,this).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._fireEdit,this).on("MSPointerUp",this._fireEdit,this),this._markerGroup.addLayer(i),i},_onMarkerDragStart:function(){this._poly.fire("editstart")},_spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._poly._convertLatLngs(this._latlngs,!0),this._poly.redraw(),t},_removeMarker:function(t){var e=t._index;this._markerGroup.removeLayer(t),this._markers.splice(e,1),this._spliceLatLngs(e,1),this._updateIndexes(e,-1),t.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._fireEdit,this).off("touchmove",this._onMarkerDrag,this).off("touchend",this._fireEdit,this).off("click",this._onMarkerClick,this)},_fireEdit:function(){this._poly.edited=!0,this._poly.fire("edit"),this._poly._map.fire("draw:editvertex",{layers:this._markerGroup})},_onMarkerDrag:function(t){var e=t.target;L.extend(e._origLatLng,e._latlng),e._middleLeft&&e._middleLeft.setLatLng(this._getMiddleLatLng(e._prev,e)),e._middleRight&&e._middleRight.setLatLng(this._getMiddleLatLng(e,e._next)),this._poly.redraw(),this._poly.fire("editdrag")},_onMarkerClick:function(t){var e=L.Polygon&&this._poly instanceof L.Polygon?4:3,i=t.target;this._latlngs.length<e||(this._removeMarker(i),this._updatePrevNext(i._prev,i._next),i._middleLeft&&this._markerGroup.removeLayer(i._middleLeft),i._middleRight&&this._markerGroup.removeLayer(i._middleRight),i._prev&&i._next?this._createMiddleMarker(i._prev,i._next):i._prev?i._next||(i._prev._middleRight=null):i._next._middleLeft=null,this._fireEdit())},_onTouchMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent.touches[0]),i=this._map.layerPointToLatLng(e),n=t.target;L.extend(n._origLatLng,i),n._middleLeft&&n._middleLeft.setLatLng(this._getMiddleLatLng(n._prev,n)),n._middleRight&&n._middleRight.setLatLng(this._getMiddleLatLng(n,n._next)),this._poly.redraw(),this.updateMarkers()},_updateIndexes:function(t,e){this._markerGroup.eachLayer(function(i){i._index>t&&(i._index+=e)})},_createMiddleMarker:function(t,e){var i,n,o,s=this._getMiddleLatLng(t,e),r=this._createMarker(s);r.setOpacity(.6),t._middleRight=e._middleLeft=r,n=function(){var n=e._index;r._index=n,r.off("click",i,this).on("click",this._onMarkerClick,this),s.lat=r.getLatLng().lat,s.lng=r.getLatLng().lng,this._spliceLatLngs(n,0,s),this._markers.splice(n,0,r),r.setOpacity(1),this._updateIndexes(n,1),e._index++,this._updatePrevNext(t,r),this._updatePrevNext(r,e),this._poly.fire("editstart")},o=function(){r.off("dragstart",n,this),r.off("dragend",o,this),r.off("touchmove",n,this),this._createMiddleMarker(t,r),this._createMiddleMarker(r,e)},i=function(){n.call(this),o.call(this),this._fireEdit()},r.on("click",i,this).on("dragstart",n,this).on("dragend",o,this).on("touchmove",n,this),this._markerGroup.addLayer(r)},_updatePrevNext:function(t,e){t&&(t._next=e),e&&(e._prev=t)},_getMiddleLatLng:function(t,e){var i=this._poly._map,n=i.project(t.getLatLng()),o=i.project(e.getLatLng());return i.unproject(n._add(o)._divideBy(2))}}),L.Polyline.addInitHook(function(){this.editing||(L.Edit.Poly&&(this.editing=new L.Edit.Poly(this),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()}))}),L.Edit=L.Edit||{},L.Edit.SimpleShape=L.Handler.extend({options:{moveIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move"}),resizeIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize"}),touchMoveIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon"}),touchResizeIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon"})},initialize:function(t,e){L.Browser.touch&&(this.options.moveIcon=this.options.touchMoveIcon,this.options.resizeIcon=this.options.touchResizeIcon),this._shape=t,L.Util.setOptions(this,e)},addHooks:function(){var t=this._shape;this._shape._map&&(this._map=this._shape._map,t.setStyle(t.options.editing),t._map&&(this._map=t._map,this._markerGroup||this._initMarkers(),this._map.addLayer(this._markerGroup)))},removeHooks:function(){var t=this._shape;if(t.setStyle(t.options.original),t._map){
+this._unbindMarker(this._moveMarker);for(var e=0,i=this._resizeMarkers.length;i>e;e++)this._unbindMarker(this._resizeMarkers[e]);this._resizeMarkers=null,this._map.removeLayer(this._markerGroup),delete this._markerGroup}this._map=null},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new L.LayerGroup),this._createMoveMarker(),this._createResizeMarker()},_createMoveMarker:function(){},_createResizeMarker:function(){},_createMarker:function(t,e){var i=new L.Marker.Touch(t,{draggable:!0,icon:e,zIndexOffset:10});return this._bindMarker(i),this._markerGroup.addLayer(i),i},_bindMarker:function(t){t.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._onMarkerDragEnd,this).on("touchstart",this._onTouchStart,this).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onTouchEnd,this).on("MSPointerUp",this._onTouchEnd,this)},_unbindMarker:function(t){t.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._onMarkerDragEnd,this).off("touchstart",this._onTouchStart,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onTouchEnd,this).off("MSPointerUp",this._onTouchEnd,this)},_onMarkerDragStart:function(t){var e=t.target;e.setOpacity(0),this._shape.fire("editstart")},_fireEdit:function(){this._shape.edited=!0,this._shape.fire("edit")},_onMarkerDrag:function(t){var e=t.target,i=e.getLatLng();e===this._moveMarker?this._move(i):this._resize(i),this._shape.redraw(),this._shape.fire("editdrag")},_onMarkerDragEnd:function(t){var e=t.target;e.setOpacity(1),this._fireEdit()},_onTouchStart:function(t){if(L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,t),"function"==typeof this._getCorners){var e=this._getCorners(),i=t.target,n=i._cornerIndex;i.setOpacity(0),this._oppositeCorner=e[(n+2)%4],this._toggleCornerMarkers(0,n)}this._shape.fire("editstart")},_onTouchMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent.touches[0]),i=this._map.layerPointToLatLng(e),n=t.target;return n===this._moveMarker?this._move(i):this._resize(i),this._shape.redraw(),!1},_onTouchEnd:function(t){var e=t.target;e.setOpacity(1),this.updateMarkers(),this._fireEdit()},_move:function(){},_resize:function(){}}),L.Edit=L.Edit||{},L.Edit.Rectangle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var t=this._shape.getBounds(),e=t.getCenter();this._moveMarker=this._createMarker(e,this.options.moveIcon)},_createResizeMarker:function(){var t=this._getCorners();this._resizeMarkers=[];for(var e=0,i=t.length;i>e;e++)this._resizeMarkers.push(this._createMarker(t[e],this.options.resizeIcon)),this._resizeMarkers[e]._cornerIndex=e},_onMarkerDragStart:function(t){L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,t);var e=this._getCorners(),i=t.target,n=i._cornerIndex;this._oppositeCorner=e[(n+2)%4],this._toggleCornerMarkers(0,n)},_onMarkerDragEnd:function(t){var e,i,n=t.target;n===this._moveMarker&&(e=this._shape.getBounds(),i=e.getCenter(),n.setLatLng(i)),this._toggleCornerMarkers(1),this._repositionCornerMarkers(),L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this,t)},_move:function(t){for(var e,i=this._shape.getLatLngs(),n=this._shape.getBounds(),o=n.getCenter(),s=[],r=0,a=i.length;a>r;r++)e=[i[r].lat-o.lat,i[r].lng-o.lng],s.push([t.lat+e[0],t.lng+e[1]]);this._shape.setLatLngs(s),this._repositionCornerMarkers()},_resize:function(t){var e;this._shape.setBounds(L.latLngBounds(t,this._oppositeCorner)),e=this._shape.getBounds(),this._moveMarker.setLatLng(e.getCenter())},_getCorners:function(){var t=this._shape.getBounds(),e=t.getNorthWest(),i=t.getNorthEast(),n=t.getSouthEast(),o=t.getSouthWest();return[e,i,n,o]},_toggleCornerMarkers:function(t){for(var e=0,i=this._resizeMarkers.length;i>e;e++)this._resizeMarkers[e].setOpacity(t)},_repositionCornerMarkers:function(){for(var t=this._getCorners(),e=0,i=this._resizeMarkers.length;i>e;e++)this._resizeMarkers[e].setLatLng(t[e])}}),L.Rectangle.addInitHook(function(){L.Edit.Rectangle&&(this.editing=new L.Edit.Rectangle(this),this.options.editable&&this.editing.enable())}),L.Edit=L.Edit||{},L.Edit.Circle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var t=this._shape.getLatLng();this._moveMarker=this._createMarker(t,this.options.moveIcon)},_createResizeMarker:function(){var t=this._shape.getLatLng(),e=this._getResizeMarkerPoint(t);this._resizeMarkers=[],this._resizeMarkers.push(this._createMarker(e,this.options.resizeIcon))},_getResizeMarkerPoint:function(t){var e=this._shape._radius*Math.cos(Math.PI/4),i=this._map.project(t);return this._map.unproject([i.x+e,i.y-e])},_move:function(t){var e=this._getResizeMarkerPoint(t);this._resizeMarkers[0].setLatLng(e),this._shape.setLatLng(t)},_resize:function(t){var e=this._moveMarker.getLatLng(),i=e.distanceTo(t);this._shape.setRadius(i)}}),L.Circle.addInitHook(function(){L.Edit.Circle&&(this.editing=new L.Edit.Circle(this),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()})}),L.Map.mergeOptions({touchExtend:!0}),L.Map.TouchExtend=L.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){L.DomEvent.on(this._container,"touchstart",this._onTouchStart,this),L.DomEvent.on(this._container,"touchend",this._onTouchEnd,this),L.DomEvent.on(this._container,"touchmove",this._onTouchMove,this),this._detectIE()?(L.DomEvent.on(this._container,"MSPointerDown",this._onTouchStart,this),L.DomEvent.on(this._container,"MSPointerUp",this._onTouchEnd,this),L.DomEvent.on(this._container,"MSPointerMove",this._onTouchMove,this),L.DomEvent.on(this._container,"MSPointerCancel",this._onTouchCancel,this)):(L.DomEvent.on(this._container,"touchcancel",this._onTouchCancel,this),L.DomEvent.on(this._container,"touchleave",this._onTouchLeave,this))},removeHooks:function(){L.DomEvent.off(this._container,"touchstart",this._onTouchStart),L.DomEvent.off(this._container,"touchend",this._onTouchEnd),L.DomEvent.off(this._container,"touchmove",this._onTouchMove),this._detectIE()?(L.DomEvent.off(this._container,"MSPointerDowm",this._onTouchStart),L.DomEvent.off(this._container,"MSPointerUp",this._onTouchEnd),L.DomEvent.off(this._container,"MSPointerMove",this._onTouchMove),L.DomEvent.off(this._container,"MSPointerCancel",this._onTouchCancel)):(L.DomEvent.off(this._container,"touchcancel",this._onTouchCancel),L.DomEvent.off(this._container,"touchleave",this._onTouchLeave))},_touchEvent:function(t,e){var i={};if("undefined"!=typeof t.touches){if(!t.touches.length)return;i=t.touches[0]}else{if("touch"!==t.pointerType)return;if(i=t,!this._filterClick(t))return}var n=this._map.mouseEventToContainerPoint(i),o=this._map.mouseEventToLayerPoint(i),s=this._map.layerPointToLatLng(o);this._map.fire(e,{latlng:s,layerPoint:o,containerPoint:n,pageX:i.pageX,pageY:i.pageY,originalEvent:t})},_filterClick:function(t){var e=t.timeStamp||t.originalEvent.timeStamp,i=L.DomEvent._lastClick&&e-L.DomEvent._lastClick;return i&&i>100&&500>i||t.target._simulatedClick&&!t._simulated?(L.DomEvent.stop(t),!1):(L.DomEvent._lastClick=e,!0)},_onTouchStart:function(t){if(this._map._loaded){var e="touchstart";this._touchEvent(t,e)}},_onTouchEnd:function(t){if(this._map._loaded){var e="touchend";this._touchEvent(t,e)}},_onTouchCancel:function(t){if(this._map._loaded){var e="touchcancel";this._detectIE()&&(e="pointercancel"),this._touchEvent(t,e)}},_onTouchLeave:function(t){if(this._map._loaded){var e="touchleave";this._touchEvent(t,e)}},_onTouchMove:function(t){if(this._map._loaded){var e="touchmove";this._touchEvent(t,e)}},_detectIE:function(){var e=t.navigator.userAgent,i=e.indexOf("MSIE ");if(i>0)return parseInt(e.substring(i+5,e.indexOf(".",i)),10);var n=e.indexOf("Trident/");if(n>0){var o=e.indexOf("rv:");return parseInt(e.substring(o+3,e.indexOf(".",o)),10)}var s=e.indexOf("Edge/");return s>0&&parseInt(e.substring(s+5,e.indexOf(".",s)),10)}}),L.Map.addInitHook("addHandler","touchExtend",L.Map.TouchExtend),L.Marker.Touch=L.Marker.extend({_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu","touchstart","touchend","touchmove"];this._detectIE?e.concat(["MSPointerDown","MSPointerUp","MSPointerMove","MSPointerCancel"]):e.concat(["touchcancel"]),L.DomUtil.addClass(t,"leaflet-clickable"),L.DomEvent.on(t,"click",this._onMouseClick,this),L.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;i<e.length;i++)L.DomEvent.on(t,e[i],this._fireMouseEvent,this);L.Handler.MarkerDrag&&(this.dragging=new L.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_detectIE:function(){var e=t.navigator.userAgent,i=e.indexOf("MSIE ");if(i>0)return parseInt(e.substring(i+5,e.indexOf(".",i)),10);var n=e.indexOf("Trident/");if(n>0){var o=e.indexOf("rv:");return parseInt(e.substring(o+3,e.indexOf(".",o)),10)}var s=e.indexOf("Edge/");return s>0&&parseInt(e.substring(s+5,e.indexOf(".",s)),10)}}),L.LatLngUtil={cloneLatLngs:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(this.cloneLatLng(t[i]));return e},cloneLatLng:function(t){return L.latLng(t.lat,t.lng)}},L.GeometryUtil=L.extend(L.GeometryUtil||{},{geodesicArea:function(t){var e,i,n=t.length,o=0,s=L.LatLng.DEG_TO_RAD;if(n>2){for(var r=0;n>r;r++)e=t[r],i=t[(r+1)%n],o+=(i.lng-e.lng)*s*(2+Math.sin(e.lat*s)+Math.sin(i.lat*s));o=6378137*o*6378137/2}return Math.abs(o)},readableArea:function(t,e){var i;return e?i=t>=1e4?(1e-4*t).toFixed(2)+" ha":t.toFixed(2)+" m&sup2;":(t/=.836127,i=t>=3097600?(t/3097600).toFixed(2)+" mi&sup2;":t>=4840?(t/4840).toFixed(2)+" acres":Math.ceil(t)+" yd&sup2;"),i},readableDistance:function(t,e,i){var n;if(e)n=t>1e3?(t/1e3).toFixed(2)+" km":Math.ceil(t)+" m";else if(t*=1.09361,t>1760)n=(t/1760).toFixed(2)+" miles";else{var o=" yd";i&&(t=3*t,o=" ft"),n=Math.ceil(t)+o}return n}}),L.Util.extend(L.LineUtil,{segmentsIntersect:function(t,e,i,n){return this._checkCounterclockwise(t,i,n)!==this._checkCounterclockwise(e,i,n)&&this._checkCounterclockwise(t,e,i)!==this._checkCounterclockwise(t,e,n)},_checkCounterclockwise:function(t,e,i){return(i.y-t.y)*(e.x-t.x)>(e.y-t.y)*(i.x-t.x)}}),L.Polyline.include({intersects:function(){var t,e,i,n=this._originalPoints,o=n?n.length:0;if(this._tooFewPointsForIntersection())return!1;for(t=o-1;t>=3;t--)if(e=n[t-1],i=n[t],this._lineSegmentsIntersectsRange(e,i,t-2))return!0;return!1},newLatLngIntersects:function(t,e){return!!this._map&&this.newPointIntersects(this._map.latLngToLayerPoint(t),e)},newPointIntersects:function(t,e){var i=this._originalPoints,n=i?i.length:0,o=i?i[n-1]:null,s=n-2;return!this._tooFewPointsForIntersection(1)&&this._lineSegmentsIntersectsRange(o,t,s,e?1:0)},_tooFewPointsForIntersection:function(t){var e=this._originalPoints,i=e?e.length:0;return i+=t||0,!this._originalPoints||3>=i},_lineSegmentsIntersectsRange:function(t,e,i,n){var o,s,r=this._originalPoints;n=n||0;for(var a=i;a>n;a--)if(o=r[a-1],s=r[a],L.LineUtil.segmentsIntersect(t,e,o,s))return!0;return!1}}),L.Polygon.include({intersects:function(){var t,e,i,n,o,s=this._originalPoints;return!this._tooFewPointsForIntersection()&&(!!(t=L.Polyline.prototype.intersects.call(this))||(e=s.length,i=s[0],n=s[e-1],o=e-2,this._lineSegmentsIntersectsRange(n,i,o,1)))}}),L.Control.Draw=L.Control.extend({options:{position:"topleft",draw:{},edit:!1},initialize:function(t){if(L.version<"0.7")throw new Error("Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/");L.Control.prototype.initialize.call(this,t);var e;this._toolbars={},L.DrawToolbar&&this.options.draw&&(e=new L.DrawToolbar(this.options.draw),this._toolbars[L.DrawToolbar.TYPE]=e,this._toolbars[L.DrawToolbar.TYPE].on("enable",this._toolbarEnabled,this)),L.EditToolbar&&this.options.edit&&(e=new L.EditToolbar(this.options.edit),this._toolbars[L.EditToolbar.TYPE]=e,this._toolbars[L.EditToolbar.TYPE].on("enable",this._toolbarEnabled,this)),L.toolbar=this},onAdd:function(t){var e,i=L.DomUtil.create("div","leaflet-draw"),n=!1,o="leaflet-draw-toolbar-top";for(var s in this._toolbars)this._toolbars.hasOwnProperty(s)&&(e=this._toolbars[s].addToolbar(t),e&&(n||(L.DomUtil.hasClass(e,o)||L.DomUtil.addClass(e.childNodes[0],o),n=!0),i.appendChild(e)));return i},onRemove:function(){for(var t in this._toolbars)this._toolbars.hasOwnProperty(t)&&this._toolbars[t].removeToolbar()},setDrawingOptions:function(t){for(var e in this._toolbars)this._toolbars[e]instanceof L.DrawToolbar&&this._toolbars[e].setOptions(t)},_toolbarEnabled:function(t){var e=t.target;for(var i in this._toolbars)this._toolbars[i]!==e&&this._toolbars[i].disable()}}),L.Map.mergeOptions({drawControlTooltips:!0,drawControl:!1}),L.Map.addInitHook(function(){this.options.drawControl&&(this.drawControl=new L.Control.Draw,this.addControl(this.drawControl))}),L.Toolbar=L.Class.extend({includes:[L.Mixin.Events],initialize:function(t){L.setOptions(this,t),this._modes={},this._actionButtons=[],this._activeMode=null},enabled:function(){return null!==this._activeMode},disable:function(){this.enabled()&&this._activeMode.handler.disable()},addToolbar:function(t){var e,i=L.DomUtil.create("div","leaflet-draw-section"),n=0,o=this._toolbarClass||"",s=this.getModeHandlers(t);for(this._toolbarContainer=L.DomUtil.create("div","leaflet-draw-toolbar leaflet-bar"),this._map=t,e=0;e<s.length;e++)s[e].enabled&&this._initModeHandler(s[e].handler,this._toolbarContainer,n++,o,s[e].title);return n?(this._lastButtonIndex=--n,this._actionsContainer=L.DomUtil.create("ul","leaflet-draw-actions"),i.appendChild(this._toolbarContainer),i.appendChild(this._actionsContainer),i):void 0},removeToolbar:function(){for(var t in this._modes)this._modes.hasOwnProperty(t)&&(this._disposeButton(this._modes[t].button,this._modes[t].handler.enable,this._modes[t].handler),this._modes[t].handler.disable(),this._modes[t].handler.off("enabled",this._handlerActivated,this).off("disabled",this._handlerDeactivated,this));this._modes={};for(var e=0,i=this._actionButtons.length;i>e;e++)this._disposeButton(this._actionButtons[e].button,this._actionButtons[e].callback,this);this._actionButtons=[],this._actionsContainer=null},_initModeHandler:function(t,e,i,n,o){var s=t.type;this._modes[s]={},this._modes[s].handler=t,this._modes[s].button=this._createButton({type:s,title:o,className:n+"-"+s,container:e,callback:this._modes[s].handler.enable,context:this._modes[s].handler}),this._modes[s].buttonIndex=i,this._modes[s].handler.on("enabled",this._handlerActivated,this).on("disabled",this._handlerDeactivated,this)},_createButton:function(t){var e=L.DomUtil.create("a",t.className||"",t.container);return e.href="#",t.text&&(e.innerHTML=t.text),t.title&&(e.title=t.title),L.DomEvent.on(e,"click",L.DomEvent.stopPropagation).on(e,"mousedown",L.DomEvent.stopPropagation).on(e,"dblclick",L.DomEvent.stopPropagation).on(e,"click",L.DomEvent.preventDefault).on(e,"click",t.callback,t.context),e},_disposeButton:function(t,e){L.DomEvent.off(t,"click",L.DomEvent.stopPropagation).off(t,"mousedown",L.DomEvent.stopPropagation).off(t,"dblclick",L.DomEvent.stopPropagation).off(t,"click",L.DomEvent.preventDefault).off(t,"click",e)},_handlerActivated:function(t){this.disable(),this._activeMode=this._modes[t.handler],L.DomUtil.addClass(this._activeMode.button,"leaflet-draw-toolbar-button-enabled"),this._showActionsToolbar(),this.fire("enable")},_handlerDeactivated:function(){this._hideActionsToolbar(),L.DomUtil.removeClass(this._activeMode.button,"leaflet-draw-toolbar-button-enabled"),this._activeMode=null,this.fire("disable")},_createActions:function(t){var e,i,n,o,s=this._actionsContainer,r=this.getActions(t),a=r.length;for(i=0,n=this._actionButtons.length;n>i;i++)this._disposeButton(this._actionButtons[i].button,this._actionButtons[i].callback);for(this._actionButtons=[];s.firstChild;)s.removeChild(s.firstChild);for(var l=0;a>l;l++)"enabled"in r[l]&&!r[l].enabled||(e=L.DomUtil.create("li","",s),o=this._createButton({title:r[l].title,text:r[l].text,container:e,callback:r[l].callback,context:r[l].context}),this._actionButtons.push({button:o,callback:r[l].callback}))},_showActionsToolbar:function(){var t=this._activeMode.buttonIndex,e=this._lastButtonIndex,i=this._activeMode.button.offsetTop-1;this._createActions(this._activeMode.handler),this._actionsContainer.style.top=i+"px",0===t&&(L.DomUtil.addClass(this._toolbarContainer,"leaflet-draw-toolbar-notop"),L.DomUtil.addClass(this._actionsContainer,"leaflet-draw-actions-top")),t===e&&(L.DomUtil.addClass(this._toolbarContainer,"leaflet-draw-toolbar-nobottom"),L.DomUtil.addClass(this._actionsContainer,"leaflet-draw-actions-bottom")),this._actionsContainer.style.display="block"},_hideActionsToolbar:function(){this._actionsContainer.style.display="none",L.DomUtil.removeClass(this._toolbarContainer,"leaflet-draw-toolbar-notop"),L.DomUtil.removeClass(this._toolbarContainer,"leaflet-draw-toolbar-nobottom"),L.DomUtil.removeClass(this._actionsContainer,"leaflet-draw-actions-top"),L.DomUtil.removeClass(this._actionsContainer,"leaflet-draw-actions-bottom")}}),L.Tooltip=L.Class.extend({initialize:function(t){this._map=t,this._popupPane=t._panes.popupPane,this._container=t.options.drawControlTooltips?L.DomUtil.create("div","leaflet-draw-tooltip",this._popupPane):null,this._singleLineLabel=!1,this._map.on("mouseout",this._onMouseOut,this)},dispose:function(){this._map.off("mouseout",this._onMouseOut,this),this._container&&(this._popupPane.removeChild(this._container),this._container=null)},updateContent:function(t){return this._container?(t.subtext=t.subtext||"",0!==t.subtext.length||this._singleLineLabel?t.subtext.length>0&&this._singleLineLabel&&(L.DomUtil.removeClass(this._container,"leaflet-draw-tooltip-single"),this._singleLineLabel=!1):(L.DomUtil.addClass(this._container,"leaflet-draw-tooltip-single"),this._singleLineLabel=!0),this._container.innerHTML=(t.subtext.length>0?'<span class="leaflet-draw-tooltip-subtext">'+t.subtext+"</span><br />":"")+"<span>"+t.text+"</span>",this):this},updatePosition:function(t){var e=this._map.latLngToLayerPoint(t),i=this._container;return this._container&&(i.style.visibility="inherit",L.DomUtil.setPosition(i,e)),this},showAsError:function(){return this._container&&L.DomUtil.addClass(this._container,"leaflet-error-draw-tooltip"),this},removeError:function(){return this._container&&L.DomUtil.removeClass(this._container,"leaflet-error-draw-tooltip"),this},_onMouseOut:function(){this._container&&(this._container.style.visibility="hidden")}}),L.DrawToolbar=L.Toolbar.extend({statics:{TYPE:"draw"},options:{polyline:{},polygon:{},rectangle:{},circle:{},marker:{}},initialize:function(t){for(var e in this.options)this.options.hasOwnProperty(e)&&t[e]&&(t[e]=L.extend({},this.options[e],t[e]));this._toolbarClass="leaflet-draw-draw",L.Toolbar.prototype.initialize.call(this,t)},getModeHandlers:function(t){return[{enabled:this.options.polyline,handler:new L.Draw.Polyline(t,this.options.polyline),title:L.drawLocal.draw.toolbar.buttons.polyline},{enabled:this.options.polygon,handler:new L.Draw.Polygon(t,this.options.polygon),title:L.drawLocal.draw.toolbar.buttons.polygon},{enabled:this.options.rectangle,handler:new L.Draw.Rectangle(t,this.options.rectangle),title:L.drawLocal.draw.toolbar.buttons.rectangle},{enabled:this.options.circle,handler:new L.Draw.Circle(t,this.options.circle),title:L.drawLocal.draw.toolbar.buttons.circle},{enabled:this.options.marker,handler:new L.Draw.Marker(t,this.options.marker),title:L.drawLocal.draw.toolbar.buttons.marker}]},getActions:function(t){return[{enabled:t.completeShape,title:L.drawLocal.draw.toolbar.finish.title,text:L.drawLocal.draw.toolbar.finish.text,callback:t.completeShape,context:t},{enabled:t.deleteLastVertex,title:L.drawLocal.draw.toolbar.undo.title,text:L.drawLocal.draw.toolbar.undo.text,callback:t.deleteLastVertex,context:t},{title:L.drawLocal.draw.toolbar.actions.title,text:L.drawLocal.draw.toolbar.actions.text,callback:this.disable,context:this}]},setOptions:function(t){L.setOptions(this,t);for(var e in this._modes)this._modes.hasOwnProperty(e)&&t.hasOwnProperty(e)&&this._modes[e].handler.setOptions(t[e])}}),L.EditToolbar=L.Toolbar.extend({statics:{TYPE:"edit"},options:{edit:{selectedPathOptions:{dashArray:"10, 10",fill:!0,fillColor:"#fe57a1",fillOpacity:.1,maintainColor:!1}},remove:{},featureGroup:null},initialize:function(t){t.edit&&("undefined"==typeof t.edit.selectedPathOptions&&(t.edit.selectedPathOptions=this.options.edit.selectedPathOptions),t.edit.selectedPathOptions=L.extend({},this.options.edit.selectedPathOptions,t.edit.selectedPathOptions)),t.remove&&(t.remove=L.extend({},this.options.remove,t.remove)),this._toolbarClass="leaflet-draw-edit",L.Toolbar.prototype.initialize.call(this,t),this._selectedFeatureCount=0},getModeHandlers:function(t){var e=this.options.featureGroup;return[{enabled:this.options.edit,handler:new L.EditToolbar.Edit(t,{featureGroup:e,selectedPathOptions:this.options.edit.selectedPathOptions}),title:L.drawLocal.edit.toolbar.buttons.edit},{enabled:this.options.remove,handler:new L.EditToolbar.Delete(t,{featureGroup:e}),title:L.drawLocal.edit.toolbar.buttons.remove}]},getActions:function(){return[{title:L.drawLocal.edit.toolbar.actions.save.title,text:L.drawLocal.edit.toolbar.actions.save.text,callback:this._save,context:this},{title:L.drawLocal.edit.toolbar.actions.cancel.title,text:L.drawLocal.edit.toolbar.actions.cancel.text,callback:this.disable,context:this}]},addToolbar:function(t){var e=L.Toolbar.prototype.addToolbar.call(this,t);return this._checkDisabled(),this.options.featureGroup.on("layeradd layerremove",this._checkDisabled,this),e},removeToolbar:function(){this.options.featureGroup.off("layeradd layerremove",this._checkDisabled,this),L.Toolbar.prototype.removeToolbar.call(this)},disable:function(){this.enabled()&&(this._activeMode.handler.revertLayers(),L.Toolbar.prototype.disable.call(this))},_save:function(){this._activeMode.handler.save(),this._activeMode.handler.disable()},_checkDisabled:function(){var t,e=this.options.featureGroup,i=0!==e.getLayers().length;this.options.edit&&(t=this._modes[L.EditToolbar.Edit.TYPE].button,i?L.DomUtil.removeClass(t,"leaflet-disabled"):L.DomUtil.addClass(t,"leaflet-disabled"),t.setAttribute("title",i?L.drawLocal.edit.toolbar.buttons.edit:L.drawLocal.edit.toolbar.buttons.editDisabled)),this.options.remove&&(t=this._modes[L.EditToolbar.Delete.TYPE].button,i?L.DomUtil.removeClass(t,"leaflet-disabled"):L.DomUtil.addClass(t,"leaflet-disabled"),t.setAttribute("title",i?L.drawLocal.edit.toolbar.buttons.remove:L.drawLocal.edit.toolbar.buttons.removeDisabled))}}),L.EditToolbar.Edit=L.Handler.extend({statics:{TYPE:"edit"},includes:L.Mixin.Events,initialize:function(t,e){if(L.Handler.prototype.initialize.call(this,t),L.setOptions(this,e),this._featureGroup=e.featureGroup,!(this._featureGroup instanceof L.FeatureGroup))throw new Error("options.featureGroup must be a L.FeatureGroup");this._uneditedLayerProps={},this.type=L.EditToolbar.Edit.TYPE},enable:function(){!this._enabled&&this._hasAvailableLayers()&&(this.fire("enabled",{handler:this.type}),this._map.fire("draw:editstart",{handler:this.type}),L.Handler.prototype.enable.call(this),this._featureGroup.on("layeradd",this._enableLayerEdit,this).on("layerremove",this._disableLayerEdit,this))},disable:function(){this._enabled&&(this._featureGroup.off("layeradd",this._enableLayerEdit,this).off("layerremove",this._disableLayerEdit,this),L.Handler.prototype.disable.call(this),this._map.fire("draw:editstop",{handler:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(t.getContainer().focus(),this._featureGroup.eachLayer(this._enableLayerEdit,this),this._tooltip=new L.Tooltip(this._map),this._updateTooltip(),this._map.on("mousemove",this._onMouseMove,this).on("touchmove",this._onMouseMove,this).on("MSPointerMove",this._onMouseMove,this).on("click",this._editStyle,this).on("draw:editvertex",this._updateTooltip,this))},removeHooks:function(){this._map&&(this._featureGroup.eachLayer(this._disableLayerEdit,this),this._uneditedLayerProps={},this._tooltip.dispose(),this._tooltip=null,this._map.off("mousemove",this._onMouseMove,this).off("touchmove",this._onMouseMove,this).off("MSPointerMove",this._onMouseMove,this))},revertLayers:function(){this._featureGroup.eachLayer(function(t){this._revertLayer(t)},this)},save:function(){var t=new L.LayerGroup;this._featureGroup.eachLayer(function(e){e.edited&&(t.addLayer(e),e.edited=!1)}),this._map.fire("draw:edited",{layers:t})},_backupLayer:function(t){var e=L.Util.stamp(t);this._uneditedLayerProps[e]||(t instanceof L.Polyline||t instanceof L.Polygon||t instanceof L.Rectangle?this._uneditedLayerProps[e]={latlngs:L.LatLngUtil.cloneLatLngs(t.getLatLngs())}:t instanceof L.Circle?this._uneditedLayerProps[e]={latlng:L.LatLngUtil.cloneLatLng(t.getLatLng()),radius:t.getRadius()}:t instanceof L.Marker&&(this._uneditedLayerProps[e]={latlng:L.LatLngUtil.cloneLatLng(t.getLatLng())}))},_getTooltipText:function(){return{text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext}},_updateTooltip:function(){this._tooltip.updateContent(this._getTooltipText())},_revertLayer:function(t){var e=L.Util.stamp(t);t.edited=!1,this._uneditedLayerProps.hasOwnProperty(e)&&(t instanceof L.Polyline||t instanceof L.Polygon||t instanceof L.Rectangle?t.setLatLngs(this._uneditedLayerProps[e].latlngs):t instanceof L.Circle?(t.setLatLng(this._uneditedLayerProps[e].latlng),t.setRadius(this._uneditedLayerProps[e].radius)):t instanceof L.Marker&&t.setLatLng(this._uneditedLayerProps[e].latlng),t.fire("revert-edited",{layer:t}))},_enableLayerEdit:function(t){var e,i=t.layer||t.target||t;this._backupLayer(i),this.options.selectedPathOptions&&(e=L.Util.extend({},this.options.selectedPathOptions),e.maintainColor&&(e.color=i.options.color,e.fillColor=i.options.fillColor),i.options.original=L.extend({},i.options),i.options.editing=e),this.isMarker?(i.dragging.enable(),i.on("dragend",this._onMarkerDragEnd).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onMarkerDragEnd,this).on("MSPointerUp",this._onMarkerDragEnd,this)):i.editing.enable()},_disableLayerEdit:function(t){var e=t.layer||t.target||t;e.edited=!1,e.editing.disable(),delete e.options.editing,delete e.options.original,this._selectedPathOptions&&(e instanceof L.Marker?this._toggleMarkerHighlight(e):(e.setStyle(e.options.previousOptions),delete e.options.previousOptions)),e instanceof L.Marker?(e.dragging.disable(),e.off("dragend",this._onMarkerDragEnd,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onMarkerDragEnd,this).off("MSPointerUp",this._onMarkerDragEnd,this)):e.editing.disable()},_onMouseMove:function(t){this._tooltip.updatePosition(t.latlng)},_onTouchMove:function(t){var e=t.originalEvent.changedTouches[0],i=this._map.mouseEventToLayerPoint(e),n=this._map.layerPointToLatLng(i);t.target.setLatLng(n)},_hasAvailableLayers:function(){return 0!==this._featureGroup.getLayers().length}}),L.EditToolbar.Delete=L.Handler.extend({statics:{TYPE:"remove"},includes:L.Mixin.Events,initialize:function(t,e){if(L.Handler.prototype.initialize.call(this,t),L.Util.setOptions(this,e),this._deletableLayers=this.options.featureGroup,!(this._deletableLayers instanceof L.FeatureGroup))throw new Error("options.featureGroup must be a L.FeatureGroup");this.type=L.EditToolbar.Delete.TYPE},enable:function(){!this._enabled&&this._hasAvailableLayers()&&(this.fire("enabled",{handler:this.type}),this._map.fire("draw:deletestart",{handler:this.type}),L.Handler.prototype.enable.call(this),this._deletableLayers.on("layeradd",this._enableLayerDelete,this).on("layerremove",this._disableLayerDelete,this))},disable:function(){this._enabled&&(this._deletableLayers.off("layeradd",this._enableLayerDelete,this).off("layerremove",this._disableLayerDelete,this),L.Handler.prototype.disable.call(this),this._map.fire("draw:deletestop",{handler:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(t.getContainer().focus(),this._deletableLayers.eachLayer(this._enableLayerDelete,this),this._deletedLayers=new L.LayerGroup,this._tooltip=new L.Tooltip(this._map),this._tooltip.updateContent({text:L.drawLocal.edit.handlers.remove.tooltip.text}),this._map.on("mousemove",this._onMouseMove,this))},removeHooks:function(){this._map&&(this._deletableLayers.eachLayer(this._disableLayerDelete,this),this._deletedLayers=null,this._tooltip.dispose(),this._tooltip=null,this._map.off("mousemove",this._onMouseMove,this))},revertLayers:function(){this._deletedLayers.eachLayer(function(t){this._deletableLayers.addLayer(t),t.fire("revert-deleted",{layer:t})},this)},save:function(){this._map.fire("draw:deleted",{layers:this._deletedLayers})},_enableLayerDelete:function(t){var e=t.layer||t.target||t;e.on("click",this._removeLayer,this)},_disableLayerDelete:function(t){var e=t.layer||t.target||t;e.off("click",this._removeLayer,this),this._deletedLayers.removeLayer(e)},_removeLayer:function(t){var e=t.layer||t.target||t;this._deletableLayers.removeLayer(e),this._deletedLayers.addLayer(e),e.fire("deleted")},_onMouseMove:function(t){this._tooltip.updatePosition(t.latlng)},_hasAvailableLayers:function(){return 0!==this._deletableLayers.getLayers().length}})}(window,document),leafletDraw=void 0,function(t){"use strict";sortable=function(){return"function"==typeof t?t():t}()}(function(){"use strict";function t(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be HTMLElement, and not "+{}.toString.call(t);this.el=t,this.options=e=v({},e),t[U]=this;var i={group:Math.random(),sort:!0,disabled:!1,store:null,handle:null,scroll:!0,scrollSensitivity:30,scrollSpeed:10,draggable:/[uo]l/i.test(t.nodeName)?"li":">*",ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",ignore:"a, img",filter:null,animation:0,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1};for(var n in i)!(n in e)&&(e[n]=i[n]);K(e);for(var s in this)"_"===s.charAt(0)&&(this[s]=this[s].bind(this));this.nativeDraggable=!e.forceFallback&&B,o(t,"mousedown",this._onTapStart),o(t,"touchstart",this._onTapStart),this.nativeDraggable&&(o(t,"dragover",this),o(t,"dragenter",this)),V.push(this._onDragOver),e.store&&this.sort(e.store.get(this))}function e(t){C&&C.state!==t&&(a(C,"display",t?"none":""),!t&&C.state&&S.insertBefore(C,y),C.state=t)}function i(t,e,i){if(t){i=i||F;do if(">*"===e&&t.parentNode===i||_(t,e))return t;while(t!==i&&(t=t.parentNode))}return null}function n(t){t.dataTransfer&&(t.dataTransfer.dropEffect="move"),t.preventDefault()}function o(t,e,i){t.addEventListener(e,i,!1)}function s(t,e,i){t.removeEventListener(e,i,!1)}function r(t,e,i){if(t)if(t.classList)t.classList[i?"add":"remove"](e);else{var n=(" "+t.className+" ").replace(N," ").replace(" "+e+" "," ");t.className=(n+(i?" "+e:"")).replace(N," ")}}function a(t,e,i){var n=t&&t.style;if(n){if(void 0===i)return F.defaultView&&F.defaultView.getComputedStyle?i=F.defaultView.getComputedStyle(t,""):t.currentStyle&&(i=t.currentStyle),void 0===e?i:i[e];e in n||(e="-webkit-"+e),n[e]=i+("string"==typeof i?"":"px")}}function l(t,e,i){if(t){var n=t.getElementsByTagName(e),o=0,s=n.length;if(i)for(;o<s;o++)i(n[o],o);return n}return[]}function c(t,e,i,n,o,s,r){var a=F.createEvent("Event"),l=(t||e[U]).options,c="on"+i.charAt(0).toUpperCase()+i.substr(1);a.initEvent(i,!0,!0),a.to=e,a.from=o||e,a.item=n||e,a.clone=C,a.oldIndex=s,a.newIndex=r,e.dispatchEvent(a),
+l[c]&&l[c].call(t,a)}function h(t,e,i,n,o,s){var r,a,l=t[U],c=l.options.onMove;return r=F.createEvent("Event"),r.initEvent("move",!0,!0),r.to=e,r.from=t,r.dragged=i,r.draggedRect=n,r.related=o||e,r.relatedRect=s||e.getBoundingClientRect(),t.dispatchEvent(r),c&&(a=c.call(l,r)),a}function u(t){t.draggable=!1}function d(){W=!1}function p(t,e){var i=t.lastElementChild,n=i.getBoundingClientRect();return(e.clientY-(n.top+n.height)>5||e.clientX-(n.right+n.width)>5)&&i}function m(t){for(var e=t.tagName+t.className+t.src+t.href+t.textContent,i=e.length,n=0;i--;)n+=e.charCodeAt(i);return n.toString(36)}function f(t,e){var i=0;if(!t||!t.parentNode)return-1;for(;t&&(t=t.previousElementSibling);)"TEMPLATE"!==t.nodeName.toUpperCase()&&_(t,e)&&i++;return i}function _(t,e){if(t){e=e.split(".");var i=e.shift().toUpperCase(),n=new RegExp("\\s("+e.join("|")+")(?=\\s)","g");return!(""!==i&&t.nodeName.toUpperCase()!=i||e.length&&((" "+t.className+" ").match(n)||[]).length!=e.length)}return!1}function g(t,e){var i,n;return function(){void 0===i&&(i=arguments,n=this,setTimeout(function(){1===i.length?t.call(n,i[0]):t.apply(n,i),i=void 0},e))}}function v(t,e){if(t&&e)for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}if("undefined"==typeof window||"undefined"==typeof window.document)return function(){throw new Error("Sortable.js requires a window with a document")};var y,E,P,C,S,M,w,L,R,b,x,G,I,A,T,k,O,D={},N=/\s+/g,U="Sortable"+(new Date).getTime(),j=window,F=j.document,z=j.parseInt,B=!!("draggable"in F.createElement("div")),q=function(t){return t=F.createElement("x"),t.style.cssText="pointer-events:auto","auto"===t.style.pointerEvents}(),W=!1,H=Math.abs,V=([].slice,[]),Y=g(function(t,e,i){if(i&&e.scroll){var n,o,s,r,a=e.scrollSensitivity,l=e.scrollSpeed,c=t.clientX,h=t.clientY,u=window.innerWidth,d=window.innerHeight;if(L!==i&&(w=e.scroll,L=i,w===!0)){w=i;do if(w.offsetWidth<w.scrollWidth||w.offsetHeight<w.scrollHeight)break;while(w=w.parentNode)}w&&(n=w,o=w.getBoundingClientRect(),s=(H(o.right-c)<=a)-(H(o.left-c)<=a),r=(H(o.bottom-h)<=a)-(H(o.top-h)<=a)),s||r||(s=(u-c<=a)-(c<=a),r=(d-h<=a)-(h<=a),(s||r)&&(n=j)),D.vx===s&&D.vy===r&&D.el===n||(D.el=n,D.vx=s,D.vy=r,clearInterval(D.pid),n&&(D.pid=setInterval(function(){n===j?j.scrollTo(j.pageXOffset+s*l,j.pageYOffset+r*l):(r&&(n.scrollTop+=r*l),s&&(n.scrollLeft+=s*l))},24)))}},30),K=function(t){var e=t.group;e&&"object"==typeof e||(e=t.group={name:e}),["pull","put"].forEach(function(t){t in e||(e[t]=!0)}),t.groups=" "+e.name+(e.put.join?" "+e.put.join(" "):"")+" "};return t.prototype={constructor:t,_onTapStart:function(t){var e=this,n=this.el,o=this.options,s=t.type,r=t.touches&&t.touches[0],a=(r||t).target,l=a,h=o.filter;if(!("mousedown"===s&&0!==t.button||o.disabled)&&(a=i(a,o.draggable,n))){if(G=f(a,o.draggable),"function"==typeof h){if(h.call(this,t,a,this))return c(e,l,"filter",a,n,G),void t.preventDefault()}else if(h&&(h=h.split(",").some(function(t){if(t=i(l,t.trim(),n))return c(e,t,"filter",a,n,G),!0})))return void t.preventDefault();o.handle&&!i(l,o.handle,n)||this._prepareDragStart(t,r,a)}},_prepareDragStart:function(t,e,i){var n,s=this,a=s.el,c=s.options,h=a.ownerDocument;i&&!y&&i.parentNode===a&&(T=t,S=a,y=i,E=y.parentNode,M=y.nextSibling,A=c.group,n=function(){s._disableDelayedDrag(),y.draggable=!0,r(y,s.options.chosenClass,!0),s._triggerDragStart(e)},c.ignore.split(",").forEach(function(t){l(y,t.trim(),u)}),o(h,"mouseup",s._onDrop),o(h,"touchend",s._onDrop),o(h,"touchcancel",s._onDrop),c.delay?(o(h,"mouseup",s._disableDelayedDrag),o(h,"touchend",s._disableDelayedDrag),o(h,"touchcancel",s._disableDelayedDrag),o(h,"mousemove",s._disableDelayedDrag),o(h,"touchmove",s._disableDelayedDrag),s._dragStartTimer=setTimeout(n,c.delay)):n())},_disableDelayedDrag:function(){var t=this.el.ownerDocument;clearTimeout(this._dragStartTimer),s(t,"mouseup",this._disableDelayedDrag),s(t,"touchend",this._disableDelayedDrag),s(t,"touchcancel",this._disableDelayedDrag),s(t,"mousemove",this._disableDelayedDrag),s(t,"touchmove",this._disableDelayedDrag)},_triggerDragStart:function(t){t?(T={target:y,clientX:t.clientX,clientY:t.clientY},this._onDragStart(T,"touch")):this.nativeDraggable?(o(y,"dragend",this),o(S,"dragstart",this._onDragStart)):this._onDragStart(T,!0);try{F.selection?F.selection.empty():window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(){S&&y&&(r(y,this.options.ghostClass,!0),t.active=this,c(this,S,"start",y,S,G))},_emulateDragOver:function(){if(k){if(this._lastX===k.clientX&&this._lastY===k.clientY)return;this._lastX=k.clientX,this._lastY=k.clientY,q||a(P,"display","none");var t=F.elementFromPoint(k.clientX,k.clientY),e=t,i=" "+this.options.group.name,n=V.length;if(e)do{if(e[U]&&e[U].options.groups.indexOf(i)>-1){for(;n--;)V[n]({clientX:k.clientX,clientY:k.clientY,target:t,rootEl:e});break}t=e}while(e=e.parentNode);q||a(P,"display","")}},_onTouchMove:function(e){if(T){t.active||this._dragStarted(),this._appendGhost();var i=e.touches?e.touches[0]:e,n=i.clientX-T.clientX,o=i.clientY-T.clientY,s=e.touches?"translate3d("+n+"px,"+o+"px,0)":"translate("+n+"px,"+o+"px)";O=!0,k=i,a(P,"webkitTransform",s),a(P,"mozTransform",s),a(P,"msTransform",s),a(P,"transform",s),e.preventDefault()}},_appendGhost:function(){if(!P){var t,e=y.getBoundingClientRect(),i=a(y),n=this.options;P=y.cloneNode(!0),r(P,n.ghostClass,!1),r(P,n.fallbackClass,!0),a(P,"top",e.top-z(i.marginTop,10)),a(P,"left",e.left-z(i.marginLeft,10)),a(P,"width",e.width),a(P,"height",e.height),a(P,"opacity","0.8"),a(P,"position","fixed"),a(P,"zIndex","100000"),a(P,"pointerEvents","none"),n.fallbackOnBody&&F.body.appendChild(P)||S.appendChild(P),t=P.getBoundingClientRect(),a(P,"width",2*e.width-t.width),a(P,"height",2*e.height-t.height)}},_onDragStart:function(t,e){var i=t.dataTransfer,n=this.options;this._offUpEvents(),"clone"==A.pull&&(C=y.cloneNode(!0),a(C,"display","none"),S.insertBefore(C,y)),e?("touch"===e?(o(F,"touchmove",this._onTouchMove),o(F,"touchend",this._onDrop),o(F,"touchcancel",this._onDrop)):(o(F,"mousemove",this._onTouchMove),o(F,"mouseup",this._onDrop)),this._loopId=setInterval(this._emulateDragOver,50)):(i&&(i.effectAllowed="move",n.setData&&n.setData.call(this,i,y)),o(F,"drop",this),setTimeout(this._dragStarted,0))},_onDragOver:function(t){var n,o,s,r=this.el,l=this.options,c=l.group,u=c.put,m=A===c,f=l.sort;if(void 0!==t.preventDefault&&(t.preventDefault(),!l.dragoverBubble&&t.stopPropagation()),O=!0,A&&!l.disabled&&(m?f||(s=!S.contains(y)):A.pull&&u&&(A.name===c.name||u.indexOf&&~u.indexOf(A.name)))&&(void 0===t.rootEl||t.rootEl===this.el)){if(Y(t,l,this.el),W)return;if(n=i(t.target,l.draggable,r),o=y.getBoundingClientRect(),s)return e(!0),void(C||M?S.insertBefore(y,C||M):f||S.appendChild(y));if(0===r.children.length||r.children[0]===P||r===t.target&&(n=p(r,t))){if(n){if(n.animated)return;g=n.getBoundingClientRect()}e(m),h(S,r,y,o,n,g)!==!1&&(y.contains(r)||(r.appendChild(y),E=r),this._animate(o,y),n&&this._animate(g,n))}else if(n&&!n.animated&&n!==y&&void 0!==n.parentNode[U]){R!==n&&(R=n,b=a(n),x=a(n.parentNode));var _,g=n.getBoundingClientRect(),v=g.right-g.left,w=g.bottom-g.top,L=/left|right|inline/.test(b.cssFloat+b.display)||"flex"==x.display&&0===x["flex-direction"].indexOf("row"),G=n.offsetWidth>y.offsetWidth,I=n.offsetHeight>y.offsetHeight,T=(L?(t.clientX-g.left)/v:(t.clientY-g.top)/w)>.5,k=n.nextElementSibling,D=h(S,r,y,o,n,g);if(D!==!1){if(W=!0,setTimeout(d,30),e(m),1===D||D===-1)_=1===D;else if(L){var N=y.offsetTop,j=n.offsetTop;_=N===j?n.previousElementSibling===y&&!G||T&&G:j>N}else _=k!==y&&!I||T&&I;y.contains(r)||(_&&!k?r.appendChild(y):n.parentNode.insertBefore(y,_?k:n)),E=y.parentNode,this._animate(o,y),this._animate(g,n)}}}},_animate:function(t,e){var i=this.options.animation;if(i){var n=e.getBoundingClientRect();a(e,"transition","none"),a(e,"transform","translate3d("+(t.left-n.left)+"px,"+(t.top-n.top)+"px,0)"),e.offsetWidth,a(e,"transition","all "+i+"ms"),a(e,"transform","translate3d(0,0,0)"),clearTimeout(e.animated),e.animated=setTimeout(function(){a(e,"transition",""),a(e,"transform",""),e.animated=!1},i)}},_offUpEvents:function(){var t=this.el.ownerDocument;s(F,"touchmove",this._onTouchMove),s(t,"mouseup",this._onDrop),s(t,"touchend",this._onDrop),s(t,"touchcancel",this._onDrop)},_onDrop:function(e){var i=this.el,n=this.options;clearInterval(this._loopId),clearInterval(D.pid),clearTimeout(this._dragStartTimer),s(F,"mousemove",this._onTouchMove),this.nativeDraggable&&(s(F,"drop",this),s(i,"dragstart",this._onDragStart)),this._offUpEvents(),e&&(O&&(e.preventDefault(),!n.dropBubble&&e.stopPropagation()),P&&P.parentNode.removeChild(P),y&&(this.nativeDraggable&&s(y,"dragend",this),u(y),r(y,this.options.ghostClass,!1),r(y,this.options.chosenClass,!1),S!==E?(I=f(y,n.draggable),I>=0&&(c(null,E,"sort",y,S,G,I),c(this,S,"sort",y,S,G,I),c(null,E,"add",y,S,G,I),c(this,S,"remove",y,S,G,I))):(C&&C.parentNode.removeChild(C),y.nextSibling!==M&&(I=f(y,n.draggable),I>=0&&(c(this,S,"update",y,S,G,I),c(this,S,"sort",y,S,G,I)))),t.active&&(null!==I&&I!==-1||(I=G),c(this,S,"end",y,S,G,I),this.save()))),this._nulling()},_nulling:function(){S=y=E=P=M=C=w=L=T=k=O=I=R=b=A=t.active=null},handleEvent:function(t){var e=t.type;"dragover"===e||"dragenter"===e?y&&(this._onDragOver(t),n(t)):"drop"!==e&&"dragend"!==e||this._onDrop(t)},toArray:function(){for(var t,e=[],n=this.el.children,o=0,s=n.length,r=this.options;o<s;o++)t=n[o],i(t,r.draggable,this.el)&&e.push(t.getAttribute(r.dataIdAttr)||m(t));return e},sort:function(t){var e={},n=this.el;this.toArray().forEach(function(t,o){var s=n.children[o];i(s,this.options.draggable,n)&&(e[t]=s)},this),t.forEach(function(t){e[t]&&(n.removeChild(e[t]),n.appendChild(e[t]))})},save:function(){var t=this.options.store;t&&t.set(this)},closest:function(t,e){return i(t,e||this.options.draggable,this.el)},option:function(t,e){var i=this.options;return void 0===e?i[t]:(i[t]=e,void("group"===t&&K(i)))},destroy:function(){var t=this.el;t[U]=null,s(t,"mousedown",this._onTapStart),s(t,"touchstart",this._onTapStart),this.nativeDraggable&&(s(t,"dragover",this),s(t,"dragenter",this)),Array.prototype.forEach.call(t.querySelectorAll("[draggable]"),function(t){t.removeAttribute("draggable")}),V.splice(V.indexOf(this._onDragOver),1),this._onDrop(),this.el=t=null}},t.utils={on:o,off:s,css:a,find:l,is:function(t,e){return!!i(t,e,t)},extend:v,throttle:g,closest:i,toggleClass:r,index:f},t.create=function(e,i){return new t(e,i)},t.version="1.4.2",t}),CommonControlsLayerSwitcherDOM=function(t){var e={_createDraggableElement:function(e,i){t.create(e,{handle:".GPlayerName",draggable:".draggable-layer",ghostClass:"GPghostLayer",animation:200,onEnd:function(t){i._onDragAndDropLayerClick(t)}})},_addUID:function(t){var e=this._uid?t+"-"+this._uid:t;return e},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPlayerSwitcher"),t.className="GPwidget",t},_createMainLayersShowElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowLayersList"),t.type="checkbox",t},_createMainLayersElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPlayersList"),t.className="GPpanel",t},_createMainPictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowLayersListPicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowLayersList"),e.title="Afficher/masquer le gestionnaire de couches";var i=document.createElement("span");i.id=this._addUID("GPshowLayersListOpen"),i.className="GPshowAdvancedToolOpen",i.addEventListener("click",function(){if(document.getElementById(t._addUID("GPshowLayersList")).checked){for(var e=document.getElementsByClassName("GPlayerInfoOpened"),i=0;i<e.length;i++)e[i].className="GPlayerInfo";document.getElementById(t._addUID("GPlayerInfoPanel")).className="GPlayerInfoPanelClosed"}}),e.appendChild(i);var n=document.createElement("span");return n.addEventListener("click",function(){if(document.getElementById(t._addUID("GPshowLayersList")).checked){for(var e=document.getElementsByClassName("GPlayerInfoOpened"),i=0;i<e.length;i++)e[i].className="GPlayerInfo";document.getElementById(t._addUID("GPlayerInfoPanel")).className="GPlayerInfoPanelClosed"}}),n.id=t._addUID("GPshowLayersListClose"),e.appendChild(n),e},_createMainInfoElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPlayerInfoPanel"),t.className="GPpanel GPlayerInfoPanelClosed",t},_createContainerLayerElement:function(t){var e=document.createElement("div");e.id="GPlayerSwitcher_ID"+t.id,e.className="GPlayerSwitcher_layer draggable-layer",e.appendChild(this._createBasicToolElement(t));for(var i=this._createAdvancedToolShowElement(t),n=0;n<i.length;n++)e.appendChild(i[n]);return e.appendChild(this._createAdvancedToolElement(t)),e},_createBasicToolElement:function(t){var e=document.createElement("div");e.id="GPbasicTools_IDLayer"+t.id,e.className="GPlayerBasicTools",e.appendChild(this._createBasicToolNameElement(t));for(var i=this._createBasicToolVisibilityElement(t),n=0;n<i.length;n++)e.appendChild(i[n]);return e},_createBasicToolNameElement:function(t){var e=document.createElement("span");return e.id="GPname_ID"+t.id,e.className="GPlayerName",e.title=t.description||t.title,e.innerHTML=t.title,e},_createBasicToolVisibilityElement:function(t){var e=[],i=t.visibility,n="GPvisibility_ID"+t.id,o=document.createElement("input");o.id=n,o.type="checkbox",o.checked=i;var s=document.createElement("label");s.htmlFor=n,s.id="GPvisibilityPicto_ID"+t.id,s.className="GPlayerVisibility",s.title="Afficher/masquer la couche";var r=this;return o.addEventListener?o.addEventListener("click",function(t){r._onVisibilityLayerClick.call(r,t)}):o.attachEvent&&o.attachEvent("onclick",function(t){r._onVisibilityLayerClick.call(r,t)}),e.push(o),e.push(s),e},_createAdvancedToolShowElement:function(t){var e=[],i=document.createElement("label");i.id="GPshowAdvancedToolsPicto_ID"+t.id,i.htmlFor="GPshowAdvancedTools_ID"+t.id,i.title="Plus d'outils",i.className="GPshowMoreOptions GPshowLayerAdvancedTools";var n=document.createElement("input");return n.type="checkbox",n.id="GPshowAdvancedTools_ID"+t.id,e.push(n),e.push(i),e},_createAdvancedToolElement:function(t){var e=document.createElement("div");if(e.id="GPadvancedTools_ID"+t.id,e.className="GPlayerAdvancedTools",e.appendChild(this._createAdvancedToolDeleteElement(t)),t.title&&t.description&&e.appendChild(this._createAdvancedToolInformationElement(t)),"feature"!==t.type)for(var i=this._createAdvancedToolOpacityElement(t),n=0;n<i.length;n++)e.appendChild(i[n]);return e},_createAdvancedToolDeleteElement:function(t){var e=document.createElement("div");e.id="GPremove_ID"+t.id,e.className="GPlayerRemove",e.title="Supprimer la couche",e.layerId=t.id;var i=this;return e.addEventListener?e.addEventListener("click",function(t){i._onDropLayerClick.call(i,t)}):e.attachEvent&&e.attachEvent("onclick",function(t){i._onDropLayerClick.call(i,t)}),e},_createAdvancedToolInformationElement:function(t){var e=document.createElement("div");e.id="GPinfo_ID"+t.id,e.className="GPlayerInfo",e.title="Informations/légende",e.layerId=t.id;var i=this;return e.addEventListener?e.addEventListener("click",function(t){i._onOpenLayerInfoClick.call(i,t)}):e.attachEvent&&e.attachEvent("onclick",function(t){i._onOpenLayerInfoClick.call(i,t)}),e},_createAdvancedToolOpacityElement:function(t){var e=[],i=document.createElement("div");i.id="GPopacity_ID"+t.id,i.className="GPlayerOpacity",i.title="Opacité";var n=Math.round(100*t.opacity),o=document.createElement("input");o.id="GPopacityValueDiv_ID"+t.id,o.type="range",o.value=n;var s=this;o.addEventListener?o.addEventListener("change",function(t){s._onChangeLayerOpacity.call(s,t)}):o.attachEvent&&o.attachEvent("onchange",function(t){s._onChangeLayerOpacity.call(s,t)}),o.addEventListener?o.addEventListener("input",function(t){s._onChangeLayerOpacity.call(s,t)}):o.attachEvent&&o.attachEvent("oninput",function(t){s._onChangeLayerOpacity.call(s,t)}),i.appendChild(o);var r=document.createElement("div");r.id="GPopacityValueDiv_ID"+t.id,r.className="GPlayerOpacityValue";var a=document.createElement("span");return a.id="GPopacityValue_ID"+t.id,a.innerHTML=n+"%",r.appendChild(a),e.push(i),e.push(r),e},_createContainerLayerInfoElement:function(t){var e=document.createElement("div");e.id="GPlayerInfoContent";var i=document.createElement("div");if(i.id="GPlayerInfoTitle",i.innerHTML=t.title,e.appendChild(i),t.quicklookUrl){var n=document.createElement("div");n.id="GPlayerInfoQuicklook",n.title="Afficher un aperçu de la couche";var o=document.createElement("a");o.href=t.quicklookUrl,o.appendChild(n),e.appendChild(o)}var s=document.createElement("div");s.id="GPlayerInfoClose",s.title="Fermer la fenêtre";var r=function(){document.getElementById("GPlayerInfoPanel").className="GPlayerInfoPanelClosed";for(var t=document.getElementsByClassName("GPlayerInfoOpened"),e=0;e<t.length;e++)t[e].className="GPlayerInfo"};s.addEventListener?s.addEventListener("click",r):s.attachEvent&&s.attachEvent("onclick",r),e.appendChild(s);var a=document.createElement("div");if(a.id="GPlayerInfoDescription",a.innerHTML=t.description,e.appendChild(a),t.metadata){var l=document.createElement("div");l.id="GPlayerInfoMetadata";var c=document.createElement("div");c.className="GPlayerInfoSubtitle",c.innerHTML="Métadonnées",l.appendChild(c);for(var h=0;h<t.metadata.length;h++){var u=t.metadata[h].url,d=document.createElement("div");d.className="GPlayerInfoLink";var p=document.createElement("a");p.href=u,p.innerHTML=u,d.appendChild(p),l.appendChild(d)}0!==t.metadata.length&&e.appendChild(l)}if(t.legends){var m=document.createElement("div");m.id="GPlayerInfoLegend";var f=document.createElement("div");f.className="GPlayerInfoSubtitle",f.innerHTML="Légende",m.appendChild(f);for(var _={},g=t.maxScaleDenominator||56e7,v=0;v<t.legends.length;v++){var y=t.legends[v].minScaleDenominator;if(y){var E=y.toString();y=Math.round(parseInt(E.substring(0,3),10)/10)*Math.pow(10,E.length-2)}else y=270;_[y]=t.legends[v]}for(var P in _)if(_.hasOwnProperty(P)){var C=_[P].url;if("string"==typeof C&&C.toLowerCase().indexOf("nolegend.jpg")==-1){var S=document.createElement("div");S.className="GPlayerInfoLink",g=_[P].maxScaleDenominator||g;var M=document.createElement("a");M.href=C,M.innerHTML="Du 1/"+P+" au 1/"+g,S.appendChild(M),m.appendChild(S)}else delete _[P]}0!==Object.keys(_).length&&e.appendChild(m)}return e}};return e}(sortable),LeafletControlsLayerSwitcher=function(t,e,i){var n=t.Control.Layers.extend({includes:i,options:{collapsed:!0,position:"topright",autoZIndex:!0,layers:[]},initialize:function(e){if(t.Util.setOptions(this,e),this._hasLayersConfig=!(!this.options.layers||0===Object.keys(this.options.layers).length),this._layersConfig=this._hasLayersConfig?this.options.layers:[],this._layers={},this._lastZIndex=0,this._hasLayersConfig)for(var i=0;i<this._layersConfig.length;i++){var n=this._layersConfig[i];this._addLayer(n.layer,null,!0)}},onAdd:function(t){var e=t._layers;if(0!==Object.keys(e).length){var i=Object.keys(e);this._lastZIndex=0;for(var n=0;n<i.length;n++){var o=i[n];this.options.autoZIndex&&e[o].setZIndex&&(this._lastZIndex++,e[o].setZIndex(this._lastZIndex)),this._hasLayersConfig&&this._layers[o]||this.addOverlay(e[o])}}if(0===Object.keys(e).length){var s=this._layersConfig;this._lastZIndex=0;for(var r=0;r<s.length;r++){var a=s[r].layer;t.hasLayer(a)||(t.addLayer(a),this.addOverlay(a,null),this.options.autoZIndex&&a.setZIndex&&(this._lastZIndex++,a.setZIndex(this._lastZIndex)))}}for(var l in this._layers)if(this._layers.hasOwnProperty(l)){var c=this._layers[l];c.visibility||this._visibilityLayer(!c.visibility,c.layer)}return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this),t.on("layerremove",this._onLayerChange,this),this._container},_addLayer:function(e,i,n){var o=e._geoportal_id?e._geoportal_id:e._leaflet_id;if(o){var s={};for(var r in this._layersConfig)if(this._layersConfig.hasOwnProperty(r)&&o===t.stamp(this._layersConfig[r].layer)){s=this._layersConfig[r].config;var a="undefined"==typeof this._layersConfig[r].display||this._layersConfig[r].display;if(!a)return;break}this._layers[o]={layer:e,id:o,overlay:n,title:e._geoportal_id&&e._title?e._title:i?i:o,description:e._geoportal_id&&e._description?e._description:i?i:o,visibility:!e._geoportal_id||e.getVisible(),legends:e._geoportal_id?e._legends:null,metadata:e._geoportal_id?e._metadata:null,quicklookUrl:e._geoportal_id?e._quicklookUrl:null},s&&Object.keys(s)&&t.Util.extend(this._layers[o],s),e._geoportal_id?e.setVisible(this._layers[o].visibility):null}},_initLayout:function(){var e=this._container=this._createMainContainerElement(),i=this._createMainLayersShowElement();e.appendChild(i),this.options.collapsed||(i.checked="checked");var n=this._overlaysList=this._createMainLayersElement();e.appendChild(n);var o=this._createMainPictoElement();e.appendChild(o);var s=this._createMainInfoElement();switch(e.appendChild(s),this._createDraggableElement(this._overlaysList,this),t.DomEvent.disableClickPropagation(e).disableScrollPropagation(e),this._map.on("moveend",this._onOutOfRangeLayerZoom,this),this.getPosition()){case"topright":e.style.position="relative",e.style.top="0",e.style.right="0";break;case"topleft":e.style.position="relative",e.style.top="0",e.style.right="initial",o.style.float="left",n.style.borderBottomRightRadius="5px",n.style.borderBottomLeftRadius="0",s.style.right="initial",s.style.left="190px";break;case"bottomleft":e.style.position="relative",e.style.top="0",e.style.right="initial",o.style.float="left",n.style.borderBottomRightRadius="5px",n.style.borderBottomLeftRadius="0",s.style.right="initial",s.style.left="190px";break;case"bottomright":e.style.position="relative",e.style.top="0",e.style.right="0";break;default:e.style.position="relative",e.style.top="0",e.style.right="0"}},_update:function(){if(this._container){this._overlaysList.innerHTML="";var t=[];for(var e in this._layers)this._layers.hasOwnProperty(e)&&t.push(e);for(var i=t.sort(function(t,e){var i=parseInt(t,10),n=parseInt(e,10);return i-n}).reverse(),n=0;n<i.length;n++){var o=i[n],s=this._layers[o];this._addItem(s)}}},_addItem:function(e){e.opacity=e.layer.options.opacity;var i=this._createContainerLayerElement(e);return e.layer.options.minZoom>this._map.getZoom()||e.layer.options.maxZoom<this._map.getZoom()?t.DomUtil.addClass(i,"outOfRange"):t.DomUtil.removeClass(i,"outOfRange"),this._overlaysList.appendChild(i),i},_onLayerChange:function(e){var i=this._layers[t.stamp(e.layer)];if(i){this._handlingClick||this._update();var n="layeradd"===e.type?"overlayadd":"overlayremove";n&&this._map.fire(n,i)}},removeLayer:function(e){var i=t.stamp(e);return delete this._layers[i],this._update(),this},_visibilityLayer:function(t,e){if(this._handlingClick=!0,e._geoportal_id){var i=!e.getVisible();e.setVisible(i)}t&&this._map.hasLayer(e)?this._map.removeLayer(e):t||this._map.hasLayer(e)||this._map.addLayer(e),this._handlingClick=!1,this._refocusOnMap()},_onOutOfRangeLayerZoom:function(){var e=this._map,i=this._layers;for(var n in i)if(i.hasOwnProperty(n)){var o=i[n].layer,s=i[n].id,r=t.DomUtil.get("GPlayerSwitcher_ID"+s);o.options.minZoom>e.getZoom()||o.options.maxZoom<e.getZoom()?t.DomUtil.addClass(r,"outOfRange"):t.DomUtil.removeClass(r,"outOfRange")}},_onVisibilityLayerClick:function(e){var i=e.target.id,n=i.substring(i.indexOf("_")+3),o=t.DomUtil.get(i);this._layers[n].visibility=o.checked,this._visibilityLayer(!o.checked,this._layers[n].layer)},_onDropLayerClick:function(t){var e=t.target.id,i=e.substring(e.indexOf("_")+3),n=this._layers[i].layer;this.removeLayer(n),this._map.hasLayer(n)&&this._map.removeLayer(n)},_onChangeLayerOpacity:function(e){var i=e.target.id,n=i.substring(i.indexOf("_")+3),o=this._layers[n].layer,s=e.target.value,r=t.DomUtil.get("GPopacityValue_ID"+n);r.innerHTML=s+"%",this._map.hasLayer(o)&&o.setOpacity(s/100)},_onOpenLayerInfoClick:function(e){var i=e.target.id,n=i.substring(i.indexOf("_")+3),o=this._layers[n],s=t.DomUtil.get(e.target.id),r=null,a=null;if("GPlayerInfoOpened"===s.className)return t.DomUtil.removeClass(s,"GPlayerInfoOpened"),t.DomUtil.addClass(s,"GPlayerInfo"),r=t.DomUtil.get("GPlayerInfoPanel"),t.DomUtil.removeClass(r,"GPpanel"),t.DomUtil.removeClass(r,"GPlayerInfoPanelOpened"),t.DomUtil.addClass(r,"GPlayerInfoPanelClosed"),a=t.DomUtil.get("GPlayerInfoContent"),void r.removeChild(a);for(var l=document.getElementsByClassName("GPlayerInfoOpened"),c=0;c<l.length;c++)l[c].className="GPlayerInfo";t.DomUtil.removeClass(s,"GPlayerInfo"),t.DomUtil.addClass(s,"GPlayerInfoOpened"),r=t.DomUtil.get("GPlayerInfoPanel"),t.DomUtil.addClass(r,"GPpanel"),t.DomUtil.removeClass(r,"GPlayerInfoPanelClosed"),t.DomUtil.addClass(r,"GPlayerInfoPanelOpened"),a=t.DomUtil.get("GPlayerInfoContent"),a&&r.removeChild(a);var h=this._createContainerLayerInfoElement(o);r.appendChild(h)},_onDragAndDropLayerClick:function(t){var e=t.item.id,i=e.substring(e.indexOf("_")+3),n=(this._layers[i].layer,document.querySelectorAll("div.GPlayerSwitcher_layer"));this._lastZIndex=n.length;for(var o=0;o<n.length;o++){var s=n[o].id,r=s.substring(s.indexOf("_")+3),a=this._layers[r].layer;this.options.autoZIndex&&a.setZIndex&&(this._lastZIndex--,a.setZIndex(this._lastZIndex))}},addLayer:function(e,i){var n=this._map,o=this._layersConfig;if(!e)return void console.log("[ERROR] LayerSwitcher:addLayer - missing layer parameter !");n.hasLayer(e)||console.log("[WARN] LayerSwitcher:addLayer - layer has not been added on map !");var s=t.stamp(e);for(var r in o)if(o.hasOwnProperty(r)&&s===t.stamp(o[r].layer)){delete o[r];break}var a=i||{};t.Util.extend(a,{layer:e}),o.push(a),e.setZIndex(this._lastZIndex++),this.addOverlay(e),this._update()}});return n}(leaflet,{},CommonControlsLayerSwitcherDOM),CommonUtilsConfig=function(){var t={configuration:null,isConfigLoaded:function(){var t="undefined"!=typeof window?window:{};return!(!t.Gp||!t.Gp.Config||0===Object.keys(t.Gp.Config).length)&&(this.configuration=t.Gp.Config,!0)},getLayerId:function(t,e){var i=null;if(this.configuration){var n=this.configuration.layers;for(var o in n)if(n.hasOwnProperty(o)){var s=o.split("$");if(t===s[0]&&s[1]){var r=s[1].split(":"),a=s[1].split(";");if(a[1]===e){i=o;break}if(r[2]===e){i=o;break}}}}return i||console.log("ERROR layer id ("+t+" / "+e+") was not found !?"),i},getLayerParams:function(t,e,i){var n={};if(this.configuration){var o=this.getLayerId(t,e);if(o){var s=this.configuration.layers[o],r=s.apiKeys[0];if(i&&i!==r)return void console.log("ERROR different keys ("+i+" !== "+r+") !?");i=i||r,n.key=i,n.url=s.getServerUrl(i),n.version=s.getServiceParams().version,n.styles=s.getDefaultStyle(),n.format=s.getDefaultFormat(),n.projection=s.getDefaultProjection(),n.minScale=s.getMinScaleDenominator(),n.maxScale=s.getMaxScaleDenominator(),n.extent=s.getBBOX(),n.legends=s.getLegends(),n.metadata=s.getMetadata(),n.originators=s.getOriginators(),n.title=s.getTitle(),n.description=s.getDescription(),n.quicklookUrl=s.getQuicklookUrl(),s.wmtsOptions&&(n.tileMatrixSetLimits=s.wmtsOptions.tileMatrixSetLimits);var a=s.getTMSID();if(a){n.TMSLink=a;var l=this.configuration.getTMSConf(a);n.matrixOrigin=l.getTopLeftCorner(),n.nativeResolutions=l.nativeResolutions,n.matrixIds=l.matrixIds,n.tileMatrices=l.tileMatrices}}}return n},getServiceParams:function(t,e,i){var n={};if(this.configuration){var o=this.getLayerId(t,e);if(o){var s=this.configuration.layers[o],r=s.apiKeys[0];if(i&&i!==r)return;i=i||r,n.key=i,n.url=s.getServerUrl(i),n.version=s.getServiceParams().version,n.extent=s.getBBOX(),n.title=s.getTitle(),n.description=s.getDescription()}}return n},getResolutions:function(){var t=[];return this.configuration&&(t=this.configuration.generalOptions.wgs84Resolutions),t},getTileMatrix:function(t){var e={};return this.configuration&&t&&(e=this.configuration.tileMatrixSets[t.toUpperCase()]),e},getGlobalConstraints:function(t){var e={};if(t){var i=this.configuration.layers[t];e.projection=i.getDefaultProjection(),e.minScale=i.getMinScaleDenominator(),e.maxScale=i.getMaxScaleDenominator(),e.extent=i.getBBOX()}return e}};return t}(),CommonUtilsCheckRightManagement=function(t,e){return{check:function(t){if(t){var i=t.key,n=t.resources||[],o=t.services||[];if(n&&0!==n.length&&o&&0!==o.length){var s={};if(!i){if(!e.isConfigLoaded())return void console.log("WARNING : parameter 'apiKey' has not been parametered, and the contract key configuration has not been loaded, so impossible to check yours rights !");i=Object.keys(e.configuration.generalOptions.apiKeys)[0]}if(i){if(e.isConfigLoaded()){for(var r=0;r<n.length;r++)for(var a=n[r],l=0;l<o.length;l++){var c=o[l],h=e.getServiceParams(a,c,i);h&&0!==Object.keys(h).length?(s[c]||(s[c]=[]),s[c].push(a)):console.log("WARNING : contract key configuration has no rights to load this geoportal resource ("+a+") for this service ("+c+") ")}return s&&0!==Object.keys(s).length?(s.key=i,s):void console.log("WARNING : the contract key configuration has been loaded, and the parameter 'apiKey' has been parametered, but, there is a problem on the mapping between the contract and the key !")}console.log("WARNING : the contract key configuration has not been loaded, so be carefull !");for(var u={},d=0;d<o.length;d++){var p=o[d];u[p]=[];for(var m=0;m<n.length;m++){var f=n[m];u[p].push(f)}}return u.key=i,u}}}}}}({},CommonUtilsConfig),CommonUtilsSelectorID=function(){var t={generate:function(){var t=Math.floor(Date.now());return function(){return t++}}(),name:function(t){var e=null,i=t.indexOf("-");return e=i===-1?t:t.substring(0,i)},index:function(t){var e=null,i=this.name(t);if(i!==t){var n=i.indexOf("_");n!==-1&&(e=i.substring(n+1))}return e},uuid:function(t){var e=null,i=t.indexOf("-");return i!==-1&&(e=parseInt(t.substring(i+1),10)),e}};return t}(),CommonControlsLocationSelectorDOM=function(t){var e={_addUID:function(t){return t+"-"+this._uid},_createMainContainerElement:function(){var t=document.createElement("div");return t.className=this._addUID("GPlocationPoint"),t.className+=" GPwidget",t},_createLocationPointElement:function(t,e){var i=document.createElement("div");return i.id=this._addUID("GPlocationPoint_"+t),i.className=e?"GPflexInput GPlocationStageFlexInput":"GPflexInput GPlocationStageFlexInputHidden",i.style.cssText="",i},_createLocationPointLabelElement:function(e,i){var n=this,o=document.createElement("label");return o.id=this._addUID("GPlocationOriginLabel_"+e),o.htmlFor="GPlocationOrigin_"+e,o.innerHTML=i,o.addEventListener("click",function(e){for(var i=t.index(this.id),o=document.getElementsByClassName(n._addUID("GPlocationPoint")),s=0;s<o.length;s++){var r=o[s].childNodes[0].id,a=t.index(r);document.getElementById(n._addUID("GPlocationPoint_"+a)).style.cssText=""}document.getElementById(n._addUID("GPlocationOriginCoords_"+i)).value="",document.getElementById(n._addUID("GPlocationOrigin_"+i)).value="",document.getElementById(n._addUID("GPlocationPoint_"+i)).style.cssText="",document.getElementById(n._addUID("GPlocationOriginPointer_"+i)).checked=!1,document.getElementById(n._addUID("GPlocationOrigin_"+i)).className="GPlocationOriginVisible",document.getElementById(n._addUID("GPlocationOriginCoords_"+i)).className="GPlocationOriginHidden",document.getElementById(n._addUID("GPlocationStageRemove_"+i))&&(document.getElementById(n._addUID("GPlocationStageRemove_"+i)).className="GPlocationStageRemove"),document.getElementById(n._addUID("GPlocationStageAdd"))&&(document.getElementById(n._addUID("GPlocationStageAdd")).className=""),n.onLocationClearPointClick(e)}),o},_createLocationAutoCompleteteInputElement:function(e){var i=this,n=document.createElement("input");return n.id=this._addUID("GPlocationOrigin_"+e),n.className="GPlocationOriginVisible",n.type="text",n.placeholder="Saisir une adresse",n.autocomplete="off",n.addEventListener("keyup",function(e){var n=e.which||e.keyCode;if(13!==n&&10!==n&&38!==n&&40!==n){
+var o=t.index(this.id);document.getElementById(i._addUID("GPlocationOrigin_"+o)).value.length>2?document.getElementById(i._addUID("GPlocationAutoCompleteList_"+o)).style.display="block":document.getElementById(i._addUID("GPlocationAutoCompleteList_"+o)).style.display="none",i.onAutoCompleteSearchText(e)}}),n.addEventListener("keydown",function(n){var o=n.which||n.keyCode,s=document.getElementById(i._addUID("GPlocationAutoCompleteList_"+e));if(s){var r=s.getElementsByClassName("GPautoCompleteProposal current"),a=s.getElementsByClassName("GPautoCompleteProposal"),l=a.length;if(l){var c=null;if(!r.length)return c=a[0],c.className="GPautoCompleteProposal current",c.style.color="#000000",void(c.style["background-color"]="#CEDBEF");c=r[0];var h=parseInt(t.index(c.id),10),u=h===l-1?a[0]:a[h+1],d=0===h?a[l-1]:a[h-1];switch(c.style["background-color"]="",c.style.color="",d.style["background-color"]="",d.style.color="",u.style["background-color"]="",u.style.color="",o){case 38:console.log("arrow up"),c.className="GPautoCompleteProposal",d.className="GPautoCompleteProposal current",d.style.color="#000000",d.style["background-color"]="#CEDBEF";break;case 40:console.log("arrow down"),c.className="GPautoCompleteProposal",u.className="GPautoCompleteProposal current",u.style.color="#000000",u.style["background-color"]="#CEDBEF";break;case 13:console.log("enter"),c.click(n)}c.focus()}}}),n},_createLocationCoordinateInputElement:function(e){var i=this,n=document.createElement("input");return n.id=this._addUID("GPlocationOriginCoords_"+e),n.className="GPlocationOriginHidden",n.type="text",n.disabled=!1,n.addEventListener("click",function(){var e=t.index(this.id);document.getElementById(i._addUID("GPlocationOriginLabel_"+e)).click()}),n},_createLocationPointerShowInputElement:function(t){var e=document.createElement("input");return e.id=this._addUID("GPlocationOriginPointer_"+t),e.type="checkbox",e},_createLocationPointerInputElement:function(e){var i=this,n=document.createElement("label");return n.id=this._addUID("GPlocationOriginPointerImg_"+e),n.htmlFor="GPlocationOriginPointer_"+e,n.className="GPlocationOriginPointerImg",n.title="Pointer un lieu sur la carte",n.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation();var n,o,s,r=t.index(this.id),a=document.getElementsByClassName(i._addUID("GPlocationPoint"));for(n=0;n<a.length;n++)o=a[n].childNodes[0].id,s=t.index(o),r!=s&&(document.getElementById(i._addUID("GPlocationOriginPointer_"+s)).checked=!1,"Pointer un lieu sur la carte"==document.getElementById(i._addUID("GPlocationOriginCoords_"+s)).value&&(document.getElementById(i._addUID("GPlocationOriginCoords_"+s)).value="",document.getElementById(i._addUID("GPlocationOrigin_"+s)).className="GPlocationOriginVisible",document.getElementById(i._addUID("GPlocationOriginCoords_"+s)).className="GPlocationOriginHidden"));if(document.getElementById(i._addUID("GPlocationOriginPointer_"+r)).checked){for(document.getElementById(i._addUID("GPlocationOriginCoords_"+r)).value="",n=0;n<a.length;n++)o=a[n].childNodes[0].id,s=t.index(o),document.getElementById(i._addUID("GPlocationPoint_"+s)).style.cssText="";document.getElementById(i._addUID("GPlocationStageRemove_"+r))&&(document.getElementById(i._addUID("GPlocationStageRemove_"+r)).className="GPlocationStageRemove"),document.getElementById(i._addUID("GPlocationStageAdd"))&&(document.getElementById(i._addUID("GPlocationStageAdd")).className=""),document.getElementById(i._addUID("GPlocationOriginPointer_"+r)).checked=!1,document.getElementById(i._addUID("GPlocationOrigin_"+r)).className="GPlocationOriginVisible",document.getElementById(i._addUID("GPlocationOriginCoords_"+r)).className="GPlocationOriginHidden"}else{for(document.getElementById(i._addUID("GPlocationOriginCoords_"+r)).value="Pointer un lieu sur la carte",n=0;n<a.length;n++)o=a[n].childNodes[0].id,s=t.index(o),r==s?document.getElementById(i._addUID("GPlocationPoint_"+s)).style.cssText="":document.getElementById(i._addUID("GPlocationPoint_"+s)).style.display="none";document.getElementById(i._addUID("GPlocationStageRemove_"+r))&&(document.getElementById(i._addUID("GPlocationStageRemove_"+r)).className="GPlocationOriginHidden"),document.getElementById(i._addUID("GPlocationStageAdd"))&&(document.getElementById(i._addUID("GPlocationStageAdd")).className="GPlocationOriginHidden"),document.getElementById(i._addUID("GPlocationOriginPointer_"+r)).checked=!0,document.getElementById(i._addUID("GPlocationOrigin_"+r)).className="GPlocationOriginHidden",document.getElementById(i._addUID("GPlocationOriginCoords_"+r)).className="GPlocationOriginVisible",document.getElementById(i._addUID("GPlocationOriginCoords_"+r)).disabled=!0}i.onActivateMapPointClick(e)}),n},_createLocationRemovePointElement:function(e){var i=this,n=document.createElement("div");return n.id=this._addUID("GPlocationStageRemove_"+e),n.className="GPlocationStageRemove",n.title="Supprimer l'étape",n.addEventListener("click",function(n){var o=document.getElementsByClassName(i._addUID("GPlocationPoint")),s=o.length-1,r=o[0].childNodes[0].id,a=o[s].childNodes[0].id,l=t.index(r),c=t.index(a);if(e!=l&&e!=c){var h=t.index(this.id);document.getElementById(i._addUID("GPlocationPoint_"+h)).className="GPflexInput GPlocationStageFlexInputHidden",document.getElementById(i._addUID("GPlocationOrigin_"+h)).value="",document.getElementById(i._addUID("GPlocationOrigin_"+h)).className="GPlocationOriginVisible",document.getElementById(i._addUID("GPlocationOriginCoords_"+h)).value="",document.getElementById(i._addUID("GPlocationOriginCoords_"+h)).className="GPlocationOriginHidden",document.getElementById(i._addUID("GPlocationStageAdd")).style.display="",i.onLocationRemovePointClick(n)}}),n},_createLocationAddPointElement:function(){var e=this,i=document.createElement("div");return i.id=this._addUID("GPlocationStageAdd"),i.title="Ajouter une étape",i.addEventListener("click",function(i){for(var n=1,o=0,s=document.getElementsByClassName(e._addUID("GPlocationPoint")),r=1;r<s.length-1;r++){var a=s[r].childNodes[0].id,l=t.index(a);document.getElementById(e._addUID("GPlocationPoint_"+l))&&("GPflexInput GPlocationStageFlexInputHidden"==document.getElementById(e._addUID("GPlocationPoint_"+l)).className?1==n&&(n=l):o++)}n<s.length&&(document.getElementById(e._addUID("GPlocationPoint_"+n)).className="GPflexInput GPlocationStageFlexInput"),4==o&&(document.getElementById(e._addUID("GPlocationStageAdd")).style.display="none"),e.onLocationAddPointClick(i)}),i},_createLocationAutoCompleteResultElement:function(t){var e=this,i=document.createElement("div");return i.id=this._addUID("GPlocationAutoCompleteList_"+t),i.className="GPadvancedAutoCompleteList",i.addEventListener?i.addEventListener("click",function(i){e.onAutoCompletedResultsItemClick(i),document.getElementById(e._addUID("GPlocationAutoCompleteList_"+t)).style.display="none"},!1):i.attachEvent&&i.attachEvent("onclick",function(i){e.onAutoCompletedResultsItemClick(i),document.getElementById(e._addUID("GPlocationAutoCompleteList_"+t)).style.display="none"}),i},_createLocationAutoCompletedLocationElement:function(t,e,i){var n=document.getElementById(this._addUID("GPlocationAutoCompleteList_"+t)),o=document.createElement("div");o.id=this._addUID("AutoCompletedLocation_"+i),o.className="GPautoCompleteProposal",o.innerHTML=e.fullText,n.appendChild(o)},GPdisplayCoordinate:function(e){for(var i=document.getElementsByClassName(this._addUID("GPlocationPoint")),n=0;n<i.length;n++){var o=i[n].childNodes[0].id,s=t.index(o);if(document.getElementById(this._addUID("GPlocationOriginPointer_"+s)).checked){document.getElementById(this._addUID("GPlocationOriginCoords_"+s)).value=e,document.getElementById(this._addUID("GPlocationOriginCoords_"+s)).disabled=!1;for(var r=0;r<i.length;r++){o=i[r].childNodes[0].id;var a=t.index(o);document.getElementById(this._addUID("GPlocationPoint_"+a)).style.cssText="",document.getElementById(this._addUID("GPlocationStageRemove_"+a))&&(document.getElementById(this._addUID("GPlocationStageRemove_"+a)).className="GPlocationStageRemove")}return document.getElementById(this._addUID("GPlocationOriginPointer_"+s)).checked=!1,void(document.getElementById(this._addUID("GPlocationStageAdd"))&&(document.getElementById(this._addUID("GPlocationStageAdd")).className=""))}}}};return e}(CommonUtilsSelectorID),LeafletControlsUtilsPositionFormater=function(){var t={NORTH:"N",SOUTH:"S",EAST:"E",WEST:"W",digitSecond:2,digitDecimal:5,digitRadian:8,roundToDecimal:function(t,e){var i=Math.pow(10,e);return Math.round(t*i)/i},decimalToRadian:function(t){var e=.017453292519943295;return this.roundToDecimal(t*e,this.digitRadian)},decimalToGrade:function(t){var e=1.1111111111111112;return this.roundToDecimal(t*e,this.digitRadian)},decimalToDMS:function(t,e){t<0&&(t*=-1);var i=Math.floor(t),n=60*(t-i),o=Math.floor(n),s=60*(n-o),r=this.roundToDecimal(s,this.digitSecond),a=i+"° "+o+"' "+r+'" ';return e&&(a+=e),a},decimalLatToDMS:function(t){var e=t<0?this.SOUTH:this.NORTH;return this.decimalToDMS(t,e)},decimalLongToDMS:function(t){var e=t<0?this.WEST:this.EAST;return this.decimalToDMS(t,e)},DMSToDecimal:function(t,e,i,n){var o=t+e/60+i/3600;o=n==this.SOUTH||n==this.WEST?o*-1:o;var s=this.roundToDecimal(o,this.digitDecimal);return s}};return t}(),LeafletControlsUtilsIconDefault=function(t){var e=t.Icon.Default.extend({images:{shadow:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=",color:{blue:"data:image/png;base64,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",orange:"data:image/png;base64,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",red:"data:image/png;base64,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",green:"data:image/png;base64,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"}},initialize:function(e,i){switch(t.Util.extend(this.options,i),e){case"red":this.options.iconUrl=this.images.color.red;break;case"green":this.options.iconUrl=this.images.color.green;break;case"orange":this.options.iconUrl=this.images.color.orange;break;case"blue":this.options.iconUrl=this.images.color.blue;break;default:this.options.iconUrl=this.images.color.blue}this.options.shadowUrl=this.images.shadow}});return e}(leaflet),LeafletControlsLocationSelector=function(t,e,i,n,o,s,r,a){var l=t.Control.extend({includes:s,options:{position:"topleft",tag:{id:0,unique:null,label:">",color:"blue",display:!0,addOption:!1,removeOption:!1},disableReverse:!1,displayInfo:!0,autocompleteOptions:{},reverseGeocodeOptions:{}},initialize:function(e){t.Util.setOptions(this,e),this._uid=this.options.tag.unique||null,this._activeDragAndDrop=!1,this._pressedKeyOnDragAndDrop=!1,this._map=null,this._inputsContainer=null,this._inputLabelContainer=null,this._inputAutoCompleteContainer=null,this._inputShowPointerContainer=null,this._inputCoordinateContainer=null,this._coordinate=null,this._suggestedContainer=null,this._suggestedLocations=[],this._currentLocation=null,this._marker=null,this._resources={},this._noRightManagement=!1,this._checkRightsManagement(),this._container=this._uid?this._initLayout():null},onAdd:function(){this._uid=o.generate();var e=this._initLayout();return t.DomEvent.disableClickPropagation(e).disableScrollPropagation(e),e},onRemove:function(){},getCoordinate:function(){return this._coordinate},getCoordinateInverse:function(){if(this._coordinate){var t={x:this._coordinate.y,y:this._coordinate.x};return t}},setMap:function(t){this._map||(this._map=t)},clear:function(){this._setCursor(),this._setMarker(),this._clearResults(),this._inputLabelContainer.click()},dragging:function(t){this._marker&&(t?this._marker.dragging.enable():this._marker.dragging.disable())},_initLayout:function(){var t=this.options.tag.id,e=this._createMainContainerElement(),i=this._inputsContainer=this._createLocationPointElement(t,this.options.tag.display);e.appendChild(i);var n=this._inputLabelContainer=this._createLocationPointLabelElement(t,this.options.tag.label);i.appendChild(n);var o=this._inputAutoCompleteContainer=this._createLocationAutoCompleteteInputElement(t);i.appendChild(o);var s=this._inputCoordinateContainer=this._createLocationCoordinateInputElement(t);i.appendChild(s);var r=this._inputShowPointerContainer=this._createLocationPointerShowInputElement(t);i.appendChild(r);var a=this._createLocationPointerInputElement(t);if(i.appendChild(a),this.options.tag.addOption){var l=this._createLocationAddPointElement();i.appendChild(l)}if(this.options.tag.removeOption){var c=this._createLocationRemovePointElement(t);i.appendChild(c)}var h=this._suggestedContainer=this._createLocationAutoCompleteResultElement(t);return e.appendChild(h),e},_checkRightsManagement:function(){var t=null,e=[],i=null;i=this.options.reverseGeocodeOptions.apiKey,t=this.options.reverseGeocodeOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=["PositionOfInterest","StreetAddress"]);var o=n.check({key:i||this.options.apiKey,resources:e,services:["ReverseGeocode"]});i=this.options.autocompleteOptions.apiKey,t=this.options.autocompleteOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=["PositionOfInterest","StreetAddress"]);var s=n.check({key:i||this.options.apiKey,resources:e,services:["AutoCompletion"]});o||s||(this._noRightManagement=!0),s&&(this._resources.AutoCompletion={},this._resources.AutoCompletion.resources=s.AutoCompletion,this._resources.AutoCompletion.key=s.key),o&&(this._resources.ReverseGeocode={},this._resources.ReverseGeocode.resources=o.ReverseGeocode,this._resources.ReverseGeocode.key=o.key)},_setLabel:function(t){this._inputAutoCompleteContainer.value=t||""},_setCoordinate:function(t){this._coordinate={x:t.lng,y:t.lat};var e=null,i=null;e=r.roundToDecimal(t.lat,4),i=r.roundToDecimal(t.lng,4);var n=i+" , "+e;this.GPdisplayCoordinate(n)},_setPosition:function(e){var i=this._map;i.panTo(t.latLng(e.y,e.x))},_setMarker:function(e,i,n){if(!this._activeDragAndDrop){var o=this._map;if(null!=this._marker&&(this._marker.off("mousedown",this.onMouseDownMarker,this),this._marker.off("dragstart",this.onStartDragMarker,this),this._marker.off("drag",this.onDragMarker,this),this._marker.off("dragend",this.onEndDragMarker,this),o.removeLayer(this._marker),this._marker=null),e){var s={icon:new a(this.options.tag.color),draggable:!0,clickable:!0,zIndexOffset:1e3};if(this._marker=t.marker(t.latLng(e.y,e.x),s),this._marker.on("mousedown",this.onMouseDownMarker,this),this._marker.on("dragstart",this.onStartDragMarker,this),this._marker.on("drag",this.onDragMarker,this),this._marker.on("dragend",this.onEndDragMarker,this),this._marker.addTo(o),n){var r=null;if("string"!=typeof i)if(i.fields.fullText)r=i.fields.fullText;else{var l=[];l.push(i.fields.street||""),l.push(i.fields.postalCode||""),l.push(i.fields.commune||""),"PositionOfInterest"===i.type&&(l.push(i.fields.poi||""),l.push(i.fields.kind||"")),r=l.join(" - ")}else r=i;this._marker.bindPopup(r)}}}},_setCursor:function(t){var e=this._map.getContainer();t?e.style.cursor=t:e.style.cursor=null},_clearResults:function(){this._currentLocation=null,this._coordinate=null,this._clearSuggestedLocation()},_clearSuggestedLocation:function(){if(this._suggestedLocations=[],this._suggestedContainer)for(;this._suggestedContainer.firstChild;)this._suggestedContainer.removeChild(this._suggestedContainer.firstChild)},_requestAutoComplete:function(e){if(e&&0!==Object.keys(e).length&&e.text){if(this._noRightManagement)return void console.log("no rights for all service !?");if(!this._resources.AutoCompletion)return void console.log("no rights for this service !?");var n=this._resources.AutoCompletion.resources;if(n&&0!==Object.keys(n).length){var o=this._resources.AutoCompletion.key,s={};t.Util.extend(s,this.options.autocompleteOptions),t.Util.extend(s,e),t.Util.extend(s,{apiKey:s.apiKey||this.options.apiKey||o}),i.Services.autoComplete(s)}}},_fillAutoCompletedLocationListContainer:function(t){if(t&&0!==t.length){var e=this._suggestedContainer;if(e.childElementCount)for(;e.firstChild;)e.removeChild(e.firstChild);for(var i=0;i<t.length;i++)this._createLocationAutoCompletedLocationElement(this.options.tag.id,t[i],i);this._suggestedLocations=t}},_requestReverseGeocode:function(e){if(e&&0!==Object.keys(e).length&&e.position&&0!==Object.keys(e.position).length){if(this._noRightManagement)return void console.log("no rights for all service !?");if(!this._resources.ReverseGeocode)return void console.log("no rights for this service !?");var n=this._resources.ReverseGeocode.resources;if(n&&0!==Object.keys(n).length){var o=this._resources.ReverseGeocode.key,s={};t.Util.extend(s,this.options.reverseGeocodeOptions),t.Util.extend(s,e),t.Util.extend(s,{returnFreeForm:!0,filterOptions:{type:["StreetAddress"]}}),t.Util.extend(s,{apiKey:s.apiKey||this.options.apiKey||o}),i.Services.reverseGeocode(s)}}},_displayResultOfCoordinate:function(t){this._setCoordinate(t),this._setMarker({x:t.lng,y:t.lat},null,!1),this.onActivateMapPointClick()},_displayResultOfLabel:function(t){var e=t.placeAttributes,i=e.number+" "+e.street+", "+e.postalCode+" "+e.commune;this._setCoordinate({lat:t.position.x,lng:t.position.y}),this._setLabel(i),this._setMarker({x:t.position.y,y:t.position.x},null,!1),this._inputShowPointerContainer.checked=!1,this._inputAutoCompleteContainer.className="GPlocationOriginVisible",this._inputCoordinateContainer.className="GPlocationOriginHidden",this.onActivateMapPointClick()},onAutoCompleteSearchText:function(t){var e=t.target.value;if(e){if(this._noRightManagement)return void console.log("no rights for this service !?");if(this._currentLocation=e,!(e.length<3)){var i=this;this._requestAutoComplete({text:e,maximumResponses:5,onSuccess:function(t){if(t){var e=t.suggestedLocations;i._fillAutoCompletedLocationListContainer(e)}},onFailure:function(t){i._clearSuggestedLocation()}})}}},onAutoCompletedResultsItemClick:function(t){var e=o.index(t.target.id);if(e){var i={x:this._suggestedLocations[e].position.x,y:this._suggestedLocations[e].position.y},n={type:this._suggestedLocations[e].type,fields:this._suggestedLocations[e]},s=this._suggestedLocations[e].fullText;this._setLabel(s),this._setPosition(i),this._setMarker(i,n,this.options.displayInfo),this._coordinate=i}},onActivateMapPointClick:function(t){var e=this._map;this._inputShowPointerContainer.checked?this._activeDragAndDrop||(e.on("click",this.onMouseMapClick,this),this._setCursor("crosshair"),this._setMarker(),this._clearResults()):this._activeDragAndDrop||(e.off("click",this.onMouseMapClick,this),this._setCursor())},onLocationClearPointClick:function(t){this._setCursor(),this._setMarker(),this._clearResults(),this._inputAutoCompleteContainer.focus()},onLocationRemovePointClick:function(t){this._setCursor(),this._setMarker(),this._clearResults()},onLocationAddPointClick:function(t){},onMouseMapClick:function(t){var e=t.latlng;if(this.options.disableReverse||this._noRightManagement)this._displayResultOfCoordinate(e);else{var i=this;this._requestReverseGeocode({position:{x:e.lat,y:e.lng},srs:"EPSG:4326",onSuccess:function(t){if(0!==t.locations.length){var n=t.locations[0];i._displayResultOfLabel(n)}else i._displayResultOfCoordinate(e)},onFailure:function(t){i._displayResultOfCoordinate(e)}})}},onStartDragMarker:function(){this._marker&&(this._activeDragAndDrop=!0,this._inputShowPointerContainer.checked=!0,this._inputAutoCompleteContainer.className="GPlocationOriginHidden",this._inputCoordinateContainer.className="GPlocationOriginVisible",this._marker.unbindPopup(),this._setLabel(),this._clearResults())},onDragMarker:function(){if(this._marker){this._activeDragAndDrop=!1,this._inputShowPointerContainer.checked=!0;var t=this._marker.getLatLng();this._setCoordinate(t)}},onEndDragMarker:function(){if(this._marker){this._inputShowPointerContainer.checked=!0;var t=this._marker.getLatLng();this._pressedKeyOnDragAndDrop?this._setCoordinate(t):this.onMouseMapClick({latlng:t}),this._activeDragAndDrop=!1,this._pressedKeyOnDragAndDrop=!1}},onMouseDownMarker:function(t){this._marker&&(this._pressedKeyOnDragAndDrop=t.originalEvent.ctrlKey)}});return l}(leaflet,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,CommonControlsLocationSelectorDOM,LeafletControlsUtilsPositionFormater,LeafletControlsUtilsIconDefault),CommonControlsIsoDOM=function(){var t={_addUID:function(t){return t+"-"+this._uid},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPisochron"),t.className="GPwidget",t},_createShowIsoElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowIsochron"),t.type="checkbox",t},_createShowIsoPictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowIsochronPicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowIsochron"),e.title="Calculer une isochrone",e.addEventListener?e.addEventListener("click",function(e){t.onShowIsoPanelClick(e)}):e.attachEvent&&e.attachEvent("onclick",function(e){t.onShowIsoPanelClick(e)});var i=document.createElement("span");return i.id=this._addUID("GPshowIsochronOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createIsoPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPisochronPanel"),t.className="GPpanel",t},_createIsoPanelHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Calcul d'isochrone",e.appendChild(i);var n=document.createElement("div");return n.id=this._addUID("GPisochronPanelClose"),n.className="GPpanelClose",n.title="Fermer le panneau",n.addEventListener?n.addEventListener("click",function(){
+document.getElementById(t._addUID("GPshowIsochronPicto")).click()},!1):n.attachEvent&&n.attachEvent("onclick",function(){document.getElementById(t._addUID("GPshowIsochronPicto")).click()}),e.appendChild(n),e},_createIsoPanelFormElement:function(){var t=this,e=document.createElement("form");return e.id=this._addUID("GPisochronForm"),e.addEventListener("submit",function(e){return e.preventDefault(),t.onIsoComputationSubmit(e),!1}),e},_createIsoWaitingElement:function(){var t=document.createElement("div");t.id=this._addUID("GPisochronCalcWaitingContainer"),t.className="GPisochronCalcWaitingContainerHidden";var e=document.createElement("p");return e.className="GPisochronCalcWaiting",e.innerHTML="Calcul en cours...",t.appendChild(e),t},_createIsoPanelFormTypeChoiceElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPisochronChoice"),t},_createIsoPanelFormTypeChoiceChronElement:function(t){var e=this,i=document.createElement("div");i.className="GPisochronChoiceAlt";var n=document.createElement("input");n.id=this._addUID("GPisochronChoiceAltChron"),n.name="GPisochronChoiceMode",n.type="radio",n.checked=!!t,n.addEventListener?n.addEventListener("change",function(t){document.getElementById(e._addUID("GPisochronValueChron")).className="GPflexInput",document.getElementById(e._addUID("GPisochronValueDist")).className="GPisochronValueHidden",e.onIsoTypeChoiceChange(t)},!1):n.attachEvent&&n.attachEvent("onchange",function(){document.getElementById(e._addUID("GPisochronValueChron")).className="GPflexInput",document.getElementById(e._addUID("GPisochronValueDist")).className="GPisochronValueHidden",e.onIsoTypeChoiceChange()}),n.value="isochron",i.appendChild(n);var o=document.createElement("label");o.className="GPisochronChoiceAltImg",o.htmlFor=this._addUID("GPisochronChoiceAltChron"),i.appendChild(o);var s=document.createElement("span");return s.id=this._addUID("GPisochronChoiceAltChronTxt"),s.innerHTML="isochrone",s.addEventListener?s.addEventListener("click",function(){document.getElementById(e._addUID("GPisochronChoiceAltChron")).click()},!1):s.attachEvent&&s.attachEvent("onclick",function(){document.getElementById(e._addUID("GPisochronChoiceAltChron")).click()}),i.appendChild(s),i},_createIsoPanelFormTypeChoiceDistElement:function(t){var e=this,i=document.createElement("div");i.className="GPisochronChoiceAlt";var n=document.createElement("input");n.id=this._addUID("GPisochronChoiceAltDist"),n.name="GPisochronChoiceMode",n.type="radio",n.checked=!!t,n.addEventListener?n.addEventListener("change",function(t){document.getElementById(e._addUID("GPisochronValueDist")).className="GPflexInput",document.getElementById(e._addUID("GPisochronValueChron")).className="GPisochronValueHidden",e.onIsoTypeChoiceChange(t)},!1):n.attachEvent&&n.attachEvent("onchange",function(){document.getElementById(e._addUID("GPisochronValueDist")).className="GPflexInput",document.getElementById(e._addUID("GPisochronValueChron")).className="GPisochronValueHidden",e.onIsoTypeChoiceChange()}),n.value="isodistance",i.appendChild(n);var o=document.createElement("label");o.className="GPisochronChoiceAltImg",o.htmlFor=this._addUID("GPisochronChoiceAltDist"),i.appendChild(o);var s=document.createElement("span");return s.id=this._addUID("GPisochronChoiceAltDistTxt"),s.innerHTML="isodistance",s.addEventListener?s.addEventListener("click",function(){document.getElementById(e._addUID("GPisochronChoiceAltDist")).click()},!1):s.attachEvent&&s.attachEvent("onclick",function(){document.getElementById(e._addUID("GPisochronChoiceAltDist")).click()}),i.appendChild(s),i},_createIsoPanelFormValueIsochronElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GPisochronValueChron"),i.className=t?"GPflexInput":"GPisochronValueHidden";var n=document.createElement("label");n.id=this._addUID("GPisochronValueChronLabel"),n.htmlFor=this._addUID("GPisochronValueChronInput"),n.innerHTML="Temps",i.appendChild(n);var o=document.createElement("input");o.id=this._addUID("GPisochronValueChronInput1"),o.min="0",o.step="1",o.value="0",o.type="number",o.addEventListener?o.addEventListener("change",function(t){"function"==typeof e.onIsoValueChronTimeMinuteChange&&e.onIsoValueChronTimeHourChange(t)}):o.attachEvent&&o.attachEvent("onchange",function(t){"function"==typeof e.onIsoValueChronTimeMinuteChange&&e.onIsoValueChronTimeHourChange(t)}),i.appendChild(o);var s=document.createElement("label");s.innerHTML="h",i.appendChild(s);var r=document.createElement("input");r.id=this._addUID("GPisochronValueChronInput2"),r.min="0",r.max="59",r.step="1",r.value="0",r.type="number",r.addEventListener?r.addEventListener("change",function(t){"function"==typeof e.onIsoValueChronTimeMinuteChange&&e.onIsoValueChronTimeMinuteChange(t)}):r.attachEvent&&r.attachEvent("onchange",function(t){"function"==typeof e.onIsoValueChronTimeMinuteChange&&e.onIsoValueChronTimeMinuteChange(t)}),i.appendChild(r);var a=document.createElement("label");return a.innerHTML="min",i.appendChild(a),i},_createIsoPanelFormValueIsodistanceElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GPisochronValueDist"),i.className=t?"GPflexInput":"GPisochronValueHidden";var n=document.createElement("label");n.id=this._addUID("GPisochronValueDistLabel"),n.htmlFor=this._addUID("GPisochronValueDistInput"),n.innerHTML="Distance",i.appendChild(n);var o=document.createElement("input");o.id=this._addUID("GPisochronValueDistInput"),o.min="0",o.step="any",o.value="0",o.type="number",o.addEventListener?o.addEventListener("change",function(t){"function"==typeof e.onIsoValueDistChange&&e.onIsoValueDistChange(t)}):o.attachEvent&&o.attachEvent("onchange",function(t){"function"==typeof e.onIsoValueDistChange&&e.onIsoValueDistChange(t)}),i.appendChild(o);var s=document.createElement("label");return s.innerHTML="km",i.appendChild(s),i},_createIsoPanelFormModeChoiceElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPisochronModeChoice"),t},_createIsoPanelFormModeChoiceTransportElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GPisochronTransportChoice");var n=document.createElement("span");n.className="GPisochronModeLabel",n.innerHTML="Mode de transport",i.appendChild(n);for(var o=0;o<t.length;o++){var s=t[o];if("Voiture"===s){var r=document.createElement("input");r.id=this._addUID("GPisochronTransportCar"),r.type="radio",r.name="GPisochronTransport",0===o&&(r.checked=!0),r.addEventListener?r.addEventListener("change",function(t){e.onIsoModeTransportChange(t)}):r.attachEvent&&r.attachEvent("onchange",function(t){e.onIsoModeTransportChange(t)}),r.value="Voiture",i.appendChild(r);var a=document.createElement("label");a.className="GPisochronTransportImg",a.htmlFor=this._addUID("GPisochronTransportCar"),a.title="Voiture",i.appendChild(a)}if("Pieton"===s){var l=document.createElement("input");l.id=this._addUID("GPisochronTransportPedestrian"),l.type="radio",l.name="GPisochronTransport",0===o&&(l.checked=!0),l.addEventListener?l.addEventListener("change",function(t){e.onIsoModeTransportChange(t)}):l.attachEvent&&l.attachEvent("onchange",function(t){e.onIsoModeTransportChange(t)}),l.value="Pieton",i.appendChild(l);var c=document.createElement("label");c.className="GPisochronTransportImg",c.htmlFor=this._addUID("GPisochronTransportPedestrian"),c.title="Piéton",i.appendChild(c)}}return i},_createIsoPanelFormModeChoiceDirectionElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GPisochronDirectionChoice");var n=document.createElement("span");n.className="GPisochronModeLabel",n.innerHTML="Sens de parcours",i.appendChild(n);var o=document.createElement("select");o.id=this._addUID("GPisochronDirectionSelect"),o.className="GPinputSelect",o.addEventListener("change",function(t){e.onIsoModeDirectionChange(t)});for(var s=0;s<t.length;s++){var r=t[s];if("departure"===r.toLowerCase()){var a=document.createElement("option");0===s&&(a.selected="selected"),a.value="departure",a.text="Départ",o.appendChild(a)}if("arrival"===r.toLowerCase()){var l=document.createElement("option");0===s&&(l.selected="selected"),l.value="arrival",l.text="Arrivée",o.appendChild(l)}}return i.appendChild(o),i},_createShowIsoExclusionsElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowIsoExclusions"),t.type="checkbox",t},_createShowIsoExclusionsPictoElement:function(){var t=document.createElement("label");return t.id=this._addUID("GPshowIsoExclusionsPicto"),t.className="GPshowMoreOptions GPshowIsoExclusionsPicto",t.htmlFor=this._addUID("GPshowIsoExclusions"),t.title="Exclusions",t.style.top="240px",t},_createIsoPanelFormExclusionsElement:function(){var t=document.createElement("div");t.id=this._addUID("GPisoExclusions");var e=document.createElement("span");return e.className="GPisoExclusionsLabel",e.innerHTML="Passages autorisés",t.appendChild(e),t},_createIsoPanelFormExclusionOptionsElement:function(t){var e=this,i=document.createElement("div");i.className="GPisoExclusionsOptions";for(var n in t)if(t.hasOwnProperty(n)){var o=t[n];switch(n){case"toll":var s=document.createElement("input");s.id=this._addUID("GPisoExclusionsToll"),s.type="checkbox",s.checked=!o,s.addEventListener?s.addEventListener("change",function(t){e.onIsoExclusionsChange(t)}):s.attachEvent&&s.attachEvent("onchange",function(t){e.onIsoExclusionsChange(t)}),s.value="Toll",i.appendChild(s);var r=document.createElement("label");r.className="GPisoExclusionsOption",r.htmlFor=this._addUID("GPisoExclusionsToll"),r.innerHTML="Péages",i.appendChild(r);break;case"tunnel":var a=document.createElement("input");a.id=this._addUID("GPisoExclusionsTunnel"),a.type="checkbox",a.checked=!o,a.addEventListener?a.addEventListener("change",function(t){e.onIsoExclusionsChange(t)}):a.attachEvent&&a.attachEvent("onchange",function(t){e.onIsoExclusionsChange(t)}),a.value="Tunnel",i.appendChild(a);var l=document.createElement("label");l.className="GPisoExclusionsOption",l.htmlFor=this._addUID("GPisoExclusionsTunnel"),l.innerHTML="Tunnels",i.appendChild(l);break;case"bridge":var c=document.createElement("input");c.id=this._addUID("GPisoExclusionsBridge"),c.type="checkbox",c.checked=!o,c.addEventListener?c.addEventListener("change",function(t){e.onIsoExclusionsChange(t)}):c.attachEvent&&c.attachEvent("onchange",function(t){e.onIsoExclusionsChange(t)}),c.value="Bridge",i.appendChild(c);var h=document.createElement("label");h.className="GPisoExclusionsOption",h.htmlFor=this._addUID("GPisoExclusionsBridge"),h.innerHTML="Ponts",i.appendChild(h)}}return i},_createIsoSubmitFormElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPisochronSubmit"),t.className="GPinputSubmit",t.type="submit",t.value="Calculer",t},_createIsoFormResetElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPisochronReset"),e.title="Réinitialiser les paramètres",e.addEventListener("click",function(e){t.onIsoResetClick(e)}),e}};return t}(),LeafletControlsIsocurve=function(t,e,i,n,o,s,r){var a=t.Control.extend({includes:r,options:{position:"topleft",collapsed:!0,methods:["time","distance"],graphs:["Voiture","Pieton"],exclusions:{toll:!1,tunnel:!1,bridge:!1},directions:["departure","arrival"],disableReverse:!1,isocurveOptions:{},autocompleteOptions:{}},initialize:function(e){t.Util.setOptions(this,e),this._uid=o.generate(),this._isDesktop=this._detectSupport(),this._waitingContainer=null,this._showContainer=null,this._formContainer=null,this._submitContainer=null,this._currentTransport=null,this._currentDirection=null,this._currentComputation=null,this._currentTimeHour=0,this._currentTimeMinute=0,this._currentDistance=0,this._currentExclusions=[],this._initTransport(),this._initComputation(),this._initDirection(),this._initExclusions(),this._currentPoint=null,this._geojsonIso=null,this._waiting=!1,this._timer=null,this._currentIsoResults=null,this._resources={},this._noRightManagement=!1,this._checkRightsManagement()},onAdd:function(e){var i=this._container=this._initLayout(e);return t.DomEvent.disableClickPropagation(i).disableScrollPropagation(i),i},onRemove:function(){},_initTransport:function(){this._currentTransport="Voiture";var e=this.options.graphs;e&&0!==e.length||(this.options.graphs=["Voiture","Pieton"]),t.Util.isArray(e)&&e.length&&("Voiture"!==e[0]&&"Pieton"!==e[0]||(this._currentTransport=e[0]));var i=this.options.isocurveOptions;i.graph&&(this._currentTransport=i.graph)},_initDirection:function(){this._currentDirection="departure";var e=this.options.directions;e&&0!==e.length||(this.options.directions=["departure","arrival"]),t.Util.isArray(e)&&e.length&&("departure"!==e[0]&&"arrival"!==e[0]||(this._currentDirection=e[0]));var i=this.options.isocurveOptions;i.reverse||(this._currentDirection="departure"),i.reverse===!0&&(this._currentDirection="arrival",this.options.directions=["arrival","departure"])},_initComputation:function(){this._currentComputation="time";var e=this.options.methods;e&&0!==e.length||(this.options.methods=["time","distance"]),t.Util.isArray(e)&&e.length&&("time"!==e[0]&&"distance"!==e[0]||(this._currentComputation=e[0]));var i=this.options.isocurveOptions;i.method&&(this._currentComputation=i.method),i.time&&(this._currentComputation="time"),i.distance&&(this._currentComputation="distance")},_initExclusions:function(){this._currentExclusions=[];var t=this.options.exclusions;if((!t||"object"==typeof t&&0===Object.keys(t).length)&&(this.options.exclusions={toll:!1,tunnel:!1,bridge:!1}),t&&"object"==typeof t&&Object.keys(t).length)for(var e in t)t.hasOwnProperty(e)&&t.k&&this._currentExclusions.push(e);var i=this.options.isocurveOptions;Array.isArray(i.exclusions)&&(this._currentExclusions=i.exclusions)},_checkRightsManagement:function(){var t=null,e=[],i=null;i=this.options.isocurveOptions.apiKey,t=this.options.isocurveOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=["Voiture","Pieton"]);var o=n.check({key:i||this.options.apiKey,resources:e,services:["Isochrone"]});i=this.options.autocompleteOptions.apiKey,t=this.options.autocompleteOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=["PositionOfInterest","StreetAddress"]);var s=n.check({key:i||this.options.apiKey,resources:e,services:["AutoCompletion"]});o||s||(this._noRightManagement=!0),s&&(this._resources.AutoCompletion={},this._resources.AutoCompletion.resources=s.AutoCompletion,this._resources.AutoCompletion.key=s.key),o&&(this._resources.Isochrone={},this._resources.Isochrone.resources=o.Isochrone,this._resources.Isochrone.key=o.key)},_detectSupport:function(){var t=!0,e=window.navigator.userAgent.toLowerCase();return e.indexOf("iphone")===-1&&e.indexOf("ipod")===-1&&e.indexOf("ipad")===-1&&e.indexOf("android")===-1&&e.indexOf("mobile")===-1&&e.indexOf("blackberry")===-1&&e.indexOf("tablet")===-1&&e.indexOf("phone")===-1&&e.indexOf("touch")===-1||(t=!1),e.indexOf("msie")===-1&&e.indexOf("trident")===-1||(t=!0),t},_initLayout:function(t){var e=this._createMainContainerElement(),i=this._showContainer=this._createShowIsoElement();e.appendChild(i),this.options.collapsed||(i.checked=!0);var n=this._createShowIsoPictoElement();e.appendChild(n);var o=this._createIsoPanelElement(),s=this._createIsoPanelHeaderElement();o.appendChild(s);var r=this._formContainer=this._createIsoPanelFormElement(),a=this._createIsoPanelFormPointElement(t);r.appendChild(a);for(var l=!1,c=!1,h=this._createIsoPanelFormTypeChoiceElement(),u=0;u<this.options.methods.length;u++)"time"===this.options.methods[u]&&(l=0===u,h.appendChild(this._createIsoPanelFormTypeChoiceChronElement(l))),"distance"===this.options.methods[u]&&(c=0===u,h.appendChild(this._createIsoPanelFormTypeChoiceDistElement(c)));r.appendChild(h),r.appendChild(this._createIsoPanelFormValueIsochronElement(l)),r.appendChild(this._createIsoPanelFormValueIsodistanceElement(c));var d=this._createIsoPanelFormModeChoiceElement();if(d.appendChild(this._createIsoPanelFormModeChoiceTransportElement(this.options.graphs)),d.appendChild(this._createIsoPanelFormModeChoiceDirectionElement(this.options.directions)),r.appendChild(d),this.options.exclusions&&"object"==typeof this.options.exclusions&&0!==Object.keys(this.options.exclusions).length){r.appendChild(this._createShowIsoExclusionsElement()),r.appendChild(this._createShowIsoExclusionsPictoElement());var p=this._createIsoPanelFormExclusionsElement();p.appendChild(this._createIsoPanelFormExclusionOptionsElement(this.options.exclusions)),r.appendChild(p)}var m=this._createIsoFormResetElement();r.appendChild(m);var f=this._submitContainer=this._createIsoSubmitFormElement();r.appendChild(f),o.appendChild(r);var _=this._waitingContainer=this._createIsoWaitingElement();return o.appendChild(_),e.appendChild(o),e},_createIsoPanelFormPointElement:function(t){return this._currentPoint=new s({apiKey:this.options.apiKey||null,tag:{id:0,unique:this._uid,label:"Départ",color:"red",display:!0},displayInfo:!0,disableReverse:this.options.disableReverse,autocompleteOptions:this.options.autocompleteOptions||null}),this._currentPoint.setMap(t),this._currentPoint.getContainer()},onShowIsoPanelClick:function(t){},onIsoResetClick:function(t){this._clear()},onIsoTypeChoiceChange:function(t){var e=t.target.value;e&&("isodistance"===e&&(this._currentComputation="distance"),"isochron"===e&&(this._currentComputation="time"))},onIsoModeTransportChange:function(t){var e=t.target.value;e&&(this._currentTransport=e)},onIsoModeDirectionChange:function(t){var e=t.target.value;e&&(this._currentDirection=e)},onIsoValueChronTimeHourChange:function(t){var e=t.target.value;this._timeHourContainer=t.target,e&&(this._currentTimeHour=e)},onIsoValueChronTimeMinuteChange:function(t){var e=t.target.value;this._timeMinuteContainer=t.target,e&&(this._currentTimeMinute=e)},onIsoValueDistChange:function(t){var e=t.target.value;this._distanceContainer=t.target,e&&(this._currentDistance=e)},onIsoExclusionsChange:function(t){var e=t.target.value,i=t.target.checked;if(e){for(var n=!1,o=null,s=0;s<this._currentExclusions.length;s++)this._currentExclusions[s]===e&&(o=s,n=!0);n||i||this._currentExclusions.push(e),n&&i&&this._currentExclusions.splice(o,1)}},onIsoComputationSubmit:function(){if(this._currentPoint&&this._currentPoint.getCoordinate&&this._currentPoint.getCoordinate()){var t;"time"===this._currentComputation.toLowerCase()&&(t=3600*this._currentTimeHour+60*this._currentTimeMinute);var e;if("distance"===this._currentComputation.toLowerCase()&&(e=1e3*this._currentDistance),(t||e)&&!this._noRightManagement){this._displayWaitingContainer();var i=this;this._requestIsoCurve({position:i._currentPoint.getCoordinate(),graph:i._currentTransport,exclusions:i._currentExclusions,method:i._currentComputation,reverse:"arrival"===i._currentDirection.toLowerCase(),time:t,distance:e,smoothing:!0,timeout:7e3,protocol:"XHR",onSuccess:function(t){t&&i._drawIsoResults(t)},onFailure:function(t){i._hideWaitingContainer(),i._clearIsoResultsGeometry()}})}}},_requestIsoCurve:function(e){if(e&&("object"!=typeof e||0!==Object.keys(e).length)&&e.position&&!this._noRightManagement){var n=this._resources.Isochrone;if(n){var o=n.resources;if(o&&("object"!=typeof o||0!==Object.keys(o).length)){var s={};t.Util.extend(s,e),t.Util.extend(s,this.options.isocurveOptions);for(var r=!1,a=0;a<o.length;a++)o[a]===s.graph&&(r=!0);if(!r)return void console.log("no rights for this service !?");var l=this._resources.Isochrone.key;s.apiKey=this.options.isocurveOptions.apiKey||this.options.apiKey||l,i.Services.isoCurve(s)}}}},_drawIsoResults:function(e){if(this._clearIsoResultsGeometry(),this._currentIsoResults=e,!e.geometry)return void this._hideWaitingContainer();var i=this._map,n=e.geometry,o={color:"#ff7800",weight:5,opacity:.65};this._geojsonIso=t.geoJson(n,{style:o}).addTo(i),this._hideWaitingContainer(),this._formContainer.className="GPisochroComponentHidden"},_clear:function(){this._initTransport(),this._initExclusions(),this._initComputation(),this._initDirection(),this._currentIsoResults=null,this._clearIsoResultsGeometry(),this._currentPoint.clear(),this._timeHourContainer&&(this._timeHourContainer.value=0),this._timeMinuteContainer&&(this._timeMinuteContainer.value=0),this._distanceContainer&&(this._distanceContainer.value=0)},_clearIsoResultsGeometry:function(){var t=this._map;null!=this._geojsonIso&&(t.removeLayer(this._geojsonIso),this._geojsonIso=null)},_displayWaitingContainer:function(){this._waitingContainer.className="GPisochronCalcWaitingContainerVisible",this._waiting=!0,this._timer&&(clearTimeout(this._timer),this._timer=null);var t=this;this._timer=setTimeout(function(){t._waiting===!0?t._hideWaitingContainer():t._timer&&clearTimeout(t._timer)},16e3)},_hideWaitingContainer:function(){this._waiting&&(this._waitingContainer.className="GPisochronCalcWaitingContainerHidden",this._waiting=!1,clearTimeout(this._timer),this._timer=null)}});return a}(leaflet,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,LeafletControlsLocationSelector,CommonControlsIsoDOM),CommonControlsMousePositionDOM=function(){var t={_addUID:function(t){var e=this._uid?t+"-"+this._uid:t;return e},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPmousePosition"),t.className="GPwidget",t},_createShowMousePositionElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowMousePosition"),t.type="checkbox",t},_createShowMousePositionPictoElement:function(t){var e=this,i=document.createElement("label");i.id=this._addUID("GPshowMousePositionPicto"),i.className="GPshowAdvancedToolPicto",i.htmlFor=this._addUID("GPshowMousePosition"),i.title="Afficher les coordonnées du curseur",i.addEventListener("click",function(i){var n="";document.getElementById(e._addUID("GPshowMousePosition")).checked||t||(n="GPmapCenterVisible"),document.getElementById("GPmapCenter").className=n,e.onShowMousePositionClick(i)});var n=document.createElement("span");return n.id=this._addUID("GPshowMousePositionOpen"),n.className="GPshowAdvancedToolOpen",i.appendChild(n),i},_createMousePositionPanelElement:function(t,e){t=!!t||"undefined"==typeof t,e=!!e||"undefined"==typeof e;var i=document.createElement("div");i.id=this._addUID("GPmousePositionPanel"),i.className="GPpanel",i.appendChild(this._createMousePositionPanelHeaderElement()),i.appendChild(this._createMousePositionPanelBasicElement(t,e));for(var n=this._createShowMousePositionSettingsElement(e),o=0;o<n.length;o++)i.appendChild(n[o]);return i},_createMapCenter:function(){var t=document.createElement("div");return t.id="GPmapCenter",t.className="",t},_createMousePositionPanelHeaderElement:function(){var t=document.createElement("div");t.className="GPpanelHeader";var e=document.createElement("div");e.className="GPpanelTitle",e.innerHTML="Coordonnées",t.appendChild(e);var i=document.createElement("div");i.id="GPmousePositionPanelClose",i.className="GPpanelClose",i.title="Fermer le panneau";var n=this;return i.addEventListener?i.addEventListener("click",function(){document.getElementById(n._addUID("GPshowMousePositionPicto")).click()},!1):i.attachEvent&&i.attachEvent("onclick",function(){document.getElementById(n._addUID("GPshowMousePositionPicto")).click()}),t.appendChild(i),t},_createMousePositionPanelBasicElement:function(t,e){var i=document.createElement("div");return i.id=this._addUID("GPmousePositionBasicPanel"),i.appendChild(this._createMousePositionPanelBasicCoordinateElement(e)),i.appendChild(this._createMousePositionPanelBasicAltitudeElement(t)),i},_createMousePositionPanelBasicCoordinateElement:function(t){var e=document.createElement("div");e.id=this._addUID("GPmousePositionCoordinate"),e.style.display=t?"block":"none";var i=document.createElement("span");i.className="GPmousePositionLabel",i.id=this._addUID("GPmousePositionLatLabel"),i.innerHTML="Latitude : ",e.appendChild(i);var n=document.createElement("span");n.className="GPmousePositionCoords",n.id=this._addUID("GPmousePositionLat"),n.innerHTML="",e.appendChild(n);var o=document.createElement("span");o.className="GPmousePositionLabel",o.id=this._addUID("GPmousePositionLonLabel"),o.innerHTML="Longitude : ",e.appendChild(o);var s=document.createElement("span");return s.className="GPmousePositionCoords",s.id=this._addUID("GPmousePositionLon"),s.innerHTML="",e.appendChild(s),e},_createMousePositionPanelBasicAltitudeElement:function(t){var e=document.createElement("div");e.id=this._addUID("GPmousePositionAltitude"),e.style.display=t?"block":"none";var i=document.createElement("span");i.className="GPmousePositionLabel",i.innerHTML="Altitude : ",e.appendChild(i);var n=document.createElement("span");return n.className="GPmousePositionCoords",n.id=this._addUID("GPmousePositionAlt"),n.innerHTML="",e.appendChild(n),e},_createShowMousePositionSettingsElement:function(t){var e=[],i=document.createElement("input");i.type="checkbox",i.id=this._addUID("GPshowMousePositionSettings");var n=document.createElement("label");return n.id=this._addUID("GPshowMousePositionSettingsPicto"),n.htmlFor=this._addUID("GPshowMousePositionSettings"),n.title="Réglages",n.className="GPshowMoreOptions GPshowMousePositionSettingsPicto",n.style.display=t?"block":"none",e.push(i),e.push(n),e},_createMousePositionSettingsElement:function(){var t=document.createElement("div");t.id=this._addUID("GPmousePositionSettings");var e=document.createElement("span");return e.className="GPmousePositionSettingsLabel",e.innerHTML="Système de référence",t.appendChild(e),t},_createMousePositionSettingsSystemsElement:function(t){var e=this,i=document.createElement("select");i.id=this._addUID("GPmousePositionProjectionSystem"),i.className="GPinputSelect GPmousePositionSettingsSelect",i.addEventListener("change",function(t){e.onMousePositionProjectionSystemChange(t)}),i.addEventListener("mouseover",function(t){e.onMousePositionProjectionSystemMouseOver(t)});for(var n=0;n<t.length;n++){var o=t[n],s=document.createElement("option");s.value=o.code,s.text=o.label||n,i.appendChild(s)}return i},_createMousePositionSettingsUnitsElement:function(t){var e=this,i=document.createElement("select");i.id=this._addUID("GPmousePositionProjectionUnits"),i.className="GPinputSelect GPmousePositionSettingsSelect",i.addEventListener("change",function(t){e.onMousePositionProjectionUnitsChange(t)});for(var n=0;n<t.length;n++){var o=t[n],s=document.createElement("option");s.value=o.code?o.code:n,s.text=o.label||n,i.appendChild(s)}return i},GPdisplayCoords:function(t){if(t&&null!=t){var e=document.getElementById(this._addUID("GPmousePositionLonLabel")),i=document.getElementById(this._addUID("GPmousePositionLatLabel"));t.x||t.y?(i.innerHTML="X : ",e.innerHTML="Y : "):t.e||t.n?(i.innerHTML="E : ",e.innerHTML="N : "):(i.innerHTML="Latitude : ",e.innerHTML="Longitude : ");var n=document.getElementById(this._addUID("GPmousePositionLat")),o=document.getElementById(this._addUID("GPmousePositionLon"));n.innerHTML=t.x||t.lat||t.e||"0",t.unit&&(n.innerHTML+=" ",n.innerHTML+=t.unit),o.innerHTML=t.y||t.lng||t.lon||t.n||"0",t.unit&&(o.innerHTML+=" ",o.innerHTML+=t.unit)}},GPdisplayElevation:function(t,e,i,n){var o,s=this;e||(e=500),clearTimeout(o),document.getElementById(this._addUID("GPmousePositionAlt")).innerHTML="...",null==i&&(i=-99999),null==n&&(n=99980);var r=i+n,a=i-n;t&&null!=t&&document.getElementById(this._addUID("GPmousePositionAltitude"))&&(o=setTimeout(function(){s.onRequestAltitude(t,function(t){a<t&&t<r?document.getElementById(s._addUID("GPmousePositionAlt")).innerHTML="--- m":document.getElementById(s._addUID("GPmousePositionAlt")).innerHTML=t+" m"})},e))}};return t}(),!function(t){if("object"==typeof exports)module.exports=t();else{proj4=function(){return"function"==typeof t?t():t}()}}(function(){return function t(e,i,n){function o(r,a){if(!i[r]){if(!e[r]){var l="function"==typeof require&&require;if(!a&&l)return l(r,!0);if(s)return s(r,!0);throw new Error("Cannot find module '"+r+"'")}var c=i[r]={exports:{}};e[r][0].call(c.exports,function(t){var i=e[r][1][t];return o(i?i:t)},c,c.exports,t,e,i,n)}return i[r].exports}for(var s="function"==typeof require&&require,r=0;r<n.length;r++)o(n[r]);return o}({1:[function(t,e){function i(t,e,n){if(!(this instanceof i))return new i(t,e,n);if(Array.isArray(t))this.x=t[0],this.y=t[1],this.z=t[2]||0;else if("object"==typeof t)this.x=t.x,this.y=t.y,this.z=t.z||0;else if("string"==typeof t&&"undefined"==typeof e){var o=t.split(",");this.x=parseFloat(o[0],10),this.y=parseFloat(o[1],10),this.z=parseFloat(o[2],10)||0}else this.x=t,this.y=e,this.z=n||0;console.warn("proj4.Point will be removed in version 3, use proj4.toPoint")}var n=t("mgrs");i.fromMGRS=function(t){return new i(n.toPoint(t))},i.prototype.toMGRS=function(t){return n.forward([this.x,this.y],t)},e.exports=i},{mgrs:66}],2:[function(t,e){function i(t,e){if(!(this instanceof i))return new i(t);e=e||function(t){if(t)throw t};var s=n(t);if("object"!=typeof s)return void e(t);var a=r(s),l=i.projections.get(a.projName);l?(o(this,a),o(this,l),this.init(),e(null,this)):e(t)}var n=t("./parseCode"),o=t("./extend"),s=t("./projections"),r=t("./deriveConstants");i.projections=s,i.projections.start(),e.exports=i},{"./deriveConstants":32,"./extend":33,"./parseCode":36,"./projections":38}],3:[function(t,e){e.exports=function(t,e,i){var n,o,s,r=i.x,a=i.y,l=i.z||0;for(s=0;3>s;s++)if(!e||2!==s||void 0!==i.z)switch(0===s?(n=r,o="x"):1===s?(n=a,o="y"):(n=l,o="z"),t.axis[s]){case"e":i[o]=n;break;case"w":i[o]=-n;break;case"n":i[o]=n;break;case"s":i[o]=-n;break;case"u":void 0!==i[o]&&(i.z=n);break;case"d":void 0!==i[o]&&(i.z=-n);break;default:return null}return i}},{}],4:[function(t,e){var i=Math.PI/2,n=t("./sign");e.exports=function(t){return Math.abs(t)<i?t:t-n(t)*Math.PI}},{"./sign":21}],5:[function(t,e){var i=2*Math.PI,n=t("./sign");e.exports=function(t){return Math.abs(t)<Math.PI?t:t-n(t)*i}},{"./sign":21}],6:[function(t,e){e.exports=function(t){return Math.abs(t)>1&&(t=t>1?1:-1),Math.asin(t)}},{}],7:[function(t,e){e.exports=function(t){return 1-.25*t*(1+t/16*(3+1.25*t))}},{}],8:[function(t,e){e.exports=function(t){return.375*t*(1+.25*t*(1+.46875*t))}},{}],9:[function(t,e){e.exports=function(t){return.05859375*t*t*(1+.75*t)}},{}],10:[function(t,e){e.exports=function(t){return t*t*t*(35/3072)}},{}],11:[function(t,e){e.exports=function(t,e,i){var n=e*i;return t/Math.sqrt(1-n*n)}},{}],12:[function(t,e){e.exports=function(t,e,i,n,o){var s,r;s=t/e;for(var a=0;15>a;a++)if(r=(t-(e*s-i*Math.sin(2*s)+n*Math.sin(4*s)-o*Math.sin(6*s)))/(e-2*i*Math.cos(2*s)+4*n*Math.cos(4*s)-6*o*Math.cos(6*s)),s+=r,Math.abs(r)<=1e-10)return s;return NaN}},{}],13:[function(t,e){var i=Math.PI/2;e.exports=function(t,e){var n=1-(1-t*t)/(2*t)*Math.log((1-t)/(1+t));if(Math.abs(Math.abs(e)-n)<1e-6)return 0>e?-1*i:i;for(var o,s,r,a,l=Math.asin(.5*e),c=0;30>c;c++)if(s=Math.sin(l),r=Math.cos(l),a=t*s,o=Math.pow(1-a*a,2)/(2*r)*(e/(1-t*t)-s/(1-a*a)+.5/t*Math.log((1-a)/(1+a))),l+=o,Math.abs(o)<=1e-10)return l;return NaN}},{}],14:[function(t,e){e.exports=function(t,e,i,n,o){return t*o-e*Math.sin(2*o)+i*Math.sin(4*o)-n*Math.sin(6*o)}},{}],15:[function(t,e){e.exports=function(t,e,i){var n=t*e;return i/Math.sqrt(1-n*n)}},{}],16:[function(t,e){var i=Math.PI/2;e.exports=function(t,e){for(var n,o,s=.5*t,r=i-2*Math.atan(e),a=0;15>=a;a++)if(n=t*Math.sin(r),o=i-2*Math.atan(e*Math.pow((1-n)/(1+n),s))-r,r+=o,Math.abs(o)<=1e-10)return r;return-9999}},{}],17:[function(t,e){var i=1,n=.25,o=.046875,s=.01953125,r=.01068115234375,a=.75,l=.46875,c=.013020833333333334,h=.007120768229166667,u=.3645833333333333,d=.005696614583333333,p=.3076171875;e.exports=function(t){var e=[];e[0]=i-t*(n+t*(o+t*(s+t*r))),e[1]=t*(a-t*(o+t*(s+t*r)));var m=t*t;return e[2]=m*(l-t*(c+t*h)),m*=t,e[3]=m*(u-t*d),e[4]=m*t*p,e}},{}],18:[function(t,e){var i=t("./pj_mlfn"),n=1e-10,o=20;e.exports=function(t,e,s){for(var r=1/(1-e),a=t,l=o;l;--l){var c=Math.sin(a),h=1-e*c*c;if(h=(i(a,c,Math.cos(a),s)-t)*h*Math.sqrt(h)*r,a-=h,Math.abs(h)<n)return a}return a;
+}},{"./pj_mlfn":19}],19:[function(t,e){e.exports=function(t,e,i,n){return i*=e,e*=e,n[0]*t-i*(n[1]+e*(n[2]+e*(n[3]+e*n[4])))}},{}],20:[function(t,e){e.exports=function(t,e){var i;return t>1e-7?(i=t*e,(1-t*t)*(e/(1-i*i)-.5/t*Math.log((1-i)/(1+i)))):2*e}},{}],21:[function(t,e){e.exports=function(t){return 0>t?-1:1}},{}],22:[function(t,e){e.exports=function(t,e){return Math.pow((1-t)/(1+t),e)}},{}],23:[function(t,e){e.exports=function(t){var e={x:t[0],y:t[1]};return t.length>2&&(e.z=t[2]),t.length>3&&(e.m=t[3]),e}},{}],24:[function(t,e){var i=Math.PI/2;e.exports=function(t,e,n){var o=t*n,s=.5*t;return o=Math.pow((1-o)/(1+o),s),Math.tan(.5*(i-e))/o}},{}],25:[function(t,e,i){i.wgs84={towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},i.ch1903={towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},i.ggrs87={towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},i.nad83={towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},i.nad27={nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},i.potsdam={towgs84:"606.0,23.0,413.0",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},i.carthage={towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},i.hermannskogel={towgs84:"653.0,-212.0,449.0",ellipse:"bessel",datumName:"Hermannskogel"},i.ire65={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},i.rassadiran={towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},i.nzgd49={towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},i.osgb36={towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},i.s_jtsk={towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},i.beduaram={towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},i.gunung_segara={towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},i.rnb72={towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"}},{}],26:[function(t,e,i){i.MERIT={a:6378137,rf:298.257,ellipseName:"MERIT 1983"},i.SGS85={a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},i.GRS80={a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},i.IAU76={a:6378140,rf:298.257,ellipseName:"IAU 1976"},i.airy={a:6377563.396,b:6356256.91,ellipseName:"Airy 1830"},i.APL4={a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},i.NWL9D={a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},i.mod_airy={a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},i.andrae={a:6377104.43,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},i.aust_SA={a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},i.GRS67={a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},i.bessel={a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},i.bess_nam={a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},i.clrk66={a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},i.clrk80={a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},i.clrk58={a:6378293.645208759,rf:294.2606763692654,ellipseName:"Clarke 1858"},i.CPM={a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},i.delmbr={a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},i.engelis={a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},i.evrst30={a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},i.evrst48={a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},i.evrst56={a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},i.evrst69={a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},i.evrstSS={a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},i.fschr60={a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},i.fschr60m={a:6378155,rf:298.3,ellipseName:"Fischer 1960"},i.fschr68={a:6378150,rf:298.3,ellipseName:"Fischer 1968"},i.helmert={a:6378200,rf:298.3,ellipseName:"Helmert 1906"},i.hough={a:6378270,rf:297,ellipseName:"Hough"},i.intl={a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},i.kaula={a:6378163,rf:298.24,ellipseName:"Kaula 1961"},i.lerch={a:6378139,rf:298.257,ellipseName:"Lerch 1979"},i.mprts={a:6397300,rf:191,ellipseName:"Maupertius 1738"},i.new_intl={a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},i.plessis={a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},i.krass={a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},i.SEasia={a:6378155,b:6356773.3205,ellipseName:"Southeast Asia"},i.walbeck={a:6376896,b:6355834.8467,ellipseName:"Walbeck"},i.WGS60={a:6378165,rf:298.3,ellipseName:"WGS 60"},i.WGS66={a:6378145,rf:298.25,ellipseName:"WGS 66"},i.WGS7={a:6378135,rf:298.26,ellipseName:"WGS 72"},i.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"},i.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"}},{}],27:[function(t,e,i){i.greenwich=0,i.lisbon=-9.131906111111,i.paris=2.337229166667,i.bogota=-74.080916666667,i.madrid=-3.687938888889,i.rome=12.452333333333,i.bern=7.439583333333,i.jakarta=106.807719444444,i.ferro=-17.666666666667,i.brussels=4.367975,i.stockholm=18.058277777778,i.athens=23.7163375,i.oslo=10.722916666667},{}],28:[function(t,e){function i(t,e,i){var n;return Array.isArray(i)?(n=r(t,e,i),3===i.length?[n.x,n.y,n.z]:[n.x,n.y]):r(t,e,i)}function n(t){return t instanceof s?t:t.oProj?t.oProj:s(t)}function o(t,e,o){t=n(t);var s,r=!1;return"undefined"==typeof e?(e=t,t=a,r=!0):("undefined"!=typeof e.x||Array.isArray(e))&&(o=e,e=t,t=a,r=!0),e=n(e),o?i(t,e,o):(s={forward:function(n){return i(t,e,n)},inverse:function(n){return i(e,t,n)}},r&&(s.oProj=e),s)}var s=t("./Proj"),r=t("./transform"),a=s("WGS84");e.exports=o},{"./Proj":2,"./transform":64}],29:[function(t,e){var i=Math.PI/2,n=1,o=2,s=3,r=4,a=5,l=484813681109536e-20,c=1.0026,h=.3826834323650898,u=function(t){if(!(this instanceof u))return new u(t);if(this.datum_type=r,t){if(t.datumCode&&"none"===t.datumCode&&(this.datum_type=a),t.datum_params){for(var e=0;e<t.datum_params.length;e++)t.datum_params[e]=parseFloat(t.datum_params[e]);(0!==t.datum_params[0]||0!==t.datum_params[1]||0!==t.datum_params[2])&&(this.datum_type=n),t.datum_params.length>3&&(0!==t.datum_params[3]||0!==t.datum_params[4]||0!==t.datum_params[5]||0!==t.datum_params[6])&&(this.datum_type=o,t.datum_params[3]*=l,t.datum_params[4]*=l,t.datum_params[5]*=l,t.datum_params[6]=t.datum_params[6]/1e6+1)}this.datum_type=t.grids?s:this.datum_type,this.a=t.a,this.b=t.b,this.es=t.es,this.ep2=t.ep2,this.datum_params=t.datum_params,this.datum_type===s&&(this.grids=t.grids)}};u.prototype={compare_datums:function(t){return this.datum_type===t.datum_type&&(!(this.a!==t.a||Math.abs(this.es-t.es)>5e-11)&&(this.datum_type===n?this.datum_params[0]===t.datum_params[0]&&this.datum_params[1]===t.datum_params[1]&&this.datum_params[2]===t.datum_params[2]:this.datum_type===o?this.datum_params[0]===t.datum_params[0]&&this.datum_params[1]===t.datum_params[1]&&this.datum_params[2]===t.datum_params[2]&&this.datum_params[3]===t.datum_params[3]&&this.datum_params[4]===t.datum_params[4]&&this.datum_params[5]===t.datum_params[5]&&this.datum_params[6]===t.datum_params[6]:this.datum_type!==s&&t.datum_type!==s||this.nadgrids===t.nadgrids))},geodetic_to_geocentric:function(t){var e,n,o,s,r,a,l,c=t.x,h=t.y,u=t.z?t.z:0,d=0;if(-i>h&&h>-1.001*i)h=-i;else if(h>i&&1.001*i>h)h=i;else if(-i>h||h>i)return null;return c>Math.PI&&(c-=2*Math.PI),r=Math.sin(h),l=Math.cos(h),a=r*r,s=this.a/Math.sqrt(1-this.es*a),e=(s+u)*l*Math.cos(c),n=(s+u)*l*Math.sin(c),o=(s*(1-this.es)+u)*r,t.x=e,t.y=n,t.z=o,d},geocentric_to_geodetic:function(t){var e,n,o,s,r,a,l,c,h,u,d,p,m,f,_,g,v,y=1e-12,E=y*y,P=30,C=t.x,S=t.y,M=t.z?t.z:0;if(m=!1,e=Math.sqrt(C*C+S*S),n=Math.sqrt(C*C+S*S+M*M),e/this.a<y){if(m=!0,_=0,n/this.a<y)return g=i,void(v=-this.b)}else _=Math.atan2(S,C);o=M/n,s=e/n,r=1/Math.sqrt(1-this.es*(2-this.es)*s*s),c=s*(1-this.es)*r,h=o*r,f=0;do f++,l=this.a/Math.sqrt(1-this.es*h*h),v=e*c+M*h-l*(1-this.es*h*h),a=this.es*l/(l+v),r=1/Math.sqrt(1-a*(2-a)*s*s),u=s*(1-a)*r,d=o*r,p=d*c-u*h,c=u,h=d;while(p*p>E&&P>f);return g=Math.atan(d/Math.abs(u)),t.x=_,t.y=g,t.z=v,t},geocentric_to_geodetic_noniter:function(t){var e,n,o,s,r,a,l,u,d,p,m,f,_,g,v,y,E,P=t.x,C=t.y,S=t.z?t.z:0;if(P=parseFloat(P),C=parseFloat(C),S=parseFloat(S),E=!1,0!==P)e=Math.atan2(C,P);else if(C>0)e=i;else if(0>C)e=-i;else if(E=!0,e=0,S>0)n=i;else{if(!(0>S))return n=i,void(o=-this.b);n=-i}return r=P*P+C*C,s=Math.sqrt(r),a=S*c,u=Math.sqrt(a*a+r),p=a/u,f=s/u,m=p*p*p,l=S+this.b*this.ep2*m,y=s-this.a*this.es*f*f*f,d=Math.sqrt(l*l+y*y),_=l/d,g=y/d,v=this.a/Math.sqrt(1-this.es*_*_),o=g>=h?s/g-v:-h>=g?s/-g-v:S/_+v*(this.es-1),E===!1&&(n=Math.atan(_/g)),t.x=e,t.y=n,t.z=o,t},geocentric_to_wgs84:function(t){if(this.datum_type===n)t.x+=this.datum_params[0],t.y+=this.datum_params[1],t.z+=this.datum_params[2];else if(this.datum_type===o){var e=this.datum_params[0],i=this.datum_params[1],s=this.datum_params[2],r=this.datum_params[3],a=this.datum_params[4],l=this.datum_params[5],c=this.datum_params[6],h=c*(t.x-l*t.y+a*t.z)+e,u=c*(l*t.x+t.y-r*t.z)+i,d=c*(-a*t.x+r*t.y+t.z)+s;t.x=h,t.y=u,t.z=d}},geocentric_from_wgs84:function(t){if(this.datum_type===n)t.x-=this.datum_params[0],t.y-=this.datum_params[1],t.z-=this.datum_params[2];else if(this.datum_type===o){var e=this.datum_params[0],i=this.datum_params[1],s=this.datum_params[2],r=this.datum_params[3],a=this.datum_params[4],l=this.datum_params[5],c=this.datum_params[6],h=(t.x-e)/c,u=(t.y-i)/c,d=(t.z-s)/c;t.x=h+l*u-a*d,t.y=-l*h+u+r*d,t.z=a*h-r*u+d}}},e.exports=u},{}],30:[function(t,e){var i=1,n=2,o=3,s=5,r=6378137,a=.006694379990141316;e.exports=function(t,e,l){function c(t){return t===i||t===n}var h,u,d;if(t.compare_datums(e))return l;if(t.datum_type===s||e.datum_type===s)return l;var p=t.a,m=t.es,f=e.a,_=e.es,g=t.datum_type;if(g===o)if(0===this.apply_gridshift(t,0,l))t.a=r,t.es=a;else{if(!t.datum_params)return t.a=p,t.es=t.es,l;for(h=1,u=0,d=t.datum_params.length;d>u;u++)h*=t.datum_params[u];if(0===h)return t.a=p,t.es=t.es,l;g=t.datum_params.length>3?n:i}return e.datum_type===o&&(e.a=r,e.es=a),(t.es!==e.es||t.a!==e.a||c(g)||c(e.datum_type))&&(t.geodetic_to_geocentric(l),c(t.datum_type)&&t.geocentric_to_wgs84(l),c(e.datum_type)&&e.geocentric_from_wgs84(l),e.geocentric_to_geodetic(l)),e.datum_type===o&&this.apply_gridshift(e,1,l),t.a=p,t.es=m,e.a=f,e.es=_,l}},{}],31:[function(t,e){function i(t){var e=this;if(2===arguments.length){var n=arguments[1];i[t]="string"==typeof n?"+"===n[0]?o(arguments[1]):s(arguments[1]):n}else if(1===arguments.length){if(Array.isArray(t))return t.map(function(t){Array.isArray(t)?i.apply(e,t):i(t)});if("string"==typeof t){if(t in i)return i[t]}else"EPSG"in t?i["EPSG:"+t.EPSG]=t:"ESRI"in t?i["ESRI:"+t.ESRI]=t:"IAU2000"in t?i["IAU2000:"+t.IAU2000]=t:console.log(t);return}}var n=t("./global"),o=t("./projString"),s=t("./wkt");n(i),e.exports=i},{"./global":34,"./projString":37,"./wkt":65}],32:[function(t,e){var i=t("./constants/Datum"),n=t("./constants/Ellipsoid"),o=t("./extend"),s=t("./datum"),r=1e-10,a=.16666666666666666,l=.04722222222222222,c=.022156084656084655;e.exports=function(t){if(t.datumCode&&"none"!==t.datumCode){var e=i[t.datumCode];e&&(t.datum_params=e.towgs84?e.towgs84.split(","):null,t.ellps=e.ellipse,t.datumName=e.datumName?e.datumName:t.datumCode)}if(!t.a){var h=n[t.ellps]?n[t.ellps]:n.WGS84;o(t,h)}return t.rf&&!t.b&&(t.b=(1-1/t.rf)*t.a),(0===t.rf||Math.abs(t.a-t.b)<r)&&(t.sphere=!0,t.b=t.a),t.a2=t.a*t.a,t.b2=t.b*t.b,t.es=(t.a2-t.b2)/t.a2,t.e=Math.sqrt(t.es),t.R_A&&(t.a*=1-t.es*(a+t.es*(l+t.es*c)),t.a2=t.a*t.a,t.b2=t.b*t.b,t.es=0),t.ep2=(t.a2-t.b2)/t.b2,t.k0||(t.k0=1),t.axis||(t.axis="enu"),t.datum=s(t),t}},{"./constants/Datum":25,"./constants/Ellipsoid":26,"./datum":29,"./extend":33}],33:[function(t,e){e.exports=function(t,e){t=t||{};var i,n;if(!e)return t;for(n in e)i=e[n],void 0!==i&&(t[n]=i);return t}},{}],34:[function(t,e){e.exports=function(t){t("EPSG:4326","+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"),t("EPSG:4269","+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"),t("EPSG:3857","+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"),t.WGS84=t["EPSG:4326"],t["EPSG:3785"]=t["EPSG:3857"],t.GOOGLE=t["EPSG:3857"],t["EPSG:900913"]=t["EPSG:3857"],t["EPSG:102113"]=t["EPSG:3857"]}},{}],35:[function(t,e){var i=t("./core");i.defaultDatum="WGS84",i.Proj=t("./Proj"),i.WGS84=new i.Proj("WGS84"),i.Point=t("./Point"),i.toPoint=t("./common/toPoint"),i.defs=t("./defs"),i.transform=t("./transform"),i.mgrs=t("mgrs"),i.version=t("../package.json").version,t("./includedProjections")(i),e.exports=i},{"../package.json":67,"./Point":1,"./Proj":2,"./common/toPoint":23,"./core":28,"./defs":31,"./includedProjections":"gWUPNW","./transform":64,mgrs:66}],36:[function(t,e){function i(t){return"string"==typeof t}function n(t){return t in a}function o(t){var e=["GEOGCS","GEOCCS","PROJCS","LOCAL_CS"];return e.reduce(function(e,i){return e+1+t.indexOf(i)},0)}function s(t){return"+"===t[0]}function r(t){return i(t)?n(t)?a[t]:o(t)?l(t):s(t)?c(t):void 0:t}var a=t("./defs"),l=t("./wkt"),c=t("./projString");e.exports=r},{"./defs":31,"./projString":37,"./wkt":65}],37:[function(t,e){var i=.017453292519943295,n=t("./constants/PrimeMeridian");e.exports=function(t){var e={},o={};t.split("+").map(function(t){return t.trim()}).filter(function(t){return t}).forEach(function(t){var e=t.split("=");e.push(!0),o[e[0].toLowerCase()]=e[1]});var s,r,a,l={proj:"projName",datum:"datumCode",rf:function(t){e.rf=parseFloat(t,10)},lat_0:function(t){e.lat0=t*i},lat_1:function(t){e.lat1=t*i},lat_2:function(t){e.lat2=t*i},lat_ts:function(t){e.lat_ts=t*i},lon_0:function(t){e.long0=t*i},lon_1:function(t){e.long1=t*i},lon_2:function(t){e.long2=t*i},alpha:function(t){e.alpha=parseFloat(t)*i},lonc:function(t){e.longc=t*i},x_0:function(t){e.x0=parseFloat(t,10)},y_0:function(t){e.y0=parseFloat(t,10)},k_0:function(t){e.k0=parseFloat(t,10)},k:function(t){e.k0=parseFloat(t,10)},r_a:function(){e.R_A=!0},zone:function(t){e.zone=parseInt(t,10)},south:function(){e.utmSouth=!0},towgs84:function(t){e.datum_params=t.split(",").map(function(t){return parseFloat(t,10)})},to_meter:function(t){e.to_meter=parseFloat(t,10)},from_greenwich:function(t){e.from_greenwich=t*i},pm:function(t){e.from_greenwich=(n[t]?n[t]:parseFloat(t,10))*i},nadgrids:function(t){"@null"===t?e.datumCode="none":e.nadgrids=t},axis:function(t){var i="ewnsud";3===t.length&&-1!==i.indexOf(t.substr(0,1))&&-1!==i.indexOf(t.substr(1,1))&&-1!==i.indexOf(t.substr(2,1))&&(e.axis=t)}};for(s in o)r=o[s],s in l?(a=l[s],"function"==typeof a?a(r):e[a]=r):e[s]=r;return"string"==typeof e.datumCode&&"WGS84"!==e.datumCode&&(e.datumCode=e.datumCode.toLowerCase()),e}},{"./constants/PrimeMeridian":27}],38:[function(t,e,i){function n(t,e){var i=r.length;return t.names?(r[i]=t,t.names.forEach(function(t){s[t.toLowerCase()]=i}),this):(console.log(e),!0)}var o=[t("./projections/merc"),t("./projections/longlat")],s={},r=[];i.add=n,i.get=function(t){if(!t)return!1;var e=t.toLowerCase();return"undefined"!=typeof s[e]&&r[s[e]]?r[s[e]]:void 0},i.start=function(){o.forEach(n)}},{"./projections/longlat":50,"./projections/merc":51}],39:[function(t,e,i){var n=1e-10,o=t("../common/msfnz"),s=t("../common/qsfnz"),r=t("../common/adjust_lon"),a=t("../common/asinz");i.init=function(){Math.abs(this.lat1+this.lat2)<n||(this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e3=Math.sqrt(this.es),this.sin_po=Math.sin(this.lat1),this.cos_po=Math.cos(this.lat1),this.t1=this.sin_po,this.con=this.sin_po,this.ms1=o(this.e3,this.sin_po,this.cos_po),this.qs1=s(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat2),this.cos_po=Math.cos(this.lat2),this.t2=this.sin_po,this.ms2=o(this.e3,this.sin_po,this.cos_po),this.qs2=s(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat0),this.cos_po=Math.cos(this.lat0),this.t3=this.sin_po,this.qs0=s(this.e3,this.sin_po,this.cos_po),this.ns0=Math.abs(this.lat1-this.lat2)>n?(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},i.forward=function(t){var e=t.x,i=t.y;this.sin_phi=Math.sin(i),this.cos_phi=Math.cos(i);var n=s(this.e3,this.sin_phi,this.cos_phi),o=this.a*Math.sqrt(this.c-this.ns0*n)/this.ns0,a=this.ns0*r(e-this.long0),l=o*Math.sin(a)+this.x0,c=this.rh-o*Math.cos(a)+this.y0;return t.x=l,t.y=c,t},i.inverse=function(t){var e,i,n,o,s,a;return t.x-=this.x0,t.y=this.rh-t.y+this.y0,this.ns0>=0?(e=Math.sqrt(t.x*t.x+t.y*t.y),n=1):(e=-Math.sqrt(t.x*t.x+t.y*t.y),n=-1),o=0,0!==e&&(o=Math.atan2(n*t.x,n*t.y)),n=e*this.ns0/this.a,this.sphere?a=Math.asin((this.c-n*n)/(2*this.ns0)):(i=(this.c-n*n)/this.ns0,a=this.phi1z(this.e3,i)),s=r(o/this.ns0+this.long0),t.x=s,t.y=a,t},i.phi1z=function(t,e){var i,o,s,r,l,c=a(.5*e);if(n>t)return c;for(var h=t*t,u=1;25>=u;u++)if(i=Math.sin(c),o=Math.cos(c),s=t*i,r=1-s*s,l=.5*r*r/o*(e/(1-h)-i/r+.5/t*Math.log((1-s)/(1+s))),c+=l,Math.abs(l)<=1e-7)return c;return null},i.names=["Albers_Conic_Equal_Area","Albers","aea"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/msfnz":15,"../common/qsfnz":20}],40:[function(t,e,i){var n=t("../common/adjust_lon"),o=Math.PI/2,s=1e-10,r=t("../common/mlfn"),a=t("../common/e0fn"),l=t("../common/e1fn"),c=t("../common/e2fn"),h=t("../common/e3fn"),u=t("../common/gN"),d=t("../common/asinz"),p=t("../common/imlfn");i.init=function(){this.sin_p12=Math.sin(this.lat0),this.cos_p12=Math.cos(this.lat0)},i.forward=function(t){var e,i,d,p,m,f,_,g,v,y,E,P,C,S,M,w,L,R,b,x,G,I,A,T=t.x,k=t.y,O=Math.sin(t.y),D=Math.cos(t.y),N=n(T-this.long0);return this.sphere?Math.abs(this.sin_p12-1)<=s?(t.x=this.x0+this.a*(o-k)*Math.sin(N),t.y=this.y0-this.a*(o-k)*Math.cos(N),t):Math.abs(this.sin_p12+1)<=s?(t.x=this.x0+this.a*(o+k)*Math.sin(N),t.y=this.y0+this.a*(o+k)*Math.cos(N),t):(R=this.sin_p12*O+this.cos_p12*D*Math.cos(N),w=Math.acos(R),L=w/Math.sin(w),t.x=this.x0+this.a*L*D*Math.sin(N),t.y=this.y0+this.a*L*(this.cos_p12*O-this.sin_p12*D*Math.cos(N)),t):(e=a(this.es),i=l(this.es),d=c(this.es),p=h(this.es),Math.abs(this.sin_p12-1)<=s?(m=this.a*r(e,i,d,p,o),f=this.a*r(e,i,d,p,k),t.x=this.x0+(m-f)*Math.sin(N),t.y=this.y0-(m-f)*Math.cos(N),t):Math.abs(this.sin_p12+1)<=s?(m=this.a*r(e,i,d,p,o),f=this.a*r(e,i,d,p,k),t.x=this.x0+(m+f)*Math.sin(N),t.y=this.y0+(m+f)*Math.cos(N),t):(_=O/D,g=u(this.a,this.e,this.sin_p12),v=u(this.a,this.e,O),y=Math.atan((1-this.es)*_+this.es*g*this.sin_p12/(v*D)),E=Math.atan2(Math.sin(N),this.cos_p12*Math.tan(y)-this.sin_p12*Math.cos(N)),b=0===E?Math.asin(this.cos_p12*Math.sin(y)-this.sin_p12*Math.cos(y)):Math.abs(Math.abs(E)-Math.PI)<=s?-Math.asin(this.cos_p12*Math.sin(y)-this.sin_p12*Math.cos(y)):Math.asin(Math.sin(N)*Math.cos(y)/Math.sin(E)),P=this.e*this.sin_p12/Math.sqrt(1-this.es),C=this.e*this.cos_p12*Math.cos(E)/Math.sqrt(1-this.es),S=P*C,M=C*C,x=b*b,G=x*b,I=G*b,A=I*b,w=g*b*(1-x*M*(1-M)/6+G/8*S*(1-2*M)+I/120*(M*(4-7*M)-3*P*P*(1-7*M))-A/48*S),t.x=this.x0+w*Math.sin(E),t.y=this.y0+w*Math.cos(E),t))},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e,i,m,f,_,g,v,y,E,P,C,S,M,w,L,R,b,x,G,I,A,T,k;if(this.sphere){if(e=Math.sqrt(t.x*t.x+t.y*t.y),e>2*o*this.a)return;return i=e/this.a,m=Math.sin(i),f=Math.cos(i),_=this.long0,Math.abs(e)<=s?g=this.lat0:(g=d(f*this.sin_p12+t.y*m*this.cos_p12/e),v=Math.abs(this.lat0)-o,_=n(Math.abs(v)<=s?this.lat0>=0?this.long0+Math.atan2(t.x,-t.y):this.long0-Math.atan2(-t.x,t.y):this.long0+Math.atan2(t.x*m,e*this.cos_p12*f-t.y*this.sin_p12*m))),t.x=_,t.y=g,t}return y=a(this.es),E=l(this.es),P=c(this.es),C=h(this.es),Math.abs(this.sin_p12-1)<=s?(S=this.a*r(y,E,P,C,o),e=Math.sqrt(t.x*t.x+t.y*t.y),M=S-e,g=p(M/this.a,y,E,P,C),_=n(this.long0+Math.atan2(t.x,-1*t.y)),t.x=_,t.y=g,t):Math.abs(this.sin_p12+1)<=s?(S=this.a*r(y,E,P,C,o),e=Math.sqrt(t.x*t.x+t.y*t.y),M=e-S,g=p(M/this.a,y,E,P,C),_=n(this.long0+Math.atan2(t.x,t.y)),t.x=_,t.y=g,t):(e=Math.sqrt(t.x*t.x+t.y*t.y),R=Math.atan2(t.x,t.y),w=u(this.a,this.e,this.sin_p12),b=Math.cos(R),x=this.e*this.cos_p12*b,G=-x*x/(1-this.es),I=3*this.es*(1-G)*this.sin_p12*this.cos_p12*b/(1-this.es),A=e/w,T=A-G*(1+G)*Math.pow(A,3)/6-I*(1+3*G)*Math.pow(A,4)/24,k=1-G*T*T/2-A*T*T*T/6,L=Math.asin(this.sin_p12*Math.cos(T)+this.cos_p12*Math.sin(T)*b),_=n(this.long0+Math.asin(Math.sin(R)*Math.sin(T)/Math.cos(L))),g=Math.atan((1-this.es*k*this.sin_p12/Math.sin(L))*Math.tan(L)/(1-this.es)),t.x=_,t.y=g,t)},i.names=["Azimuthal_Equidistant","aeqd"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/imlfn":12,"../common/mlfn":14}],41:[function(t,e,i){var n=t("../common/mlfn"),o=t("../common/e0fn"),s=t("../common/e1fn"),r=t("../common/e2fn"),a=t("../common/e3fn"),l=t("../common/gN"),c=t("../common/adjust_lon"),h=t("../common/adjust_lat"),u=t("../common/imlfn"),d=Math.PI/2,p=1e-10;i.init=function(){this.sphere||(this.e0=o(this.es),this.e1=s(this.es),this.e2=r(this.es),this.e3=a(this.es),this.ml0=this.a*n(this.e0,this.e1,this.e2,this.e3,this.lat0))},i.forward=function(t){var e,i,o=t.x,s=t.y;if(o=c(o-this.long0),this.sphere)e=this.a*Math.asin(Math.cos(s)*Math.sin(o)),i=this.a*(Math.atan2(Math.tan(s),Math.cos(o))-this.lat0);else{var r=Math.sin(s),a=Math.cos(s),h=l(this.a,this.e,r),u=Math.tan(s)*Math.tan(s),d=o*Math.cos(s),p=d*d,m=this.es*a*a/(1-this.es),f=this.a*n(this.e0,this.e1,this.e2,this.e3,s);e=h*d*(1-p*u*(1/6-(8-u+8*m)*p/120)),i=f-this.ml0+h*r/a*p*(.5+(5-u+6*m)*p/24)}return t.x=e+this.x0,t.y=i+this.y0,t},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e,i,n=t.x/this.a,o=t.y/this.a;if(this.sphere){var s=o+this.lat0;e=Math.asin(Math.sin(s)*Math.cos(n)),i=Math.atan2(Math.tan(n),Math.cos(s))}else{var r=this.ml0/this.a+o,a=u(r,this.e0,this.e1,this.e2,this.e3);if(Math.abs(Math.abs(a)-d)<=p)return t.x=this.long0,t.y=d,0>o&&(t.y*=-1),t;var m=l(this.a,this.e,Math.sin(a)),f=m*m*m/this.a/this.a*(1-this.es),_=Math.pow(Math.tan(a),2),g=n*this.a/m,v=g*g;e=a-m*Math.tan(a)/f*g*g*(.5-(1+3*_)*g*g/24),i=g*(1-v*(_/3+(1+3*_)*_*v/15))/Math.cos(a)}return t.x=c(i+this.long0),t.y=h(e),t},i.names=["Cassini","Cassini_Soldner","cass"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/imlfn":12,"../common/mlfn":14}],42:[function(t,e,i){var n=t("../common/adjust_lon"),o=t("../common/qsfnz"),s=t("../common/msfnz"),r=t("../common/iqsfnz");i.init=function(){this.sphere||(this.k0=s(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},i.forward=function(t){var e,i,s=t.x,r=t.y,a=n(s-this.long0);if(this.sphere)e=this.x0+this.a*a*Math.cos(this.lat_ts),i=this.y0+this.a*Math.sin(r)/Math.cos(this.lat_ts);else{var l=o(this.e,Math.sin(r));e=this.x0+this.a*this.k0*a,i=this.y0+this.a*l*.5/this.k0}return t.x=e,t.y=i,t},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e,i;return this.sphere?(e=n(this.long0+t.x/this.a/Math.cos(this.lat_ts)),i=Math.asin(t.y/this.a*Math.cos(this.lat_ts))):(i=r(this.e,2*t.y*this.k0/this.a),e=n(this.long0+t.x/(this.a*this.k0))),t.x=e,t.y=i,t},i.names=["cea"]},{"../common/adjust_lon":5,"../common/iqsfnz":13,"../common/msfnz":15,"../common/qsfnz":20}],43:[function(t,e,i){var n=t("../common/adjust_lon"),o=t("../common/adjust_lat");i.init=function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},i.forward=function(t){var e=t.x,i=t.y,s=n(e-this.long0),r=o(i-this.lat0);return t.x=this.x0+this.a*s*this.rc,t.y=this.y0+this.a*r,t},i.inverse=function(t){var e=t.x,i=t.y;return t.x=n(this.long0+(e-this.x0)/(this.a*this.rc)),t.y=o(this.lat0+(i-this.y0)/this.a),t},i.names=["Equirectangular","Equidistant_Cylindrical","eqc"]},{"../common/adjust_lat":4,"../common/adjust_lon":5}],44:[function(t,e,i){var n=t("../common/e0fn"),o=t("../common/e1fn"),s=t("../common/e2fn"),r=t("../common/e3fn"),a=t("../common/msfnz"),l=t("../common/mlfn"),c=t("../common/adjust_lon"),h=t("../common/adjust_lat"),u=t("../common/imlfn"),d=1e-10;i.init=function(){Math.abs(this.lat1+this.lat2)<d||(this.lat2=this.lat2||this.lat1,this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=n(this.es),this.e1=o(this.es),this.e2=s(this.es),this.e3=r(this.es),this.sinphi=Math.sin(this.lat1),this.cosphi=Math.cos(this.lat1),this.ms1=a(this.e,this.sinphi,this.cosphi),this.ml1=l(this.e0,this.e1,this.e2,this.e3,this.lat1),Math.abs(this.lat1-this.lat2)<d?this.ns=this.sinphi:(this.sinphi=Math.sin(this.lat2),this.cosphi=Math.cos(this.lat2),this.ms2=a(this.e,this.sinphi,this.cosphi),this.ml2=l(this.e0,this.e1,this.e2,this.e3,this.lat2),this.ns=(this.ms1-this.ms2)/(this.ml2-this.ml1)),this.g=this.ml1+this.ms1/this.ns,this.ml0=l(this.e0,this.e1,this.e2,this.e3,this.lat0),this.rh=this.a*(this.g-this.ml0))},i.forward=function(t){var e,i=t.x,n=t.y;if(this.sphere)e=this.a*(this.g-n);else{var o=l(this.e0,this.e1,this.e2,this.e3,n);e=this.a*(this.g-o)}var s=this.ns*c(i-this.long0),r=this.x0+e*Math.sin(s),a=this.y0+this.rh-e*Math.cos(s);return t.x=r,t.y=a,t},i.inverse=function(t){t.x-=this.x0,t.y=this.rh-t.y+this.y0;var e,i,n,o;this.ns>=0?(i=Math.sqrt(t.x*t.x+t.y*t.y),e=1):(i=-Math.sqrt(t.x*t.x+t.y*t.y),e=-1);var s=0;if(0!==i&&(s=Math.atan2(e*t.x,e*t.y)),this.sphere)return o=c(this.long0+s/this.ns),n=h(this.g-i/this.a),t.x=o,t.y=n,t;var r=this.g-i/this.a;return n=u(r,this.e0,this.e1,this.e2,this.e3),o=c(this.long0+s/this.ns),t.x=o,t.y=n,t},i.names=["Equidistant_Conic","eqdc"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/imlfn":12,"../common/mlfn":14,"../common/msfnz":15}],45:[function(t,e,i){var n=Math.PI/4,o=t("../common/srat"),s=Math.PI/2,r=20;i.init=function(){var t=Math.sin(this.lat0),e=Math.cos(this.lat0);e*=e,this.rc=Math.sqrt(1-this.es)/(1-this.es*t*t),this.C=Math.sqrt(1+this.es*e*e/(1-this.es)),this.phic0=Math.asin(t/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+n)/(Math.pow(Math.tan(.5*this.lat0+n),this.C)*o(this.e*t,this.ratexp))},i.forward=function(t){var e=t.x,i=t.y;return t.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*i+n),this.C)*o(this.e*Math.sin(i),this.ratexp))-s,t.x=this.C*e,t},i.inverse=function(t){for(var e=1e-14,i=t.x/this.C,a=t.y,l=Math.pow(Math.tan(.5*a+n)/this.K,1/this.C),c=r;c>0&&(a=2*Math.atan(l*o(this.e*Math.sin(t.y),-.5*this.e))-s,!(Math.abs(a-t.y)<e));--c)t.y=a;return c?(t.x=i,t.y=a,t):null},i.names=["gauss"]},{"../common/srat":22}],46:[function(t,e,i){var n=t("../common/adjust_lon"),o=1e-10,s=t("../common/asinz");i.init=function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0),this.infinity_dist=1e3*this.a,this.rc=1},i.forward=function(t){var e,i,s,r,a,l,c,h,u=t.x,d=t.y;return s=n(u-this.long0),e=Math.sin(d),i=Math.cos(d),r=Math.cos(s),l=this.sin_p14*e+this.cos_p14*i*r,a=1,l>0||Math.abs(l)<=o?(c=this.x0+this.a*a*i*Math.sin(s)/l,h=this.y0+this.a*a*(this.cos_p14*e-this.sin_p14*i*r)/l):(c=this.x0+this.infinity_dist*i*Math.sin(s),h=this.y0+this.infinity_dist*(this.cos_p14*e-this.sin_p14*i*r)),t.x=c,t.y=h,t},i.inverse=function(t){var e,i,o,r,a,l;return t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,t.x/=this.k0,t.y/=this.k0,(e=Math.sqrt(t.x*t.x+t.y*t.y))?(r=Math.atan2(e,this.rc),i=Math.sin(r),o=Math.cos(r),l=s(o*this.sin_p14+t.y*i*this.cos_p14/e),a=Math.atan2(t.x*i,e*this.cos_p14*o-t.y*this.sin_p14*i),a=n(this.long0+a)):(l=this.phic0,a=0),t.x=a,t.y=l,t},i.names=["gnom"]},{"../common/adjust_lon":5,"../common/asinz":6}],47:[function(t,e,i){var n=t("../common/adjust_lon");i.init=function(){this.a=6377397.155,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},i.forward=function(t){var e,i,o,s,r,a,l,c=t.x,h=t.y,u=n(c-this.long0);return e=Math.pow((1+this.e*Math.sin(h))/(1-this.e*Math.sin(h)),this.alfa*this.e/2),i=2*(Math.atan(this.k*Math.pow(Math.tan(h/2+this.s45),this.alfa)/e)-this.s45),o=-u*this.alfa,s=Math.asin(Math.cos(this.ad)*Math.sin(i)+Math.sin(this.ad)*Math.cos(i)*Math.cos(o)),r=Math.asin(Math.cos(i)*Math.sin(o)/Math.cos(s)),a=this.n*r,l=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(s/2+this.s45),this.n),t.y=l*Math.cos(a)/1,t.x=l*Math.sin(a)/1,this.czech||(t.y*=-1,t.x*=-1),t},i.inverse=function(t){var e,i,n,o,s,r,a,l,c=t.x;t.x=t.y,t.y=c,this.czech||(t.y*=-1,t.x*=-1),r=Math.sqrt(t.x*t.x+t.y*t.y),s=Math.atan2(t.y,t.x),o=s/Math.sin(this.s0),n=2*(Math.atan(Math.pow(this.ro0/r,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),e=Math.asin(Math.cos(this.ad)*Math.sin(n)-Math.sin(this.ad)*Math.cos(n)*Math.cos(o)),i=Math.asin(Math.cos(n)*Math.sin(o)/Math.cos(e)),t.x=this.long0-i/this.alfa,a=e,l=0;var h=0;do t.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(e/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(a))/(1-this.e*Math.sin(a)),this.e/2))-this.s45),Math.abs(a-t.y)<1e-10&&(l=1),a=t.y,h+=1;while(0===l&&15>h);return h>=15?null:t},i.names=["Krovak","krovak"]},{"../common/adjust_lon":5}],48:[function(t,e,i){var n=Math.PI/2,o=Math.PI/4,s=1e-10,r=t("../common/qsfnz"),a=t("../common/adjust_lon");i.S_POLE=1,i.N_POLE=2,i.EQUIT=3,i.OBLIQ=4,i.init=function(){var t=Math.abs(this.lat0);if(this.mode=Math.abs(t-n)<s?this.lat0<0?this.S_POLE:this.N_POLE:Math.abs(t)<s?this.EQUIT:this.OBLIQ,this.es>0){var e;switch(this.qp=r(this.e,1),this.mmf=.5/(1-this.es),this.apa=this.authset(this.es),this.mode){case this.N_POLE:this.dd=1;break;case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),e=Math.sin(this.lat0),this.sinb1=r(this.e,e)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*e*e)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},i.forward=function(t){var e,i,l,c,h,u,d,p,m,f,_=t.x,g=t.y;if(_=a(_-this.long0),this.sphere){if(h=Math.sin(g),f=Math.cos(g),l=Math.cos(_),this.mode===this.OBLIQ||this.mode===this.EQUIT){if(i=this.mode===this.EQUIT?1+f*l:1+this.sinph0*h+this.cosph0*f*l,s>=i)return null;i=Math.sqrt(2/i),e=i*f*Math.sin(_),i*=this.mode===this.EQUIT?h:this.cosph0*h-this.sinph0*f*l}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(l=-l),Math.abs(g+this.phi0)<s)return null;i=o-.5*g,i=2*(this.mode===this.S_POLE?Math.cos(i):Math.sin(i)),e=i*Math.sin(_),i*=l}}else{switch(d=0,p=0,m=0,l=Math.cos(_),c=Math.sin(_),h=Math.sin(g),u=r(this.e,h),(this.mode===this.OBLIQ||this.mode===this.EQUIT)&&(d=u/this.qp,p=Math.sqrt(1-d*d)),this.mode){case this.OBLIQ:m=1+this.sinb1*d+this.cosb1*p*l;break;case this.EQUIT:m=1+p*l;break;case this.N_POLE:m=n+g,u=this.qp-u;break;case this.S_POLE:m=g-n,u=this.qp+u}if(Math.abs(m)<s)return null;
+switch(this.mode){case this.OBLIQ:case this.EQUIT:m=Math.sqrt(2/m),i=this.mode===this.OBLIQ?this.ymf*m*(this.cosb1*d-this.sinb1*p*l):(m=Math.sqrt(2/(1+p*l)))*d*this.ymf,e=this.xmf*m*p*c;break;case this.N_POLE:case this.S_POLE:u>=0?(e=(m=Math.sqrt(u))*c,i=l*(this.mode===this.S_POLE?m:-m)):e=i=0}}return t.x=this.a*e+this.x0,t.y=this.a*i+this.y0,t},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e,i,o,r,l,c,h,u=t.x/this.a,d=t.y/this.a;if(this.sphere){var p,m=0,f=0;if(p=Math.sqrt(u*u+d*d),i=.5*p,i>1)return null;switch(i=2*Math.asin(i),(this.mode===this.OBLIQ||this.mode===this.EQUIT)&&(f=Math.sin(i),m=Math.cos(i)),this.mode){case this.EQUIT:i=Math.abs(p)<=s?0:Math.asin(d*f/p),u*=f,d=m*p;break;case this.OBLIQ:i=Math.abs(p)<=s?this.phi0:Math.asin(m*this.sinph0+d*f*this.cosph0/p),u*=f*this.cosph0,d=(m-Math.sin(i)*this.sinph0)*p;break;case this.N_POLE:d=-d,i=n-i;break;case this.S_POLE:i-=n}e=0!==d||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(u,d):0}else{if(h=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(u/=this.dd,d*=this.dd,c=Math.sqrt(u*u+d*d),s>c)return t.x=0,t.y=this.phi0,t;r=2*Math.asin(.5*c/this.rq),o=Math.cos(r),u*=r=Math.sin(r),this.mode===this.OBLIQ?(h=o*this.sinb1+d*r*this.cosb1/c,l=this.qp*h,d=c*this.cosb1*o-d*this.sinb1*r):(h=d*r/c,l=this.qp*h,d=c*o)}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(d=-d),l=u*u+d*d,!l)return t.x=0,t.y=this.phi0,t;h=1-l/this.qp,this.mode===this.S_POLE&&(h=-h)}e=Math.atan2(u,d),i=this.authlat(Math.asin(h),this.apa)}return t.x=a(this.long0+e),t.y=i,t},i.P00=.3333333333333333,i.P01=.17222222222222222,i.P02=.10257936507936508,i.P10=.06388888888888888,i.P11=.0664021164021164,i.P20=.016415012942191543,i.authset=function(t){var e,i=[];return i[0]=t*this.P00,e=t*t,i[0]+=e*this.P01,i[1]=e*this.P10,e*=t,i[0]+=e*this.P02,i[1]+=e*this.P11,i[2]=e*this.P20,i},i.authlat=function(t,e){var i=t+t;return t+e[0]*Math.sin(i)+e[1]*Math.sin(i+i)+e[2]*Math.sin(i+i+i)},i.names=["Lambert Azimuthal Equal Area","Lambert_Azimuthal_Equal_Area","laea"]},{"../common/adjust_lon":5,"../common/qsfnz":20}],49:[function(t,e,i){var n=1e-10,o=t("../common/msfnz"),s=t("../common/tsfnz"),r=Math.PI/2,a=t("../common/sign"),l=t("../common/adjust_lon"),c=t("../common/phi2z");i.init=function(){if(this.lat2||(this.lat2=this.lat1),this.k0||(this.k0=1),this.x0=this.x0||0,this.y0=this.y0||0,!(Math.abs(this.lat1+this.lat2)<n)){var t=this.b/this.a;this.e=Math.sqrt(1-t*t);var e=Math.sin(this.lat1),i=Math.cos(this.lat1),r=o(this.e,e,i),a=s(this.e,this.lat1,e),l=Math.sin(this.lat2),c=Math.cos(this.lat2),h=o(this.e,l,c),u=s(this.e,this.lat2,l),d=s(this.e,this.lat0,Math.sin(this.lat0));this.ns=Math.abs(this.lat1-this.lat2)>n?Math.log(r/h)/Math.log(a/u):e,isNaN(this.ns)&&(this.ns=e),this.f0=r/(this.ns*Math.pow(a,this.ns)),this.rh=this.a*this.f0*Math.pow(d,this.ns),this.title||(this.title="Lambert Conformal Conic")}},i.forward=function(t){var e=t.x,i=t.y;Math.abs(2*Math.abs(i)-Math.PI)<=n&&(i=a(i)*(r-2*n));var o,c,h=Math.abs(Math.abs(i)-r);if(h>n)o=s(this.e,i,Math.sin(i)),c=this.a*this.f0*Math.pow(o,this.ns);else{if(h=i*this.ns,0>=h)return null;c=0}var u=this.ns*l(e-this.long0);return t.x=this.k0*c*Math.sin(u)+this.x0,t.y=this.k0*(this.rh-c*Math.cos(u))+this.y0,t},i.inverse=function(t){var e,i,n,o,s,a=(t.x-this.x0)/this.k0,h=this.rh-(t.y-this.y0)/this.k0;this.ns>0?(e=Math.sqrt(a*a+h*h),i=1):(e=-Math.sqrt(a*a+h*h),i=-1);var u=0;if(0!==e&&(u=Math.atan2(i*a,i*h)),0!==e||this.ns>0){if(i=1/this.ns,n=Math.pow(e/(this.a*this.f0),i),o=c(this.e,n),-9999===o)return null}else o=-r;return s=l(u/this.ns+this.long0),t.x=s,t.y=o,t},i.names=["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_2SP","lcc"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/sign":21,"../common/tsfnz":24}],50:[function(t,e,i){function n(t){return t}i.init=function(){},i.forward=n,i.inverse=n,i.names=["longlat","identity"]},{}],51:[function(t,e,i){var n=t("../common/msfnz"),o=Math.PI/2,s=1e-10,r=57.29577951308232,a=t("../common/adjust_lon"),l=Math.PI/4,c=t("../common/tsfnz"),h=t("../common/phi2z");i.init=function(){var t=this.b/this.a;this.es=1-t*t,"x0"in this||(this.x0=0),"y0"in this||(this.y0=0),this.e=Math.sqrt(this.es),this.lat_ts?this.k0=this.sphere?Math.cos(this.lat_ts):n(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)):this.k0||(this.k0=this.k?this.k:1)},i.forward=function(t){var e=t.x,i=t.y;if(i*r>90&&-90>i*r&&e*r>180&&-180>e*r)return null;var n,h;if(Math.abs(Math.abs(i)-o)<=s)return null;if(this.sphere)n=this.x0+this.a*this.k0*a(e-this.long0),h=this.y0+this.a*this.k0*Math.log(Math.tan(l+.5*i));else{var u=Math.sin(i),d=c(this.e,i,u);n=this.x0+this.a*this.k0*a(e-this.long0),h=this.y0-this.a*this.k0*Math.log(d)}return t.x=n,t.y=h,t},i.inverse=function(t){var e,i,n=t.x-this.x0,s=t.y-this.y0;if(this.sphere)i=o-2*Math.atan(Math.exp(-s/(this.a*this.k0)));else{var r=Math.exp(-s/(this.a*this.k0));if(i=h(this.e,r),-9999===i)return null}return e=a(this.long0+n/(this.a*this.k0)),t.x=e,t.y=i,t},i.names=["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/tsfnz":24}],52:[function(t,e,i){var n=t("../common/adjust_lon");i.init=function(){},i.forward=function(t){var e=t.x,i=t.y,o=n(e-this.long0),s=this.x0+this.a*o,r=this.y0+this.a*Math.log(Math.tan(Math.PI/4+i/2.5))*1.25;return t.x=s,t.y=r,t},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e=n(this.long0+t.x/this.a),i=2.5*(Math.atan(Math.exp(.8*t.y/this.a))-Math.PI/4);return t.x=e,t.y=i,t},i.names=["Miller_Cylindrical","mill"]},{"../common/adjust_lon":5}],53:[function(t,e,i){var n=t("../common/adjust_lon"),o=1e-10;i.init=function(){},i.forward=function(t){for(var e=t.x,i=t.y,s=n(e-this.long0),r=i,a=Math.PI*Math.sin(i),l=0;!0;l++){var c=-(r+Math.sin(r)-a)/(1+Math.cos(r));if(r+=c,Math.abs(c)<o)break}r/=2,Math.PI/2-Math.abs(i)<o&&(s=0);var h=.900316316158*this.a*s*Math.cos(r)+this.x0,u=1.4142135623731*this.a*Math.sin(r)+this.y0;return t.x=h,t.y=u,t},i.inverse=function(t){var e,i;t.x-=this.x0,t.y-=this.y0,i=t.y/(1.4142135623731*this.a),Math.abs(i)>.999999999999&&(i=.999999999999),e=Math.asin(i);var o=n(this.long0+t.x/(.900316316158*this.a*Math.cos(e)));o<-Math.PI&&(o=-Math.PI),o>Math.PI&&(o=Math.PI),i=(2*e+Math.sin(2*e))/Math.PI,Math.abs(i)>1&&(i=1);var s=Math.asin(i);return t.x=o,t.y=s,t},i.names=["Mollweide","moll"]},{"../common/adjust_lon":5}],54:[function(t,e,i){var n=484813681109536e-20;i.iterations=1,i.init=function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},i.forward=function(t){var e,i=t.x,o=t.y,s=o-this.lat0,r=i-this.long0,a=s/n*1e-5,l=r,c=1,h=0;for(e=1;10>=e;e++)c*=a,h+=this.A[e]*c;var u,d,p=h,m=l,f=1,_=0,g=0,v=0;for(e=1;6>=e;e++)u=f*p-_*m,d=_*p+f*m,f=u,_=d,g=g+this.B_re[e]*f-this.B_im[e]*_,v=v+this.B_im[e]*f+this.B_re[e]*_;return t.x=v*this.a+this.x0,t.y=g*this.a+this.y0,t},i.inverse=function(t){var e,i,o,s=t.x,r=t.y,a=s-this.x0,l=r-this.y0,c=l/this.a,h=a/this.a,u=1,d=0,p=0,m=0;for(e=1;6>=e;e++)i=u*c-d*h,o=d*c+u*h,u=i,d=o,p=p+this.C_re[e]*u-this.C_im[e]*d,m=m+this.C_im[e]*u+this.C_re[e]*d;for(var f=0;f<this.iterations;f++){var _,g,v=p,y=m,E=c,P=h;for(e=2;6>=e;e++)_=v*p-y*m,g=y*p+v*m,v=_,y=g,E+=(e-1)*(this.B_re[e]*v-this.B_im[e]*y),P+=(e-1)*(this.B_im[e]*v+this.B_re[e]*y);v=1,y=0;var C=this.B_re[1],S=this.B_im[1];for(e=2;6>=e;e++)_=v*p-y*m,g=y*p+v*m,v=_,y=g,C+=e*(this.B_re[e]*v-this.B_im[e]*y),S+=e*(this.B_im[e]*v+this.B_re[e]*y);var M=C*C+S*S;p=(E*C+P*S)/M,m=(P*C-E*S)/M}var w=p,L=m,R=1,b=0;for(e=1;9>=e;e++)R*=w,b+=this.D[e]*R;var x=this.lat0+b*n*1e5,G=this.long0+L;return t.x=G,t.y=x,t},i.names=["New_Zealand_Map_Grid","nzmg"]},{}],55:[function(t,e,i){var n=t("../common/tsfnz"),o=t("../common/adjust_lon"),s=t("../common/phi2z"),r=Math.PI/2,a=Math.PI/4,l=1e-10;i.init=function(){this.no_off=this.no_off||!1,this.no_rot=this.no_rot||!1,isNaN(this.k0)&&(this.k0=1);var t=Math.sin(this.lat0),e=Math.cos(this.lat0),i=this.e*t;this.bl=Math.sqrt(1+this.es/(1-this.es)*Math.pow(e,4)),this.al=this.a*this.bl*this.k0*Math.sqrt(1-this.es)/(1-i*i);var s=n(this.e,this.lat0,t),r=this.bl/e*Math.sqrt((1-this.es)/(1-i*i));1>r*r&&(r=1);var a,l;if(isNaN(this.longc)){var c=n(this.e,this.lat1,Math.sin(this.lat1)),h=n(this.e,this.lat2,Math.sin(this.lat2));this.el=this.lat0>=0?(r+Math.sqrt(r*r-1))*Math.pow(s,this.bl):(r-Math.sqrt(r*r-1))*Math.pow(s,this.bl);var u=Math.pow(c,this.bl),d=Math.pow(h,this.bl);a=this.el/u,l=.5*(a-1/a);var p=(this.el*this.el-d*u)/(this.el*this.el+d*u),m=(d-u)/(d+u),f=o(this.long1-this.long2);this.long0=.5*(this.long1+this.long2)-Math.atan(p*Math.tan(.5*this.bl*f)/m)/this.bl,this.long0=o(this.long0);var _=o(this.long1-this.long0);this.gamma0=Math.atan(Math.sin(this.bl*_)/l),this.alpha=Math.asin(r*Math.sin(this.gamma0))}else a=this.lat0>=0?r+Math.sqrt(r*r-1):r-Math.sqrt(r*r-1),this.el=a*Math.pow(s,this.bl),l=.5*(a-1/a),this.gamma0=Math.asin(Math.sin(this.alpha)/r),this.long0=this.longc-Math.asin(l*Math.tan(this.gamma0))/this.bl;this.uc=this.no_off?0:this.lat0>=0?this.al/this.bl*Math.atan2(Math.sqrt(r*r-1),Math.cos(this.alpha)):-1*this.al/this.bl*Math.atan2(Math.sqrt(r*r-1),Math.cos(this.alpha))},i.forward=function(t){var e,i,s,c=t.x,h=t.y,u=o(c-this.long0);if(Math.abs(Math.abs(h)-r)<=l)s=h>0?-1:1,i=this.al/this.bl*Math.log(Math.tan(a+s*this.gamma0*.5)),e=-1*s*r*this.al/this.bl;else{var d=n(this.e,h,Math.sin(h)),p=this.el/Math.pow(d,this.bl),m=.5*(p-1/p),f=.5*(p+1/p),_=Math.sin(this.bl*u),g=(m*Math.sin(this.gamma0)-_*Math.cos(this.gamma0))/f;i=Math.abs(Math.abs(g)-1)<=l?Number.POSITIVE_INFINITY:.5*this.al*Math.log((1-g)/(1+g))/this.bl,e=Math.abs(Math.cos(this.bl*u))<=l?this.al*this.bl*u:this.al*Math.atan2(m*Math.cos(this.gamma0)+_*Math.sin(this.gamma0),Math.cos(this.bl*u))/this.bl}return this.no_rot?(t.x=this.x0+e,t.y=this.y0+i):(e-=this.uc,t.x=this.x0+i*Math.cos(this.alpha)+e*Math.sin(this.alpha),t.y=this.y0+e*Math.cos(this.alpha)-i*Math.sin(this.alpha)),t},i.inverse=function(t){var e,i;this.no_rot?(i=t.y-this.y0,e=t.x-this.x0):(i=(t.x-this.x0)*Math.cos(this.alpha)-(t.y-this.y0)*Math.sin(this.alpha),e=(t.y-this.y0)*Math.cos(this.alpha)+(t.x-this.x0)*Math.sin(this.alpha),e+=this.uc);var n=Math.exp(-1*this.bl*i/this.al),a=.5*(n-1/n),c=.5*(n+1/n),h=Math.sin(this.bl*e/this.al),u=(h*Math.cos(this.gamma0)+a*Math.sin(this.gamma0))/c,d=Math.pow(this.el/Math.sqrt((1+u)/(1-u)),1/this.bl);return Math.abs(u-1)<l?(t.x=this.long0,t.y=r):Math.abs(u+1)<l?(t.x=this.long0,t.y=-1*r):(t.y=s(this.e,d),t.x=o(this.long0-Math.atan2(a*Math.cos(this.gamma0)-h*Math.sin(this.gamma0),Math.cos(this.bl*e/this.al))/this.bl)),t},i.names=["Hotine_Oblique_Mercator","Hotine Oblique Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin","Hotine_Oblique_Mercator_Azimuth_Center","omerc"]},{"../common/adjust_lon":5,"../common/phi2z":16,"../common/tsfnz":24}],56:[function(t,e,i){var n=t("../common/e0fn"),o=t("../common/e1fn"),s=t("../common/e2fn"),r=t("../common/e3fn"),a=t("../common/adjust_lon"),l=t("../common/adjust_lat"),c=t("../common/mlfn"),h=1e-10,u=t("../common/gN"),d=20;i.init=function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=n(this.es),this.e1=o(this.es),this.e2=s(this.es),this.e3=r(this.es),this.ml0=this.a*c(this.e0,this.e1,this.e2,this.e3,this.lat0)},i.forward=function(t){var e,i,n,o=t.x,s=t.y,r=a(o-this.long0);if(n=r*Math.sin(s),this.sphere)Math.abs(s)<=h?(e=this.a*r,i=-1*this.a*this.lat0):(e=this.a*Math.sin(n)/Math.tan(s),i=this.a*(l(s-this.lat0)+(1-Math.cos(n))/Math.tan(s)));else if(Math.abs(s)<=h)e=this.a*r,i=-1*this.ml0;else{var d=u(this.a,this.e,Math.sin(s))/Math.tan(s);e=d*Math.sin(n),i=this.a*c(this.e0,this.e1,this.e2,this.e3,s)-this.ml0+d*(1-Math.cos(n))}return t.x=e+this.x0,t.y=i+this.y0,t},i.inverse=function(t){var e,i,n,o,s,r,l,u,p;if(n=t.x-this.x0,o=t.y-this.y0,this.sphere)if(Math.abs(o+this.a*this.lat0)<=h)e=a(n/this.a+this.long0),i=0;else{r=this.lat0+o/this.a,l=n*n/this.a/this.a+r*r,u=r;var m;for(s=d;s;--s)if(m=Math.tan(u),p=-1*(r*(u*m+1)-u-.5*(u*u+l)*m)/((u-r)/m-1),u+=p,Math.abs(p)<=h){i=u;break}e=a(this.long0+Math.asin(n*Math.tan(u)/this.a)/Math.sin(i))}else if(Math.abs(o+this.ml0)<=h)i=0,e=a(this.long0+n/this.a);else{r=(this.ml0+o)/this.a,l=n*n/this.a/this.a+r*r,u=r;var f,_,g,v,y;for(s=d;s;--s)if(y=this.e*Math.sin(u),f=Math.sqrt(1-y*y)*Math.tan(u),_=this.a*c(this.e0,this.e1,this.e2,this.e3,u),g=this.e0-2*this.e1*Math.cos(2*u)+4*this.e2*Math.cos(4*u)-6*this.e3*Math.cos(6*u),v=_/this.a,p=(r*(f*v+1)-v-.5*f*(v*v+l))/(this.es*Math.sin(2*u)*(v*v+l-2*r*v)/(4*f)+(r-v)*(f*g-2/Math.sin(2*u))-g),u-=p,Math.abs(p)<=h){i=u;break}f=Math.sqrt(1-this.es*Math.pow(Math.sin(i),2))*Math.tan(i),e=a(this.long0+Math.asin(n*f/this.a)/Math.sin(i))}return t.x=e,t.y=i,t},i.names=["Polyconic","poly"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/mlfn":14}],57:[function(t,e,i){var n=t("../common/adjust_lon"),o=t("../common/adjust_lat"),s=t("../common/pj_enfn"),r=20,a=t("../common/pj_mlfn"),l=t("../common/pj_inv_mlfn"),c=Math.PI/2,h=1e-10,u=t("../common/asinz");i.init=function(){this.sphere?(this.n=1,this.m=0,this.es=0,this.C_y=Math.sqrt((this.m+1)/this.n),this.C_x=this.C_y/(this.m+1)):this.en=s(this.es)},i.forward=function(t){var e,i,o=t.x,s=t.y;if(o=n(o-this.long0),this.sphere){if(this.m)for(var l=this.n*Math.sin(s),c=r;c;--c){var u=(this.m*s+Math.sin(s)-l)/(this.m+Math.cos(s));if(s-=u,Math.abs(u)<h)break}else s=1!==this.n?Math.asin(this.n*Math.sin(s)):s;e=this.a*this.C_x*o*(this.m+Math.cos(s)),i=this.a*this.C_y*s}else{var d=Math.sin(s),p=Math.cos(s);i=this.a*a(s,d,p,this.en),e=this.a*o*p/Math.sqrt(1-this.es*d*d)}return t.x=e,t.y=i,t},i.inverse=function(t){var e,i,s,r;return t.x-=this.x0,s=t.x/this.a,t.y-=this.y0,e=t.y/this.a,this.sphere?(e/=this.C_y,s/=this.C_x*(this.m+Math.cos(e)),this.m?e=u((this.m*e+Math.sin(e))/this.n):1!==this.n&&(e=u(Math.sin(e)/this.n)),s=n(s+this.long0),e=o(e)):(e=l(t.y/this.a,this.es,this.en),r=Math.abs(e),c>r?(r=Math.sin(e),i=this.long0+t.x*Math.sqrt(1-this.es*r*r)/(this.a*Math.cos(e)),s=n(i)):c>r-h&&(s=this.long0)),t.x=s,t.y=e,t},i.names=["Sinusoidal","sinu"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/asinz":6,"../common/pj_enfn":17,"../common/pj_inv_mlfn":18,"../common/pj_mlfn":19}],58:[function(t,e,i){i.init=function(){var t=this.lat0;this.lambda0=this.long0;var e=Math.sin(t),i=this.a,n=this.rf,o=1/n,s=2*o-Math.pow(o,2),r=this.e=Math.sqrt(s);this.R=this.k0*i*Math.sqrt(1-s)/(1-s*Math.pow(e,2)),this.alpha=Math.sqrt(1+s/(1-s)*Math.pow(Math.cos(t),4)),this.b0=Math.asin(e/this.alpha);var a=Math.log(Math.tan(Math.PI/4+this.b0/2)),l=Math.log(Math.tan(Math.PI/4+t/2)),c=Math.log((1+r*e)/(1-r*e));this.K=a-this.alpha*l+this.alpha*r/2*c},i.forward=function(t){var e=Math.log(Math.tan(Math.PI/4-t.y/2)),i=this.e/2*Math.log((1+this.e*Math.sin(t.y))/(1-this.e*Math.sin(t.y))),n=-this.alpha*(e+i)+this.K,o=2*(Math.atan(Math.exp(n))-Math.PI/4),s=this.alpha*(t.x-this.lambda0),r=Math.atan(Math.sin(s)/(Math.sin(this.b0)*Math.tan(o)+Math.cos(this.b0)*Math.cos(s))),a=Math.asin(Math.cos(this.b0)*Math.sin(o)-Math.sin(this.b0)*Math.cos(o)*Math.cos(s));return t.y=this.R/2*Math.log((1+Math.sin(a))/(1-Math.sin(a)))+this.y0,t.x=this.R*r+this.x0,t},i.inverse=function(t){for(var e=t.x-this.x0,i=t.y-this.y0,n=e/this.R,o=2*(Math.atan(Math.exp(i/this.R))-Math.PI/4),s=Math.asin(Math.cos(this.b0)*Math.sin(o)+Math.sin(this.b0)*Math.cos(o)*Math.cos(n)),r=Math.atan(Math.sin(n)/(Math.cos(this.b0)*Math.cos(n)-Math.sin(this.b0)*Math.tan(o))),a=this.lambda0+r/this.alpha,l=0,c=s,h=-1e3,u=0;Math.abs(c-h)>1e-7;){if(++u>20)return;l=1/this.alpha*(Math.log(Math.tan(Math.PI/4+s/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(c))/2)),h=c,c=2*Math.atan(Math.exp(l))-Math.PI/2}return t.x=a,t.y=c,t},i.names=["somerc"]},{}],59:[function(t,e,i){var n=Math.PI/2,o=1e-10,s=t("../common/sign"),r=t("../common/msfnz"),a=t("../common/tsfnz"),l=t("../common/phi2z"),c=t("../common/adjust_lon");i.ssfn_=function(t,e,i){return e*=i,Math.tan(.5*(n+t))*Math.pow((1-e)/(1+e),.5*i)},i.init=function(){this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=o&&(this.k0=.5*(1+s(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=o&&(this.con=this.lat0>0?1:-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=o&&(this.k0=.5*this.cons*r(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/a(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=r(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-n,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},i.forward=function(t){var e,i,s,r,l,h,u=t.x,d=t.y,p=Math.sin(d),m=Math.cos(d),f=c(u-this.long0);return Math.abs(Math.abs(u-this.long0)-Math.PI)<=o&&Math.abs(d+this.lat0)<=o?(t.x=NaN,t.y=NaN,t):this.sphere?(e=2*this.k0/(1+this.sinlat0*p+this.coslat0*m*Math.cos(f)),t.x=this.a*e*m*Math.sin(f)+this.x0,t.y=this.a*e*(this.coslat0*p-this.sinlat0*m*Math.cos(f))+this.y0,t):(i=2*Math.atan(this.ssfn_(d,p,this.e))-n,r=Math.cos(i),s=Math.sin(i),Math.abs(this.coslat0)<=o?(l=a(this.e,d*this.con,this.con*p),h=2*this.a*this.k0*l/this.cons,t.x=this.x0+h*Math.sin(u-this.long0),t.y=this.y0-this.con*h*Math.cos(u-this.long0),t):(Math.abs(this.sinlat0)<o?(e=2*this.a*this.k0/(1+r*Math.cos(f)),t.y=e*s):(e=2*this.a*this.k0*this.ms1/(this.cosX0*(1+this.sinX0*s+this.cosX0*r*Math.cos(f))),t.y=e*(this.cosX0*s-this.sinX0*r*Math.cos(f))+this.y0),t.x=e*r*Math.sin(f)+this.x0,t))},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e,i,s,r,a,h=Math.sqrt(t.x*t.x+t.y*t.y);if(this.sphere){var u=2*Math.atan(h/(.5*this.a*this.k0));return e=this.long0,i=this.lat0,o>=h?(t.x=e,t.y=i,t):(i=Math.asin(Math.cos(u)*this.sinlat0+t.y*Math.sin(u)*this.coslat0/h),e=c(Math.abs(this.coslat0)<o?this.lat0>0?this.long0+Math.atan2(t.x,-1*t.y):this.long0+Math.atan2(t.x,t.y):this.long0+Math.atan2(t.x*Math.sin(u),h*this.coslat0*Math.cos(u)-t.y*this.sinlat0*Math.sin(u))),t.x=e,t.y=i,t)}if(Math.abs(this.coslat0)<=o){if(o>=h)return i=this.lat0,e=this.long0,t.x=e,t.y=i,t;t.x*=this.con,t.y*=this.con,s=h*this.cons/(2*this.a*this.k0),i=this.con*l(this.e,s),e=this.con*c(this.con*this.long0+Math.atan2(t.x,-1*t.y))}else r=2*Math.atan(h*this.cosX0/(2*this.a*this.k0*this.ms1)),e=this.long0,o>=h?a=this.X0:(a=Math.asin(Math.cos(r)*this.sinX0+t.y*Math.sin(r)*this.cosX0/h),e=c(this.long0+Math.atan2(t.x*Math.sin(r),h*this.cosX0*Math.cos(r)-t.y*this.sinX0*Math.sin(r)))),i=-1*l(this.e,Math.tan(.5*(n+a)));return t.x=e,t.y=i,t},i.names=["stere"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/sign":21,"../common/tsfnz":24}],60:[function(t,e,i){var n=t("./gauss"),o=t("../common/adjust_lon");i.init=function(){n.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title="Oblique Stereographic Alternative"))},i.forward=function(t){var e,i,s,r;return t.x=o(t.x-this.long0),n.forward.apply(this,[t]),e=Math.sin(t.y),i=Math.cos(t.y),s=Math.cos(t.x),r=this.k0*this.R2/(1+this.sinc0*e+this.cosc0*i*s),t.x=r*i*Math.sin(t.x),t.y=r*(this.cosc0*e-this.sinc0*i*s),t.x=this.a*t.x+this.x0,t.y=this.a*t.y+this.y0,t},i.inverse=function(t){var e,i,s,r,a;if(t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,t.x/=this.k0,t.y/=this.k0,a=Math.sqrt(t.x*t.x+t.y*t.y)){var l=2*Math.atan2(a,this.R2);e=Math.sin(l),i=Math.cos(l),r=Math.asin(i*this.sinc0+t.y*e*this.cosc0/a),s=Math.atan2(t.x*e,a*this.cosc0*i-t.y*this.sinc0*e)}else r=this.phic0,s=0;return t.x=s,t.y=r,n.inverse.apply(this,[t]),t.x=o(t.x+this.long0),t},i.names=["Stereographic_North_Pole","Oblique_Stereographic","Polar_Stereographic","sterea","Oblique Stereographic Alternative"]},{"../common/adjust_lon":5,"./gauss":45}],61:[function(t,e,i){var n=t("../common/e0fn"),o=t("../common/e1fn"),s=t("../common/e2fn"),r=t("../common/e3fn"),a=t("../common/mlfn"),l=t("../common/adjust_lon"),c=Math.PI/2,h=1e-10,u=t("../common/sign"),d=t("../common/asinz");i.init=function(){this.e0=n(this.es),this.e1=o(this.es),this.e2=s(this.es),this.e3=r(this.es),this.ml0=this.a*a(this.e0,this.e1,this.e2,this.e3,this.lat0)},i.forward=function(t){var e,i,n,o=t.x,s=t.y,r=l(o-this.long0),c=Math.sin(s),h=Math.cos(s);if(this.sphere){var u=h*Math.sin(r);if(Math.abs(Math.abs(u)-1)<1e-10)return 93;i=.5*this.a*this.k0*Math.log((1+u)/(1-u)),e=Math.acos(h*Math.cos(r)/Math.sqrt(1-u*u)),0>s&&(e=-e),n=this.a*this.k0*(e-this.lat0)}else{var d=h*r,p=Math.pow(d,2),m=this.ep2*Math.pow(h,2),f=Math.tan(s),_=Math.pow(f,2);e=1-this.es*Math.pow(c,2);var g=this.a/Math.sqrt(e),v=this.a*a(this.e0,this.e1,this.e2,this.e3,s);i=this.k0*g*d*(1+p/6*(1-_+m+p/20*(5-18*_+Math.pow(_,2)+72*m-58*this.ep2)))+this.x0,n=this.k0*(v-this.ml0+g*f*p*(.5+p/24*(5-_+9*m+4*Math.pow(m,2)+p/30*(61-58*_+Math.pow(_,2)+600*m-330*this.ep2))))+this.y0}return t.x=i,t.y=n,t},i.inverse=function(t){var e,i,n,o,s,r,a=6;if(this.sphere){var p=Math.exp(t.x/(this.a*this.k0)),m=.5*(p-1/p),f=this.lat0+t.y/(this.a*this.k0),_=Math.cos(f);e=Math.sqrt((1-_*_)/(1+m*m)),s=d(e),0>f&&(s=-s),r=0===m&&0===_?this.long0:l(Math.atan2(m,_)+this.long0)}else{var g=t.x-this.x0,v=t.y-this.y0;for(e=(this.ml0+v/this.k0)/this.a,i=e,o=0;n=(e+this.e1*Math.sin(2*i)-this.e2*Math.sin(4*i)+this.e3*Math.sin(6*i))/this.e0-i,i+=n,!(Math.abs(n)<=h);o++)if(o>=a)return 95;if(Math.abs(i)<c){var y=Math.sin(i),E=Math.cos(i),P=Math.tan(i),C=this.ep2*Math.pow(E,2),S=Math.pow(C,2),M=Math.pow(P,2),w=Math.pow(M,2);e=1-this.es*Math.pow(y,2);var L=this.a/Math.sqrt(e),R=L*(1-this.es)/e,b=g/(L*this.k0),x=Math.pow(b,2);s=i-L*P*x/R*(.5-x/24*(5+3*M+10*C-4*S-9*this.ep2-x/30*(61+90*M+298*C+45*w-252*this.ep2-3*S))),r=l(this.long0+b*(1-x/6*(1+2*M+C-x/20*(5-2*C+28*M-3*S+8*this.ep2+24*w)))/E)}else s=c*u(v),r=this.long0}return t.x=r,t.y=s,t},i.names=["Transverse_Mercator","Transverse Mercator","tmerc"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/mlfn":14,"../common/sign":21}],62:[function(t,e,i){var n=.017453292519943295,o=t("./tmerc");i.dependsOn="tmerc",i.init=function(){this.zone&&(this.lat0=0,this.long0=(6*Math.abs(this.zone)-183)*n,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,o.init.apply(this),this.forward=o.forward,this.inverse=o.inverse)},i.names=["Universal Transverse Mercator System","utm"]},{"./tmerc":61}],63:[function(t,e,i){var n=t("../common/adjust_lon"),o=Math.PI/2,s=1e-10,r=t("../common/asinz");i.init=function(){this.R=this.a},i.forward=function(t){var e,i,a=t.x,l=t.y,c=n(a-this.long0);Math.abs(l)<=s&&(e=this.x0+this.R*c,i=this.y0);var h=r(2*Math.abs(l/Math.PI));(Math.abs(c)<=s||Math.abs(Math.abs(l)-o)<=s)&&(e=this.x0,i=l>=0?this.y0+Math.PI*this.R*Math.tan(.5*h):this.y0+Math.PI*this.R*-Math.tan(.5*h));var u=.5*Math.abs(Math.PI/c-c/Math.PI),d=u*u,p=Math.sin(h),m=Math.cos(h),f=m/(p+m-1),_=f*f,g=f*(2/p-1),v=g*g,y=Math.PI*this.R*(u*(f-v)+Math.sqrt(d*(f-v)*(f-v)-(v+d)*(_-v)))/(v+d);0>c&&(y=-y),e=this.x0+y;var E=d+f;return y=Math.PI*this.R*(g*E-u*Math.sqrt((v+d)*(d+1)-E*E))/(v+d),i=l>=0?this.y0+y:this.y0-y,t.x=e,t.y=i,t},i.inverse=function(t){var e,i,o,r,a,l,c,h,u,d,p,m,f;return t.x-=this.x0,t.y-=this.y0,p=Math.PI*this.R,o=t.x/p,r=t.y/p,a=o*o+r*r,l=-Math.abs(r)*(1+a),c=l-2*r*r+o*o,h=-2*l+1+2*r*r+a*a,f=r*r/h+(2*c*c*c/h/h/h-9*l*c/h/h)/27,u=(l-c*c/3/h)/h,d=2*Math.sqrt(-u/3),p=3*f/u/d,Math.abs(p)>1&&(p=p>=0?1:-1),m=Math.acos(p)/3,i=t.y>=0?(-d*Math.cos(m+Math.PI/3)-c/3/h)*Math.PI:-(-d*Math.cos(m+Math.PI/3)-c/3/h)*Math.PI,e=Math.abs(o)<s?this.long0:n(this.long0+Math.PI*(a-1+Math.sqrt(1+2*(o*o-r*r)+a*a))/2/o),t.x=e,t.y=i,t},i.names=["Van_der_Grinten_I","VanDerGrinten","vandg"]},{"../common/adjust_lon":5,"../common/asinz":6}],64:[function(t,e){var i=.017453292519943295,n=57.29577951308232,o=1,s=2,r=t("./datum_transform"),a=t("./adjust_axis"),l=t("./Proj"),c=t("./common/toPoint");e.exports=function t(e,h,u){function d(t,e){return(t.datum.datum_type===o||t.datum.datum_type===s)&&"WGS84"!==e.datumCode}var p;return Array.isArray(u)&&(u=c(u)),e.datum&&h.datum&&(d(e,h)||d(h,e))&&(p=new l("WGS84"),t(e,p,u),e=p),"enu"!==e.axis&&a(e,!1,u),"longlat"===e.projName?(u.x*=i,u.y*=i):(e.to_meter&&(u.x*=e.to_meter,u.y*=e.to_meter),e.inverse(u)),e.from_greenwich&&(u.x+=e.from_greenwich),u=r(e.datum,h.datum,u),h.from_greenwich&&(u.x-=h.from_greenwich),"longlat"===h.projName?(u.x*=n,u.y*=n):(h.forward(u),h.to_meter&&(u.x/=h.to_meter,u.y/=h.to_meter)),"enu"!==h.axis&&a(h,!0,u),u}},{"./Proj":2,"./adjust_axis":3,"./common/toPoint":23,"./datum_transform":30}],65:[function(t,e){function i(t,e,i){t[e]=i.map(function(t){var e={};return n(t,e),e}).reduce(function(t,e){return l(t,e)},{})}function n(t,e){var o;return Array.isArray(t)?(o=t.shift(),"PARAMETER"===o&&(o=t.shift()),void(1===t.length?Array.isArray(t[0])?(e[o]={},n(t[0],e[o])):e[o]=t[0]:t.length?"TOWGS84"===o?e[o]=t:(e[o]={},["UNIT","PRIMEM","VERT_DATUM"].indexOf(o)>-1?(e[o]={name:t[0].toLowerCase(),convert:t[1]},3===t.length&&(e[o].auth=t[2])):"SPHEROID"===o?(e[o]={name:t[0],a:t[1],rf:t[2]},4===t.length&&(e[o].auth=t[3])):["GEOGCS","GEOCCS","DATUM","VERT_CS","COMPD_CS","LOCAL_CS","FITTED_CS","LOCAL_DATUM"].indexOf(o)>-1?(t[0]=["name",t[0]],i(e,o,t)):t.every(function(t){return Array.isArray(t)})?i(e,o,t):n(t,e[o])):e[o]=!0)):void(e[t]=!0)}function o(t,e){var i=e[0],n=e[1];!(i in t)&&n in t&&(t[i]=t[n],3===e.length&&(t[i]=e[2](t[i])))}function s(t){return t*a}function r(t){function e(e){var i=t.to_meter||1;return parseFloat(e,10)*i}"GEOGCS"===t.type?t.projName="longlat":"LOCAL_CS"===t.type?(t.projName="identity",t.local=!0):t.projName="object"==typeof t.PROJECTION?Object.keys(t.PROJECTION)[0]:t.PROJECTION,t.UNIT&&(t.units=t.UNIT.name.toLowerCase(),"metre"===t.units&&(t.units="meter"),t.UNIT.convert&&(t.to_meter=parseFloat(t.UNIT.convert,10))),t.GEOGCS&&(t.datumCode=t.GEOGCS.DATUM?t.GEOGCS.DATUM.name.toLowerCase():t.GEOGCS.name.toLowerCase(),"d_"===t.datumCode.slice(0,2)&&(t.datumCode=t.datumCode.slice(2)),("new_zealand_geodetic_datum_1949"===t.datumCode||"new_zealand_1949"===t.datumCode)&&(t.datumCode="nzgd49"),"wgs_1984"===t.datumCode&&("Mercator_Auxiliary_Sphere"===t.PROJECTION&&(t.sphere=!0),t.datumCode="wgs84"),"_ferro"===t.datumCode.slice(-6)&&(t.datumCode=t.datumCode.slice(0,-6)),"_jakarta"===t.datumCode.slice(-8)&&(t.datumCode=t.datumCode.slice(0,-8)),~t.datumCode.indexOf("belge")&&(t.datumCode="rnb72"),t.GEOGCS.DATUM&&t.GEOGCS.DATUM.SPHEROID&&(t.ellps=t.GEOGCS.DATUM.SPHEROID.name.replace("_19","").replace(/[Cc]larke\_18/,"clrk"),"international"===t.ellps.toLowerCase().slice(0,13)&&(t.ellps="intl"),t.a=t.GEOGCS.DATUM.SPHEROID.a,t.rf=parseFloat(t.GEOGCS.DATUM.SPHEROID.rf,10)),~t.datumCode.indexOf("osgb_1936")&&(t.datumCode="osgb36")),t.b&&!isFinite(t.b)&&(t.b=t.a);var i=function(e){return o(t,e)},n=[["standard_parallel_1","Standard_Parallel_1"],["standard_parallel_2","Standard_Parallel_2"],["false_easting","False_Easting"],["false_northing","False_Northing"],["central_meridian","Central_Meridian"],["latitude_of_origin","Latitude_Of_Origin"],["scale_factor","Scale_Factor"],["k0","scale_factor"],["latitude_of_center","Latitude_of_center"],["lat0","latitude_of_center",s],["longitude_of_center","Longitude_Of_Center"],["longc","longitude_of_center",s],["x0","false_easting",e],["y0","false_northing",e],["long0","central_meridian",s],["lat0","latitude_of_origin",s],["lat0","standard_parallel_1",s],["lat1","standard_parallel_1",s],["lat2","standard_parallel_2",s],["alpha","azimuth",s],["srsCode","name"]];n.forEach(i),t.long0||!t.longc||"Albers_Conic_Equal_Area"!==t.PROJECTION&&"Lambert_Azimuthal_Equal_Area"!==t.PROJECTION||(t.long0=t.longc)}var a=.017453292519943295,l=t("./extend");e.exports=function(t,e){var i=JSON.parse((","+t).replace(/\s*\,\s*([A-Z_0-9]+?)(\[)/g,',["$1",').slice(1).replace(/\s*\,\s*([A-Z_0-9]+?)\]/g,',"$1"]')),o=i.shift(),s=i.shift();i.unshift(["name",s]),i.unshift(["type",o]),i.unshift("output");var a={};return n(i,a),r(a.output),l(e,a.output)}},{"./extend":33}],66:[function(t,e,i){function n(t){return t*(Math.PI/180)}function o(t){return 180*(t/Math.PI)}function s(t){var e,i,o,s,r,l,c,h,u,d=t.lat,p=t.lon,m=6378137,f=.00669438,_=.9996,g=n(d),v=n(p);u=Math.floor((p+180)/6)+1,180===p&&(u=60),d>=56&&64>d&&p>=3&&12>p&&(u=32),d>=72&&84>d&&(p>=0&&9>p?u=31:p>=9&&21>p?u=33:p>=21&&33>p?u=35:p>=33&&42>p&&(u=37)),e=6*(u-1)-180+3,h=n(e),i=f/(1-f),o=m/Math.sqrt(1-f*Math.sin(g)*Math.sin(g)),s=Math.tan(g)*Math.tan(g),r=i*Math.cos(g)*Math.cos(g),l=Math.cos(g)*(v-h),c=m*((1-f/4-3*f*f/64-5*f*f*f/256)*g-(3*f/8+3*f*f/32+45*f*f*f/1024)*Math.sin(2*g)+(15*f*f/256+45*f*f*f/1024)*Math.sin(4*g)-35*f*f*f/3072*Math.sin(6*g));var y=_*o*(l+(1-s+r)*l*l*l/6+(5-18*s+s*s+72*r-58*i)*l*l*l*l*l/120)+5e5,E=_*(c+o*Math.tan(g)*(l*l/2+(5-s+9*r+4*r*r)*l*l*l*l/24+(61-58*s+s*s+600*r-330*i)*l*l*l*l*l*l/720));return 0>d&&(E+=1e7),{northing:Math.round(E),easting:Math.round(y),zoneNumber:u,zoneLetter:a(d)}}function r(t){var e=t.northing,i=t.easting,n=t.zoneLetter,s=t.zoneNumber;if(0>s||s>60)return null;var a,l,c,h,u,d,p,m,f,_,g=.9996,v=6378137,y=.00669438,E=(1-Math.sqrt(1-y))/(1+Math.sqrt(1-y)),P=i-5e5,C=e;"N">n&&(C-=1e7),m=6*(s-1)-180+3,a=y/(1-y),p=C/g,f=p/(v*(1-y/4-3*y*y/64-5*y*y*y/256)),_=f+(3*E/2-27*E*E*E/32)*Math.sin(2*f)+(21*E*E/16-55*E*E*E*E/32)*Math.sin(4*f)+151*E*E*E/96*Math.sin(6*f),l=v/Math.sqrt(1-y*Math.sin(_)*Math.sin(_)),c=Math.tan(_)*Math.tan(_),h=a*Math.cos(_)*Math.cos(_),u=v*(1-y)/Math.pow(1-y*Math.sin(_)*Math.sin(_),1.5),d=P/(l*g);var S=_-l*Math.tan(_)/u*(d*d/2-(5+3*c+10*h-4*h*h-9*a)*d*d*d*d/24+(61+90*c+298*h+45*c*c-252*a-3*h*h)*d*d*d*d*d*d/720);S=o(S);var M=(d-(1+2*c+h)*d*d*d/6+(5-2*h+28*c-3*h*h+8*a+24*c*c)*d*d*d*d*d/120)/Math.cos(_);M=m+o(M);var w;if(t.accuracy){var L=r({northing:t.northing+t.accuracy,easting:t.easting+t.accuracy,zoneLetter:t.zoneLetter,zoneNumber:t.zoneNumber});w={top:L.lat,right:L.lon,bottom:S,left:M}}else w={lat:S,lon:M};return w}function a(t){var e="Z";return 84>=t&&t>=72?e="X":72>t&&t>=64?e="W":64>t&&t>=56?e="V":56>t&&t>=48?e="U":48>t&&t>=40?e="T":40>t&&t>=32?e="S":32>t&&t>=24?e="R":24>t&&t>=16?e="Q":16>t&&t>=8?e="P":8>t&&t>=0?e="N":0>t&&t>=-8?e="M":-8>t&&t>=-16?e="L":-16>t&&t>=-24?e="K":-24>t&&t>=-32?e="J":-32>t&&t>=-40?e="H":-40>t&&t>=-48?e="G":-48>t&&t>=-56?e="F":-56>t&&t>=-64?e="E":-64>t&&t>=-72?e="D":-72>t&&t>=-80&&(e="C"),e}function l(t,e){var i=""+t.easting,n=""+t.northing;return t.zoneNumber+t.zoneLetter+c(t.easting,t.northing,t.zoneNumber)+i.substr(i.length-5,e)+n.substr(n.length-5,e)}function c(t,e,i){var n=h(i),o=Math.floor(t/1e5),s=Math.floor(e/1e5)%20;return u(o,s,n)}function h(t){var e=t%_;return 0===e&&(e=_),e}function u(t,e,i){var n=i-1,o=g.charCodeAt(n),s=v.charCodeAt(n),r=o+t-1,a=s+e,l=!1;r>S&&(r=r-S+y-1,l=!0),(r===E||E>o&&r>E||(r>E||E>o)&&l)&&r++,(r===P||P>o&&r>P||(r>P||P>o)&&l)&&(r++,r===E&&r++),r>S&&(r=r-S+y-1),a>C?(a=a-C+y-1,
+l=!0):l=!1,(a===E||E>s&&a>E||(a>E||E>s)&&l)&&a++,(a===P||P>s&&a>P||(a>P||P>s)&&l)&&(a++,a===E&&a++),a>C&&(a=a-C+y-1);var c=String.fromCharCode(r)+String.fromCharCode(a);return c}function d(t){if(t&&0===t.length)throw"MGRSPoint coverting from nothing";for(var e,i=t.length,n=null,o="",s=0;!/[A-Z]/.test(e=t.charAt(s));){if(s>=2)throw"MGRSPoint bad conversion from: "+t;o+=e,s++}var r=parseInt(o,10);if(0===s||s+3>i)throw"MGRSPoint bad conversion from: "+t;var a=t.charAt(s++);if("A">=a||"B"===a||"Y"===a||a>="Z"||"I"===a||"O"===a)throw"MGRSPoint zone letter "+a+" not handled: "+t;n=t.substring(s,s+=2);for(var l=h(r),c=p(n.charAt(0),l),u=m(n.charAt(1),l);u<f(a);)u+=2e6;var d=i-s;if(d%2!==0)throw"MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters"+t;var _,g,v,y,E,P=d/2,C=0,S=0;return P>0&&(_=1e5/Math.pow(10,P),g=t.substring(s,s+P),C=parseFloat(g)*_,v=t.substring(s+P),S=parseFloat(v)*_),y=C+c,E=S+u,{easting:y,northing:E,zoneLetter:a,zoneNumber:r,accuracy:_}}function p(t,e){for(var i=g.charCodeAt(e-1),n=1e5,o=!1;i!==t.charCodeAt(0);){if(i++,i===E&&i++,i===P&&i++,i>S){if(o)throw"Bad character: "+t;i=y,o=!0}n+=1e5}return n}function m(t,e){if(t>"V")throw"MGRSPoint given invalid Northing "+t;for(var i=v.charCodeAt(e-1),n=0,o=!1;i!==t.charCodeAt(0);){if(i++,i===E&&i++,i===P&&i++,i>C){if(o)throw"Bad character: "+t;i=y,o=!0}n+=1e5}return n}function f(t){var e;switch(t){case"C":e=11e5;break;case"D":e=2e6;break;case"E":e=28e5;break;case"F":e=37e5;break;case"G":e=46e5;break;case"H":e=55e5;break;case"J":e=64e5;break;case"K":e=73e5;break;case"L":e=82e5;break;case"M":e=91e5;break;case"N":e=0;break;case"P":e=8e5;break;case"Q":e=17e5;break;case"R":e=26e5;break;case"S":e=35e5;break;case"T":e=44e5;break;case"U":e=53e5;break;case"V":e=62e5;break;case"W":e=7e6;break;case"X":e=79e5;break;default:e=-1}if(e>=0)return e;throw"Invalid zone letter: "+t}var _=6,g="AJSAJS",v="AFAFAF",y=65,E=73,P=79,C=86,S=90;i.forward=function(t,e){return e=e||5,l(s({lat:t[1],lon:t[0]}),e)},i.inverse=function(t){var e=r(d(t.toUpperCase()));return[e.left,e.bottom,e.right,e.top]},i.toPoint=function(t){var e=i.inverse(t);return[(e[2]+e[0])/2,(e[3]+e[1])/2]}},{}],67:[function(t,e){e.exports={name:"proj4",version:"2.2.1",description:"Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.",main:"lib/index.js",directories:{test:"test",doc:"docs"},scripts:{test:"./node_modules/istanbul/lib/cli.js test ./node_modules/mocha/bin/_mocha test/test.js"},repository:{type:"git",url:"git://github.com/proj4js/proj4js.git"},author:"",license:"MIT",jam:{main:"dist/proj4.js",include:["dist/proj4.js","README.md","AUTHORS","LICENSE.md"]},devDependencies:{"grunt-cli":"~0.1.13",grunt:"~0.4.2","grunt-contrib-connect":"~0.6.0","grunt-contrib-jshint":"~0.8.0",chai:"~1.8.1",mocha:"~1.17.1","grunt-mocha-phantomjs":"~0.4.0",browserify:"~3.24.5","grunt-browserify":"~1.3.0","grunt-contrib-uglify":"~0.3.2",curl:"git://github.com/cujojs/curl.git",istanbul:"~0.2.4",tin:"~0.4.0"},dependencies:{mgrs:"0.0.0"}}},{}],"./includedProjections":[function(t,e){e.exports=t("gWUPNW")},{}],gWUPNW:[function(t,e){var i=[t("./lib/projections/tmerc"),t("./lib/projections/utm"),t("./lib/projections/sterea"),t("./lib/projections/stere"),t("./lib/projections/somerc"),t("./lib/projections/omerc"),t("./lib/projections/lcc"),t("./lib/projections/krovak"),t("./lib/projections/cass"),t("./lib/projections/laea"),t("./lib/projections/aea"),t("./lib/projections/gnom"),t("./lib/projections/cea"),t("./lib/projections/eqc"),t("./lib/projections/poly"),t("./lib/projections/nzmg"),t("./lib/projections/mill"),t("./lib/projections/sinu"),t("./lib/projections/moll"),t("./lib/projections/eqdc"),t("./lib/projections/vandg"),t("./lib/projections/aeqd")];e.exports=function(t){i.forEach(function(e){t.Proj.projections.add(e)})}},{"./lib/projections/aea":39,"./lib/projections/aeqd":40,"./lib/projections/cass":41,"./lib/projections/cea":42,"./lib/projections/eqc":43,"./lib/projections/eqdc":44,"./lib/projections/gnom":46,"./lib/projections/krovak":47,"./lib/projections/laea":48,"./lib/projections/lcc":49,"./lib/projections/mill":52,"./lib/projections/moll":53,"./lib/projections/nzmg":54,"./lib/projections/omerc":55,"./lib/projections/poly":56,"./lib/projections/sinu":57,"./lib/projections/somerc":58,"./lib/projections/stere":59,"./lib/projections/sterea":60,"./lib/projections/tmerc":61,"./lib/projections/utm":62,"./lib/projections/vandg":63}]},{},[35])(35)}),!function(t,e){proj4leaflet07x=function(t,i){return"function"==typeof e?e(t,i):e}(leaflet,proj4)}(this,function(t,e){return t.Proj={},t.Proj._isProj4Obj=function(t){return"undefined"!=typeof t.inverse&&"undefined"!=typeof t.forward},t.Proj.ScaleDependantTransformation=function(t){this.scaleTransforms=t},t.Proj.ScaleDependantTransformation.prototype.transform=function(t,e){return this.scaleTransforms[e].transform(t,e)},t.Proj.ScaleDependantTransformation.prototype.untransform=function(t,e){return this.scaleTransforms[e].untransform(t,e)},t.Proj.Projection=t.Class.extend({initialize:function(i,n){if(t.Proj._isProj4Obj(i))this._proj=i;else{var o=i;if(n)e.defs(o,n);else if(void 0===e.defs[o]){var s=o.split(":");if(s.length>3&&(o=s[s.length-3]+":"+s[s.length-1]),void 0===e.defs[o])throw"No projection definition for code "+o}this._proj=e(o)}},project:function(e){var i=this._proj.forward([e.lng,e.lat]);return new t.Point(i[0],i[1])},unproject:function(e,i){var n=this._proj.inverse([e.x,e.y]);return new t.LatLng(n[1],n[0],i)}}),t.Proj.CRS=t.Class.extend({includes:t.CRS,options:{transformation:new t.Transformation(1,0,-1,0)},initialize:function(e,i,n){var o,s,r,a;if(t.Proj._isProj4Obj(e)?(s=e,o=s.srsCode,a=i||{},this.projection=new t.Proj.Projection(s)):(o=e,r=i,a=n||{},this.projection=new t.Proj.Projection(o,r)),t.Util.setOptions(this,a),this.code=o,this.transformation=this.options.transformation,this.options.origin&&(this.transformation=new t.Transformation(1,-this.options.origin[0],-1,this.options.origin[1])),this.options.scales)this._scales=this.options.scales;else if(this.options.resolutions){this._scales=[];for(var l=this.options.resolutions.length-1;l>=0;l--)this.options.resolutions[l]&&(this._scales[l]=1/this.options.resolutions[l])}},scale:function(t){var e,i,n,o,s=Math.floor(t);return t===s?this._scales[t]:(e=this._scales[s],i=this._scales[s+1],n=i-e,o=t-s,e+n*o)},getSize:function(e){var i,n,o,s=this.options.bounds;return s?(i=this.scale(e),n=this.transformation.transform(s.min,i),o=this.transformation.transform(s.max,i),t.point(Math.abs(o.x-n.x),Math.abs(o.y-n.y))):(i=256*Math.pow(2,e),t.point(i,i))}}),t.Proj.CRS.TMS=t.Proj.CRS.extend({options:{tileSize:256},initialize:function(e,i,n,o){var s,r,a,l,c;t.Proj._isProj4Obj(e)?(a=e,l=i,c=n||{},c.origin=[l[0],l[3]],t.Proj.CRS.prototype.initialize.call(this,a,c)):(s=e,r=i,l=n,c=o||{},c.origin=[l[0],l[3]],t.Proj.CRS.prototype.initialize.call(this,s,r,c)),this.projectedBounds=l,this._sizes=this._calculateSizes()},_calculateSizes:function(){var e,i,n,o,s=[],r=this.projectedBounds;for(i=this._scales.length-1;i>=0;i--)this._scales[i]&&(e=this.options.tileSize/this._scales[i],n=Math.ceil(parseFloat((r[2]-r[0])/e).toPrecision(3))*e*this._scales[i],o=Math.ceil(parseFloat((r[3]-r[1])/e).toPrecision(3))*e*this._scales[i],s[i]=t.point(n,o));return s},getSize:function(t){return this._sizes[t]}}),t.Proj.TileLayer={},t.Proj.TileLayer.TMS=t.TileLayer.extend({options:{continuousWorld:!0},initialize:function(e,i,n){var o,s,r,a,l=!0;if(!(i instanceof t.Proj.CRS.TMS))throw"CRS is not L.Proj.CRS.TMS.";for(t.TileLayer.prototype.initialize.call(this,e,n),this.options.tms=!1,this.crs=i,r=this.crs.projectedBounds,a=this.options.minZoom;a<this.options.maxZoom&&l;a++){var c=(r[3]-r[1])/this._projectedTileSize(a);l=Math.abs(c-Math.round(c))>.001}if(!l){for(o={},a=this.options.minZoom;a<this.options.maxZoom;a++)s=r[1]+Math.ceil((r[3]-r[1])/this._projectedTileSize(a))*this._projectedTileSize(a),o[this.crs.scale(a)]=new t.Transformation(1,-r[0],-1,s);this.crs=new t.Proj.CRS.TMS(this.crs.projection._proj,r,this.crs.options),this.crs.transformation=new t.Proj.ScaleDependantTransformation(o)}},getTileUrl:function(e){var i=this._map.getZoom(),n=Math.ceil((this.crs.projectedBounds[3]-this.crs.projectedBounds[1])/this._projectedTileSize(i));return t.Util.template(this._url,t.Util.extend({s:this._getSubdomain(e),z:this._getZoomForUrl(),x:e.x,y:n-e.y-1},this.options))},_projectedTileSize:function(t){return this.options.tileSize/this.crs.scale(t)}}),t.Proj.GeoJSON=t.GeoJSON.extend({initialize:function(e,i){this._callLevel=0,t.GeoJSON.prototype.initialize.call(this,null,i),e&&this.addData(e)},addData:function(e){var i;e&&(e.crs&&"name"===e.crs.type?i=new t.Proj.CRS(e.crs.properties.name):e.crs&&e.crs.type&&(i=new t.Proj.CRS(e.crs.type+":"+e.crs.properties.code)),void 0!==i&&(this.options.coordsToLatLng=function(e){var n=t.point(e[0],e[1]);return i.projection.unproject(n)})),this._callLevel++;try{t.GeoJSON.prototype.addData.call(this,e)}finally{this._callLevel--,0===this._callLevel&&delete this.options.coordsToLatLng}}}),t.Proj.geoJson=function(e,i){return new t.Proj.GeoJSON(e,i)},t.Proj.ImageOverlay=t.ImageOverlay.extend({initialize:function(e,i,n){t.ImageOverlay.prototype.initialize.call(this,e,null,n),this._projBounds=i},_animateZoom:function(e){var i=t.point(this._projBounds.min.x,this._projBounds.max.y),n=t.point(this._projBounds.max.x,this._projBounds.min.y),o=this._projectedToNewLayerPoint(i,e.zoom,e.center),s=this._projectedToNewLayerPoint(n,e.zoom,e.center).subtract(o),r=o.add(s._multiplyBy((1-1/e.scale)/2));this._image.style[t.DomUtil.TRANSFORM]=t.DomUtil.getTranslateString(r)+" scale("+this._map.getZoomScale(e.zoom)+") "},_reset:function(){var e=this._map.getZoom(),i=this._map.getPixelOrigin(),n=t.bounds(this._transform(this._projBounds.min,e)._subtract(i),this._transform(this._projBounds.max,e)._subtract(i)),o=n.getSize(),s=this._image;t.DomUtil.setPosition(s,n.min),s.style.width=o.x+"px",s.style.height=o.y+"px"},_projectedToNewLayerPoint:function(t,e,i){var n=this._map._getNewTopLeftPoint(i,e).add(this._map._getMapPanePos());return this._transform(t,e)._subtract(n)},_transform:function(t,e){var i=this._map.options.crs,n=i.transformation,o=i.scale(e);return n.transform(t,o)}}),t.Proj.imageOverlay=function(e,i,n){return new t.Proj.ImageOverlay(e,i,n)},"undefined"!=typeof t.CRS&&(t.CRS.proj4js=function(){return function(e,i,n,o){return o=o||{},n&&(o.transformation=n),new t.Proj.CRS(e,i,o)}}()),t.Proj}),!function(t,e){proj4leaflet10x=function(t,i){return"function"==typeof e?e(t,i):e}(leaflet,proj4)}(this,function(t,e){return t.Proj={},t.Proj._isProj4Obj=function(t){return"undefined"!=typeof t.inverse&&"undefined"!=typeof t.forward},t.Proj.Projection=t.Class.extend({initialize:function(e,i,n){var o=t.Proj._isProj4Obj(e);this._proj=o?e:this._projFromCodeDef(e,i),this.bounds=o?i:n},project:function(e){var i=this._proj.forward([e.lng,e.lat]);return new t.Point(i[0],i[1])},unproject:function(e,i){var n=this._proj.inverse([e.x,e.y]);return new t.LatLng(n[1],n[0],i)},_projFromCodeDef:function(t,i){if(i)e.defs(t,i);else if(void 0===e.defs[t]){var n=t.split(":");if(n.length>3&&(t=n[n.length-3]+":"+n[n.length-1]),void 0===e.defs[t])throw"No projection definition for code "+t}return e(t)}}),t.Proj.CRS=t.Class.extend({includes:t.CRS,options:{transformation:new t.Transformation(1,0,-1,0)},initialize:function(e,i,n){var o,s,r,a;if(t.Proj._isProj4Obj(e)?(s=e,o=s.srsCode,a=i||{},this.projection=new t.Proj.Projection(s,a.bounds)):(o=e,r=i,a=n||{},this.projection=new t.Proj.Projection(o,r,a.bounds)),t.Util.setOptions(this,a),this.code=o,this.transformation=this.options.transformation,this.options.origin&&(this.transformation=new t.Transformation(1,-this.options.origin[0],-1,this.options.origin[1])),this.options.scales)this._scales=this.options.scales;else if(this.options.resolutions){this._scales=[];for(var l=this.options.resolutions.length-1;l>=0;l--)this.options.resolutions[l]&&(this._scales[l]=1/this.options.resolutions[l])}this.infinite=!this.options.bounds},scale:function(t){var e,i,n,o,s=Math.floor(t);return t===s?this._scales[t]:(e=this._scales[s],i=this._scales[s+1],n=i-e,o=t-s,e+n*o)},zoom:function(t){var e,i,n=this._closestElement(this._scales,t),o=this._scales.indexOf(n);return t===n?o:(e=o+1,i=this._scales[e]-n,(t-n)/i+o)},_closestElement:function(t,e){for(var i,n=t.length;n--;)t[n]<=e&&(void 0===i||i<t[n])&&(i=t[n]);return i}}),t.Proj.GeoJSON=t.GeoJSON.extend({initialize:function(e,i){if(e.crs&&"name"===e.crs.type){var n=new t.Proj.CRS(e.crs.properties.name);i=i||{},i.coordsToLatLng=function(e){var i=t.point(e[0],e[1]);return n.projection.unproject(i)}}t.GeoJSON.prototype.initialize.call(this,e,i)}}),t.Proj.geoJson=function(e,i){return new t.Proj.GeoJSON(e,i)},t.Proj}),LeafletCRSProj4Leaflet=function(t,e,i){return{load:function(){console.log("loading lib proj4leaflet ...");var t=null;if(0===e.version.lastIndexOf("0.7",0))t=proj4leaflet07x,console.log("loaded version for leaflet 0.7.7 ...");else{if(0!==e.version.lastIndexOf("1.0",0))return void console.log("version leaflet incompatible !");t=proj4leaflet10x,console.log("loaded version for leaflet 1.0.0 ...")}return e.Proj=t,e.Proj}}}({},leaflet,proj4),CommonUtilsRegister=function(t){var e={isLoaded:!1,get:function(t){if(""!==t&&null!==t&&"undefined"!=typeof t){var e=t.split(":");if(2===e.length){var i=e[0],n=e[1];if(this.hasOwnProperty(i)&&this[i].hasOwnProperty(n))return this[i][n]}}},load:function(){if(!this.isLoaded){for(var e=["IGNF","EPSG","CRS"],i=0;i<e.length;i++){var n=e[i],o=this[n];for(var s in o)if(o.hasOwnProperty(s)){var r=n+":"+s;t.defs(r,this.get(r))}}this.isLoaded=!0}},EPSG:{4149:"+title=CH1903 +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs ",4150:"+title=CH1903plus +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs ",4151:"+title=CHTRF95 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4171:"+title=RGF93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4230:"+title=ED50 +proj=longlat +ellps=intl +no_defs ",4235:"+title=Guyane Francaise +proj=longlat +ellps=intl +no_defs ",4258:"+title=ETRS89 +proj=longlat +ellps=GRS80 +no_defs ",4275:"+title=NTF +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +no_defs ",4322:"+title=WGS 72 +proj=longlat +ellps=WGS72 +no_defs ",4326:"+title=WGS 84 +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ",4467:"+proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",4470:"+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4471:"+proj=utm +zone=38 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",4474:"+proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs ",4558:"+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4559:"+proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",4621:"+title=Fort Marigot +proj=longlat +ellps=intl +towgs84=137,248,-430,0,0,0,0 +no_defs ",4622:"+title=Guadeloupe 1948 +proj=longlat +ellps=intl +no_defs ",4623:"+title=CSG67 +proj=longlat +ellps=intl +towgs84=-186,230,110,0,0,0,0 +no_defs ",4624:"+title=RGFG95 +proj=longlat +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +no_defs ",4625:"+title=Martinique 1938 +proj=longlat +ellps=intl +no_defs ",4626:"+title=Reunion 1947 +proj=longlat +ellps=intl +no_defs ",4627:"+title=RGR92 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4628:"+title=Tahiti 52 +proj=longlat +ellps=intl +towgs84=162,117,154,0,0,0,0 +no_defs ",4629:"+title=Tahaa 54 +proj=longlat +ellps=intl +no_defs ",4630:"+title=IGN72 Nuku Hiva +proj=longlat +ellps=intl +no_defs ",4632:"+title=Combani 1950 +proj=longlat +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +no_defs ",4633:"+title=IGN56 Lifou +proj=longlat +ellps=intl +no_defs ",4634:"+title=IGN72 Grand Terre +proj=longlat +ellps=intl +no_defs ",4637:"+title=Perroud 1950 +proj=longlat +ellps=intl +towgs84=325,154,172,0,0,0,0 +no_defs ",4638:"+title=Saint Pierre et Miquelon 1950 +proj=longlat +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +no_defs ",4640:"+title=RRAF 1991 +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs ",4641:"+title=IGN53 Mare +proj=longlat +ellps=intl +no_defs ",4645:"+title=RGNC 1991 +proj=longlat +ellps=intl +towgs84=0,0,0,0,0,0,0 +no_defs ",4687:"+proj=longlat +ellps=GRS80 +no_defs ",4662:"+title=IGN72 Grande Terre +proj=longlat +ellps=intl +no_defs ",4689:"+title=IGN63 Hiva Oa +proj=longlat +ellps=intl +no_defs ",4690:"+title=Tahiti 79 +proj=longlat +ellps=intl +no_defs ",4691:"+title=Moorea 87 +proj=longlat +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +no_defs ",4692:"+title=Maupiti 83 +proj=longlat +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +no_defs ",4698:"+title=IGN 1962 Kerguelen +proj=longlat +ellps=intl +towgs84=145,-187,103,0,0,0,0 +no_defs ",4749:"+title=RGNC91-93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4750:"+title=ST87 Ouvea +proj=longlat +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +no_defs ",4807:"+title=NTF (Paris) +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +no_defs ",2056:"+title=CH1903+ / LV95 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs ",2154:"+title=RGF93 / Lambert-93 +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",2213:"+title=ETRS89 / TM 30 NE +proj=tmerc +lat_0=0 +lon_0=30 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs ",2969:"+title=Fort Marigot / UTM zone 20N +proj=utm +zone=20 +ellps=intl +towgs84=137,248,-430,0,0,0,0 +units=m +no_defs ",2970:"+title=Guadeloupe 1948 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs ",2971:"+title=CSG67 / UTM zone 22N +proj=utm +zone=22 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs ",2972:"+title=RGFG95 / UTM zone 22N +proj=utm +zone=22 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs ",2973:"+title=Martinique 1938 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs ",2975:"+title=RGR92 / UTM zone 40S +proj=utm +zone=40 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",2976:"+title=Tahiti 52 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=162,117,154,0,0,0,0 +units=m +no_defs ",2977:"+title=Tahaa 54 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +units=m +no_defs ",2978:"+title=IGN72 Nuku Hiva / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs ",2980:"+title=Combani 1950 / UTM zone 38S +proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs ",2981:"+title=IGN56 Lifou / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",2982:"+title=IGN72 Grand Terre / UTM zone 58S (deprecated) +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",2984:"+title=RGNC 1991 / Lambert New Caledonia (deprecated) +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=intl +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",2986:"+title=Terre Adelie 1950 +proj=stere +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-90.000000000 +lon_0=140.000000000 +lat_ts=-67.000000000 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs",2987:"+title=Saint Pierre et Miquelon 1950 / UTM zone 21N +proj=utm +zone=21 +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +units=m +no_defs ",2989:"+title=RRAF 1991 / UTM zone 20N +proj=utm +zone=20 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",2990:"+title=Reunion 1947 / TM Reunion (deprecated) +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=50000 +y_0=160000 +ellps=intl +units=m +no_defs ",2995:"+title=IGN53 Mare / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",3038:"+proj=utm +zone=26 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3039:"+proj=utm +zone=27 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3040:"+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3041:"+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3045:"+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3046:"+proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3047:"+proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3048:"+proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3049:"+proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3050:"+proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3051:"+proj=utm +zone=39 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3034:"+title=ETRS89 / ETRS-LCC +proj=lcc +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=4000000 +y_0=2800000 +ellps=GRS80 +units=m +no_defs ",3035:"+title=ETRS89 / ETRS-LAEA +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs ",3042:"+title=ETRS89 / ETRS-TM30 +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs ",3043:"+title=ETRS89 / ETRS-TM31 +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs ",3044:"+title=ETRS89 / ETRS-TM32 +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs ",25828:"+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25829:"+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25833:"+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25834:"+proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25835:"+proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25836:"+proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25837:"+proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25838:"+proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3060:"+title=IGN72 Grande Terre / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",3163:"+title=RGNC91-93 / Lambert New Caledonia +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3164:"+title=ST87 Ouvea / UTM zone 58S +proj=utm +zone=58 +south +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +units=m +no_defs ",3165:"+title=NEA74 Noumea / Noumea Lambert +proj=lcc +lat_1=-22.24469175 +lat_2=-22.29469175 +lat_0=-22.26969175 +lon_0=166.44242575 +x_0=0.66 +y_0=1.02 +ellps=intl +units=m +no_defs ",3166:"+title=NEA74 Noumea / Noumea Lambert 2 +proj=lcc +lat_1=-22.24472222222222 +lat_2=-22.29472222222222 +lat_0=-22.26972222222222 +lon_0=166.4425 +x_0=8.313000000000001 +y_0=-2.354 +ellps=intl +units=m +no_defs ",3169:"+title=RGNC91-93 / UTM zone 57S +proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3170:"+title=RGNC91-93 / UTM zone 58S +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3171:"+title=RGNC91-93 / UTM zone 59S +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3172:"+title=IGN53 Mare / UTM zone 59S +proj=utm +zone=59 +south +ellps=intl +units=m +no_defs ",3296:"+title=RGPF / UTM zone 5S +proj=utm +zone=5 +south +ellps=GRS80 +units=m +no_defs ",3297:"+title=RGPF / UTM zone 6S +proj=utm +zone=6 +south +ellps=GRS80 +units=m +no_defs ",3298:"+title=RGPF / UTM zone 7S +proj=utm +zone=7 +south +ellps=GRS80 +units=m +no_defs ",3299:"+title=RGPF / UTM zone 8S +proj=utm +zone=8 +south +ellps=GRS80 +units=m +no_defs ",3302:"+title=IGN63 Hiva Oa / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs ",3303:"+title=Fatu Iva 72 / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +towgs84=347.103,1078.12,2623.92,-33.8875,70.6773,-9.3943,186.074 +units=m +no_defs ",3304:"+title=Tahiti 79 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +units=m +no_defs ",3305:"+title=Moorea 87 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +units=m +no_defs ",3306:"+title=Maupiti 83 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +units=m +no_defs ",3312:"+title=CSG67 / UTM zone 21N +proj=utm +zone=21 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs ",3313:"+title=RGFG95 / UTM zone 21N +proj=utm +zone=21 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs ",3336:"+title=IGN 1962 Kerguelen / UTM zone 42S +proj=utm +zone=42 +south +ellps=intl +towgs84=145,-187,103,0,0,0,0 +units=m +no_defs ",3395:"+title=WGS 84 / World Mercator +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",3727:"+title=Reunion 1947 / TM Reunion +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=160000 +y_0=50000 +ellps=intl +units=m +no_defs ",21781:"+title=CH1903 / LV03 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs ",25830:"+title=ETRS89 / UTM zone 30N +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs ",25831:"+title=ETRS89 / UTM zone 31N +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs ",25832:"+title=ETRS89 / UTM zone 32N +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs ",27561:"+title=NTF (Paris) / Lambert Nord France +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27562:"+title=NTF (Paris) / Lambert Centre France +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27563:"+title=NTF (Paris) / Lambert Sud France +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27564:"+title=NTF (Paris) / Lambert Corse +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27571:"+title=NTF (Paris) / Lambert zone I +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27572:"+title=NTF (Paris) / Lambert zone II +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27573:"+title=NTF (Paris) / Lambert zone III +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27574:"+title=NTF (Paris) / Lambert zone IV +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27581:"+title=NTF (Paris) / France I (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27582:"+title=NTF (Paris) / France II (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27583:"+title=NTF (Paris) / France III (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27584:"+title=NTF (Paris) / France IV (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27591:"+title=NTF (Paris) / Nord France (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27592:"+title=NTF (Paris) / Centre France (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27593:"+title=NTF (Paris) / Sud France (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27594:"+title=NTF (Paris) / Corse (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",32601:"+proj=utm +zone=1 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32602:"+proj=utm +zone=2 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32603:"+proj=utm +zone=3 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32604:"+proj=utm +zone=4 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32605:"+proj=utm +zone=5 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32606:"+proj=utm +zone=6 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32607:"+proj=utm +zone=7 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32608:"+proj=utm +zone=8 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32609:"+proj=utm +zone=9 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32610:"+proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32611:"+proj=utm +zone=11 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32612:"+proj=utm +zone=12 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32613:"+proj=utm +zone=13 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32614:"+proj=utm +zone=14 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32615:"+proj=utm +zone=15 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32616:"+proj=utm +zone=16 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32617:"+proj=utm +zone=17 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32618:"+proj=utm +zone=18 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32619:"+proj=utm +zone=19 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32620:"+proj=utm +zone=20 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32621:"+proj=utm +zone=21 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32622:"+proj=utm +zone=22 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32623:"+proj=utm +zone=23 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32624:"+proj=utm +zone=24 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32625:"+proj=utm +zone=25 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32626:"+proj=utm +zone=26 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32627:"+proj=utm +zone=27 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32628:"+proj=utm +zone=28 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32629:"+proj=utm +zone=29 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32630:"+proj=utm +zone=30 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32631:"+proj=utm +zone=31 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32632:"+proj=utm +zone=32 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32633:"+proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32634:"+proj=utm +zone=34 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32635:"+proj=utm +zone=35 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32636:"+proj=utm +zone=36 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+32637:"+proj=utm +zone=37 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32638:"+proj=utm +zone=38 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32639:"+proj=utm +zone=39 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32640:"+proj=utm +zone=40 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32641:"+proj=utm +zone=41 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32642:"+proj=utm +zone=42 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32643:"+proj=utm +zone=43 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32644:"+proj=utm +zone=44 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32645:"+proj=utm +zone=45 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32646:"+proj=utm +zone=46 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32647:"+proj=utm +zone=47 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32648:"+proj=utm +zone=48 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32649:"+proj=utm +zone=49 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32650:"+proj=utm +zone=50 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32651:"+proj=utm +zone=51 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32652:"+proj=utm +zone=52 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32653:"+proj=utm +zone=53 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32654:"+proj=utm +zone=54 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32655:"+proj=utm +zone=55 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32656:"+proj=utm +zone=56 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32657:"+proj=utm +zone=57 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32658:"+proj=utm +zone=58 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32659:"+proj=utm +zone=59 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32660:"+proj=utm +zone=60 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32661:"+proj=stere +lat_0=90 +lat_ts=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32662:"+title=WGS 84 / Plate Carree +proj=eqc +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32701:"+proj=utm +zone=1 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32702:"+proj=utm +zone=2 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32703:"+proj=utm +zone=3 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32704:"+proj=utm +zone=4 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32705:"+proj=utm +zone=5 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32706:"+proj=utm +zone=6 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32707:"+proj=utm +zone=7 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32708:"+proj=utm +zone=8 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32709:"+proj=utm +zone=9 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32710:"+proj=utm +zone=10 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32711:"+proj=utm +zone=11 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32712:"+proj=utm +zone=12 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32713:"+proj=utm +zone=13 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32714:"+proj=utm +zone=14 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32715:"+proj=utm +zone=15 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32716:"+proj=utm +zone=16 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32717:"+proj=utm +zone=17 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32718:"+proj=utm +zone=18 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32719:"+proj=utm +zone=19 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32720:"+proj=utm +zone=20 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32721:"+proj=utm +zone=21 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32722:"+proj=utm +zone=22 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32723:"+proj=utm +zone=23 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32724:"+proj=utm +zone=24 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32725:"+proj=utm +zone=25 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32726:"+proj=utm +zone=26 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32727:"+proj=utm +zone=27 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32728:"+proj=utm +zone=28 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32729:"+proj=utm +zone=29 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32730:"+proj=utm +zone=30 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32731:"+proj=utm +zone=31 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32732:"+proj=utm +zone=32 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32733:"+proj=utm +zone=33 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32734:"+proj=utm +zone=34 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32735:"+proj=utm +zone=35 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32736:"+proj=utm +zone=36 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32737:"+proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32738:"+proj=utm +zone=38 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32739:"+proj=utm +zone=39 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32740:"+proj=utm +zone=40 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32741:"+proj=utm +zone=41 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32742:"+proj=utm +zone=42 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32743:"+proj=utm +zone=43 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32744:"+proj=utm +zone=44 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32745:"+proj=utm +zone=45 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32746:"+proj=utm +zone=46 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32747:"+proj=utm +zone=47 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32748:"+proj=utm +zone=48 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32749:"+proj=utm +zone=49 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32750:"+proj=utm +zone=50 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32751:"+proj=utm +zone=51 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32752:"+proj=utm +zone=52 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32753:"+proj=utm +zone=53 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32754:"+proj=utm +zone=54 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32755:"+proj=utm +zone=55 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32756:"+proj=utm +zone=56 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32757:"+proj=utm +zone=57 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32758:"+proj=utm +zone=58 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32759:"+proj=utm +zone=59 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32760:"+proj=utm +zone=60 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32761:"+proj=stere +lat_0=-90 +lat_ts=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",310024802:"+title=Geoportail - France metropolitaine +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=46.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310915814:"+title=Geoportail - Antilles francaises +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310486805:"+title=Geoportail - Guyane +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=4.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310700806:"+title=Geoportail - Reunion et dependances +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-21.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310702807:"+title=Geoportail - Mayotte +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-12.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310706808:"+title=Geoportail - Saint-Pierre et Miquelon +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=47.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310547809:"+title=Geoportail - Nouvelle-Caledonie +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-22.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310642810:"+title=Geoportail - Wallis et Futuna +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-14.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310032811:"+title=Geoportail - Polynesie francaise +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310642812:"+title=Geoportail - Kerguelen +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-49.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310642801:"+title=Geoportail - Crozet +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-46.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310642813:"+title=Geoportail - Amsterdam et Saint-Paul +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-38.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310642901:"+title=Geoportail - Monde +proj=mill +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lon_0=0.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",5489:"+title=RGAF09 geographiques (dms) +proj=longlat +nadgrids=@null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137 +rf=298.257222101 +units=m +no_defs",5490:"+title=RGAF09 UTM Nord Fuseau 20 +proj=tmerc +nadgrids=@null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137 +rf=298.257222101 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs"},CRS:{84:"+title=WGS 84 longitude-latitude +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs "},IGNF:{AMST63:"+title=Amsterdam 1963 +proj=geocent +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",CROZ63:"+title=Crozet 1963 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",CSG67:"+title=Guyane CSG67 +proj=geocent +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",ED50:"+title=ED50 +proj=geocent +towgs84=-84.0000,-97.0000,-117.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",ETRS89:"+title=Systeme de reference terrestre Europeen (1989) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",GUAD48:"+title=Guadeloupe Ste Anne +proj=geocent +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",GUADFM49:"+title=Guadeloupe Fort Marigot +proj=geocent +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",IGN63:"+title=IGN 1963 (Hiva Oa, Tahuata, Mohotani) +proj=geocent +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",IGN72:"+title=IGN 1972 Grande-Terre / Ile des Pins +proj=geocent +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",KERG62CAR:"+title=Kerguelen - K0 +proj=geocent +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",MART38:"+title=Martinique Fort-Desaix +proj=geocent +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",MAYO50:"+title=Mayotte Combani +proj=geocent +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",MOOREA87:"+title=Moorea 1987 +proj=geocent +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",NTF:"+title=Nouvelle Triangulation Francaise +proj=geocent +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +units=m +no_defs",NUKU72:"+title=IGN 1972 Nuku Hiva +proj=geocent +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",REUN47:"+title=Reunion 1947 +proj=geocent +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",RGF93:"+title=Reseau geodesique francais 1993 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGFG95:"+title=Reseau geodesique francais de Guyane 1995 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGM04:"+title=RGM04 (Reseau Geodesique de Mayotte 2004) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGNC:"+title=Reseau Geodesique de Nouvelle-Caledonie +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGPF:"+title=RGPF (Reseau Geodesique de Polynesie Francaise) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGR92:"+title=Reseau geodesique Reunion 1992 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGSPM06:"+title=Reseau Geodesique Saint-Pierre-et-Miquelon (2006) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGTAAF07:"+title=Reseau Geodesique des TAAF (2007) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RRAF91:"+title=RRAF 1991 (Reseau de Reference des Antilles Francaises) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",STPL69:"+title=Saint-Paul 1969 +proj=geocent +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",STPM50:"+title=St Pierre et Miquelon 1950 +proj=geocent +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +units=m +no_defs",TAHAA:"+title=Raiatea - Tahaa 51-54 (Tahaa, Base Terme Est) +proj=geocent +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",TAHI79:"+title=IGN79 (Tahiti) Iles de la Societe +proj=geocent +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",TERA50:"+title=Pointe Geologie - Perroud 1950 +proj=geocent +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",WALL78:"+title=Wallis-Uvea 1978 (MOP78) +proj=geocent +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",WGS72:"+title=World Geodetic System 1972 +proj=geocent +towgs84=0.0000,12.0000,6.0000 +a=6378135.0000 +rf=298.2600000000000 +units=m +no_defs",WGS84:"+title=World Geodetic System 1984 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",AMST63GEO:"+title=Amsterdam 1963 +proj=longlat +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",CROZ63GEO:"+title=Crozet 1963 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",CSG67GEO:"+title=Guyane CSG67 +proj=longlat +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",ED50G:"+title=ED50 +proj=longlat +towgs84=-84.0000,-97.0000,-117.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",GUAD48GEO:"+title=Guadeloupe Ste Anne +proj=longlat +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",GUADFM49GEO:"+title=Guadeloupe Fort Marigot +proj=longlat +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",IGN63GEO:"+title=IGN 1963 (Hiva Oa, Tahuata, Mohotani) +proj=longlat +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",IGN72GEO:"+title=IGN 1972 Grande-Terre / Ile des Pins +proj=longlat +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",KERG62GEO:"+title=Kerguelen - K0 +proj=longlat +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",MART38GEO:"+title=Martinique Fort-Desaix +proj=longlat +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",MAYO50GEO:"+title=Mayotte Combani +proj=longlat +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",MOOREA87GEO:"+title=Moorea 1987 +proj=longlat +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",NTFG:"+title=Nouvelle Triangulation Francaise Greenwich degres sexagesimaux +proj=longlat +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +units=m +no_defs",NTFP:"+title=Nouvelle Triangulation Francaise Paris grades +proj=longlat +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +units=m +no_defs",NUKU72GEO:"+title=IGN 1972 Nuku Hiva +proj=longlat +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",REUN47GEO:"+title=Reunion 1947 +proj=longlat +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",RGF93G:"+title=Reseau geodesique francais 1993 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGFG95GEO:"+title=Reseau geodesique francais de Guyane 1995 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGM04GEO:"+title=RGM04 (Reseau Geodesique de Mayotte 2004) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGNCGEO:"+title=Reseau Geodesique de Nouvelle-Caledonie +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGPFGEO:"+title=RGPF (Reseau Geodesique de Polynesie Francaise) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGR92GEO:"+title=Reseau geodesique de la Reunion 1992 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGSPM06GEO:"+title=Saint-Pierre-et-Miquelon (2006) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGTAAF07G:"+title=Reseau Geodesique des TAAF (2007) (dms) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",STPL69GEO:"+title=Saint-Paul 1969 +proj=longlat +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",STPM50GEO:"+title=St Pierre et Miquelon 1950  +proj=longlat +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +units=m +no_defs",TAHAAGEO:"+title=Raiatea - Tahaa 51-54 (Tahaa, Base Terme Est) +proj=longlat +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",TAHI79GEO:"+title=IGN79 (Tahiti) Iles de la Societe +proj=longlat +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",TERA50G:"+title=Pointe Geologie - Perroud 1950 +proj=longlat +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",WALL78GEO:"+title=Wallis - Uvea 1978 (MOP78) +proj=longlat +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",WGS72G:"+title=WGS72 +proj=longlat +towgs84=0.0000,12.0000,6.0000 +a=6378135.0000 +rf=298.2600000000000 +units=m +no_defs",WGS84G:"+title=World Geodetic System 1984 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",WGS84RRAFGEO:"+title=Reseau de reference des Antilles francaises (1988-1991) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",XGEO:"+title=Systeme CIO-BIH +proj=longlat +towgs84=0.0000,0.0000,0.5000,0.0000,0.0000,0.0140,-0.100000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",AMST63UTM43S:"+title=Amsterdam 1963 UTM fuseau 43 Sud +proj=tmerc +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",CROZ63UTM39S:"+title=Crozet 1963 +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",CSG67UTM21:"+title=Guyane CSG67 UTM fuseau 21 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",CSG67UTM22:"+title=Guyane CSG67 UTM fuseau 22 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",GEOPORTALANF:"+title=Geoportail - Antilles francaises +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALASP:"+title=Geoportail - Amsterdam et Saint-Paul +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-38.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALCRZ:"+title=Geoportail - Crozet +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-46.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALFXX:"+title=Geoportail - France metropolitaine +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=46.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALGUF:"+title=Geoportail - Guyane +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=4.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALKER:"+title=Geoportail - Kerguelen +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-49.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALMYT:"+title=Geoportail - Mayotte +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-12.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALNCL:"+title=Geoportail - Nouvelle-Caledonie +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-22.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALPYF:"+title=Geoportail - Polynesie francaise +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALREU:"+title=Geoportail - Reunion et dependances +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-21.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALSPM:"+title=Geoportail - Saint-Pierre et Miquelon +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=47.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALWLF:"+title=Geoportail - Wallis et Futuna +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-14.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GUAD48UTM20:"+title=Guadeloupe Ste Anne +proj=tmerc +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",GUADFM49U20:"+title=Guadeloupe Fort Marigot  +proj=tmerc +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",IGN63UTM7S:"+title=IGN 1963 - Hiva Oa, Tahuata, Mohotani - UTM fuseau 7 Sud +proj=tmerc +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",IGN72UTM58S:"+title=IGN 1972 - UTM fuseau 58 Sud +proj=tmerc +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",KERG62UTM42S:"+title=Kerguelen 1962 +proj=tmerc +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",LAMB1:"+title=Lambert I +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs",LAMB1C:"+title=Lambert I Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=1200000.000 +units=m +no_defs",LAMB2:"+title=Lambert II +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs",LAMB2C:"+title=Lambert II Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs",LAMB3:"+title=Lambert III +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs",LAMB3C:"+title=Lambert III Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=3200000.000 +units=m +no_defs",LAMB4:"+title=Lambert IV +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=185861.369 +units=m +no_defs",LAMB4C:"+title=Lambert IV Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=4185861.369 +units=m +no_defs",LAMB93:"+title=Lambert 93 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.500000000 +lon_0=3.000000000 +lat_1=44.000000000 +lat_2=49.000000000 +x_0=700000.000 +y_0=6600000.000 +units=m +no_defs",RGF93CC42:"+title=Lambert conique conforme Zone 1 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=42.000000000 +lon_0=3.000000000 +lat_1=41.200000000 +lat_2=42.800000000 +x_0=1700000.000 +y_0=1200000.000 +units=m +no_defs",RGF93CC43:"+title=Lambert conique conforme Zone 2 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=43.000000000 +lon_0=3.000000000 +lat_1=42.200000000 +lat_2=43.800000000 +x_0=1700000.000 +y_0=2200000.000 +units=m +no_defs",RGF93CC44:"+title=Lambert conique conforme Zone 3 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=44.000000000 +lon_0=3.000000000 +lat_1=43.200000000 +lat_2=44.800000000 +x_0=1700000.000 +y_0=3200000.000 +units=m +no_defs",RGF93CC45:"+title=Lambert conique conforme Zone 4 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=45.000000000 +lon_0=3.000000000 +lat_1=44.200000000 +lat_2=45.800000000 +x_0=1700000.000 +y_0=4200000.000 +units=m +no_defs",RGF93CC46:"+title=Lambert conique conforme Zone 5 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.000000000 +lon_0=3.000000000 +lat_1=45.200000000 +lat_2=46.800000000 +x_0=1700000.000 +y_0=5200000.000 +units=m +no_defs",RGF93CC47:"+title=Lambert conique conforme Zone 6 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=47.000000000 +lon_0=3.000000000 +lat_1=46.200000000 +lat_2=47.800000000 +x_0=1700000.000 +y_0=6200000.000 +units=m +no_defs",RGF93CC48:"+title=Lambert conique conforme Zone 7 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=48.000000000 +lon_0=3.000000000 +lat_1=47.200000000 +lat_2=48.800000000 +x_0=1700000.000 +y_0=7200000.000 +units=m +no_defs",RGF93CC49:"+title=Lambert conique conforme Zone 8 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=49.000000000 +lon_0=3.000000000 +lat_1=48.200000000 +lat_2=49.800000000 +x_0=1700000.000 +y_0=8200000.000 +units=m +no_defs",
+RGF93CC50:"+title=Lambert conique conforme Zone 9 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=50.000000000 +lon_0=3.000000000 +lat_1=49.200000000 +lat_2=50.800000000 +x_0=1700000.000 +y_0=9200000.000 +units=m +no_defs",LAMBE:"+title=Lambert II etendu +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs",MART38UTM20:"+title=Martinique Fort-Desaix +proj=tmerc +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",MAYO50UTM38S:"+title=Mayotte Combani +proj=tmerc +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",MILLER:"+title=Geoportail - Monde +proj=mill +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lon_0=0.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",MOOREA87U6S:"+title=Moorea 1987 - UTM fuseau 6 Sud +proj=tmerc +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",NUKU72U7S:"+title=IGN 1972 Nuku Hiva - UTM fuseau 7 Sud +proj=tmerc +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",REUN47GAUSSL:"+title=Reunion Gauss Laborde +proj=gstmerc +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-21.116666667 +lon_0=55.533333333 +k_0=1.00000000 +x_0=160000.000 +y_0=50000.000 +units=m +no_defs",RGM04UTM38S:"+title=UTM fuseau 38 Sud (Reseau Geodesique de Mayotte 2004) +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGNCUTM57S:"+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 57 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=159.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGNCUTM58S:"+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 58 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGNCUTM59S:"+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 59 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=171.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGPFUTM5S:"+title=RGPF - UTM fuseau 5 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGPFUTM6S:"+title=RGPF - UTM fuseau 6 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGPFUTM7S:"+title=RGPF - UTM fuseau 7 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGR92UTM40S:"+title=RGR92 UTM fuseau 40 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGSPM06U21:"+title=Saint-Pierre-et-Miquelon (2006) UTM Fuseau 21 Nord +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",STPL69UTM43S:"+title=Saint-Paul 1969 UTM fuseau 43 Sud +proj=tmerc +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",STPM50UTM21:"+title=St Pierre et Miquelon 1950 +proj=tmerc +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",TAHAAUTM05S:"+title=Tahaa 1951 +proj=tmerc +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",TAHI51UTM06S:"+title=Tahiti-Terme Nord UTM fuseau 6 Sud +proj=tmerc +towgs84=162.0000,117.0000,154.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",TAHI79UTM6S:"+title=Tahiti 1979 +proj=tmerc +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",TERA50STEREO:"+title=Terre Adelie 1950 +proj=stere +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-90.000000000 +lon_0=140.000000000 +lat_ts=-67 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs",UTM01SW84:"+title=World Geodetic System 1984 UTM fuseau 01 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",UTM20W84GUAD:"+title=World Geodetic System 1984 UTM fuseau 20 Nord-Guadeloupe +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM20W84MART:"+title=World Geodetic System 1984 UTM fuseau 20 Nord-Martinique +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM22RGFG95:"+title=RGFG95 UTM fuseau 22 Nord-Guyane +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM39SW84:"+title=World Geodetic System 1984 UTM fuseau 39 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",UTM42SW84:"+title=World Geodetic System 1984 UTM fuseau 42 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",UTM43SW84:"+title=World Geodetic System 1984 UTM fuseau 43 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",WALL78UTM1S:"+title=Wallis-Uvea 1978 (MOP78) UTM 1 SUD +proj=tmerc +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",ETRS89GEO:"+title=ETRS89 geographiques (dms) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",ETRS89LAEA:"+title=ETRS89 Lambert Azimutal Equal Area +proj=laea +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=52.000000000 +lon_0=10.000000000 +x_0=4321000.000 +y_0=3210000.000 +units=m +no_defs",ETRS89LCC:"+title=ETRS89 Lambert Conformal Conic +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=52.000000000 +lon_0=9.999999995 +lat_1=35.000000000 +lat_2=65.000000000 +x_0=4000000.000 +y_0=2800000.000 +units=m +no_defs",UTM26ETRS89:"+title=Europe - de 30d a 24d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-27.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM27ETRS89:"+title=Europe - de 24d a 18d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-21.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM28ETRS89:"+title=Europe - de 18d a 12d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-15.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM29ETRS89:"+title=Europe - de 12d a 6d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-9.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM30ETRS89:"+title=Europe - de -6d a 0d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-3.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM31ETRS89:"+title=Europe - de 0d a 6d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=3.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM32ETRS89:"+title=Europe - de 6d a 12d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=9.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM33ETRS89:"+title=Europe - de 12d a 18d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=15.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM34ETRS89:"+title=Europe - de 18d a 24d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=21.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM35ETRS89:"+title=Europe - de 24d a 30d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=27.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM36ETRS89:"+title=Europe - de 30d a 36d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=33.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM37ETRS89:"+title=Europe - de 36d a 42d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=39.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM38ETRS89:"+title=Europe - de 42d a 48d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs"}};return e}(proj4),LeafletCRSEPSG2154=function(t,e,i){var n={instance:null,build:function(){if(!this.instance){var t=new i.Proj.CRS("EPSG:2154",e.get("EPSG:2154"),{resolutions:this._getResolutions(),origin:this._getOrigin()});this.instance=t}return this.instance},_getResolutions:function(){var e=[];if(t.isConfigLoaded()){var i=t.getTileMatrix("LAMB93");e=i.nativeResolutions}return e.length?e:[104579.22454989408,52277.53235379051,26135.487078595408,13066.891381800004,6533.228604113456,3266.5595244626675,1633.2660045974187,816.6295549860224,408.31391467683596,204.15674151090204,102.07831678324082,51.0391448966112,25.519569074269395,12.759783693647506,6.379891635966491,3.18994576530532,1.5949728694977277,.7974864315474559,.398743214900604,.19937160727567999,.099685803696052,.049842901818919996]},_getOrigin:function(){return[0,12e6]}};return n}(CommonUtilsConfig,CommonUtilsRegister,leaflet),LeafletCRSEPSG27572=function(t,e,i){var n={instance:null,build:function(){if(!this.instance){var t=new i.Proj.CRS("EPSG:27572",e.get("EPSG:27572"),{resolutions:this._getResolutions(),origin:this._getOrigin()});this.instance=t}return this.instance},_getResolutions:function(){var e=[];if(t.isConfigLoaded()){var i=t.getTileMatrix("LAMB2E");i&&Object.keys(i)&&(e=i.nativeResolutions)}return e.length?e:[104579.22454989408,52277.53235379051,26135.487078595408,13066.891381800004,6533.228604113456,3266.5595244626675,1633.2660045974187,816.6295549860224,408.31391467683596,204.15674151090204,102.07831678324082,51.0391448966112,25.519569074269395,12.759783693647506,6.379891635966491,3.18994576530532,1.5949728694977277,.7974864315474559,.398743214900604,.19937160727567999,.099685803696052,.049842901818919996]},_getOrigin:function(){return[0,12e6]}};return n}(CommonUtilsConfig,CommonUtilsRegister,leaflet),LeafletCRSEPSG4326=function(t,e,i){var n={instance:null,build:function(){if(!this.instance){var t=new i.Proj.CRS("EPSG:4326",e.get("EPSG:4326"),{resolutions:this._getResolutions(),origin:[-180,90]});this.instance=t}return this.instance},_getResolutions:function(){var e=[];return t.isConfigLoaded()&&(e=t.getResolutions()),e.length?e:[1.40625,.703125,.3515625,.17578125,.087890625,.0439453125,.02197265625,.010986328125,.0054931640625,.00274658203125,.001373291015625,.0006866455078125,.00034332275390625,.000171661376953126,858306884765628e-19,429153442382813e-19,214576721191407e-19,107288360595703e-19,536441802978517e-20,268220901489259e-20,13411045074463e-19,6.70552253723145e-7,3.3527612686157e-7]},_getOrigin:function(){}};return n}(CommonUtilsConfig,CommonUtilsRegister,leaflet),LeafletCRSCRS=function(t,e,i,n,o){!function(){t.load(),e.load()}();var s={EPSG2154:function(){return i.build()},EPSG27572:function(){return n.build()},EPSG4326:function(){return o.build()}};return s}(LeafletCRSProj4Leaflet,CommonUtilsRegister,LeafletCRSEPSG2154,LeafletCRSEPSG27572,LeafletCRSEPSG4326),LeafletControlsMousePosition=function(t,e,i,n,o,s,r,a){var l=t.Control.extend({includes:s,options:{position:"bottomleft",collapsed:!0,units:[],systems:[],displayAltitude:!0,displayCoordinates:!0,altitude:{triggerDelay:200,responseDelay:500,noDataValue:-99999,noDataValueTolerance:9e4,serviceOptions:{}}},initialize:function(e){t.Util.extend(this.options,e),this._uid=o.generate(),this._projectionSystems=[],this._initProjectionSystems(),this._projectionUnits={},this._initProjectionUnits(),this._isDesktop=this._detectSupport(),this.options.altitude.triggerDelay<100&&(this.options.altitude.triggerDelay=100),this._timer=this.options.altitude.triggerDelay,this._currentProjectionSystems=this._projectionSystems[0],this._projectionSystemsContainer=null,this._currentProjectionType=this._projectionSystems[0].type,this._currentProjectionUnits=this._projectionUnits[this._currentProjectionType][0].code,this._projectionUnitsContainer=null,this._showMousePositionContainer=null,this.options.displayAltitude||this.options.displayCoordinates||(this.options.displayCoordinates=!0),this._noRightManagement=!1,this.options.displayAltitude&&this._checkRightsManagement(),t.Util.setOptions(this,this.options)},onAdd:function(e){var i=this._container=this._initLayout();return this.options.collapsed||(this._isDesktop?e.on("mousemove",this.onMouseMove,this):e.on("move",this.onMapMove,this)),t.DomEvent.disableClickPropagation(i).disableScrollPropagation(i),t.DomEvent.addListener(i,"mousemove",t.DomEvent.stopPropagation).addListener(i,"mousemove",t.DomEvent.preventDefault),i},onRemove:function(t){t.off("mousemove",this.onMouseMove)},_initProjectionSystems:function(){for(var e=[{label:"Géographique",crs:t.CRS.Simple,type:"Geographical"},{label:"Web Mercator",crs:t.CRS.EPSG3395,type:"Metric"},{label:"Lambert 93",crs:a.EPSG2154,type:"Metric",geoBBox:{left:-9.86,bottom:41.15,right:10.38,top:51.56}},{label:"Lambert II étendu",crs:a.EPSG27572,type:"Metric",geoBBox:{left:-4.87,bottom:42.33,right:8.23,top:51.14}}],i=this.options.systems,n=0;n<i.length;n++){var o=i[n];if(o.label&&o.crs){o.type||(o.type="Metric"),this._projectionSystems.push(i[n]);for(var s=!1,r=0;r<e.length;r++){var l=e[r];o.crs===l.crs&&(s=!0)}}}0===this._projectionSystems.length&&(this._projectionSystems=e);for(var c=0;c<this._projectionSystems.length;++c)this._projectionSystems[c].code=c},_initProjectionUnits:function(){var t={Geographical:[{code:"DEC",label:"degrés décimaux",convert:this._displayDEC},{code:"DMS",label:"degrés sexagésimaux",convert:this._displayDMS},{code:"RAD",label:"radians",convert:this._displayRAD},{code:"GON",label:"grades",convert:this._displayGON}],Metric:[{code:"M",label:"mètres",convert:this._displayMeter},{code:"KM",label:"kilomètres",convert:this._displayKMeter}]},e=this.options.units;for(var i in t)if(t.hasOwnProperty(i)){for(var n=!1,o=0;o<t[i].length;o++)for(var s=t[i][o],r=0;r<e.length;r++){var a=e[r];s.code===a&&(n=!0,this._projectionUnits[i]||(this._projectionUnits[i]=[]),this._projectionUnits[i].push(s))}n||(this._projectionUnits[i]=t[i])}0===Object.keys(this._projectionUnits).length&&(this._projectionUnits=t)},_checkRightsManagement:function(){var t=n.check({key:this.options.apiKey,resources:["SERVICE_CALCUL_ALTIMETRIQUE_RSC"],services:["Elevation"]});t||(this._noRightManagement=!0),this.options.apiKey||(this.options.apiKey=t.key)},_detectSupport:function(){var t=!0,e=window.navigator.userAgent.toLowerCase();return e.indexOf("iphone")===-1&&e.indexOf("ipod")===-1&&e.indexOf("ipad")===-1&&e.indexOf("android")===-1&&e.indexOf("mobile")===-1&&e.indexOf("blackberry")===-1&&e.indexOf("tablet")===-1&&e.indexOf("phone")===-1&&e.indexOf("touch")===-1||(t=!1),e.indexOf("msie")===-1&&e.indexOf("trident")===-1||(t=!0),t},_initLayout:function(){var t=this._createMainContainerElement(),e=this._showMousePositionContainer=this._createShowMousePositionElement();t.appendChild(e),this.options.collapsed||(e.checked=!0);var i=this._createShowMousePositionPictoElement(this._isDesktop);t.appendChild(i);var n=this._createMousePositionPanelElement(this.options.displayAltitude,this.options.displayCoordinates),o=this._createMousePositionSettingsElement(),s=this._projectionSystemsContainer=this._createMousePositionSettingsSystemsElement(this._projectionSystems),r=this._projectionUnitsContainer=this._createMousePositionSettingsUnitsElement(this._projectionUnits[this._currentProjectionType]);o.appendChild(s),o.appendChild(r),n.appendChild(o),t.appendChild(n);var a=this._createMapCenter(),l=this._map;return l.getContainer().appendChild(a),t},_setElevationPanel:function(e){var i=null;e||(i=t.DomUtil.get(this._addUID("GPmousePositionAltitude")),i.style.display="none"),e&&this._noRightManagement&&(i=t.DomUtil.get(this._addUID("GPmousePositionAlt")),i.innerHTML="no right !")},_setCoordinatePanel:function(e){if(!e){var i=t.DomUtil.get(this._addUID("GPmousePositionCoordinate"));i.style.display="none"}},_setSettingsPanel:function(e){if(!e){var i=t.DomUtil.get("GPshowMousePositionSettingsPicto"),n=t.DomUtil.get(this._addUID("GPmousePositionSettings"));i.style.display="none",n.style.display="none"}},_setTypeUnitsPanel:function(t){for(var e=this._projectionUnitsContainer;e.firstChild;)e.removeChild(e.firstChild);for(var i=this._projectionUnits[t],n=0;n<i.length;n++){var o=i[n],s=document.createElement("option");s.value=o.code?o.code:n,s.text=o.label||n,e.appendChild(s)}this._currentProjectionType=t,this._currentProjectionUnits=this._projectionUnits[t][0].code},_displayDEC:function(t){var e={};return e.lat=r.roundToDecimal(t.lat,6),e.lng=r.roundToDecimal(t.lng,6),e},_displayDMS:function(t){var e={};return e.lat=r.decimalLatToDMS(t.lat),e.lng=r.decimalLongToDMS(t.lng),e},_displayRAD:function(t){var e={};return e.lat=r.decimalToRadian(t.lat),e.lng=r.decimalToRadian(t.lng),e},_displayGON:function(t){var e={};return e.lat=r.decimalToGrade(t.lat),e.lng=r.decimalToGrade(t.lng),e},_displayMeter:function(e){var i={};return i.x=t.Util.formatNum(e.x,2),i.y=t.Util.formatNum(e.y,2),i.unit="m",i},_displayKMeter:function(e){var i={};return i.x=t.Util.formatNum(e.x/1e3,2),i.y=t.Util.formatNum(e.y/1e3,2),i.unit="km",i},_project:function(e,i){if("function"==typeof i&&(i=i()),"object"==typeof i){if(i===t.CRS.Simple)return e;if(i.projection&&"object"==typeof i.projection){var n=i.projection.project(e);return"Geographical"===this._currentProjectionType&&(n.lat=n.y,n.lng=n.x),!n||0===Object.keys(n).length,n}}},_setCoordinate:function(t){for(var e=this._currentProjectionSystems.type,i=null,n=this._projectionUnits[e],o=0;o<n.length;o++)if(n[o].code===this._currentProjectionUnits){i=n[o].convert;break}var s={},r=this._currentProjectionSystems.crs;r&&(s=i(this._project(t,r)),s&&0!==Object.keys(s).lenght&&this.GPdisplayCoords(s))},_setElevation:function(t){var e=this.options.altitude.responseDelay,i=this.options.altitude.noDataValue,n=this.options.altitude.noDataValueTolerance;this.GPdisplayElevation(t,e,i,n)},onMoveStopped:function(t){this._noRightManagement||this._setElevation(t)},onMouseMove:function(t){var e=this,i=t.latlng;this._setCoordinate(i),clearTimeout(this._timer),this._timer=setTimeout(function(){e.onMoveStopped(i)},this.options.altitude.triggerDelay)},onMapMove:function(){var t=this,e=this._map,i=e.getCenter();this._setCoordinate(i),clearTimeout(this._timer),this._timer=setTimeout(function(){t.onMoveStopped(i)},this.options.altitude.triggerDelay)},onRequestAltitude:function(e,n){if(e&&0!==Object.keys(e).length&&this.options.displayAltitude&&!this._noRightManagement){var o={};t.Util.extend(o,this.options.altitude.serviceOptions),t.Util.extend(o,{zonly:!0,positions:[{lon:e.lon||e.lng,lat:e.lat}]}),t.Util.extend(o,{scope:this,onSuccess:function(t){t&&Object.keys(t)&&n.call(this,t.elevations[0].z)},onFailure:function(t){}}),t.Util.extend(o,{apiKey:o.apiKey||this.options.apiKey}),i.Services.getAltitude(o)}},onShowMousePositionClick:function(t){var e=this._map;this._showMousePositionContainer.checked?this._isDesktop?e.off("mousemove",this.onMouseMove,this):e.off("move",this.onMapMove,this):this._isDesktop?e.on("mousemove",this.onMouseMove,this):e.on("move",this.onMapMove,this),this._setElevationPanel(this.options.displayAltitude),this._setCoordinatePanel(this.options.displayCoordinates),this.options.displayCoordinates||this._setSettingsPanel(!1)},onMousePositionProjectionSystemChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;t.target.options[e].label;this._setCurrentSystem(i)},_setCurrentSystem:function(t){for(var e=null,i=0;i<this._projectionSystems.length;++i)if(this._projectionSystems[i].code==t){e=this._projectionSystems[i].type;break}e&&(e!==this._currentProjectionType&&this._setTypeUnitsPanel(e),this._currentProjectionSystems=this._projectionSystems[Number(t)],this._isDesktop||this.onMapMove())},onMousePositionProjectionSystemMouseOver:function(t){var e=this._map;if(e){var i=document.getElementById(this._addUID("GPmousePositionProjectionSystem"));i.innerHTML="";for(var n=0;n<this._projectionSystems.length;n++){var o=this._projectionSystems[n];if(o.geoBBox&&(e.getBounds()._southWest.lng>o.geoBBox.right||e.getBounds()._southWest.lat>o.geoBBox.top||e.getBounds()._northEast.lng<o.geoBBox.left||e.getBounds()._northEast.lat<o.geoBBox.bottom)){if(o===this._currentProjectionSystems){var s=document.createElement("option");s.value=o.code,s.text=o.label||n,s.setAttribute("selected","selected"),s.setAttribute("disabled","disabled"),i.appendChild(s)}}else{var s=document.createElement("option");s.value=o.code,s.text=o.label||n,o===this._currentProjectionSystems&&s.setAttribute("selected","selected"),i.appendChild(s)}}}},onMousePositionProjectionUnitsChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;t.target.options[e].label;this._currentProjectionUnits=i,this._isDesktop||this.onMapMove()}});return l}(leaflet,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,CommonControlsMousePositionDOM,LeafletControlsUtilsPositionFormater,LeafletCRSCRS),CommonControlsReverseGeocodingDOM=function(){var t={_addUID:function(t){return t+"-"+this._uid},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPreverseGeocoding"),t.className="GPwidget",t},_createShowReverseGeocodingElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowReverseGeocoding"),t.type="checkbox",t},_createShowReverseGeocodingPictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowReverseGeocodingPicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowReverseGeocoding"),e.title="Ouvrir la recherche inverse",e.addEventListener?e.addEventListener("click",function(){t.onShowReverseGeocodingClick()}):e.attachEvent&&e.attachEvent("onclick",function(){t.onShowReverseGeocodingClick()});var i=document.createElement("span");return i.id=this._addUID("GPshowReverseGeocodingOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createReverseGeocodingWaitingElement:function(){var t=document.createElement("div");t.id=this._addUID("GPreverseGeocodingCalcWaitingContainer"),t.className="GPreverseGeocodingCalcWaitingContainerHidden";var e=document.createElement("p");return e.className="GPreverseGeocodingCalcWaiting",e.innerHTML="Recherche en cours...",t.appendChild(e),t},_createReverseGeocodingResultsPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPreverseGeocodingResultsPanel"),t.className="GPpanel GPreverseGeocodingComponentHidden",t},_createReverseGeocodingResultsListElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPreverseGeocodingResultsList"),t},_createReverseGeocodingResultElement:function(t,e){var i=this,n=document.getElementById(this._addUID("GPreverseGeocodingResultsList")),o=document.createElement("div");o.id=this._addUID("ReverseGeocodedLocation_"+e),o.className="GPautoCompleteProposal",o.innerHTML=t,o.title=t,o.addEventListener?(o.addEventListener("mouseover",function(t){i.onReverseGeocodingResultMouseOver(t)}),o.addEventListener("mouseout",function(t){i.onReverseGeocodingResultMouseOut(t)}),o.addEventListener("click",function(t){"function"==typeof i.onReverseGeocodingResultClick&&i.onReverseGeocodingResultClick(t)})):o.attachEvent&&(o.attachEvent("onmouseover",function(t){i.onReverseGeocodingResultMouseOver(t)}),o.attachEvent("onmouseout",function(t){i.onReverseGeocodingResultMouseOut(t)}),o.attachEvent("onclick",function(t){"function"==typeof i.onReverseGeocodingResultClick&&i.onReverseGeocodingResultClick(t)})),n.appendChild(o)},_createReverseGeocodingPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPreverseGeocodingPanel"),t.className="GPpanel",t},_createReverseGeocodingPanelHeaderElement:function(){var t=document.createElement("div");return t.className="GPpanelHeader",t},_createReverseGeocodingPanelReturnPictoElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPreverseGeocodingReturnPicto"),e.title="Nouvelle recherche",e.className="GPreverseGeocodingReturnPictoHidden",e.addEventListener?e.addEventListener("click",function(e){document.getElementById(t._addUID("GPreverseGeocodingResultsPanel")).className="GProuteComponentHidden",document.getElementById(t._addUID("GPreverseGeocodingForm")).className="",document.getElementById(t._addUID("GPreverseGeocodingHeaderTitle")).innerHTML="Recherche inverse",document.getElementById(t._addUID("GPreverseGeocodingReturnPicto")).className="GPreverseGeocodingReturnPictoHidden",t.onGPreverseGeocodingReturnPictoClick(e)}):e.attachEvent&&e.attachEvent("onclick",function(e){document.getElementById(t._addUID("GPreverseGeocodingResultsPanel")).className="GProuteComponentHidden",document.getElementById(t._addUID("GPreverseGeocodingForm")).className="",document.getElementById(t._addUID("GPreverseGeocodingHeaderTitle")).innerHTML="Recherche inverse",document.getElementById(t._addUID("GPreverseGeocodingReturnPicto")).className="GPreverseGeocodingReturnPictoHidden",t.onGPreverseGeocodingReturnPictoClick(e)}),e},_createReverseGeocodingPanelTitleElement:function(){var t=document.createElement("div");return t.className="GPpanelTitle",t.id=this._addUID("GPreverseGeocodingHeaderTitle"),t.innerHTML="Recherche inverse",t},_createReverseGeocodingPanelCloseElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPreverseGeocodingPanelClose"),e.className="GPpanelClose",e.title="Fermer le panneau",e.addEventListener?e.addEventListener("click",function(){document.getElementById(t._addUID("GPshowReverseGeocodingPicto")).click()},!1):e.attachEvent&&e.attachEvent("onclick",function(){document.getElementById(t._addUID("GPshowReverseGeocodingPicto")).click()}),e},_createReverseGeocodingPanelFormElement:function(){var t=this,e=document.createElement("form");return e.id=this._addUID("GPreverseGeocodingForm"),e.addEventListener?e.addEventListener("submit",function(e){e.preventDefault(),t.onReverseGeocodingSubmit()}):e.attachEvent&&e.attachEvent("onsubmit",function(e){e.preventDefault(),t.onReverseGeocodingSubmit()}),e},_createReverseGeocodingFormModeChoiceGeocodingTypeElement:function(t){var e=this,i=document.createElement("div");i.className="GPflexInput";var n=document.createElement("label");n.className="GPreverseGeocodingCodeLabel",n.innerHTML="Recherche par",n.title="Recherche par",i.appendChild(n);var o=document.createElement("select");o.className="GPreverseGeocodingCode",o.addEventListener?o.addEventListener("change",function(t){e.onReverseGeocodingTypeChange(t)}):o.attachEvent&&o.attachEvent("onchange",function(t){e.onReverseGeocodingTypeChange(t)}),t&&Array.isArray(t)||(t=["StreetAddress","PositionOfInterest","CadastralParcel"]);for(var s=0;s<t.length;s++)switch(t[s]){case"PositionOfInterest":var r=document.createElement("option");r.value="PositionOfInterest",r.text="Lieux/toponymes",o.appendChild(r);break;case"StreetAddress":var a=document.createElement("option");a.value="StreetAddress",a.text="Adresses",o.appendChild(a);break;case"CadastralParcel":var l=document.createElement("option");l.value="CadastralParcel",l.text="Parcelles cadastrales",o.appendChild(l);break;case"Administratif":var c=document.createElement("option");c.value="Administratif",c.text="Unités administratives",o.appendChild(c)}return i.appendChild(o),i},_createReverseGeocodingFormModeChoiceGeocodingDelimitationElement:function(t){var e=this,i=document.createElement("div");i.className="GPflexInput";var n=document.createElement("label");n.className="GPreverseGeocodingCodeLabel",n.innerHTML="Délimitation",n.title="Délimitation",i.appendChild(n);var o=document.createElement("select");o.className="GPreverseGeocodingCode",o.addEventListener?o.addEventListener("change",function(t){e.onReverseGeocodingDelimitationChange(t);
+}):o.attachEvent&&o.attachEvent("onchange",function(t){e.onReverseGeocodingDelimitationChange(t)}),t&&Array.isArray(t)||(t=["Point","Circle","Extent"]);for(var s=0;s<t.length;s++)switch(t[s].toLowerCase()){case"point":var r=document.createElement("option");r.value="point",r.text="Pointer un lieu",o.appendChild(r);break;case"circle":var a=document.createElement("option");a.value="circle",a.text="Dessiner un cercle",o.appendChild(a);break;case"extent":var l=document.createElement("option");l.value="extent",l.text="Dessiner une emprise",o.appendChild(l)}return i.appendChild(o),i},_createReverseGeocodingSubmitFormElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPreverseGeocodingSubmit"),t.className="GPinputSubmit",t.type="submit",t.value="Rechercher",t}};return t}(),LeafletControlsReverseGeocoding=function(t,e,i,n,o,s,r,a){var l=t.Control.extend({includes:a,options:{position:"bottomleft",collapsed:!0,resources:["StreetAddress","PositionOfInterest"],delimitations:["Point","Circle","Extent"],reverseGeocodeOptions:{}},initialize:function(e){t.Util.extend(this.options,e),this._noRightManagement=!1,this._servicesRightManagement={},this._checkRightsManagement(),this._checkInputOptions(),this._uid=s.generate(),this._currentGeocodingType=null,this._initGeocodingType(),this._currentGeocodingDelimitation=null,this._initGeocodingDelimitation(),this._showReverseGeocodingContainer=null,this._panelHeaderContainer=null,this._panelTitleContainer=null,this._returnPictoContainer=null,this._formContainer=null,this._resultsContainer=null,this._resultsListContainer=null,this._waitingContainer=null,this._inputFeaturesLayer=null,this._inputResultsLayer=null,this._lastIdLayer=0,this._currentIdLayer=0,this._currentFeature=null,this._requestPosition=null,this._requestCircleFilter=null,this._requestBboxFilter=null,this._waiting=!1,this._timer=null,this._reverseGeocodingLocations=[]},onAdd:function(e){var i=this._container=this._initLayout();return t.DomEvent.disableClickPropagation(i).disableScrollPropagation(i),e&&(this.options.collapsed||this._activateMapInteraction(e)),i},onRemove:function(){},_checkRightsManagement:function(){var t,e=[],i=null;t=this.options.reverseGeocodeOptions.apiKey,i=this.options.reverseGeocodeOptions.filterOptions,e=i?i.type:[],e&&0!==e.length||(e=this.options.resources),e&&0!==e.length||(e=["StreetAddress","PositionOfInterest"]);var n=o.check({key:t||this.options.apiKey,resources:e,services:["Geocode"]});return n?(this.options.apiKey||(this.options.apiKey=n.key),void(n&&(this._servicesRightManagement.Geocode=n.Geocode))):void(this._noRightManagement=!0)},_checkInputOptions:function(){var t;if(this.options.resources){var e=this.options.resources;Array.isArray(e)||(console.log("[ReverseGeocoding] 'options.resources' parameter should be an array"),e=null);var i=["StreetAddress","PositionOfInterest","CadastralParcel","Administratif"];for(t=0;t<e.length;t++)i.indexOf(e[t])===-1&&console.log("[ReverseGeocoding] options.resources : "+e[t]+" is not a resource for reverse geocode")}if(this.options.delimitations){var n=this.options.delimitations;Array.isArray(n)||(console.log("[ReverseGeocoding] 'options.delimitations' parameter should be an array"),n=null);var o=["Circle","Point","Extent"];for(t=0;t<n.length;t++)o.indexOf(n[t])===-1&&console.log("[ReverseGeocoding] options.delimitations : "+n[t]+" is not a delimitation for reverse geocode")}},_initGeocodingType:function(){this._currentGeocodingType="StreetAddress";var t=this.options.resources;if(t&&0!==t.length||(this.options.resources=["StreetAddress","PositionOfInterest","CadastralParcel"]),Array.isArray(t)&&t.length){for(var e=[],i=0;i<t.length;i++)this._servicesRightManagement.Geocode.indexOf(t[i])<0&&(e.push(i),console.log("[ReverseGeocode] no rights for options.resources : "+t[i]));if(0!==e.length)for(var n=0;n<e.length;n++)t.splice(e[n],1);"StreetAddress"!==t[0]&&"PositionOfInterest"!==t[0]&&"CadastralParcel"!==t[0]&&"Administratif"!==t[0]||(this._currentGeocodingType=t[0])}var o=this.options.reverseGeocodeOptions;o.filterOptions&&Array.isArray(o.filterOptions.type)&&0!==o.filterOptions.type.length&&(this._currentGeocodingType=o.filterOptions.type[0])},_initGeocodingDelimitation:function(){this._currentGeocodingDelimitation="Point";var t=this.options.delimitations;if(t&&0!==t.length||(this.options.delimitations=["Point","Circle","Extent"]),Array.isArray(t)&&t.length){var e=t[0].toLowerCase();"point"!==e&&"circle"!==e&&"extent"!==e||(this._currentGeocodingDelimitation=t[0])}},_initLayout:function(){var t=this._createMainContainerElement(),e=this._showReverseGeocodingContainer=this._createShowReverseGeocodingElement();t.appendChild(e),this.options.collapsed||(e.checked=!0);var i=this._createShowReverseGeocodingPictoElement();t.appendChild(i);var n=this._createReverseGeocodingPanelElement(),o=this._panelHeaderContainer=this._createReverseGeocodingPanelHeaderElement(),s=this._returnPictoContainer=this._createReverseGeocodingPanelReturnPictoElement();o.appendChild(s);var r=this._panelTitleContainer=this._createReverseGeocodingPanelTitleElement();o.appendChild(r);var a=this._createReverseGeocodingPanelCloseElement();o.appendChild(a),n.appendChild(o);var l=this._formContainer=this._createReverseGeocodingPanelFormElement();l.appendChild(this._createReverseGeocodingFormModeChoiceGeocodingTypeElement(this.options.resources)),l.appendChild(this._createReverseGeocodingFormModeChoiceGeocodingDelimitationElement(this.options.delimitations));var c=this._createReverseGeocodingSubmitFormElement();l.appendChild(c),n.appendChild(l);var h=this._waitingContainer=this._createReverseGeocodingWaitingElement();n.appendChild(h);var u=this._resultsContainer=this._createReverseGeocodingResultsPanelElement(),d=this._resultsListContainer=this._createReverseGeocodingResultsListElement();return u.appendChild(d),n.appendChild(u),t.appendChild(n),t},_activateMapInteraction:function(e){if(null===this._inputFeaturesLayer){this._inputFeaturesLayer=new t.FeatureGroup,e.addLayer(this._inputFeaturesLayer);var i=this;e.on("draw:created",function(e){var n=e.layer,o=e.layerType;i._setFeaturePosition(n,o),i._currentIdLayer=t.Util.stamp(n),i._setFeatureLayer(n)}),e.on("draw:drawstart",function(){i._removeFeatureLayer(i._lastIdLayer),i._lastIdLayer=i._currentIdLayer}),e.on("draw:drawstop",function(){})}var n=this._currentGeocodingDelimitation.toLowerCase();switch(n){case"point":this._activatePointInteraction(e);break;case"circle":this._activateCircleInteraction(e);break;case"extent":this._activateBoxInteraction(e)}},_removeMapInteraction:function(t){t&&(null!==this._inputFeaturesLayer&&(t.off("draw:created"),t.off("draw:drawstart"),t.off("draw:drawstop"),t.removeLayer(this._inputFeaturesLayer),this._inputFeaturesLayer=null),this._lastIdLayer=this._currentIdLayer=0,this._currentFeature&&this._currentFeature.disable())},_activatePointInteraction:function(e){this._currentFeature&&this._currentFeature.disable(),t.drawLocal.draw.handlers.marker.tooltip.start="click map to place search point";var i={repeatMode:!0};this._currentFeature=new t.Draw.Marker(e,i),this._currentFeature.enable()},_activateCircleInteraction:function(e){this._currentFeature&&this._currentFeature.disable();var i={repeatMode:!0};this._currentFeature=new t.Draw.Circle(e,i),this._currentFeature.enable()},_activateBoxInteraction:function(e){this._currentFeature&&this._currentFeature.disable();var i={repeatMode:!0};this._currentFeature=new t.Draw.Rectangle(e,i),this._currentFeature.enable()},_setFeaturePosition:function(t,e){var i=null;if("marker"===e)i=t.getLatLng(),this._requestPosition={x:i.lat,y:i.lng};else if("circle"===e)i=t.getLatLng(),this._requestPosition={x:i.lat,y:i.lng},this._requestCircleFilter={x:i.lat,y:i.lng,radius:t.getRadius()};else if("rectangle"===e){i=t.getBounds();var n={lng:(i.getSouthWest().lng+i.getNorthEast().lng)/2,lat:(i.getSouthWest().lat+i.getNorthEast().lat)/2};this._requestPosition={x:n.lat,y:n.lng},this._requestBboxFilter={left:i.getSouthWest().lat,right:i.getNorthEast().lat,bottom:i.getSouthWest().lng,top:i.getNorthEast().lng}}},_setFeatureLayer:function(t){this._inputFeaturesLayer&&this._inputFeaturesLayer.addLayer(t)},_removeFeatureLayer:function(t){this._inputFeaturesLayer&&0!==t&&(t?this._inputFeaturesLayer.removeLayer(t):this._inputFeaturesLayer.clearLayers())},_reverseGeocodingRequest:function(e){var i=this._map;this._removeMapInteraction(i);var o={};t.Util.extend(o,this.options.reverseGeocodeOptions),t.Util.extend(o,e),t.Util.extend(o,{apiKey:this.options.apiKey,srs:"EPSG:4326",returnFreeForm:!1,timeOut:3e4,protocol:"XHR"});var s=o.filterOptions.type;"circle"===this._currentGeocodingDelimitation.toLowerCase()&&this._requestCircleFilter&&(this._requestCircleFilter.radius>1e3&&(this._requestCircleFilter.radius=1e3),t.Util.extend(o,{filterOptions:{type:s,circle:this._requestCircleFilter}})),"extent"===this._currentGeocodingDelimitation.toLowerCase()&&this._requestBboxFilter&&t.Util.extend(o,{filterOptions:{type:s,bbox:this._requestBboxFilter}}),this._displayWaitingContainer(),n.Services.reverseGeocode(o)},_displayGeocodedLocations:function(t){if(this._clearLocations(),this._clearLocationsFeature(),this._reverseGeocodingLocations=t,!t||0===t.length)return void this._clearInputRequest();this._formContainer.className="GPreverseGeocodingComponentHidden",this._hideWaitingContainer(),this._panelTitleContainer.innerHTML="Résultats de la recherche",this._returnPictoContainer.className="",this._resultsContainer.className="GPpanel",this._fillGeocodedLocationListContainer(t),this._displayGeocodedLocationsOnMap(t);var e=this._map;e.fitBounds(this._inputResultsLayer.getBounds())},_fillGeocodedLocationListContainer:function(t){for(var e=0;e<t.length;e++){var i=t[e],n=this._fillGeocodedLocationDescription(i);0!==n.length&&this._createReverseGeocodingResultElement(n,e)}},_fillGeocodedLocationDescription:function(t){if(t&&t.placeAttributes){var e=t.placeAttributes,i="";switch(t.type){case"StreetAddress":e.street&&(i+=e.number?e.number+" ":"",i+=e.street+", "),i+=e.postalCode+" "+e.commune;break;case"PositionOfInterest":"City"===t.matchType&&e.commune?(i+=e.commune,i+=e.postalCode?", "+e.postalCode:""):"Département"===t.matchType&&e.municipality?(i+=e.municipality,i+=e.postalCode?", "+e.postalCode:""):"Toponym"===t.matchType&&e.municipality?(i+=e.municipality,i+=e.postalCode?", "+e.postalCode:"",i+=e.commune?" "+e.commune:""):i+=e.municipality?e.municipality:"",i+=e.nature?" ("+e.nature+") ":"";break;case"CadastralParcel":i+=e.cadastralParcel?e.cadastralParcel:"",i+=e.municipality?" ("+e.municipality+")":"";break;case"Administratif":i+=e.municipality?e.municipality:"",e.inseeDepartment?i+="(Département)":e.inseeRegion&&(i+="(Région)");break;default:i+=e.municipality?e.municipality:""}return i}},_displayGeocodedLocationsOnMap:function(e){function i(e){var i=e.target;i.setIcon(new r("red"));var n=t.DomUtil.get("ReverseGeocodedLocation_"+i.options.id+"-"+s._uid);t.DomUtil.addClass(n,"GPreverseGeocodedLocationHighlight"),n.scrollIntoView(!1)}function n(e){var i=e.target;i.setIcon(new r("green"));var n=t.DomUtil.get("ReverseGeocodedLocation_"+i.options.id+"-"+s._uid);t.DomUtil.removeClass(n,"GPreverseGeocodedLocationHighlight")}var o=this._map,s=this;this._inputResultsLayer=new t.FeatureGroup,o.addLayer(this._inputResultsLayer);for(var a=0;a<e.length;a++){var l=e[a];if(l){var c={id:a,icon:new r("green"),riseOnHover:!0,draggable:!1,clickable:!0,zIndexOffset:1e3},h=t.marker(t.latLng(l.position.x,l.position.y),c),u="<ul>",d=l.placeAttributes;for(var p in d)d.hasOwnProperty(p)&&"bbox"!==p&&(u+="<li>",u+='<span class="gp-attname-others-span">'+p.toUpperCase()+" : </span>",u+=d[p],u+=" </li>");u+=" </ul>",h.bindPopup(u),h.on("mouseover",i),h.on("mouseout",n),this._inputResultsLayer.addLayer(h)}}},onShowReverseGeocodingClick:function(){var t=this._map;this._showReverseGeocodingContainer.checked?this._removeMapInteraction(t):this._waiting||this._reverseGeocodingLocations.length||this._activateMapInteraction(t)},onReverseGeocodingTypeChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;i&&(this._currentGeocodingType=i)},onReverseGeocodingDelimitationChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;if(i){this._currentGeocodingDelimitation=i,this._clearInputRequest();var n=this._map;this._removeMapInteraction(n),this._activateMapInteraction(n)}},onGPreverseGeocodingReturnPictoClick:function(){this._clearLocations(),this._clearLocationsFeature(),this._clearInputRequest(),this._activateMapInteraction(this._map)},onReverseGeocodingSubmit:function(){if(this._requestPosition&&!this._noRightManagement){var t=this;this._reverseGeocodingRequest({position:t._requestPosition,filterOptions:{type:[t._currentGeocodingType]},onSuccess:function(e){if(e){var i=e.locations;t._displayGeocodedLocations(i),t._hideWaitingContainer()}},onFailure:function(e){t._hideWaitingContainer(),t._clearLocations(),t._clearLocationsFeature(),t._clearInputRequest()}})}},onReverseGeocodingResultClick:function(t){},onReverseGeocodingResultMouseOver:function(t){var e=s.index(t.target.id);t.target.classList&&t.target.classList.add("GPreverseGeocodedLocationHighlight"),this._inputResultsLayer&&this._inputResultsLayer.eachLayer(function(t){t.options.id===parseInt(e,10)&&t.fire("mouseover")})},onReverseGeocodingResultMouseOut:function(t){var e=s.index(t.target.id);t.target.classList&&t.target.classList.remove("GPreverseGeocodedLocationHighlight"),this._inputResultsLayer&&this._inputResultsLayer.eachLayer(function(t){t.options.id===parseInt(e,10)&&t.fire("mouseout")})},_clearLocations:function(){if(this._reverseGeocodingLocations=[],this._resultsListContainer)for(;this._resultsListContainer.firstChild;)this._resultsListContainer.removeChild(this._resultsListContainer.firstChild)},_clearLocationsFeature:function(){var t=this._map;null!==this._inputResultsLayer&&(t.removeLayer(this._inputResultsLayer),this._inputResultsLayer=null)},_clearInputRequest:function(){this._requestPosition=null,this._requestCircleFilter=null,this._requestBboxFilter=null},_displayWaitingContainer:function(){this._waitingContainer.className="GPreverseGeocodingCalcWaitingContainerVisible",this._waiting=!0,this._timer&&(clearTimeout(this._timer),this._timer=null);var t=this;this._timer=setTimeout(function(){t._waiting===!0?t._hideWaitingContainer():t._timer&&clearTimeout(t._timer)},16e3)},_hideWaitingContainer:function(){this._waiting&&(this._waitingContainer.className="GPreverseGeocodingCalcWaitingContainerHidden",this._waiting=!1,clearTimeout(this._timer),this._timer=null)}});return l}(leaflet,leafletDraw,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,LeafletControlsUtilsIconDefault,CommonControlsReverseGeocodingDOM),CommonControlsRouteDOM=function(t){var e={_addUID:function(t){return t+"-"+this._uid},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProute"),t.className="GPwidget",t},_createShowRouteElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowRoute"),t.type="checkbox",t},_createShowRoutePictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowRoutePicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowRoute"),e.title="Ouvrir le calcul d'itinéraire",e.addEventListener?e.addEventListener("click",function(e){t.onShowRoutePanelClick(e)}):e.attachEvent&&e.attachEvent("onclick",function(e){t.onShowRoutePanelClick(e)});var i=document.createElement("span");return i.id=this._addUID("GPshowRouteOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createRoutePanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProutePanel"),t.className="GPpanel",t},_createRoutePanelHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Calcul d'itinéraire",e.appendChild(i);var n=document.createElement("div");return n.id=this._addUID("GProutePanelClose"),n.className="GPpanelClose",n.title="Masquer le panneau",n.addEventListener?n.addEventListener("click",function(){document.getElementById(t._addUID("GPshowRoutePicto")).click()},!1):n.attachEvent&&n.attachEvent("onclick",function(){document.getElementById(t._addUID("GPshowRoutePicto")).click()}),e.appendChild(n),e},_createRoutePanelFormElement:function(){var e=this,i=document.createElement("form");return i.id=this._addUID("GProuteForm"),i.setAttribute("onkeypress","return event.keyCode != 13;"),i.addEventListener("submit",function(i){console.log(i),i.preventDefault();var n=document.getElementsByClassName(e._addUID("GPlocationPoint")),o=n[0].childNodes[0].id,s=n[n.length-1].childNodes[0].id,r=t.index(o),a=t.index(s);if(""==document.getElementById(e._addUID("GPlocationOrigin_"+r)).value&&""==document.getElementById(e._addUID("GPlocationOriginCoords_"+r)).value||""==document.getElementById(e._addUID("GPlocationOrigin_"+a)).value&&""==document.getElementById(e._addUID("GPlocationOriginCoords_"+a)).value)return!1;var l;document.getElementById(e._addUID("GProuteResultsStages")).innerHTML="";for(var c=0;c<n.length;c++){var h=n[c].childNodes[0].id;if(l=t.index(h),"GPflexInput GPlocationStageFlexInput"==document.getElementById(e._addUID("GPlocationPoint_"+l)).className){var u=document.createElement("div");u.className="GProuteResultsStages";var d=document.createElement("div");d.className="GProuteResultStageLabel",d.innerHTML=document.getElementById(e._addUID("GPlocationOriginLabel_"+l)).innerHTML+" :",u.appendChild(d);var p=document.createElement("div");p.className="GProuteResultStageValue";var m=document.getElementById(e._addUID("GPlocationOriginCoords_"+l)),f=m.value,_="GPlocationOriginVisible"===m.className;null!=f&&""!=f&&_?p.innerHTML=f:p.innerHTML=document.getElementById(e._addUID("GPlocationOrigin_"+l)).value,u.appendChild(p),""!=p.innerHTML&&document.getElementById(e._addUID("GProuteResultsStages")).appendChild(u)}}var g=null;if(document.getElementById(e._addUID("GProuteComputationSelect"))){var v=document.getElementById(e._addUID("GProuteResultsComputationSelect"));v.selectedIndex=document.getElementById(e._addUID("GProuteComputationSelect")).selectedIndex,g=v.options[v.selectedIndex].value}var y=null;document.getElementById(e._addUID("GProuteTransportCar"))&&document.getElementById(e._addUID("GProuteTransportCar")).checked&&(y=document.getElementById(e._addUID("GProuteTransportCar")).value),document.getElementById(e._addUID("GProuteTransportPedestrian"))&&document.getElementById(e._addUID("GProuteTransportPedestrian")).checked&&(y=document.getElementById(e._addUID("GProuteTransportPedestrian")).value);for(var E=[],P=document.getElementsByClassName("GProuteExclusionsOption"),C=0;C<P.length;C++){l=P[C].htmlFor;var S=document.getElementById(l);S.checked||E.push(S.value)}return e.onRouteComputationSubmit({computation:g,transport:y,exclusions:E}),!1}),i},_createRoutePanelResultsElement:function(){var t=document.createElement("div");t.id=this._addUID("GProuteResultsPanel"),t.className="GProuteComponentHidden",t.appendChild(this._createRouteResultsStagesElement()),t.appendChild(this._createRouteResultsElement());var e=document.createElement("div");e.className="GPfakeBorder GPfakeBorderLeft",t.appendChild(e),t.appendChild(this._createRouteShowResultsDetailsElement());var i=document.createElement("label");i.htmlFor=this._addUID("GProuteResultsShowDetails"),i.innerHTML="Afficher le détail",t.appendChild(i);var n=document.createElement("label");n.htmlFor=this._addUID("GProuteResultsShowDetails"),n.innerHTML="Masquer le détail",t.appendChild(n);var o=document.createElement("div");return o.className="GPfakeBorder",t.appendChild(o),t.appendChild(this._createRouteResultsDetailsElement()),t},_createRouteWaitingElement:function(){var t=document.createElement("div");t.id=this._addUID("GProuteCalcWaitingContainer"),t.className="GProuteCalcWaitingContainerHidden";var e=document.createElement("p");return e.className="GProuteCalcWaiting",e.innerHTML="Calcul en cours...",t.appendChild(e),t},_createRouteResultsStagesElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProuteResultsStages"),t},_createRouteResultsElement:function(){var t=this,e=document.createElement("div");e.id=this._addUID("GProuteResults");var i=document.createElement("div");i.id=this._addUID("GProuteResultsValues"),e.appendChild(i);var n=document.createElement("div");n.id=this._addUID("GProuteResultsMode");var o=document.createElement("select");o.id=this._addUID("GProuteResultsComputationSelect"),o.className="GPinputSelect",o.addEventListener("change",function(e){t.onRouteModeComputationChangeAndRun(e)});for(var s=[{code:"fastest",label:"Plus rapide"},{code:"shortest",label:"Plus court"}],r=0;r<s.length;r++){var a=document.createElement("option");a.value=s[r].code,a.text=s[r].label,o.appendChild(a)}n.appendChild(o),e.appendChild(n);var l=document.createElement("div");return l.id=this._addUID("GProuteResultsNew"),l.title="Modifier le calcul",l.addEventListener("click",function(e){document.getElementById(t._addUID("GProuteResultsPanel")).className="GProuteComponentHidden",document.getElementById(t._addUID("GProuteForm")).className="",t.onShowRouteResultsNewClick(e)}),e.appendChild(l),e},_addRouteResultsValuesElement:function(t,e,i){var n=document.getElementById(this._addUID("GProuteResultsValues"));if(n.childElementCount)for(;n.firstChild;)n.removeChild(n.firstChild);var o=document.createElement("div");o.className="GProuteResultsValue";var s=document.createElement("label");s.className="GProuteResultsValueLabel",s.innerHTML="Distance :",o.appendChild(s);var r=0,a=parseInt(t/1e3,10);if(a){var l=Math.round(t);l/=1e3,r=l+" km"}else r=Math.round(t)+" m";var c=document.createElement("div");c.id=this._addUID("GProuteResultsValueDist"),c.innerHTML=r,o.appendChild(c),n.appendChild(o);var h=document.createElement("div");h.className="GProuteResultsValue";var u=document.createElement("label");u.className="GProuteResultsValueLabel",u.innerHTML="Durée :",h.appendChild(u);var d=document.createElement("div");return d.id=this._addUID("GProuteResultsValueDist"),d.innerHTML=i(e),h.appendChild(d),n.appendChild(h),n},_createRouteShowResultsDetailsElement:function(){var t=document.createElement("input");return t.id=this._addUID("GProuteResultsShowDetails"),t.type="checkbox",t},_createRouteResultsDetailsElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProuteResultsDetails"),t},_addRouteResultsDetailsElement:function(t,e){var i=this,n=document.getElementById(this._addUID("GProuteResultsDetails"));if(n.childElementCount)for(;n.firstChild;)n.removeChild(n.firstChild);for(var o=0,s=0,r=0;r<t.length;r++){var a=r+1,l=t[r],c=document.createElement("div");c.className="GProuteResultsDetailsNumber",c.innerHTML=a+".",n.appendChild(c),s+=parseFloat(l.duration),o+=parseFloat(l.distance);var h=0,u=parseInt(o/1e3,10);if(u){var d=Math.round(o);d/=1e3,h=d+" km"}else h=Math.round(o)+" m";var p=document.createElement("div");p.className="GProuteResultsDetailsInstruction",p.id=this._addUID("GProuteResultsDetailsInstruction_"+a),p.title="distance : "+h+" / temps : "+e(s),p.innerHTML=l.instruction,p.addEventListener("mouseover",function(t){i.onRouteResultsDetailsMouseOver(t)}),p.addEventListener("mouseout",function(t){i.onRouteResultsDetailsMouseOut(t)}),p.addEventListener("click",function(t){"function"==typeof i.onRouteResultsDetailsClick&&i.onRouteResultsDetailsClick(t)}),n.appendChild(p)}return n},_createRoutePanelFormPointElement:function(t,e,i){var n=this,o=document.createElement("div");o.id="GProutePoint"+t,o.className=i?"GPflexInput GProuteStageFlexInput":"GPflexInput GProuteStageFlexInputHidden";var s=document.createElement("label");s.id="GProuteOriginLabel"+t,s.htmlFor="GProuteOrigin"+t,s.innerHTML=e,s.addEventListener("click",function(){var t=this.id.charAt(this.id.length-1);document.getElementById("GProuteOriginCoords"+t).value="";for(var e=1;e<8;e++)document.getElementById("GProutePoint"+e).style.display="flex";document.getElementById("GProuteForm").className="",document.getElementById("GProuteOriginPointer"+t).checked=!1,document.getElementById("GProuteOrigin"+t).className="GProuteOriginVisible",document.getElementById("GProuteOriginCoords"+t).className="GProuteOriginHidden"}),o.appendChild(s);var r=document.createElement("input");r.id="GProuteOrigin"+t,r.className="GProuteOriginVisible",r.type="text",r.placeholder="Saisir une adresse",r.addEventListener("keyup",function(t){var e=t.which||t.keyCode;if(13!==e&&10!==e){var i=this.id.charAt(this.id.length-1);document.getElementById("GProuteOrigin"+i).value.length>2?document.getElementById("GProuteAutoCompleteList"+i).style.display="block":document.getElementById("GProuteAutoCompleteList"+i).style.display="none",n.onAutoCompleteSearchText(t)}}),r.addEventListener("blur",function(){var t=this.id.charAt(this.id.length-1);document.getElementById("GProuteAutoCompleteList"+t).style.display="none"}),o.appendChild(r);var a=document.createElement("input");a.id="GProuteOriginCoords"+t,a.className="GProuteOriginHidden",a.type="text",a.disabled=!0,o.appendChild(a);var l=document.createElement("input");l.id="GProuteOriginPointer"+t,l.type="checkbox",o.appendChild(l);var c=document.createElement("label");return c.id="GProuteOriginPointerImg"+t,c.htmlFor="GProuteOriginPointer"+t,c.className="GProuteOriginPointerImg",c.title="Pointer un lieu sur la carte",c.addEventListener("click",function(t){t.preventDefault(),t.stopPropagation();var e,i=this.id.charAt(this.id.length-1);for(e=1;e<8;e++)i!=e&&(document.getElementById("GProuteOriginPointer"+e).checked=!1,"Pointer un lieu sur la carte"==document.getElementById("GProuteOriginCoords"+e).value&&(document.getElementById("GProuteOriginCoords"+e).value="",document.getElementById("GProuteOrigin"+e).className="GProuteOriginVisible",document.getElementById("GProuteOriginCoords"+e).className="GProuteOriginHidden"));if(document.getElementById("GProuteOriginPointer"+i).checked){for(document.getElementById("GProuteOriginCoords"+i).value="",e=1;e<8;e++)document.getElementById("GProutePoint"+e).style.display="flex";document.getElementById("GProuteForm").className="",document.getElementById("GProuteOriginPointer"+i).checked=!1,document.getElementById("GProuteOrigin"+i).className="GProuteOriginVisible",document.getElementById("GProuteOriginCoords"+i).className="GProuteOriginHidden"}else{for(document.getElementById("GProuteOriginCoords"+i).value="Pointer un lieu sur la carte",e=1;e<8;e++)i==e?document.getElementById("GProutePoint"+e).style.display="flex":document.getElementById("GProutePoint"+e).style.display="none";document.getElementById("GProuteForm").className="GProuteFormMini",document.getElementById("GProuteOriginPointer"+i).checked=!0,document.getElementById("GProuteOrigin"+i).className="GProuteOriginHidden",document.getElementById("GProuteOriginCoords"+i).className="GProuteOriginVisible"}n.onRouteMapPointClick(t)}),o.appendChild(c),o},_createRoutePanelFormRemoveStageElement:function(t){var e=this,i=document.createElement("div");return i.id="GProuteStageRemove"+t,i.className="GProuteStageRemove",i.title="Supprimer l'étape",1!=t&&7!=t&&i.addEventListener("click",function(t){var i=this.id.charAt(this.id.length-1);document.getElementById("GProutePoint"+i).className="GPflexInput GProuteStageFlexInputHidden",document.getElementById("GProuteOrigin"+i).value="",document.getElementById("GProuteOrigin"+i).className="GProuteOriginVisible",document.getElementById("GProuteOriginCoords"+i).value="",document.getElementById("GProuteOriginCoords"+i).className="GProuteOriginHidden",document.getElementById("GProuteStageAdd").style.display="";var n=document.getElementById("GPshowRouteExclusionsPicto").style.top;document.getElementById("GPshowRouteExclusionsPicto").style.top=(parseInt(n,10)-33).toString()+"px",e.onRouteRemovePointClick(t)}),i},_createRoutePanelFormAddStageElement:function(){var t=this,e=document.createElement("div");return e.id="GProuteStageAdd",e.title="Ajouter une étape",e.addEventListener("click",function(e){for(var i=1,n=0,o=2;o<7;o++)"GPflexInput GProuteStageFlexInputHidden"==document.getElementById("GProutePoint"+o).className?1==i&&(i=o):n++;if(i<7){document.getElementById("GProutePoint"+i).className="GPflexInput GProuteStageFlexInput";var s=document.getElementById("GPshowRouteExclusionsPicto").style.top;document.getElementById("GPshowRouteExclusionsPicto").style.top=(parseInt(s,10)+33).toString()+"px"}4==n&&(document.getElementById("GProuteStageAdd").style.display="none"),t.onRouteAddPointClick(e)}),e},_createRoutePanelFormAutoCompleteListElement:function(t){var e=this,i=document.createElement("div");return i.id="GProuteAutoCompleteList"+t,i.className="GPadvancedAutoCompleteList",i.addEventListener?i.addEventListener("click",function(i){e.onAutoCompletedResultsItemClick(i),document.getElementById("GProuteAutoCompleteList"+t).style.display="none"},!1):i.attachEvent&&i.attachEvent("onclick",function(i){e.onAutoCompletedResultsItemClick(i),document.getElementById("GProuteAutoCompleteList"+t).style.display="none"}),i},_createRouteAutoCompletedLocationElement:function(t,e,i){var n=document.getElementById("GProuteAutoCompleteList"+e),o=document.createElement("div");o.id="AutoCompletedLocation"+i,o.className="GPautoCompleteProposal",o.innerHTML=t.fullText,n.appendChild(o)},_createRoutePanelFormModeChoiceElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProuteModeChoice"),t},_createRoutePanelFormModeChoiceTransportElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GProuteTransportChoice");var n=document.createElement("span");n.className="GProuteModeLabel",n.innerHTML="Mode de transport",i.appendChild(n);for(var o=0;o<t.length;o++){var s=t[o];if("Voiture"===s){var r=document.createElement("input");r.id=this._addUID("GProuteTransportCar"),r.type="radio",r.name="GProuteTransport",r.value="Voiture",0===o&&(r.checked=!0),r.addEventListener?r.addEventListener("change",function(t){e.onRouteModeTransportChange(t)}):r.attachEvent&&r.attachEvent("onchange",function(t){e.onRouteModeTransportChange(t)}),i.appendChild(r);var a=document.createElement("label");a.className="GProuteTransportImg",a.htmlFor=this._addUID("GProuteTransportCar"),a.title="Voiture",i.appendChild(a)}if("Pieton"===s){var l=document.createElement("input");l.id=this._addUID("GProuteTransportPedestrian"),l.type="radio",l.name="GProuteTransport",l.value="Pieton",0===o&&(l.checked=!0),l.addEventListener?l.addEventListener("change",function(t){e.onRouteModeTransportChange(t)}):l.attachEvent&&l.attachEvent("onchange",function(t){e.onRouteModeTransportChange(t)}),i.appendChild(l);var c=document.createElement("label");c.className="GProuteTransportImg",c.htmlFor=this._addUID("GProuteTransportPedestrian"),c.title="Piéton",i.appendChild(c)}}return i},_createRoutePanelFormModeChoiceComputeElement:function(){var t=this,e=document.createElement("div");e.id=this._addUID("GProuteComputationChoice");var i=document.createElement("span");i.className="GProuteModeLabel",i.innerHTML="Mode de calcul",e.appendChild(i);var n=document.createElement("select");n.id=this._addUID("GProuteComputationSelect"),n.className="GPinputSelect",n.addEventListener("change",function(e){t.onRouteModeComputationChange(e)});for(var o=[{code:"fastest",label:"Plus rapide"},{code:"shortest",label:"Plus court"}],s=0;s<o.length;s++){var r=document.createElement("option");r.value=o[s].code,r.text=o[s].label,n.appendChild(r)}return e.appendChild(n),e},_createShowRouteExclusionsElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowRouteExclusions"),t.type="checkbox",t},_createShowRouteExclusionsPictoElement:function(){var t=this,e=document.createElement("label");return e.id=this._addUID("GPshowRouteExclusionsPicto"),
+e.className="GPshowMoreOptions GPshowRouteExclusionsPicto",e.htmlFor=this._addUID("GPshowRouteExclusions"),e.title="Exclusions",e.style.top="185px",e.addEventListener?e.addEventListener("click",function(e){t.onShowRouteExclusionsClick(e)}):e.attachEvent&&e.attachEvent("onclick",function(e){t.onShowRouteExclusionsClick(e)}),e},_createRoutePanelFormExclusionsElement:function(){var t=document.createElement("div");t.id=this._addUID("GProuteExclusions");var e=document.createElement("span");return e.className="GProuteExclusionsLabel",e.innerHTML="Passages autorisés",t.appendChild(e),t},_createRoutePanelFormExclusionOptionsElement:function(t){var e=this,i=document.createElement("div");i.className="GProuteExclusionsOptions";for(var n in t)if(t.hasOwnProperty(n)){var o=t[n];switch(n){case"toll":var s=document.createElement("input");s.id=this._addUID("GProuteExclusionsToll"),s.type="checkbox",s.value="Toll",s.checked=!o,s.addEventListener?s.addEventListener("change",function(t){e.onRouteExclusionsChange(t)}):s.attachEvent&&s.attachEvent("onchange",function(t){e.onRouteExclusionsChange(t)}),i.appendChild(s);var r=document.createElement("label");r.className="GProuteExclusionsOption",r.htmlFor=this._addUID("GProuteExclusionsToll"),r.innerHTML="Péages",i.appendChild(r);break;case"tunnel":var a=document.createElement("input");a.id=this._addUID("GProuteExclusionsTunnel"),a.type="checkbox",a.value="Tunnel",a.checked=!o,a.addEventListener?a.addEventListener("change",function(t){e.onRouteExclusionsChange(t)}):a.attachEvent&&a.attachEvent("onchange",function(t){e.onRouteExclusionsChange(t)}),i.appendChild(a);var l=document.createElement("label");l.className="GProuteExclusionsOption",l.htmlFor=this._addUID("GProuteExclusionsTunnel"),l.innerHTML="Tunnels",i.appendChild(l);break;case"bridge":var c=document.createElement("input");c.id=this._addUID("GProuteExclusionsBridge"),c.type="checkbox",c.value="Bridge",c.checked=!o,c.addEventListener?c.addEventListener("change",function(t){e.onRouteExclusionsChange(t)}):c.attachEvent&&c.attachEvent("onchange",function(t){e.onRouteExclusionsChange(t)}),i.appendChild(c);var h=document.createElement("label");h.className="GProuteExclusionsOption",h.htmlFor=this._addUID("GProuteExclusionsBridge"),h.innerHTML="Ponts",i.appendChild(h)}}return i},_createRouteSubmitFormElement:function(){var t=document.createElement("input");return t.id=this._addUID("GProuteSubmit"),t.className="GPinputSubmit",t.type="submit",t.value="Calculer",t},_createRouteFormResetElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GProuteReset"),e.title="Réinitialiser les paramètres",e.addEventListener("click",function(e){t.onRouteResetClick(e)}),e}};return e}(CommonUtilsSelectorID),LeafletControlsRoute=function(t,e,i,n,o,s,r){var a=t.Control.extend({includes:r,options:{position:"topleft",collapsed:!0,graphs:["Voiture","Pieton"],exclusions:{toll:!1,tunnel:!1,bridge:!1},disableReverse:!1,routeOptions:{},autocompleteOptions:{}},initialize:function(e){t.Util.setOptions(this,e),this._uid=o.generate(),this._initTransport(),this._initExclusions(),this._initComputation(),this._waitingContainer=null,this._formRouteContainer=null,this._resultsRouteContainer=null,this._isDesktop=this._detectSupport(),this._currentPoints=[],this._currentTransport=null,this._currentComputation=null,this._currentExclusions=[],this._geojsonRoute=null,this._geojsonSections=null,this._waiting=!1,this._timer=null,this._currentRouteInformations=null,this._resources={},this._noRightManagement=!1,this._checkRightsManagement()},onAdd:function(e){var i=this._container=this._initLayout(e);return t.DomEvent.disableClickPropagation(i).disableScrollPropagation(i),i},onRemove:function(){},_initTransport:function(){this._currentTransport="Voiture";var e=this.options.graphs;e&&0!==e.length||(this.options.graphs=["Voiture","Pieton"]),t.Util.isArray(e)&&e.length&&("Voiture"!==e[0]&&"Pieton"!==e[0]||(this._currentTransport=e[0]));var i=this.options.routeOptions;i.graph&&(this._currentTransport=i.graph)},_initComputation:function(){this._currentComputation="fastest";var t=this.options.routeOptions;t.routePreference&&(this._currentComputation=t.routePreference)},_initExclusions:function(){this._currentExclusions=[];var e=this.options.exclusions;if(e&&0!==Object.keys(e).length||(this.options.exclusions={toll:!1,tunnel:!1,bridge:!1}),e&&Object.keys(e).length)for(var i in e)e.hasOwnProperty(i)&&e.k&&this._currentExclusions.push(i);var n=this.options.routeOptions;t.Util.isArray(n.exclusions)&&(this._currentExclusions=n.exclusions)},_checkRightsManagement:function(){var t=null,e=[],i=null;i=this.options.routeOptions.apiKey,t=this.options.routeOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=["Voiture","Pieton"]);var o=n.check({key:i||this.options.apiKey,resources:e,services:["Itineraire"]});i=this.options.autocompleteOptions.apiKey,t=this.options.autocompleteOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=["StreetAddress","PositionOfInterest"]);var s=n.check({key:i||this.options.apiKey,resources:e,services:["AutoCompletion"]});o||s||(this._noRightManagement=!0),s&&(this._resources.AutoCompletion={},this._resources.AutoCompletion.resources=s.AutoCompletion,this._resources.AutoCompletion.key=s.key),o&&(this._resources.Itineraire={},this._resources.Itineraire.resources=o.Itineraire,this._resources.Itineraire.key=o.key)},_detectSupport:function(){var t=!0,e=window.navigator.userAgent.toLowerCase();return e.indexOf("iphone")===-1&&e.indexOf("ipod")===-1&&e.indexOf("ipad")===-1&&e.indexOf("android")===-1&&e.indexOf("mobile")===-1&&e.indexOf("blackberry")===-1&&e.indexOf("tablet")===-1&&e.indexOf("phone")===-1&&e.indexOf("touch")===-1||(t=!1),e.indexOf("msie")===-1&&e.indexOf("trident")===-1||(t=!0),t},_initLayout:function(t){var e=this._createMainContainerElement(),i=this._showRouteContainer=this._createShowRouteElement();e.appendChild(i),this.options.collapsed||(i.checked=!0);var n=this._createShowRoutePictoElement();e.appendChild(n);var o=this._createRoutePanelElement(),s=this._createRoutePanelHeaderElement();o.appendChild(s);for(var r=this._formRouteContainer=this._createRoutePanelFormElement(),a=this._createRoutePanelFormPointsElement(t),l=0;l<a.length;l++)r.appendChild(a[l]);var c=this._createRoutePanelFormModeChoiceElement();c.appendChild(this._createRoutePanelFormModeChoiceTransportElement(this.options.graphs)),c.appendChild(this._createRoutePanelFormModeChoiceComputeElement()),r.appendChild(c),r.appendChild(this._createShowRouteExclusionsElement()),r.appendChild(this._createShowRouteExclusionsPictoElement());var h=this._createRoutePanelFormExclusionsElement();h.appendChild(this._createRoutePanelFormExclusionOptionsElement(this.options.exclusions)),r.appendChild(h);var u=this._createRouteSubmitFormElement();r.appendChild(u),o.appendChild(r);var d=this._resultsRouteContainer=this._createRoutePanelResultsElement();o.appendChild(d);var p=this._waitingContainer=this._createRouteWaitingElement();return o.appendChild(p),e.appendChild(o),e},_createRoutePanelFormPointsElement:function(t){var e=[],i=1,n=new s({apiKey:this.options.apiKey||null,tag:{id:i,unique:this._uid,label:"Départ",color:"blue",display:!0},disableReverse:this.options.disableReverse,autocompleteOptions:this.options.autocompleteOptions||null});for(n.setMap(t),e.push(n.getContainer()),this._currentPoints.push(n),i=2;i<7;i++){var o=new s({apiKey:this.options.apiKey||null,tag:{id:i,unique:this._uid,label:"Etape",color:"green",display:!1,removeOption:!0},disableReverse:this.options.disableReverse,autocompleteOptions:this.options.autocompleteOptions||null});o.setMap(t),e.push(o.getContainer()),this._currentPoints.push(o)}var r=new s({apiKey:this.options.apiKey||null,tag:{id:i,unique:this._uid,label:"Arrivée",color:"red",display:!0,addOption:!0,removeOption:!1},disableReverse:this.options.disableReverse,autocompleteOptions:this.options.autocompleteOptions||null});return r.setMap(t),e.push(r.getContainer()),this._currentPoints.push(r),e},onShowRoutePanelClick:function(t){this._geojsonSections||this._clear()},onRouteModeComputationChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;i&&(this._currentComputation=i)},onRouteModeComputationChangeAndRun:function(t){this.onRouteModeComputationChange(t),this._clearRouteResultsDetails(),this._clearRouteResultsGeometry(),this._clearRouteResultsFeatureGeometry(),this.onRouteComputationSubmit({computation:this._currentComputation,transport:this._currentTransport,exclusions:this._currentExclusions})},onRouteModeTransportChange:function(t){var e=t.target.value;e&&(this._currentTransport=e)},onShowRouteExclusionsClick:function(t){},onRouteExclusionsChange:function(t){var e=t.target.value,i=t.target.checked;if(e){for(var n=!1,o=null,s=0;s<this._currentExclusions.length;s++)this._currentExclusions[s]===e&&(o=s,n=!0);!n&&i&&this._currentExclusions.push(e),n&&!i&&(this._currentExclusions[o]=null)}},onRouteComputationSubmit:function(t){var e=this._currentPoints,i=e[0].getCoordinate();e[0].dragging(!1);var n=e[e.length-1].getCoordinate();e[e.length-1].dragging(!1);for(var o=[],s=1;s<e.length-1;s++){var r=e[s].getCoordinate();e[s].dragging(!1),r&&o.push(r)}if(!this._noRightManagement){this._currentTransport=t.transport,this._currentComputation=t.computation,this._currentExclusions=t.exclusions,this._displayWaitingContainer();var a=this;this._requestRouting({startPoint:i,endPoint:n,viaPoints:o,graph:this._currentTransport,routePreference:this._currentComputation,exclusions:this._currentExclusions,geometryInInstructions:!0,distanceUnit:"m",onSuccess:function(t){t&&a._fillRouteResultsDetails(t)},onFailure:function(t){a._hideWaitingContainer(),a._clearRouteResultsDetails()}})}},onShowRouteResultsNewClick:function(t){for(var e=this._currentPoints,i=0;i<e.length;i++)e[i].dragging(!0);this._clearRouteResultsDetails(),this._clearRouteResultsGeometry(),this._clearRouteResultsFeatureGeometry()},onRouteResultsDetailsMouseOver:function(t){var e=o.index(t.target.id);this._isDesktop&&this._geojsonSections&&this._geojsonSections.eachLayer(function(t){t.feature.id===parseInt(e,10)&&t.setStyle({weight:10,color:"#0F9DE8",opacity:.5})})},onRouteResultsDetailsMouseOut:function(t){var e=o.index(t.target.id);this._isDesktop&&this._geojsonSections&&this._geojsonSections.eachLayer(function(t){t.feature.id===parseInt(e,10)&&t.setStyle({color:"#ED7F10",weight:5,opacity:.75})})},onRouteResultsDetailsClick:function(t){var e=o.index(t.target.id),i=this;if(!this._isDesktop&&this._geojsonSections){var n=t.target.title,s=t.target.innerHTML;this._geojsonSections.eachLayer(function(i){i.feature.id===parseInt(e,10)&&(t.target.innerHTML=n,i.setStyle({weight:10,color:"#0F9DE8",opacity:.5}))}),clearTimeout(1e3),setTimeout(function(){i._geojsonSections.eachLayer(function(i){i.feature.id===parseInt(e,10)&&(t.target.innerHTML=s,i.setStyle({color:"#ED7F10",weight:5,opacity:.75}))})},1e3)}},_requestRouting:function(e){if(e&&0!==Object.keys(e).length&&e.startPoint&&e.endPoint){if(this._noRightManagement)return void console.log("no rights for all service !?");if(!this._resources.Itineraire)return void console.log("no rights for this service !?");var n=this._resources.Itineraire.resources;if(n&&0!==Object.keys(n).length){var o=this._resources.Itineraire.key,s={};t.Util.extend(s,this.options.routeOptions),t.Util.extend(s,e);for(var r=!1,a=0;a<n.length;a++)n[a]===s.graph&&(r=!0);if(!r)return void console.log("no rights for this service !?");t.Util.extend(s,{apiKey:this.options.routeOptions.apiKey||this.options.apiKey||o}),i.Services.route(s)}}},_fillRouteResultsDetails:function(e){var i=e.totalDistance,n=e.totalTime,o=this._simplifiedInstructions(e.routeInstructions);o&&this._fillRouteResultsDetailsContainer(i,n,o);var s=e.routeGeometry;s&&this._fillRouteResultsDetailsGeometry(s);var r=0!==o[0].geometry.length;o&&r&&this._fillRouteResultsDetailsFeatureGeometry(o);var a=e.bbox;if(a){var l=this._map,c=t.latLngBounds([a.bottom,a.left],[a.top,a.right]);l.fitBounds(c,{padding:[1,1]})}this._currentRouteInformations=e,this._formRouteContainer.className="GProuteComponentHidden",this._hideWaitingContainer(),this._resultsRouteContainer.className=""},_fillRouteResultsDetailsContainer:function(t,e,i){this._resultsRouteValuesContainer=this._addRouteResultsValuesElement(t,e,this._convertSecondsToTime),this._resultsRouteDetailsContainer=this._addRouteResultsDetailsElement(i,this._convertSecondsToTime)},_fillRouteResultsDetailsGeometry:function(e){this._clearRouteResultsGeometry();var i=this._map,n={color:"#ff7800",weight:5,opacity:.65};this._geojsonRoute=t.geoJson(e,{style:n}).addTo(i)},_fillRouteResultsDetailsFeatureGeometry:function(e){function i(e){var i=e.target;h._geojsonSections.resetStyle(i);var n=t.DomUtil.get("GProuteResultsDetailsInstruction_"+i.feature.id+"-"+h._uid);t.DomUtil.removeClass(n,"GProuteResultsDetailsHighlight")}function n(e){var i=e.target;i.setStyle({weight:10,color:"#0F9DE8",opacity:.5});var n=t.DomUtil.get("GProuteResultsDetailsInstruction_"+i.feature.id+"-"+h._uid);t.DomUtil.addClass(n,"GProuteResultsDetailsHighlight")}this._clearRouteResultsFeatureGeometry();for(var o=this._map,s={color:"#ED7F10",weight:5,opacity:.75},r={type:"FeatureCollection",features:[]},a=0;a<e.length;a++){var l=e[a],c=a+1;r.features.push({id:c,type:"Feature",geometry:l.geometry,properties:{popupContent:"("+c+") distance : "+this._convertDistance(l.distance)+" / temps : "+this._convertSecondsToTime(l.duration)}})}var h=this;this._geojsonSections=t.geoJson(r,{style:s,onEachFeature:function(t,e){e.on({mouseover:n,mouseout:i}),e.bindPopup(t.properties.popupContent)}}).addTo(o)},_clear:function(){this._currentTransport=null,this._currentExclusions=[],this._currentComputation=null,this._clearRouteResultsDetails(),this._clearRouteResultsGeometry(),this._clearRouteResultsFeatureGeometry();for(var t=0;t<this._currentPoints.length;t++)this._currentPoints[t].clear()},_clearRouteResultsDetails:function(){if(this._currentRouteInformations=null,this._resultsRouteDetailsContainer){var t=this._resultsRouteDetailsContainer;if(t.childElementCount)for(;t.firstChild;)t.removeChild(t.firstChild)}if(this._resultsRouteValuesContainer){var e=this._resultsRouteValuesContainer;if(e.childElementCount)for(;e.firstChild;)e.removeChild(e.firstChild)}},_clearRouteResultsGeometry:function(){var t=this._map;null!=this._geojsonRoute&&(t.removeLayer(this._geojsonRoute),this._geojsonRoute=null)},_clearRouteResultsFeatureGeometry:function(){var t=this._map;null!=this._geojsonSections&&(t.removeLayer(this._geojsonSections),this._geojsonSections=null)},_displayWaitingContainer:function(){this._waitingContainer.className="GProuteCalcWaitingContainerVisible",this._waiting=!0,this._timer&&(clearTimeout(this._timer),this._timer=null);var t=this;this._timer=setTimeout(function(){t._waiting===!0?t._hideWaitingContainer():t._timer&&clearTimeout(t._timer)},16e3)},_hideWaitingContainer:function(){this._waiting&&(this._waitingContainer.className="GProuteCalcWaitingContainerHidden",this._waiting=!1,clearTimeout(this._timer),this._timer=null)},_simplifiedInstructions:function(t){var e=[],i=t[0];1===t.length&&e.push(i);for(var n=1;n<t.length;n++){var o=t[n];if(o.instruction===i.instruction){i.distance=(parseFloat(o.distance)+parseFloat(i.distance)).toString(),i.duration=(parseFloat(o.duration)+parseFloat(i.duration)).toString();for(var s=1;s<o.geometry.coordinates.length;s++)i.geometry.coordinates.push(o.geometry.coordinates[s]);n===t.length-1&&(e.push(i),i=null)}else e.push(i),i=o,n===t.length-1&&(e.push(o),i=null)}return e},_convertSecondsToTime:function(t){var e="";t=Math.round(t);var i=Math.floor(t/3600);i||(i="00");var n=t%3600,o=Math.floor(n/60);o||(o="00");var s=n%60,r=Math.ceil(s);return r||(r="00"),e=i+"h "+o+"m "+r+"s"},_convertDistance:function(t){var e="",i=parseInt(t/1e3,10);return e=i?i+" km":parseInt(t,10)+" m"}});return a}(leaflet,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,LeafletControlsLocationSelector,CommonControlsRouteDOM),CommonControlsSearchEngineDOM=function(t){var e={_addUID:function(t){return t+"-"+this._uid},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPsearchEngine"),t.className="GPwidget",t},_createShowSearchEngineElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowSearchEngine"),t.type="checkbox",t},_createShowSearchEnginePictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowSearchEnginePicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowSearchEngine"),e.title="Afficher/masquer la recherche par lieux",e.addEventListener("click",function(){document.getElementById(t._addUID("GPautoCompleteList")).style.display="none",document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none";var e=document.getElementById(t._addUID("GPshowAdvancedSearch"));e&&(e.style.display=null,document.getElementById(t._addUID("GPadvancedSearchPanel")).style.display="none");var i="#GPsearchInput-"+t._uid;document.querySelector(i+" input").disabled=!1,t.onShowSearchEngineClick()});var i=document.createElement("span");return i.id=this._addUID("GPshowSearchEngineOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createSearchInputElement:function(){var t=this,e=document.createElement("form");e.id=this._addUID("GPsearchInput"),e.addEventListener("submit",function(e){return e.preventDefault(),document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="block",document.getElementById(t._addUID("GPautoCompleteList")).style.display="none",t.onGeocodingSearchSubmit(e),!1});var i=document.createElement("input");i.id=this._addUID("GPsearchInputText"),i.type="text",i.placeholder="Rechercher un lieu, une adresse",i.autocomplete="off",i.addEventListener("keyup",function(e){var n=e.which||e.keyCode;13!==n&&10!==n&&38!==n&&40!==n&&(document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",i.value.length>2?document.getElementById(t._addUID("GPautoCompleteList")).style.display="block":document.getElementById(t._addUID("GPautoCompleteList")).style.display="none",t.onAutoCompleteSearchText(e))}),i.addEventListener("keydown",function(t){return}),e.appendChild(i);var n=document.createElement("div");return n.id=this._addUID("GPsearchInputReset"),n.addEventListener("click",function(){document.getElementById(t._addUID("GPsearchInputText")).value="",document.getElementById(t._addUID("GPautoCompleteList")).style.display="none",document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",t.onSearchResetClick()}),e.appendChild(n),e},_createShowAdvancedSearchElement:function(){var t=this,e=document.createElement("div");e.id=this._addUID("GPshowAdvancedSearch"),e.className="GPshowAdvancedToolPicto",e.title="Ouvrir la recherche avancée",e.addEventListener("click",function(){var e="#GPsearchInput-"+t._uid;document.querySelector(e+" input").disabled=!0,document.getElementById(t._addUID("GPautoCompleteList")).style.display="none",document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",document.getElementById(t._addUID("GPshowAdvancedSearch")).style.display="none",document.getElementById(t._addUID("GPadvancedSearchPanel")).style.display="inline-block"});var i=document.createElement("span");return i.id=this._addUID("GPshowAdvancedSearchOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createAdvancedSearchPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPadvancedSearchPanel"),t.className="GPpanel",t.style.display="none",t},_createGeocodeResultsElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPgeocodeResultsList"),t.className="GPpanel",t.style.display="none",t.appendChild(this._createGeocodeResultsHeaderElement()),t},_createAutoCompleteElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPautoCompleteList"),t.className="GPautoCompleteList",t.style.display="none",t},_createAutoCompleteListElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPautocompleteResults"),e.addEventListener?e.addEventListener("click",function(e){t.onAutoCompletedResultsItemClick(e),document.getElementById(t._addUID("GPautoCompleteList")).style.display="none"},!1):e.attachEvent&&e.attachEvent("onclick",function(e){t.onAutoCompletedResultsItemClick(e),document.getElementById(t._addUID("GPautoCompleteList")).style.display="none"}),e},_createAutoCompletedLocationElement:function(t,e){var i=document.getElementById(this._addUID("GPautocompleteResults")),n=document.createElement("div");n.id=this._addUID("AutoCompletedLocation_"+e),n.className="GPautoCompleteProposal",n.innerHTML=t.fullText,n.addEventListener?n.addEventListener("click",function(t){i.click(t)},!1):n.attachEvent&&n.attachEvent("onclick",function(t){i.click(t)}),i.appendChild(n)},_createAdvancedSearchPanelHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Recherche avancée",e.appendChild(i);var n=document.createElement("div");return n.id=this._addUID("GPadvancedSearchClose"),n.className="GPpanelClose",n.title="Fermer la recherche avancée",n.addEventListener?n.addEventListener("click",function(){var e="#GPsearchInput-"+t._uid;document.querySelector(e+" input").disabled=!1,document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",document.getElementById(t._addUID("GPshowAdvancedSearch")).style.display="inline-block",document.getElementById(t._addUID("GPadvancedSearchPanel")).style.display="none"},!1):n.attachEvent&&n.attachEvent("onclick",function(){var e="#GPsearchInput-"+t._uid;document.querySelector(e+" input").disabled=!1,document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",document.getElementById(t._addUID("GPshowAdvancedSearch")).style.display="inline-block",document.getElementById(t._addUID("GPadvancedSearchPanel")).style.display="none"}),e.appendChild(n),e},_createAdvancedSearchPanelFormElement:function(t){var e=this,i=document.createElement("form");i.id=this._addUID("GPadvancedSearchForm"),i.addEventListener("submit",function(t){t.preventDefault();for(var i=[],n="#GPadvancedSearchFilters-"+e._uid,o=document.querySelectorAll(n+" > div > div > input"),s=0;s<o.length;s++){var r=o[s];i.push({key:r.name,value:r.value})}return e.onGeocodingAdvancedSearchSubmit(t,i),document.getElementById(e._addUID("GPgeocodeResultsList")).style.display="block",!1});var n=document.createElement("div");n.className="GPflexInput";var o=document.createElement("label");o.className="GPadvancedSearchCodeLabel",o.innerHTML="Recherche par",n.appendChild(o);var s=this._createAdvancedSearchFormCodeElement(t);return n.appendChild(s),i.appendChild(n),i},_createAdvancedSearchFormCodeElement:function(t){var e=this,i=document.createElement("select");i.id=this._addUID("GPadvancedSearchCode"),i.className="GPadvancedSearchCode",i.addEventListener("change",function(t){e.onGeocodingAdvancedSearchCodeChange(t)},!1),t||(t=[{id:"PositionOfInterest",title:"Lieux/toponymes"},{id:"StreetAddress",title:"Adresses"},{id:"CadastralParcel",title:"Parcelles cadastrales"},{id:"Administratif",title:"Administratif"}]);for(var n=0;n<t.length;n++){var o=document.createElement("option");o.value=t[n].id,o.text=t[n].title,i.appendChild(o)}return i},_createAdvancedSearchFormInputElement:function(){var t=document.createElement("input");return t.type="submit",t.id=this._addUID("GPadvancedSearchSubmit"),t.className="GPinputSubmit",t.value="Chercher",t},_createAdvancedSearchFormFiltersElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPadvancedSearchFilters"),t},_createAdvancedSearchFiltersTableElement:function(t,e){var i=document.createElement("div");return i.id=this._addUID(t),e||(i.style.display="none"),i},_createAdvancedSearchFiltersAttributElement:function(t){var e=null,i=t.name,n=t.title,o=t.description,s=t.code,r=t.value,a=document.createElement("div");a.className="GPflexInput";var l=document.createElement("label");l.className="GPadvancedSearchFilterLabel",l.htmlFor=i,l.title=o||n,l.innerHTML=n,a.appendChild(l);var c=document.createElement("input");return c.id=i,c.className="GPadvancedSearchFilterInput",c.type="text",c.name=i,r&&(c.value=r),a.appendChild(c),e=document.getElementById(this._addUID(s)),e?e.appendChild(a):e=a,e},_createGeocodeResultsHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Résultats de la recherche",e.appendChild(i);var n=document.createElement("div");return n.id=this._addUID("GPgeocodeResultsClose"),n.className="GPpanelClose",n.title="Fermer la fenêtre de résultats",n.addEventListener?n.addEventListener("click",function(){document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none"},!1):n.attachEvent&&n.attachEvent("onclick",function(){document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none"}),e.appendChild(n),e},_createGeocodeResultsListElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPgeocodeResults"),e.addEventListener?e.addEventListener("click",function(e){e.ctrlKey||(document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none"),t.onGeocodedResultsItemClick(e)},!1):e.attachEvent&&e.attachEvent("onclick",function(e){e.ctrlKey||(document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none"),t.onGeocodedResultsItemClick(e)}),e},_createGeocodedLocationElement:function(t,e){var i=document.getElementById(this._addUID("GPgeocodeResults")),n=document.createElement("div");if(n.id=this._addUID("GeocodedLocation_"+e),n.className="GPautoCompleteProposal","string"==typeof t)n.innerHTML=t;else{var o=t.placeAttributes;o.freeform?n.innerHTML=o.freeform:o.postalCode?n.innerHTML=o.postalCode+" "+o.commune:o.cadastralParcel?n.innerHTML=o.cadastralParcel:n.innerHTML="..."}i.appendChild(n)}};return e}(CommonUtilsSelectorID),CommonControlsSearchEngineUtils=function(){var t={advancedSearchFiltersByDefault:{PositionOfInterest:[{name:"importance",title:"Importance"},{name:"nature",title:"Nature"},{name:"territory",title:"Territoire"},{name:"insee",title:"Code INSEE"},{name:"municipality",title:"Ville"},{name:"department",title:"Département"}],StreetAddress:[{name:"territory",title:"Territoire"},{name:"insee",title:"Code INSEE"},{name:"municipality",title:"Ville"},{name:"department",title:"Département"}],CadastralParcel:[{name:"department",title:"Département",description:"Numéro du département (ex: 01, 94)"},{name:"commune",title:"Code commune (INSEE)",description:"Code commune (INSEE) : 3 chiffres (ex: 067)"},{name:"absorbedCity",title:"Commune absorbée",description:"Commune absorbée : 3 chiffres (ex: 000, 001)"},{name:"section",title:"Section",description:"Section : 2 caractères (ex: AA, 0D)"},{name:"number",title:"Numéro",description:"Numéro de la parcelle : 4 chiffres (ex: 0041, 0250)"}],Administratif:[{name:"prefecture",title:"Préfecture"},{name:"inseeRegion",title:"Code région (INSEE)"},{name:"inseeDepartment",title:"Code département (INSEE)"},{name:"municipality",title:"Ville"}]},zoomToResultsByDefault:function(t){var e=15,i=t.service,n=t.fields,o=t.type,s={1:11,2:12,3:13,4:14,5:15,6:16,7:17,8:17};return"SuggestedLocation"===i&&"PositionOfInterest"===o&&(e=s[n.classification]),"DirectGeocodedLocation"===i&&"PositionOfInterest"===o&&(e=s[n.importance]||14),"StreetAddress"===o&&(e=17),"CadastralParcel"===o&&(e=17),"Administratif"===o&&(e=12),e}};return t}(),LeafletControlsSearchEngine=function(t,e,i,n,o,s,r){var a=t.Control.extend({includes:s,options:{position:"topleft",collapsed:!0,displayInfo:!0,zoomTo:"",resources:[],displayAdvancedSearch:!0,advancedSearch:{},geocodeOptions:{},autocompleteOptions:{}},initialize:function(e){t.Util.setOptions(this,e),this._uid=o.generate(),this._inputContainer=null,this._suggestedContainer=null,this._suggestedLocations=[],this._geocodedContainer=null,this._geocodedLocations=[],this._filterContainer=null,this._currentGeocodingCode=null,this._currentGeocodingLocation=null,this._advancedSearchFilters={},this._advancedSearchCodes=[],this._marker=null,this._servicesRightManagement={},this._noRightManagement=!1,this._checkRightsManagement()},onAdd:function(){this._initAdvancedSearchCodes(),this._initAdvancedSearchFilters();var e=this._initLayout();return t.DomEvent.disableClickPropagation(e).disableScrollPropagation(e),e},onRemove:function(){},_checkRightsManagement:function(){this.options.resources&&0!==this.options.resources.length||(this.options.resources=["StreetAddress","PositionOfInterest"]);var t=null,e=[],i=null;i=this.options.geocodeOptions.apiKey,t=this.options.geocodeOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=this.options.resources||["StreetAddress","PositionOfInterest"]);var o=n.check({key:i||this.options.apiKey,resources:e,services:["Geocode"]});i=this.options.autocompleteOptions.apiKey,t=this.options.autocompleteOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=this.options.resources||["StreetAddress","PositionOfInterest"]);var s=n.check({key:i||this.options.apiKey,resources:e,services:["AutoCompletion"]});if(o||s||(this._noRightManagement=!0),s&&(this._servicesRightManagement.AutoCompletion={},this._servicesRightManagement.AutoCompletion.resources=s.AutoCompletion,this._servicesRightManagement.AutoCompletion.key=s.key),o&&(this._servicesRightManagement.Geocode={},this._servicesRightManagement.Geocode.resources=o.Geocode,this._servicesRightManagement.Geocode.key=o.key),!this.options.advancedSearch||0===Object.keys(this.options.advancedSearch).length)for(var r=this._servicesRightManagement.Geocode.resources,a=0;a<r.length;a++){var l=r[a];this.options.advancedSearch[l]=[]}},_initLayout:function(){var t=this._createMainContainerElement(),e=this._createShowSearchEngineElement();t.appendChild(e),this.options.collapsed||(e.checked="true");var i=this._createShowSearchEnginePictoElement();t.appendChild(i);var n=this._createSearchInputElement();if(t.appendChild(n),this.options.displayAdvancedSearch){var o=this._createShowAdvancedSearchElement();t.appendChild(o);var s=this._createAdvancedSearchPanelElement(),r=this._createAdvancedSearchPanelHeaderElement(),a=this._createAdvancedSearchPanelFormElement(this._advancedSearchCodes),l=this._filterContainer=this._createAdvancedSearchFormFiltersElement();this._setFilter(this._advancedSearchCodes[0].id);var c=this._createAdvancedSearchFormInputElement();a.appendChild(l),a.appendChild(c),s.appendChild(r),s.appendChild(a),t.appendChild(s)}var h=this._createAutoCompleteElement(),u=this._suggestedContainer=this._createAutoCompleteListElement();h.appendChild(u),t.appendChild(h);var d=this._createGeocodeResultsElement(),p=this._geocodedContainer=this._createGeocodeResultsListElement();return d.appendChild(p),t.appendChild(d),t},_initAdvancedSearchCodes:function(){for(var t=[{id:"PositionOfInterest",title:"Lieux/toponymes"},{id:"StreetAddress",title:"Adresses"},{id:"CadastralParcel",title:"Parcelles cadastrales"},{id:"Administratif",title:"Administratif"}],e=Object.keys(this.options.advancedSearch),i=0;i<e.length;i++)for(var n=e[i],o=0;o<t.length;o++)t[o].id===n&&this._advancedSearchCodes.push(t[o]);0===this._advancedSearchCodes.length&&(this._advancedSearchCodes=t)},_initAdvancedSearchFilters:function(){var e={PositionOfInterest:[{name:"city",title:"Ville",filter:!1,sep:!0},{name:"importance",title:"Importance",filter:!0},{name:"nature",title:"Nature",filter:!0},{name:"territory",title:"Territoire",filter:!0},{name:"insee",title:"Code commune (INSEE)",filter:!0},{name:"department",title:"Département",filter:!0}],StreetAddress:[{name:"number",title:"Numéro",filter:!1,sep:!0},{name:"street",title:"Rue",filter:!1,sep:!0},{name:"postalCode",
+title:"Code Postal",filter:!1,sep:!0},{name:"city",title:"Ville",filter:!1,sep:!0},{name:"territory",title:"Territoire",filter:!0},{name:"insee",title:"Code commune (INSEE)",filter:!0},{name:"department",title:"Département",filter:!0}],CadastralParcel:[{name:"department",title:"Département",filter:!1,sep:!1,value:"__"},{name:"commune",title:"Commune",filter:!1,sep:!1,value:"___"},{name:"absorbedCity",title:"Commune absorbée",filter:!1,sep:!1,value:"___"},{name:"section",title:"Section",filter:!1,sep:!1,value:"__"},{name:"number",title:"Numéro",filter:!1,sep:!1,value:"____"}],Administratif:[{name:"prefecture",title:"Préfecture",filter:!0},{name:"inseeRegion",title:"Code région (INSEE)",filter:!0},{name:"inseeDepartment",title:"Code département (INSEE)",filter:!0},{name:"city",title:"Ville",filter:!1,sep:!0}]},i=this.options.advancedSearch;for(var n in i)if(i.hasOwnProperty(n)){if(!i[n]||0===i[n].length){i[n]=e[n];continue}for(var o=i[n],s=0;s<o.length;s++){var r=o[s];r.hasOwnProperty("filter")||(r.filter="municipality"!==r.name)}}t.Util.extend(this._advancedSearchFilters,e,i)},_setFilter:function(t){for(var e=this._filterContainer,i=!1,n=0;n<this._advancedSearchCodes.length;n++)if(this._advancedSearchCodes[n].id===t){i=!0;break}if(i){for(this._currentGeocodingCode=t;e.firstChild;)e.removeChild(e.firstChild);var o=this._advancedSearchFilters[t];if(o&&0!==o.length){for(var s=this._createAdvancedSearchFiltersTableElement(t,!0),r=0;r<o.length;r++){var a=this._createAdvancedSearchFiltersAttributElement(o[r]);s.appendChild(a)}return e.appendChild(s),e}}else for(;e.firstChild;)e.removeChild(e.firstChild)},_requestAutoComplete:function(e){if(e&&0!==Object.keys(e).length&&e.text){if(this._noRightManagement)return void console.log("no rights for all service !?");if(!this._servicesRightManagement.AutoCompletion)return void console.log("no rights for this service !?");var n={};t.Util.extend(n,this.options.autocompleteOptions),t.Util.extend(n,e);var o=this._servicesRightManagement.AutoCompletion.resources;if(o&&0!==Object.keys(o).length){o&&t.Util.isArray(o)&&!n.filterOptions&&(n.filterOptions||(n.filterOptions={}),n.filterOptions.type=o);var s=this._servicesRightManagement.AutoCompletion.key;t.Util.extend(n,{apiKey:n.apiKey||this.options.apiKey||s}),i.Services.autoComplete(n)}}},_fillAutoCompletedLocationListContainer:function(t){if(t&&0!==t.length){var e=this._suggestedContainer;if(e.childElementCount)for(;e.firstChild;)e.removeChild(e.firstChild);for(var i=0;i<t.length;i++)this._createAutoCompletedLocationElement(t[i],i);this._suggestedLocations=t}},_requestGeocoding:function(e){if(e&&0!==Object.keys(e).length&&e.location){if(this._noRightManagement)return void console.log("no rights for all service !?");if(!this._servicesRightManagement.Geocode)return void console.log("no rights for this service !?");var n={};t.Util.extend(n,this.options.geocodeOptions),t.Util.extend(n,e),n.hasOwnProperty("returnFreeForm")||t.Util.extend(n,{returnFreeForm:!1});var o=this._servicesRightManagement.Geocode.resources;if(o&&0!==Object.keys(o).length){o&&t.Util.isArray(o)&&!n.filterOptions&&(n.filterOptions||(n.filterOptions={}),n.filterOptions.type=o);var s=this._servicesRightManagement.Geocode.key;t.Util.extend(n,{apiKey:n.apiKey||this.options.apiKey||s}),i.Services.geocode(n)}}},_fillGeocodedLocationListContainer:function(t){if(!t||0===t.length)return void this._clearGeocodedLocation();var e=this._geocodedContainer;if(e.childElementCount)for(;e.firstChild;)e.removeChild(e.firstChild);for(var i=0;i<t.length;i++)this._createGeocodedLocationElement(t[i],i);this._geocodedLocations=t},_setLabel:function(e){var i=t.DomUtil.get("GPsearchInputText-"+this._uid);i.value=e||""},_setPosition:function(e,i){var n=this._map;n.setZoomAround(t.latLng(e.x,e.y),i,!0),n.panTo(t.latLng(e.x,e.y))},_getZoom:function(t){var e=this._map,i=this.options.zoomTo,n=null;if("function"==typeof i&&(n=i.call(this,t)),"number"==typeof i&&(n=i),"string"==typeof i)if("auto"===i)n=r.zoomToResultsByDefault(t);else{var o=parseInt(i,10);isNaN(o)||(n=o)}Number.isInteger=Number.isInteger||function(t){return"number"==typeof t&&isFinite(t)&&Math.floor(t)===t},n&&""!==n&&Number.isInteger(n)||(n=e.getZoom());var s=e.getMinZoom(),a=e.getMaxZoom();return n<s&&(n=s),n>a&&(n=a),n},_setMarker:function(e,i,n){var o=this._map;if(null!=this._marker&&(o.removeLayer(this._marker),this._marker=null),e){var s={clickable:!0,zIndexOffset:1e3};if(this._marker=t.marker(t.latLng(e.x,e.y),s),this._marker.addTo(o),n){var r=null;if("string"!=typeof i){var a=[];if("DirectGeocodedLocation"===i.service)if(i.fields.freeform)r=i.fields.freeform;else{for(var l=this._advancedSearchFilters[i.type],c=0;c<l.length;c++){var h=l[c].name,u=i.fields[h];"string"!=typeof u&&"number"!=typeof u||a.push(u)}r=a.join(" - ")}else"SuggestedLocation"===i.service?i.fields.fullText?r=i.fields.fullText:(a.push(i.fields.street||""),a.push(i.fields.postalCode||""),a.push(i.fields.commune||""),"PositionOfInterest"===i.type&&(a.push(i.fields.poi||""),a.push(i.fields.kind||"")),r=a.join(" - ")):r="sans informations."}else r=i;this._marker.bindPopup(r)}}},_clearResults:function(){this._currentGeocodingLocation=null,this._clearSuggestedLocation(),this._clearGeocodedLocation(),this._setMarker()},_clearSuggestedLocation:function(){if(this._suggestedLocations=[],this._suggestedContainer)for(;this._suggestedContainer.firstChild;)this._suggestedContainer.removeChild(this._suggestedContainer.firstChild)},_clearGeocodedLocation:function(){if(this._geocodedLocations=[],this._geocodedContainer)for(;this._geocodedContainer.firstChild;)this._geocodedContainer.removeChild(this._geocodedContainer.firstChild)},onShowSearchEngineClick:function(){},onSearchResetClick:function(){this._clearResults()},onAutoCompleteSearchText:function(t){var e=t.target.value;if(e&&!(this._noRightManagement||(this._currentGeocodingLocation=e,e.length<3))){var i=this;this._requestAutoComplete({text:e,onSuccess:function(t){if(t){var e=t.suggestedLocations;i._fillAutoCompletedLocationListContainer(e)}},onFailure:function(t){i._clearSuggestedLocation()}})}},onAutoCompletedResultsItemClick:function(t){var e=o.index(t.target.id),i=t.target.innerHTML;if(e){var n={x:this._suggestedLocations[e].position.y,y:this._suggestedLocations[e].position.x},s={service:"SuggestedLocation",type:this._suggestedLocations[e].type,fields:this._suggestedLocations[e]},r=this._getZoom(s);this._setLabel(i),this._setPosition(n,r),this._setMarker(n,s,this.options.displayInfo)}},onGeocodingSearchSubmit:function(t){var e=t.target[0].value;if(e&&!this._noRightManagement){this._currentGeocodingLocation=e;var i=this;this._requestGeocoding({location:e,onSuccess:function(t){if(t){var e=t.locations;i._fillGeocodedLocationListContainer(e)}},onFailure:function(t){i._clearGeocodedLocation()}})}},onGeocodedResultsItemClick:function(t){var e=o.index(t.target.id),i=t.target.innerHTML;if(e){var n=this._geocodedLocations[e].position,s={service:"DirectGeocodedLocation",type:this._geocodedLocations[e].type,fields:this._geocodedLocations[e].placeAttributes},r=this._getZoom(s);this._setLabel(i),this._setPosition(n,r),this._setMarker(n,s,this.options.displayInfo)}},onGeocodingAdvancedSearchCodeChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;i&&this._setFilter(i)},onGeocodingAdvancedSearchSubmit:function(t,e){if(e&&0!==e.length){var i={};i.type=[this._currentGeocodingCode];var n=this._currentGeocodingLocation||"";"CadastralParcel"===this._currentGeocodingCode&&(n="");for(var o=0;o<e.length;o++){var s=e[o];if(s.value)for(var r=this._advancedSearchFilters[this._currentGeocodingCode],a=0;a<r.length;a++){var l=r[a];if(l.name===s.key)if(l.filter)i[s.key]=s.value;else if(l.value){var c=s.value.length,h=l.value.length;if(h!==c){for(var u=h-c,d=l.value.charAt(0);d.length<u;)d+=d;var p=d.slice(0,u);s.value=s.value+p}n+=s.value}else"string"==typeof n&&(n={}),n[s.key]=s.value}}var m=this;this._requestGeocoding({location:n,filterOptions:i,onSuccess:function(t){if(t){var e=t.locations;m._fillGeocodedLocationListContainer(e)}},onFailure:function(t){m._clearGeocodedLocation()}})}}});return a}(leaflet,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,CommonControlsSearchEngineDOM,CommonControlsSearchEngineUtils),CommonControlsElevationPathDOM=function(){var t={_addUID:function(t){return t+"-"+this._uid},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPelevationPath"),t.className="GPwidget",t},_createShowElevationPathElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowElevationPath"),t.type="checkbox",t},_createShowElevationPathPictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowElevationPathPicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowElevationPath"),e.title="Calculer un profil",e.addEventListener?e.addEventListener("click",function(e){t.onShowElevationPathClick(e)}):e.attachEvent&&e.attachEvent("onclick",function(e){t.onShowElevationPathClick(e)});var i=document.createElement("span");return i.id=this._addUID("GPshowElevationPathOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createElevationPathPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPelevationPathPanel"),t.className="GPpanel",t},_createElevationPathPanelHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Profil Altimétrique",e.appendChild(i);var n=document.createElement("div");n.id=this._addUID("GPelevationPathPanelReduce"),n.className="GPpanelReduce",n.title="Masquer le panneau",n.addEventListener?n.addEventListener("click",function(){"function"==typeof t.onReduceElevationPathPanelClick&&(document.getElementById(t._addUID("GPshowElevationPath")).checked=!1,t.onReduceElevationPathPanelClick())},!1):n.attachEvent&&n.attachEvent("onclick",function(){"function"==typeof t.onReduceElevationPathPanelClick&&(document.getElementById(t._addUID("GPshowElevationPath")).checked=!1,t.onReduceElevationPathPanelClick())}),e.appendChild(n);var o=document.createElement("div");return o.id=this._addUID("GPelevationPathPanelClose"),o.className="GPpanelClose",o.title="Fermer le panneau",o.addEventListener?o.addEventListener("click",function(){document.getElementById(t._addUID("GPshowElevationPathPicto")).click()},!1):o.attachEvent&&o.attachEvent("onclick",function(){document.getElementById(t._addUID("GPshowElevationPathPicto")).click()}),e.appendChild(o),e},_createElevationPathPanelProfilElement:function(){var t=document.createElement("div");return t.id="GPelevationPathProfil",t},_createElevationPathWaitingElement:function(){var t=document.createElement("div");t.id=this._addUID("GPelevationPathCalcWaitingContainer"),t.className="GPelevationPathCalcWaitingContainerHidden";var e=document.createElement("p");return e.className="GPelevationPathCalcWaiting",e.innerHTML="Calcul en cours...",t.appendChild(e),t}};return t}(),LeafletControlsElevationPath=function(t,e,i,n,o,s,r,a,l,c){var h=t.Control.extend({includes:c,options:{position:"topleft",active:!1,elevationPathOptions:{},stylesOptions:{},displayProfileOptions:{apply:null,target:null}},initialize:function(e){t.Util.setOptions(this,e),this._uid=s.generate(),this._initDisplayProfileOptions(),this._showContainer=null,this._pictoContainer=null,this._panelContainer=null,this._profilContainer=null,this._waitingContainer=null,this._reducePanel=!1,this._featuresLayer=null,this._lastIdLayer=0,this._currentIdLayer=0,this._currentFeature=null,this._profile=null,this._marker=null,this._geometry=null,this._noRightManagement=!1,this._checkRightsManagement()},onAdd:function(e){var i=this._container=this._initLayout();return e&&this.options.active&&(null===this._profile&&(this._panelContainer.style.display="none"),this._activateMapInteraction(e)),t.DomEvent.disableClickPropagation(i).disableScrollPropagation(i),i},onRemove:function(){},_checkRightsManagement:function(){var t=o.check({key:this.options.apiKey,resources:["SERVICE_CALCUL_ALTIMETRIQUE_RSC"],services:["ElevationLine"]});t||(this._noRightManagement=!0),this.options.apiKey||(this.options.apiKey=t.key)},_initDisplayProfileOptions:function(){var t=this.options.displayProfileOptions||{};"undefined"==typeof t||0===Object.keys(t).length?this.options.displayProfileOptions={apply:h.DISPLAY_PROFILE_BY_DEFAULT,target:null}:this.options.displayProfileOptions={};var e=t.apply||this.options.displayProfileOptions.apply;this.options.displayProfileOptions.apply="function"==typeof e?e:h.DISPLAY_PROFILE_BY_DEFAULT;var i=t.target||this.options.displayProfileOptions.target;this.options.displayProfileOptions.target="undefined"==typeof i?null:i},_initLayout:function(){var t=this._createMainContainerElement(),e=this._showContainer=this._createShowElevationPathElement();t.appendChild(e),this.options.active&&(this._showContainer.checked=!0);var i=this._pictoContainer=this._createShowElevationPathPictoElement();t.appendChild(i);var n=this._panelContainer=this._createElevationPathPanelElement(),o=this._createElevationPathPanelHeaderElement();n.appendChild(o);var s=this._profilContainer=this._createElevationPathPanelProfilElement();n.appendChild(s);var r=this._waitingContainer=this._createElevationPathWaitingElement();return n.appendChild(r),t.appendChild(n),t},onShowElevationPathClick:function(t){var e=this._map;this._reducePanel?null!==this._profile&&(null===this.options.displayProfileOptions.target&&(this._pictoContainer.style.display="none"),this._panelContainer.style.display="block"):this._showContainer.checked?(this._pictoContainer.style.display="block",this._panelContainer.style.display="none",this._removeMapInteraction(e),this._clear()):(null===this._profile&&(this._panelContainer.style.display="none"),this._activateMapInteraction(e)),this._reducePanel=!1},onReduceElevationPathPanelClick:function(){this._reducePanel=!0,this._pictoContainer.style.display="block",this._panelContainer.style.display="none"},_activateMapInteraction:function(e){if(null===this._featuresLayer){this._featuresLayer=new t.FeatureGroup,e.addLayer(this._featuresLayer);var i=this;e.on("draw:created",function(e){i._currentIdLayer=t.Util.stamp(e.layer),i._getFeatureGeometry(e.layer),i._addFeatureLayer(e.layer)}),e.on("draw:drawstart",function(){i._removeFeatureLayer(i._lastIdLayer),i._lastIdLayer=i._currentIdLayer}),e.on("draw:drawstop",function(){"undefined"==typeof i.options.elevationPathOptions.onSuccess&&null===i.options.displayProfileOptions.target&&(i._pictoContainer.style.display="none",i._panelContainer.style.display="block"),i._altiRequest()})}this._activatePolyLineInteraction(e)},_removeMapInteraction:function(t){t&&(null!==this._featuresLayer&&(t.off("draw:created"),t.off("draw:drawstart"),t.off("draw:drawstop"),t.removeLayer(this._featuresLayer),this._featuresLayer=null),this._lastIdLayer=this._currentIdLayer=0,this._currentFeature&&this._currentFeature.disable())},_activatePolyLineInteraction:function(e){this._currentFeature&&this._currentFeature.disable();var i=this.options.stylesOptions||{},n=0!==Object.keys(i).length?i:{stroke:!0,color:"#C77A04",weight:4,opacity:.5,fill:!1};this._currentFeature=new t.Draw.Polyline(e,{shapeOptions:n}),this._currentFeature.enable()},_getFeatureGeometry:function(t){null!==this._geometry&&(this._geometry=null),this._geometry=[];for(var e=t.getLatLngs(),i=0;i<e.length;i++){var n=e[i];this._geometry.push({lon:n.lng,lat:n.lat})}},_addFeatureLayer:function(t){this._featuresLayer&&this._featuresLayer.addLayer(t)},_removeFeatureLayer:function(t){this._featuresLayer&&0!==t&&(t?this._featuresLayer.removeLayer(t):this._featuresLayer.clearLayers())},_altiRequest:function(){if(this._geometry&&!this._noRightManagement){var e={};t.Util.extend(e,this.options.elevationPathOptions),t.Util.extend(e,{apiKey:e.apiKey||this.options.apiKey});var i=this;t.Util.extend(e,{sampling:e.sampling||200,onSuccess:this.options.elevationPathOptions.onSuccess||function(t){t&&(null!==i.options.displayProfileOptions.target&&(i._pictoContainer.style.display="block",i._panelContainer.style.display="block"),i._displayProfil(t.elevations),i._waitingContainer.className="GPelevationPathCalcWaitingContainerHidden",i._waiting=!1)},onFailure:this.options.elevationPathOptions.onFailure||function(t){i._pictoContainer.style.display="block",i._panelContainer.style.display="none",i._waitingContainer.className="GPelevationPathCalcWaitingContainerHidden",i._waiting=!1,i._clear()}});var o=this._geometry;t.Util.extend(e,{positions:o}),this._waitingContainer.className="GPelevationPathCalcWaitingContainerVisible",n.Services.getAltitude(e)}},_computeElevationMeasure:function(t){var e=function(t,e){var i=a.decimalToRadian(t[1]),n=a.decimalToRadian(e[1]),o=(n-i)/2,s=a.decimalToRadian(e[0]-t[0])/2,r=Math.sin(o)*Math.sin(o)+Math.sin(s)*Math.sin(s)*Math.cos(i)*Math.cos(n);return 12756274*Math.atan2(Math.sqrt(r),Math.sqrt(1-r))};t[0].dist=0;for(var i=0,n=1;n<t.length;n++)i+=e([t[n].lon,t[n].lat],[t[n-1].lon,t[n-1].lat])/1e3,t[n].dist=i,t[n].lat=Math.round(1e4*t[n].lat)/1e4,t[n].lon=Math.round(1e4*t[n].lon)/1e4;var o=100;i>100?o=1:i>10&&(o=10);for(var s=0;s<t.length;s++){var r=t[s];r.z<0&&(r.z=0),r.dist=Math.round(r.dist*o)/o}return t},_displayProfil:function(t){var e=this._computeElevationMeasure(t),i=this.options.displayProfileOptions.target;i&&i.appendChild(this._panelContainer),i=this._profilContainer;var n=this,o=this.options.displayProfileOptions.apply;"undefined"!=typeof AmCharts&&"undefined"!=typeof d3,o.call(this,e,i,n)},_activateProfilEvent:function(e){if(null!==this._profile){var i=this._map,n=this;n._marker&&(i.removeLayer(n._marker),n._marker=null),n._marker=t.marker(t.latLng(e.lat,e.lon),{icon:new l("orange"),draggable:!1,clickable:!1,zIndexOffset:1e3}),n._marker.addTo(i);var o=function(e){var i=e.chart.dataProvider[e.index];n._marker.setLatLng(t.latLng(i.lat,i.lon)),n._marker.update()};n._profile.removeListener("changed",o),n._profile.addListener("changed",o)}},_clear:function(){if(this._geometry=null,this._profile=null,this._profilContainer)for(;this._profilContainer.firstChild;)this._profilContainer.removeChild(this._profilContainer.firstChild);var t=this._map;this._marker&&(t.removeLayer(this._marker),this._marker=null)}});return h.DISPLAY_PROFILE_BY_DEFAULT=function(e,i,n){if(i)for(;i.firstChild;)i.removeChild(i.firstChild);if(e){var o=JSON.parse(JSON.stringify(e));o.sort(function(t,e){return t.z-e.z});var s=o[0].z,r=o[o.length-1].z,a=r-s,c=e[e.length-1].dist,h=100/e.length,u=this,d=n._map,p=document.createElement("div");p.id="profileElevationByDefault",p.addEventListener("mouseover",function(e){var i=parseFloat(e.target.dataset.lon),n=parseFloat(e.target.dataset.lat);i&&n&&(u._marker=t.marker(t.latLng(n,i),{icon:new l("orange"),draggable:!1,clickable:!1,zIndexOffset:1e3}),u._marker.addTo(d))}),p.addEventListener("mousemove",function(){}),p.addEventListener("mouseout",function(){u._marker&&(d.removeLayer(u._marker),u._marker=null)}),i.appendChild(p);var m=document.createElement("div");m.className="z-title-vertical",m.innerHTML=s+" / "+r+" m",p.appendChild(m);var f=document.createElement("ul");f.id="data-default",f.className="z-axis x-axis",p.appendChild(f);for(var _=0;_<e.length;_++){var g=e[_],v=document.createElement("li");v.setAttribute("data-z",g.z),v.setAttribute("data-lon",g.lon),v.setAttribute("data-lat",g.lat),v.setAttribute("data-dist",g.dist);var y=Math.floor(100*(g.z-s)/a);v.setAttribute("class","percent v"+y),v.title="altitude : "+g.z+"m",v.setAttribute("style","width: "+h+"%"),f.appendChild(v)}var E=document.createElement("div");E.className="x-title-horizontal",E.innerHTML=c+" km",p.appendChild(E),n._profile=i}},h.DISPLAY_PROFILE_RAW=function(t,e,i){if(e)for(;e.firstChild;)e.removeChild(e.firstChild);var n=document.createElement("textarea");n.id="profilElevationResults",n.rows=10,n.cols=50,n.style.width="100%",n.innerHTML=JSON.stringify(t,void 0,4),e.appendChild(n),i._profile=e},h.DISPLAY_PROFILE_LIB_D3=function(e,i,n){if("undefined"==typeof d3)return void console.log("Lib. D3 is not loaded !");if(i)for(;i.firstChild;)i.removeChild(i.firstChild);var o={top:20,right:20,bottom:30,left:40},s=i.clientWidth-o.left-o.right,r=i.clientHeight-o.top-o.bottom,a=d3.scale.linear().range([0,s]),c=d3.scale.linear().range([r,0]),h=d3.svg.axis().scale(a).orient("bottom").ticks(5),u=d3.svg.axis().scale(c).orient("left").ticks(5),d=d3.svg.line().interpolate("basis").x(function(t){return a(t.dist)}).y(function(t){return c(t.z)}),p=d3.svg.area().interpolate("basis").x(function(t){return a(t.dist)}).y0(r).y1(function(t){return c(t.z)}),m=d3.select(i).append("svg").attr("width",s+o.left+o.right).attr("height",r+o.top+o.bottom).append("g").attr("transform","translate("+o.left+","+o.top+")"),f=d3.extent(e,function(t){return t.dist});a.domain(f);var _=[0,d3.max(e,function(t){return t.z})];c.domain(_),m.append("path").datum(e).attr("class","area-d3").attr("d",p),m.append("g").attr("class","x axis-d3").attr("transform","translate(0,"+r+")").call(h).append("text").attr("y",-15).attr("dy",".71em").attr("x",s).text("Distance (km)"),m.append("g").attr("class","y axis-d3").call(u).append("text").attr("transform","rotate(-90)").attr("y",6).attr("dy",".71em").text("Altitude (m)"),m.append("g").attr("class","grid-d3 vertical").attr("transform","translate(0,"+r+")").call(h.orient("bottom").tickSize(-r,0,0).tickFormat("")),m.append("g").attr("class","grid-d3 horizontal").call(u.orient("left").tickSize(-s,0,0).tickFormat("")),m.append("path").datum(e).attr("class","line-d3").attr("d",d),m.selectAll("circle").data(e).enter().append("circle").attr("cx",function(t){return a(t.dist)}).attr("cy",function(t){return c(t.z)}).attr("r",0).attr("class","circle-d3");var g=m.append("g").style("display","none");g.append("line").attr("id","focusLineX").attr("class","focusLine-d3"),g.append("line").attr("id","focusLineY").attr("class","focusLine-d3"),g.append("circle").attr("id","focusCircle").attr("r",4).attr("class","circle-d3 focusCircle-d3");var v=d3.select(i).append("div").attr("class","tooltip-d3").style("opacity",0),y=d3.bisector(function(t){return t.dist}).left,E=this,P=n._map;m.append("rect").attr("class","overlay-d3").attr("width",s).attr("height",r).on("mouseover",function(){g.style("display",null),E._marker=t.marker(t.latLng(e[0].lat,e[0].lon),{icon:new l("orange"),draggable:!1,clickable:!1,zIndexOffset:1e3}),E._marker.addTo(P)}).on("mouseout",function(){g.style("display","none"),E._marker&&(P.removeLayer(E._marker),E._marker=null),v.transition().duration(500).style("opacity",0)}).on("mousemove",function(){var i=d3.mouse(this),n=a.invert(i[0]),o=y(e,n),s=e[o-1],r=e[o],l=n-s[0]>r[0]-n?r:s,h=a(l.dist),u=c(l.z);g.select("#focusCircle").attr("cx",h).attr("cy",u),g.select("#focusLineX").attr("x1",h).attr("y1",c(_[0])).attr("x2",h).attr("y2",c(_[1])),g.select("#focusLineY").attr("x1",a(f[0])).attr("y1",u).attr("x2",a(f[1])).attr("y2",u),E._marker.setLatLng(t.latLng(l.lat,l.lon)),E._marker.update(),v.transition().duration(200).style("opacity",.9),v.html("Alt : "+l.z+" m <br/>Lon : "+l.lon+" <br/>Lat : "+l.lat).style("left",d3.event.pageX+"px").style("top",d3.event.pageY-28+"px")}),n._profile=d3.selectAll("rect.overlay")[0][0]},h.DISPLAY_PROFILE_LIB_AMCHARTS=function(t,e,i){if("undefined"==typeof AmCharts)return void console.log("Lib. AmCharts is not loaded !");AmCharts.addInitHandler(function(){}),i._profile=AmCharts.makeChart(e,{type:"serial",pathToImages:"http://cdn.amcharts.com/lib/3/images/",categoryField:"dist",autoMarginOffset:0,marginRight:10,marginTop:10,startDuration:0,color:"#5E5E5E",fontSize:10,theme:"light",thousandsSeparator:"",categoryAxis:{color:"#5E5E5E",gridPosition:"start",minHorizontalGap:40,tickPosition:"start",title:"Distance (km)",titleColor:"#5E5E5E",startOnAxis:!0},chartCursor:{animationDuration:0,bulletsEnabled:!0,bulletSize:10,categoryBalloonEnabled:!1,cursorColor:"#F90",graphBulletAlpha:1,graphBulletSize:1,zoomable:!1},trendLines:[],graphs:[{balloonColor:"#CCCCCC",balloonText:"<span class='altiPathValue'>[[title]] : [[value]]m</span><br/><span class='altiPathCoords'>(lat: [[lat]] / lon:[[lon]])</span>",bullet:"round",bulletAlpha:0,bulletBorderColor:"#FFF",bulletBorderThickness:2,bulletColor:"#F90",bulletSize:6,hidden:!1,id:"AmGraph-1",fillAlphas:.4,fillColors:"#C77A04",lineAlpha:1,lineColor:"#C77A04",lineThickness:1,title:"Altitude",valueField:"z"}],guides:[],valueAxes:[{id:"ValueAxis-1",minVerticalGap:20,title:"Altitude (m)"}],allLabel:[],balloon:{borderColor:"#CCCCCC",borderThickness:1,fillColor:"#FFFFFF",showBullet:!0},titles:[],dataProvider:t});var n=t[0];i._activateProfilEvent(n)},h}(leaflet,leafletDraw,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,LeafletControlsLocationSelector,LeafletControlsUtilsPositionFormater,LeafletControlsUtilsIconDefault,CommonControlsElevationPathDOM),LeafletControlsLogo=function(t){var e=t.Control.extend({options:{position:"topright",picto:null,url:null,text:null,size:"30px"},initialize:function(e){t.setOptions(this,e)},onAdd:function(){var e=t.DomUtil.create("div","gp-control-logo",e),i=!(!this.options.url&&!this.options.text),n=null;i&&(n=t.DomUtil.create("a","",e),n.target="_blank",this.options.url&&(n.href=this.options.url,this.options.text?n.title=this.options.text:null)),i&&this.options.text&&(n.text=this.options.text);var o=!!this.options.picto,s=null;return o&&(s=i?t.DomUtil.create("img","",n):t.DomUtil.create("img","",e),s.src=this.options.picto,"string"==typeof this.options.size?s.style.height=s.style.width=this.options.size:(s.style.height=this.options.size.height,s.style.width=this.options.size.width)),e}});return e}(leaflet),LeafletControlsControls=function(t,e,i,n,o,s,r,a){var l={LayerSwitcher:function(e){return new t(e)},Isocurve:function(t){return new e(t)},MousePosition:function(t){return new i(t)},ReverseGeocode:function(t){return new n(t)},Route:function(t){return new o(t)},SearchEngine:function(t){return new s(t)},ElevationPath:function(t){return new r(t)},Logo:function(t){return new a(t)}};return l}(LeafletControlsLayerSwitcher,LeafletControlsIsocurve,LeafletControlsMousePosition,LeafletControlsReverseGeocoding,LeafletControlsRoute,LeafletControlsSearchEngine,LeafletControlsElevationPath,LeafletControlsLogo),CommonUtilsLayerUtils=function(){var t={getZoomLevelFromScaleDenominator:function(t,e){var i={};switch(e){case"EPSG:2154":i={0:104579.224549894,1:52277.5323537905,2:26135.4870785954,3:13066.8913818,4:6533.2286041135,5:3266.5595244627,6:1633.2660045974,7:816.629554986,8:408.3139146768,9:204.1567415109,10:102.0783167832,11:51.0391448966,12:25.5195690743,13:12.7597836936,14:6.379891636,15:3.1899457653,16:1.5949728695,17:.7974864315,18:.3987432149,19:.1993716073,20:.0996858037,21:.0498429018};break;default:i={0:156543.033928041,1:78271.51696402048,2:39135.758482010235,3:19567.87924100512,4:9783.93962050256,5:4891.96981025128,6:2445.98490512564,7:1222.99245256282,8:611.49622628141,9:305.7481131407048,10:152.8740565703525,11:76.43702828517624,12:38.21851414258813,13:19.10925707129406,14:9.554628535647032,15:4.777314267823516,16:2.388657133911758,17:1.194328566955879,18:.5971642834779395,19:.2985821417389697,20:.1492910708694849,21:.0746455354347424}}var n=28e-5*t;for(var o in i)if(i.hasOwnProperty(o)&&i[o]<=n)return o;return 0},getAttributions:function(t){var e=t.zoom,i=[];if(null!=t.originators&&t.visibility)for(var n,o=0,s=t.originators.length;o<s;o++){n=!0;for(var r=t.originators[o],a=t.originators[o].constraints||[],l=0,c=a.length;l<c;l++){var h=a[l];n=!0;var u=this.getZoomLevelFromScaleDenominator(h.maxScaleDenominator,t.crs),d=this.getZoomLevelFromScaleDenominator(h.minScaleDenominator,t.crs);u&&u>e&&(n=!1),n&&d&&d<e&&(n=!1);var p=h.bbox;if(n&&p){n=!1;var m=t.extent;if(m){var f=[p.top,p.left,p.bottom,p.right];if(this.intersects(m,f)){n=!0;break}}}}if(n){var _=r.logo,g=r.url,v=r.name?r.name:"",y=r.attribution,E=document.createElement("div");E.className="gp-control-attribution";var P=null;P=document.createElement("a"),P.className="gp-control-attribution-link",P.target="_blank",E.appendChild(P),g&&(P.href=g);var C=!!_,S=null;C?(S=document.createElement("img"),P?(S.className="gp-control-attribution-image",P.appendChild(S)):(S.className="",E.appendChild(S)),S.src=_,S.title=y||v,S.style.height="30px",S.style.width="30px"):v?P.textContent=v:y?P.textContent=y:g?P.textContent=g:P.textContent="",i.push(E.innerHTML+" ")}}return i},intersects:function(t,e){var i=t[1]<=e[3]&&e[1]<=t[3],n=t[2]<=e[0]&&e[2]<=t[0];return i&&n}};return t}(),LeafletLayersLayerConfig=function(t,e,i){var n={get:function(t){var n={};if(e.isConfigLoaded()&&(n=e.getLayerParams(t.layer,t.service,t.key)))return n.minZoom=i.getZoomLevelFromScaleDenominator(n.maxScale)||1,n.maxZoom=i.getZoomLevelFromScaleDenominator(n.minScale)||21,n}};return n}({},CommonUtilsConfig,CommonUtilsLayerUtils),LeafletLayersLayerEvent=function(t,e){var i={_id:null,_attributions:[],_visibility:!0,_originators:[],isEnable:function(t){return!!t.attributionControl},setVisible:function(t){this._visibility=t},getVisible:function(){return this._visibility},_onRemoveLayer:function(t){t.layer._geoportal_id==this._geoportal_id&&this.setVisible(!1)},_onAddLayer:function(t){t.layer._geoportal_id==this._geoportal_id&&this.setVisible(!0)},_onMoveEndLayer:function(t){this.updateAttributions(this._map,this)},updateAttributions:function(t){this.isEnable(t)&&(this.removeAttributions(t),this.addAttributions(t))},removeAttributions:function(t){if(this.isEnable(t)){for(var e=0;e<this._attributions.length;e++)t.attributionControl.removeAttribution(this._attributions[e]);this._attributions&&(this._attributions=[])}},addAttributions:function(t){if(this.isEnable(t)){var i=t.getBounds().getNorthWest(),n=t.getBounds().getSouthEast(),o=[i.lat,i.lng,n.lat,n.lng],s={extent:o,zoom:t.getZoom(),originators:this._originators,visibility:this._visibility},r=e.getAttributions(s);if(r&&0!==r.length)for(var a=0;a<r.length;a++)this._attributions.push(r[a]),t.attributionControl.addAttribution(r[a])}}};return i}({},CommonUtilsLayerUtils),LeafletLayersWMS=function(t,e,i,n){var o=t.TileLayer.WMS.extend({includes:n,initialize:function(i,n){var o={};t.Util.extend(o,n.paramsWms,n.paramsNative),t.TileLayer.WMS.prototype.initialize.call(this,e.Helper.normalyzeUrl(i,{"gp-leaflet-ext":"0.9.0"},!1),o),this._originators=n.originators,this._legends=n.legends,this._metadata=n.metadata,this._title=n.title,this._description=n.description,this._quicklookUrl=n.quicklookUrl,this._geoportal_id=0},onAdd:function(e){this._map=e,this._geoportal_id=t.stamp(this),t.TileLayer.WMS.prototype.onAdd.call(this,e),this.setVisible(!0),this.updateAttributions(e),e.on({overlayremove:this._onRemoveLayer,overlayadd:this._onAddLayer,layerremove:this._onRemoveLayer,layeradd:this._onAddLayer,moveend:this._onMoveEndLayer},this)},onRemove:function(e){this._map=e,t.TileLayer.prototype.onRemove.call(this,e),this.setVisible(!1),this.removeAttributions(e),e.off({overlayremove:this._onRemoveLayer,overlayadd:this._onAddLayer,layerremove:this._onRemoveLayer,layeradd:this._onAddLayer,moveend:this._onMoveEndLayer},this)},getTileUrl:function(e){var i=["EPSG:4326"],n=this._map,o=this.options.tileSize,s=e.multiplyBy(o),r=s.add([o,o]),a=this._crs.project(n.unproject(s,e.z)),l=this._crs.project(n.unproject(r,e.z)),c=this._wmsVersion>=1.3&&i.indexOf(this._crs.code)!==-1?[l.y,a.x,a.y,l.x].join(","):[a.x,l.y,l.x,a.y].join(","),h=t.Util.template(this._url,{s:this._getSubdomain(e)});return h+t.Util.getParamString(this.wmsParams,h,!0)+"&BBOX="+c}});return o}(leaflet,gp,{},LeafletLayersLayerEvent),LeafletLayersWMTS=function(t,e,i,n){var o=t.TileLayer.extend({includes:n,defaultWmtsParams:{service:"WMTS",request:"GetTile",version:"1.0.0",layer:"",style:"",tilematrixset:"PM",format:"image/jpeg"},initialize:function(i,n){this._wmtsParams={},t.Util.extend(this._wmtsParams,this.defaultWmtsParams,n.paramsWmts),
+t.TileLayer.prototype.initialize.call(this,e.Helper.normalyzeUrl(i,{"gp-leaflet-ext":"0.9.0"},!1),n.paramsNative),this._originators=n.originators,this._legends=n.legends,this._metadata=n.metadata,this._title=n.title,this._description=n.description,this._quicklookUrl=n.quicklookUrl,this._geoportal_id=0},onAdd:function(e){this._map=e,this._geoportal_id=t.stamp(this),t.TileLayer.prototype.onAdd.call(this,e),this.setVisible(!0),this.updateAttributions(e),e.on({overlayremove:this._onRemoveLayer,overlayadd:this._onAddLayer,layerremove:this._onRemoveLayer,layeradd:this._onAddLayer,moveend:this._onMoveEndLayer},this)},onRemove:function(e){this._map=e,t.TileLayer.prototype.onRemove.call(this,e),this.setVisible(!1),this.removeAttributions(e),e.off({overlayremove:this._onRemoveLayer,overlayadd:this._onAddLayer,layerremove:this._onRemoveLayer,layeradd:this._onAddLayer,moveend:this._onMoveEndLayer},this)},getTileUrl:function(e){var i=this._getZoomForUrl(),n=t.Util.template(this._url,{s:this._getSubdomain(e)});return n+t.Util.getParamString(this._wmtsParams,n)+"&tilematrix="+i+"&tilerow="+e.y+"&tilecol="+e.x},setParams:function(e,i){return t.extend(this._wmtsParams,e),i||this.redraw(),this}});return o}(leaflet,gp,{},LeafletLayersLayerEvent),LeafletLayersLayers=function(t,e,i,n,o){var s={options:{},params:{},serviceUrl:"http://localhost?no-rights-found-for=[{layer}]",_initLogger:function(){},_initOptions:function(){if(!this.options||0===Object.keys(this.options))throw new Error("PARAM_MISSING : options !");if(!this.options.layer)throw new Error("PARAM_MISSING : layer !");this.options.apiKey||console.log("PARAM_MISSING : apiKey !")},_initParams:function(t){t||(t="WMTS"),this.params=i.get({key:this.options.apiKey,layer:this.options.layer,service:t}),this.params&&0!==Object.keys(this.params)||(this.params={},this.options.apiKey||console.log("WARNING PARAM_MISSING : parameter 'apiKey' is mandatory if the contract key configuration has not been loaded !"))},WMS:function(e,i){this._initLogger(),this.options=e||{},this._initOptions(),this.settings=i||{},this._initParams("WMS");var o=null;o=this.params.key||this.options.apiKey?this.params.url||t.Util.template("http://wxs.ign.fr/{key}/geoportail/r/wms",{key:this.params.key||this.options.apiKey}):t.Util.template(this.serviceUrl,{layer:this.options.layer});var s={layers:this.options.layer,styles:this.params.styles||"normal",format:this.params.format||"image/jpeg",version:this.params.version||"1.3.0"},r={minZoom:this.params.minZoom||1,maxZoom:this.params.maxZoom||21};return t.Util.extend(r,this.settings),new n(o,{paramsNative:r,paramsWms:s,originators:this.params.originators||[],legends:this.params.legends||[],metadata:this.params.metadata||[],title:this.params.title||null,description:this.params.description||null,quicklookUrl:this.params.quicklookUrl||null})},WMTS:function(e,i){this._initLogger(),this.options=e||{},this._initOptions(),this.settings=i||{},this._initParams("WMTS");var n=null;n=this.params.key||this.options.apiKey?this.params.url||t.Util.template("http://wxs.ign.fr/{key}/geoportail/wmts",{key:this.params.key||this.options.apiKey}):t.Util.template(this.serviceUrl,{layer:this.options.layer});var s={layer:this.options.layer,style:this.params.styles||"normal",format:this.params.format||"image/jpeg",version:this.params.version||"1.0.0",tilematrixset:this.params.TMSLink||"PM"},r={minZoom:this.params.minZoom||1,maxZoom:this.params.maxZoom||21};return t.Util.extend(r,this.settings),new o(n,{paramsNative:r,paramsWmts:s,originators:this.params.originators||[],legends:this.params.legends||[],metadata:this.params.metadata||[],title:this.params.title||"",description:this.params.description||"",quicklookUrl:this.params.quicklookUrl||""})}};return s}(leaflet,{},LeafletLayersLayerConfig,LeafletLayersWMS,LeafletLayersWMTS),LeafletGpPluginLeaflet=function(t,e,i,n,o,s,r,a){return i.leafletExtVersion="0.9.0",i.leafletExtDate="2016-12-04",i.Register=a,t.geoportalLayer=s,t.geoportalControl=n,t.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_D3=o.DISPLAY_PROFILE_LIB_D3,t.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS=o.DISPLAY_PROFILE_LIB_AMCHARTS,t.geoportalControl.ElevationPath.DISPLAY_PROFILE_RAW=o.DISPLAY_PROFILE_RAW,t.geoportalControl.ElevationPath.DISPLAY_PROFILE_BY_DEFAULT=o.DISPLAY_PROFILE_BY_DEFAULT,t.geoportalCRS=r,t.geoportalCRS.EPSG2154=r.EPSG2154(),t.geoportalCRS.EPSG27572=r.EPSG27572(),t.geoportalCRS.EPSG4326=r.EPSG4326(),i}(leaflet,leafletDraw,gp,LeafletControlsControls,LeafletControlsElevationPath,LeafletLayersLayers,LeafletCRSCRS,CommonUtilsRegister),window.proj4=proj4;
+return Gp;
+}));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet.Control.Draw.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,118 @@
+/**
+ * @class L.Control.Draw
+ * @aka L.Draw
+ */
+L.Control.Draw = L.Control.extend({
+
+	// Options
+	options: {
+		position: 'topleft',
+		draw: {},
+		edit: false
+	},
+
+	// @method initialize(): void
+	// Initializes draw control, toolbars from the options
+	initialize: function (options) {
+		if (L.version < '0.7') {
+			throw new Error('Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/');
+		}
+
+		L.Control.prototype.initialize.call(this, options);
+
+		var toolbar;
+
+		this._toolbars = {};
+
+		// Initialize toolbars
+		if (L.DrawToolbar && this.options.draw) {
+			toolbar = new L.DrawToolbar(this.options.draw);
+
+			this._toolbars[L.DrawToolbar.TYPE] = toolbar;
+
+			// Listen for when toolbar is enabled
+			this._toolbars[L.DrawToolbar.TYPE].on('enable', this._toolbarEnabled, this);
+		}
+
+		if (L.EditToolbar && this.options.edit) {
+			toolbar = new L.EditToolbar(this.options.edit);
+
+			this._toolbars[L.EditToolbar.TYPE] = toolbar;
+
+			// Listen for when toolbar is enabled
+			this._toolbars[L.EditToolbar.TYPE].on('enable', this._toolbarEnabled, this);
+		}
+		L.toolbar = this; //set global var for editing the toolbar
+	},
+
+	// @method onAdd(): container
+	// Adds the toolbar container to the map
+	onAdd: function (map) {
+		var container = L.DomUtil.create('div', 'leaflet-draw'),
+			addedTopClass = false,
+			topClassName = 'leaflet-draw-toolbar-top',
+			toolbarContainer;
+
+		for (var toolbarId in this._toolbars) {
+			if (this._toolbars.hasOwnProperty(toolbarId)) {
+				toolbarContainer = this._toolbars[toolbarId].addToolbar(map);
+
+				if (toolbarContainer) {
+					// Add class to the first toolbar to remove the margin
+					if (!addedTopClass) {
+						if (!L.DomUtil.hasClass(toolbarContainer, topClassName)) {
+							L.DomUtil.addClass(toolbarContainer.childNodes[0], topClassName);
+						}
+						addedTopClass = true;
+					}
+
+					container.appendChild(toolbarContainer);
+				}
+			}
+		}
+
+		return container;
+	},
+
+	// @method onRemove(): void
+	// Removes the toolbars from the map toolbar container
+	onRemove: function () {
+		for (var toolbarId in this._toolbars) {
+			if (this._toolbars.hasOwnProperty(toolbarId)) {
+				this._toolbars[toolbarId].removeToolbar();
+			}
+		}
+	},
+
+	// @method setDrawingOptions(options): void
+	// Sets options to all toolbar instances
+	setDrawingOptions: function (options) {
+		for (var toolbarId in this._toolbars) {
+			if (this._toolbars[toolbarId] instanceof L.DrawToolbar) {
+				this._toolbars[toolbarId].setOptions(options);
+			}
+		}
+	},
+
+	_toolbarEnabled: function (e) {
+		var enabledToolbar = e.target;
+
+		for (var toolbarId in this._toolbars) {
+			if (this._toolbars[toolbarId] !== enabledToolbar) {
+				this._toolbars[toolbarId].disable();
+			}
+		}
+	}
+});
+
+L.Map.mergeOptions({
+	drawControlTooltips: true,
+	drawControl: false
+});
+
+L.Map.addInitHook(function () {
+	if (this.options.drawControl) {
+		this.drawControl = new L.Control.Draw();
+		this.addControl(this.drawControl);
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet.Control.Draw.min.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+L.Control.Draw=L.Control.extend({options:{position:"topleft",draw:{},edit:false},initialize:function(a){if(L.version<"0.7"){throw new Error("Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/")}L.Control.prototype.initialize.call(this,a);var b;this._toolbars={};if(L.DrawToolbar&&this.options.draw){b=new L.DrawToolbar(this.options.draw);this._toolbars[L.DrawToolbar.TYPE]=b;this._toolbars[L.DrawToolbar.TYPE].on("enable",this._toolbarEnabled,this)}if(L.EditToolbar&&this.options.edit){b=new L.EditToolbar(this.options.edit);this._toolbars[L.EditToolbar.TYPE]=b;this._toolbars[L.EditToolbar.TYPE].on("enable",this._toolbarEnabled,this)}L.toolbar=this},onAdd:function(e){var b=L.DomUtil.create("div","leaflet-draw"),c=false,f="leaflet-draw-toolbar-top",a;for(var d in this._toolbars){if(this._toolbars.hasOwnProperty(d)){a=this._toolbars[d].addToolbar(e);if(a){if(!c){if(!L.DomUtil.hasClass(a,f)){L.DomUtil.addClass(a.childNodes[0],f)}c=true}b.appendChild(a)}}}return b},onRemove:function(){for(var a in this._toolbars){if(this._toolbars.hasOwnProperty(a)){this._toolbars[a].removeToolbar()}}},setDrawingOptions:function(a){for(var b in this._toolbars){if(this._toolbars[b] instanceof L.DrawToolbar){this._toolbars[b].setOptions(a)}}},_toolbarEnabled:function(c){var b=c.target;for(var a in this._toolbars){if(this._toolbars[a]!==b){this._toolbars[a].disable()}}}});L.Map.mergeOptions({drawControlTooltips:true,drawControl:false});L.Map.addInitHook(function(){if(this.options.drawControl){this.drawControl=new L.Control.Draw();this.addControl(this.drawControl)}});
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet.Draw.Event.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,156 @@
+/**
+ * ### Events
+ * Once you have successfully added the Leaflet.draw plugin to your map you will want to respond to the different
+ * actions users can initiate. The following events will be triggered on the map:
+ *
+ * @class L.Draw.Event
+ * @aka Draw.Event
+ *
+ * Use `L.Draw.Event.EVENTNAME` constants to ensure events are correct.
+ *
+ * @example
+ * ```js
+ * map.on(L.Draw.Event.CREATED; function (e) {
+ *    var type = e.layerType;
+ *        layer = e.layer;
+ *
+ *    if (type === 'marker') {
+ *        // Do marker specific actions
+ *    }
+ *
+ *    // Do whatever else you need to. (save to db; add to map etc)
+ *    map.addLayer(layer);
+ *});
+ * ```
+ */
+L.Draw.Event = {};
+/**
+ * @event draw:created: PolyLine; Polygon; Rectangle; Circle; Marker | String
+ *
+ * Layer that was just created.
+ * The type of layer this is. One of: `polyline`; `polygon`; `rectangle`; `circle`; `marker`
+ * Triggered when a new vector or marker has been created.
+ *
+ */
+L.Draw.Event.CREATED = 'draw:created';
+
+/**
+ * @event draw:edited: LayerGroup
+ *
+ * List of all layers just edited on the map.
+ *
+ *
+ * Triggered when layers in the FeatureGroup; initialised with the plugin; have been edited and saved.
+ *
+ * @example
+ * ```js
+ *      map.on('draw:edited'; function (e) {
+     *          var layers = e.layers;
+     *          layers.eachLayer(function (layer) {
+     *              //do whatever you want; most likely save back to db
+     *          });
+     *      });
+ * ```
+ */
+L.Draw.Event.EDITED = 'draw:edited';
+
+/**
+ * @event draw:deleted: LayerGroup
+ *
+ * List of all layers just removed from the map.
+ *
+ * Triggered when layers have been removed (and saved) from the FeatureGroup.
+ */
+L.Draw.Event.DELETED = 'draw:deleted';
+
+/**
+ * @event draw:drawstart: String
+ *
+ * The type of layer this is. One of:`polyline`; `polygon`; `rectangle`; `circle`; `marker`
+ *
+ * Triggered when the user has chosen to draw a particular vector or marker.
+ */
+L.Draw.Event.DRAWSTART = 'draw:drawstart';
+
+/**
+ * @event draw:drawstop: String
+ *
+ * The type of layer this is. One of: `polyline`; `polygon`; `rectangle`; `circle`; `marker`
+ *
+ * Triggered when the user has finished a particular vector or marker.
+ */
+
+L.Draw.Event.DRAWSTOP = 'draw:drawstop';
+
+/**
+ * @event draw:drawvertex: LayerGroup
+ *
+ * List of all layers just being added from the map.
+ *
+ * Triggered when a vertex is created on a polyline or polygon.
+ */
+L.Draw.Event.DRAWVERTEX = 'draw:drawvertex';
+
+/**
+ * @event draw:editstart: String
+ *
+ * The type of edit this is. One of: `edit`
+ *
+ * Triggered when the user starts edit mode by clicking the edit tool button.
+ */
+
+L.Draw.Event.EDITSTART = 'draw:editstart';
+
+/**
+ * @event draw:editmove: ILayer
+ *
+ *  Layer that was just moved.
+ *
+ * Triggered as the user moves a rectangle; circle or marker.
+ */
+L.Draw.Event.EDITMOVE = 'draw:editmove';
+
+/**
+ * @event draw:editresize: ILayer
+ *
+ * Layer that was just moved.
+ *
+ * Triggered as the user resizes a rectangle or circle.
+ */
+L.Draw.Event.EDITRESIZE = 'draw:editresize';
+
+/**
+ * @event draw:editvertex: LayerGroup
+ *
+ * List of all layers just being edited from the map.
+ *
+ * Triggered when a vertex is edited on a polyline or polygon.
+ */
+L.Draw.Event.EDITVERTEX = 'draw:editvertex';
+
+/**
+ * @event draw:editstop: String
+ *
+ * The type of edit this is. One of: `edit`
+ *
+ * Triggered when the user has finshed editing (edit mode) and saves edits.
+ */
+L.Draw.Event.EDITSTOP = 'draw:editstop';
+
+/**
+ * @event draw:deletestart: String
+ *
+ * The type of edit this is. One of: `remove`
+ *
+ * Triggered when the user starts remove mode by clicking the remove tool button.
+ */
+L.Draw.Event.DELETESTART = 'draw:deletestart';
+
+/**
+ * @event draw:deletestop: String
+ *
+ * The type of edit this is. One of: `remove`
+ *
+ * Triggered when the user has finished removing shapes (remove mode) and saves.
+ */
+L.Draw.Event.DELETESTOP = 'draw:deletestop';
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet.Draw.Event.min.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+L.Draw.Event={};L.Draw.Event.CREATED="draw:created";L.Draw.Event.EDITED="draw:edited";L.Draw.Event.DELETED="draw:deleted";L.Draw.Event.DRAWSTART="draw:drawstart";L.Draw.Event.DRAWSTOP="draw:drawstop";L.Draw.Event.DRAWVERTEX="draw:drawvertex";L.Draw.Event.EDITSTART="draw:editstart";L.Draw.Event.EDITMOVE="draw:editmove";L.Draw.Event.EDITRESIZE="draw:editresize";L.Draw.Event.EDITVERTEX="draw:editvertex";L.Draw.Event.EDITSTOP="draw:editstop";L.Draw.Event.DELETESTART="draw:deletestart";L.Draw.Event.DELETESTOP="draw:deletestop";
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet.Draw.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,183 @@
+/**
+ * Leaflet.draw assumes that you have already included the Leaflet library.
+ */
+L.drawVersion = '0.4.2';
+/**
+ * @class L.Draw
+ * @aka Draw
+ *
+ *
+ * To add the draw toolbar set the option drawControl: true in the map options.
+ *
+ * @example
+ * ```js
+ *      var map = L.map('map', {drawControl: true}).setView([51.505, -0.09], 13);
+ *
+ *      L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
+ *          attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
+ *      }).addTo(map);
+ * ```
+ *
+ * ### Adding the edit toolbar
+ * To use the edit toolbar you must initialise the Leaflet.draw control and manually add it to the map.
+ *
+ * ```js
+ *      var map = L.map('map').setView([51.505, -0.09], 13);
+ *
+ *      L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
+ *          attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
+ *      }).addTo(map);
+ *
+ *      // FeatureGroup is to store editable layers
+ *      var drawnItems = new L.FeatureGroup();
+ *      map.addLayer(drawnItems);
+ *
+ *      var drawControl = new L.Control.Draw({
+ *          edit: {
+ *              featureGroup: drawnItems
+ *          }
+ *      });
+ *      map.addControl(drawControl);
+ * ```
+ *
+ * The key here is the featureGroup option. This tells the plugin which FeatureGroup contains the layers that
+ * should be editable. The featureGroup can contain 0 or more features with geometry types Point, LineString, and Polygon.
+ * Leaflet.draw does not work with multigeometry features such as MultiPoint, MultiLineString, MultiPolygon,
+ * or GeometryCollection. If you need to add multigeometry features to the draw plugin, convert them to a
+ * FeatureCollection of non-multigeometries (Points, LineStrings, or Polygons).
+ */
+L.Draw = {};
+
+/**
+ * @class L.drawLocal
+ * @aka L.drawLocal
+ *
+ * The core toolbar class of the API — it is used to create the toolbar ui
+ *
+ * @example
+ * ```js
+ *      var modifiedDraw = L.drawLocal.extend({
+ *          draw: {
+ *              toolbar: {
+ *                  buttons: {
+ *                      polygon: 'Draw an awesome polygon'
+ *                  }
+ *              }
+ *          }
+ *      });
+ * ```
+ *
+ * The default state for the control is the draw toolbar just below the zoom control.
+ *  This will allow map users to draw vectors and markers.
+ *  **Please note the edit toolbar is not enabled by default.**
+ */
+L.drawLocal = {
+	// format: {
+	// 	numeric: {
+	// 		delimiters: {
+	// 			thousands: ',',
+	// 			decimal: '.'
+	// 		}
+	// 	}
+	// },
+	draw: {
+		toolbar: {
+			// #TODO: this should be reorganized where actions are nested in actions
+			// ex: actions.undo  or actions.cancel
+			actions: {
+				title: 'Cancel drawing',
+				text: 'Cancel'
+			},
+			finish: {
+				title: 'Finish drawing',
+				text: 'Finish'
+			},
+			undo: {
+				title: 'Delete last point drawn',
+				text: 'Delete last point'
+			},
+			buttons: {
+				polyline: 'Draw a polyline',
+				polygon: 'Draw a polygon',
+				rectangle: 'Draw a rectangle',
+				circle: 'Draw a circle',
+				marker: 'Draw a marker'
+			}
+		},
+		handlers: {
+			circle: {
+				tooltip: {
+					start: 'Click and drag to draw circle.'
+				},
+				radius: 'Radius'
+			},
+			marker: {
+				tooltip: {
+					start: 'Click map to place marker.'
+				}
+			},
+			polygon: {
+				tooltip: {
+					start: 'Click to start drawing shape.',
+					cont: 'Click to continue drawing shape.',
+					end: 'Click first point to close this shape.'
+				}
+			},
+			polyline: {
+				error: '<strong>Error:</strong> shape edges cannot cross!',
+				tooltip: {
+					start: 'Click to start drawing line.',
+					cont: 'Click to continue drawing line.',
+					end: 'Click last point to finish line.'
+				}
+			},
+			rectangle: {
+				tooltip: {
+					start: 'Click and drag to draw rectangle.'
+				}
+			},
+			simpleshape: {
+				tooltip: {
+					end: 'Release mouse to finish drawing.'
+				}
+			}
+		}
+	},
+	edit: {
+		toolbar: {
+			actions: {
+				save: {
+					title: 'Save changes.',
+					text: 'Save'
+				},
+				cancel: {
+					title: 'Cancel editing, discards all changes.',
+					text: 'Cancel'
+				},
+				clearAll:{
+					title: 'clear all layers.',
+					text: 'Clear All'
+				}
+			},
+			buttons: {
+				edit: 'Edit layers.',
+				editDisabled: 'No layers to edit.',
+				remove: 'Delete layers.',
+				removeDisabled: 'No layers to delete.'
+			}
+		},
+		handlers: {
+			edit: {
+				tooltip: {
+					text: 'Drag handles, or marker to edit feature.',
+					subtext: 'Click cancel to undo changes.'
+				}
+			},
+			remove: {
+				tooltip: {
+					text: 'Click on a feature to remove'
+				}
+			}
+		}
+	}
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet.Draw.min.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+L.drawVersion="0.4.2";L.Draw={};L.drawLocal={draw:{toolbar:{actions:{title:"Cancel drawing",text:"Cancel"},finish:{title:"Finish drawing",text:"Finish"},undo:{title:"Delete last point drawn",text:"Delete last point"},buttons:{polyline:"Draw a polyline",polygon:"Draw a polygon",rectangle:"Draw a rectangle",circle:"Draw a circle",marker:"Draw a marker"}},handlers:{circle:{tooltip:{start:"Click and drag to draw circle."},radius:"Radius"},marker:{tooltip:{start:"Click map to place marker."}},polygon:{tooltip:{start:"Click to start drawing shape.",cont:"Click to continue drawing shape.",end:"Click first point to close this shape."}},polyline:{error:"<strong>Error:</strong> shape edges cannot cross!",tooltip:{start:"Click to start drawing line.",cont:"Click to continue drawing line.",end:"Click last point to finish line."}},rectangle:{tooltip:{start:"Click and drag to draw rectangle."}},simpleshape:{tooltip:{end:"Release mouse to finish drawing."}}}},edit:{toolbar:{actions:{save:{title:"Save changes.",text:"Save"},cancel:{title:"Cancel editing, discards all changes.",text:"Cancel"},clearAll:{title:"clear all layers.",text:"Clear All"}},buttons:{edit:"Edit layers.",editDisabled:"No layers to edit.",remove:"Delete layers.",removeDisabled:"No layers to delete."}},handlers:{edit:{tooltip:{text:"Drag handles, or marker to edit feature.",subtext:"Click cancel to undo changes."}},remove:{tooltip:{text:"Click on a feature to remove"}}}}};
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet.DrawToolbar.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,104 @@
+/**
+ * @class L.DrawToolbar
+ * @aka Toolbar
+ */
+L.DrawToolbar = L.Toolbar.extend({
+
+	statics: {
+		TYPE: 'draw'
+	},
+
+	options: {
+		polyline: {},
+		polygon: {},
+		rectangle: {},
+		circle: {},
+		marker: {}
+	},
+
+	// @method initialize(): void
+	initialize: function (options) {
+		// Ensure that the options are merged correctly since L.extend is only shallow
+		for (var type in this.options) {
+			if (this.options.hasOwnProperty(type)) {
+				if (options[type]) {
+					options[type] = L.extend({}, this.options[type], options[type]);
+				}
+			}
+		}
+
+		this._toolbarClass = 'leaflet-draw-draw';
+		L.Toolbar.prototype.initialize.call(this, options);
+	},
+
+	// @method getModeHandlers(): object
+	// Get mode handlers information
+	getModeHandlers: function (map) {
+		return [
+			{
+				enabled: this.options.polyline,
+				handler: new L.Draw.Polyline(map, this.options.polyline),
+				title: L.drawLocal.draw.toolbar.buttons.polyline
+			},
+			{
+				enabled: this.options.polygon,
+				handler: new L.Draw.Polygon(map, this.options.polygon),
+				title: L.drawLocal.draw.toolbar.buttons.polygon
+			},
+			{
+				enabled: this.options.rectangle,
+				handler: new L.Draw.Rectangle(map, this.options.rectangle),
+				title: L.drawLocal.draw.toolbar.buttons.rectangle
+			},
+			{
+				enabled: this.options.circle,
+				handler: new L.Draw.Circle(map, this.options.circle),
+				title: L.drawLocal.draw.toolbar.buttons.circle
+			},
+			{
+				enabled: this.options.marker,
+				handler: new L.Draw.Marker(map, this.options.marker),
+				title: L.drawLocal.draw.toolbar.buttons.marker
+			}
+		];
+	},
+
+	// @method getActions(): object
+	// Get action information
+	getActions: function (handler) {
+		return [
+			{
+				enabled: handler.completeShape,
+				title: L.drawLocal.draw.toolbar.finish.title,
+				text: L.drawLocal.draw.toolbar.finish.text,
+				callback: handler.completeShape,
+				context: handler
+			},
+			{
+				enabled: handler.deleteLastVertex,
+				title: L.drawLocal.draw.toolbar.undo.title,
+				text: L.drawLocal.draw.toolbar.undo.text,
+				callback: handler.deleteLastVertex,
+				context: handler
+			},
+			{
+				title: L.drawLocal.draw.toolbar.actions.title,
+				text: L.drawLocal.draw.toolbar.actions.text,
+				callback: this.disable,
+				context: this
+			}
+		];
+	},
+
+	// @method setOptions(): void
+	// Sets the options to the toolbar
+	setOptions: function (options) {
+		L.setOptions(this, options);
+
+		for (var type in this._modes) {
+			if (this._modes.hasOwnProperty(type) && options.hasOwnProperty(type)) {
+				this._modes[type].handler.setOptions(options[type]);
+			}
+		}
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet.DrawToolbar.min.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+L.DrawToolbar=L.Toolbar.extend({statics:{TYPE:"draw"},options:{polyline:{},polygon:{},rectangle:{},circle:{},marker:{}},initialize:function(a){for(var b in this.options){if(this.options.hasOwnProperty(b)){if(a[b]){a[b]=L.extend({},this.options[b],a[b])}}}this._toolbarClass="leaflet-draw-draw";L.Toolbar.prototype.initialize.call(this,a)},getModeHandlers:function(a){return[{enabled:this.options.polyline,handler:new L.Draw.Polyline(a,this.options.polyline),title:L.drawLocal.draw.toolbar.buttons.polyline},{enabled:this.options.polygon,handler:new L.Draw.Polygon(a,this.options.polygon),title:L.drawLocal.draw.toolbar.buttons.polygon},{enabled:this.options.rectangle,handler:new L.Draw.Rectangle(a,this.options.rectangle),title:L.drawLocal.draw.toolbar.buttons.rectangle},{enabled:this.options.circle,handler:new L.Draw.Circle(a,this.options.circle),title:L.drawLocal.draw.toolbar.buttons.circle},{enabled:this.options.marker,handler:new L.Draw.Marker(a,this.options.marker),title:L.drawLocal.draw.toolbar.buttons.marker}]},getActions:function(a){return[{enabled:a.completeShape,title:L.drawLocal.draw.toolbar.finish.title,text:L.drawLocal.draw.toolbar.finish.text,callback:a.completeShape,context:a},{enabled:a.deleteLastVertex,title:L.drawLocal.draw.toolbar.undo.title,text:L.drawLocal.draw.toolbar.undo.text,callback:a.deleteLastVertex,context:a},{title:L.drawLocal.draw.toolbar.actions.title,text:L.drawLocal.draw.toolbar.actions.text,callback:this.disable,context:this}]},setOptions:function(a){L.setOptions(this,a);for(var b in this._modes){if(this._modes.hasOwnProperty(b)&&a.hasOwnProperty(b)){this._modes[b].handler.setOptions(a[b])}}}});
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/pyams_gis.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,519 @@
+/**
+ * PyAMS_GIS package extension
+ */
+(function($, globals) {
+
+	"use strict";
+
+	var MyAMS = globals.MyAMS;
+	var L;
+
+	var PyAMS_GIS = {
+
+		RPC_ENDPOINT: '/api/gis/json',
+		WGS_SRID: 4326,
+
+		_layersControlAddItem: function(obj) {
+			var group = $('<div></div>').addClass('inline-group'),
+				label = $('<label></label>').addClass(obj.overlay ? "checkbox" : "radio"),
+				input,
+				span = $('<i></i>'),
+				name,
+				checked = this._map.hasLayer(obj.layer);
+			if (obj.overlay) {
+				input = document.createElement('input');
+				input.type = 'checkbox';
+				input.className = 'leaflet-control-layers-selector';
+				input.defaultChecked = checked;
+			} else {
+				input = this._createRadioElement('leaflet-base-layers', checked);
+			}
+			input.layerId = L.stamp(obj.layer);
+			$(input).addClass(obj.overlay ? "checkbox" : "radio");
+			L.DomEvent.on(input, 'click', this._onInputClick, this);
+			name = $('<span></span>').text(' ' + obj.name);
+			label.append(input);
+			label.append(span);
+			label.append(name);
+			group.append(label);
+			var container = obj.overlay ? this._overlaysList : this._baseLayersList;
+			$(container).append(group);
+			// $($(container).parents('form').get(0)).data("async", true);
+			return group;
+		},
+
+		init: function(context, options, callback) {
+			var map = context;
+			MyAMS.ajax.check(globals.L,
+							 '/--static--/pyams_gis/js/leaflet-1.0.3' + MyAMS.devext + '.js',
+							 function(first_load) {
+								if (first_load) {
+									L = globals.L;
+									L.Control.Layers.prototype._addItem = PyAMS_GIS._layersControlAddItem;
+									MyAMS.getCSS('/--static--/pyams_gis/css/leaflet-1.0.3' + MyAMS.devext + '.css',
+												 'leaflet');
+								}
+								MyAMS.ajax.post('get-map-configuration.json', {}, function(config) {
+									var data = map.data();
+									var settings = {
+										preferCanvas: data.mapLeafletPreferCanvas || false,
+										attributionControl: data.mapLeafletAttributionControl === undefined ?
+											config.attributionControl :
+											data.mapLeafletAttributionControl,
+										zoomControl: data.mapLeafletZoomControl === undefined ?
+											config.zoomControl :
+											data.mapLeafletZoomControl,
+										crs: data.mapLeafletCrs || MyAMS.getObject(config.crs) || globals.L.CRS.EPSG3857,
+										center: data.mapLeafletCenter || config.center,
+										zoom: data.mapLeafletZoom || config.zoom
+									};
+									settings = $.extend({}, settings, options);
+									map.trigger('map.init', [map, settings, config]);
+									var leafmap = L.map(map.attr('id'), settings);
+									if (config.layers) {
+										for (var index = 0; index < config.layers.length; index++) {
+											var layerConfig = config.layers[index];
+											map.trigger('map.layer.init', [map, layerConfig]);
+											PyAMS_GIS.getLayer(layerConfig).addTo(leafmap);
+										}
+									} else {
+										L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
+											maxZoom: 19,
+											id: 'osm',
+											attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
+										}).addTo(leafmap);
+									}
+									if (config.zoomControl && (data.mapLeafletHideZoomControl !== true)) {
+										L.control.scale().addTo(leafmap);
+									}
+									if (config.bounds) {
+										leafmap.fitBounds(config.bounds);
+									}
+									map.data('leafmap', leafmap);
+									map.data('leafmap.config', config);
+									map.trigger('map.finishing', [map, leafmap]);
+									if (callback) {
+										callback(leafmap, config);
+									}
+									map.trigger('map.finished', [map, leafmap]);
+								});
+							 });
+		},
+
+		getLayer: function(layer) {
+			var factory = MyAMS.getObject(layer.factory);
+			if (factory !== undefined) {
+				delete layer.factory;
+				var deferred = [];
+				if (layer.dependsOn) {
+					for (var name in layer.dependsOn) {
+						if (!layer.dependsOn.hasOwnProperty(name)) {
+							continue;
+						}
+						if (MyAMS.getObject(name) === undefined) {
+							deferred.push(MyAMS.getScript(layer.dependsOn[name]));
+						}
+					}
+					delete layer.dependsOn;
+				}
+				if (deferred.length > 0) {
+					$.when.apply($, deferred);
+				}
+				return factory(layer);
+			}
+		},
+
+		factory: {
+			TileLayer: function(layer) {
+				var url = layer.url;
+				delete layer.url;
+				return L.tileLayer(url, layer);
+			},
+			WMS: function(layer) {
+				var url = layer.url;
+				delete layer.url;
+				return L.tileLayer.wms(url, layer);
+			},
+			Geoportal: {
+				WMS: function(layer) {
+					MyAMS.getCSS('/--static--/pyams_gis/css/leaflet-gp-3.0.2' + MyAMS.devext + '.css', 'geoportal');
+					return L.geoportalLayer.WMS(layer);
+				}
+			},
+			ESRI: {
+				Feature: function(layer) {
+					return L.esri.featureLayer(layer);
+				}
+			},
+			Google: function(layer) {
+				var apiKey = layer.apiKey;
+				delete layer.apiKey;
+				if (MyAMS.getObject('window.google.maps') === undefined) {
+					var script = MyAMS.getScript('https://maps.googleapis.com/maps/api/js?key=' + apiKey);
+					$.when.apply($, [script]);
+				}
+				return L.gridLayer.googleMutant(layer);
+			}
+		},
+
+		callJSON: function(method, params, callback) {
+			MyAMS.ajax.check($.jsonRPC,
+							 MyAMS.baseURL + 'ext/jquery-jsonrpc' + MyAMS.devext + '.js',
+							 function() {
+								$.jsonRPC.withOptions({
+									endPoint: PyAMS_GIS.RPC_ENDPOINT,
+									cache: false
+								}, function() {
+									$.jsonRPC.request(method, {
+										id: new Date().getTime(),
+										params: params,
+										success: callback,
+										error: MyAMS.error.show
+									});
+								});
+							 });
+		},
+
+		/**
+		 * Single position marker management
+		 */
+		position: {
+
+			init: function() {
+				/* Position marker initialization */
+				var map = $('.map', $(this));
+				if (map.data('leafmap') === undefined) {
+					map.css('height', $(window).height() - 200);
+					PyAMS_GIS.init(map, {}, function (leafmap, config) {
+						var data = map.data();
+						var icon = L.icon({
+							iconUrl: '/--static--/pyams_gis/img/marker-icon.png',
+							iconSize: [25, 41],
+							iconAnchor: [13, 40]
+						});
+						var marker = L.marker();
+						marker.setIcon(icon);
+						var fieldname = data.mapLeafletFieldname;
+						var longitude = $('input[name="' + fieldname + '.widgets.longitude"]');
+						var latitude = $('input[name="' + fieldname + '.widgets.latitude"]');
+						if (longitude.val() && latitude.val()) {
+							var projection = $('select[name="' + fieldname + '.widgets.projection:list"]');
+							var params = {
+								point: {
+									longitude: parseFloat(longitude.val()),
+									latitude: parseFloat(latitude.val())
+								},
+								from_projection: projection.val() || PyAMS_GIS.WGS_SRID,
+								to_projection: PyAMS_GIS.WGS_SRID
+							};
+							PyAMS_GIS.callJSON('transformPoint', params, function(result) {
+								if (!result.error) {
+									var point = result.result.point;
+									marker.setLatLng({
+										lon: point.longitude,
+										lat: point.latitude
+									});
+									marker.addTo(leafmap);
+									leafmap.setView(marker.getLatLng(), config.zoom || 13);
+								}
+							});
+						} else {
+							marker.setLatLng([-90, 0]);
+							marker.addTo(leafmap);
+						}
+						map.data('marker', marker);
+						leafmap.on('click', PyAMS_GIS.position.onClick);
+					});
+				}
+			},
+
+			onClick: function(event) {
+				var map = event.target.getContainer();
+				var data = $(map).data();
+				var marker = data.marker;
+				var latlng = event.latlng;
+				marker.setLatLng(latlng);
+				var fieldname = data.mapLeafletFieldname;
+				var projection = $('select[name="' + fieldname + '.widgets.projection:list"]');
+				var params = {
+					point: {
+						longitude: latlng.lng,
+						latitude: latlng.lat
+					},
+					from_projection: PyAMS_GIS.WGS_SRID,
+					to_projection: projection.val()
+				};
+				PyAMS_GIS.callJSON('transformPoint', params, function(result) {
+					if (!result.error) {
+						var point = result.result.point;
+						$('input[name="' + fieldname + '.widgets.longitude"]').val(point.longitude);
+						$('input[name="' + fieldname + '.widgets.latitude"]').val(point.latitude);
+					}
+				});
+			},
+
+			changedCoordinate: function() {
+				var input = $(this);
+				var map = $('.map', input.parents('fieldset:first'));
+				if (!map.data('marker')) {
+					return;
+				}
+				var fieldname = map.data('map-leaflet-fieldname');
+				var longitude = $('input[name="' + fieldname + '.widgets.longitude"]');
+				var latitude = $('input[name="' + fieldname + '.widgets.latitude"]');
+				if (longitude.val() && latitude.val()) {
+					var projection = $('select[name="' + fieldname + '.widgets.projection:list"]');
+					var params = {
+						point: {
+							longitude: parseFloat(longitude.val()),
+							latitude: parseFloat(latitude.val())
+						},
+						from_projection: projection.val(),
+						to_projection: 4326
+					};
+					PyAMS_GIS.callJSON('transformPoint', params, function (result) {
+						if (!result.error) {
+							var point = result.result.point;
+							var marker = map.data('marker');
+							marker.setLatLng({
+								lon: point.longitude,
+								lat: point.latitude
+							});
+						}
+					});
+				}
+			},
+
+			changedProjection: function(event) {
+				var select = $(this);
+				var map = $('.map', select.parents('fieldset:first'));
+				var fieldname = map.data('map-leaflet-fieldname');
+				var longitude = $('input[name="' + fieldname + '.widgets.longitude"]');
+				var latitude = $('input[name="' + fieldname + '.widgets.latitude"]');
+				if (event.removed) {
+					var previous = event.removed.id;
+					var current = event.added.id;
+					if (previous !== current) {
+						if (longitude.val() && latitude.val()) {
+							var params = {
+								point: {
+									longitude: parseFloat(longitude.val()),
+									latitude: parseFloat(latitude.val())
+								},
+								from_projection: previous,
+								to_projection: current
+							};
+							PyAMS_GIS.callJSON('transformPoint', params, function (result) {
+								if (!result.error) {
+									var point = result.result.point;
+									longitude.val(point.longitude);
+									latitude.val(point.latitude);
+								}
+							});
+						}
+					}
+				} else {
+					PyAMS_GIS.position.changedCoordinate.apply(longitude);
+				}
+			},
+
+			clear: function(event) {
+				var fieldset = $(this).parents('fieldset:first');
+				$('input', fieldset).val(null);
+			}
+		},
+
+
+		/**
+		 * Single rectangular area management
+		 */
+		area: {
+
+			init: function () {
+				var map = $('.map', $(this));
+				if (map.data('leafmap') === undefined) {
+					map.css('height', $(window).height() - 200);
+					PyAMS_GIS.init(map, {}, function(leafmap) {
+						L.Draw = L.Draw || {};
+						L.Edit = L.Edit || {};
+						MyAMS.ajax.check([L.Draw, L.Draw.Event, L.Map.TouchExtend, L.Edit.SimpleShape],
+										 ['/--static--/pyams_gis/js/leaflet.Draw' + MyAMS.devext + '.js',
+										  '/--static--/pyams_gis/js/leaflet.Draw.Event' + MyAMS.devext + '.js',
+										  '/--static--/pyams_gis/js/TouchEvents' + MyAMS.devext + '.js',
+										  '/--static--/pyams_gis/js/Edit.SimpleShape' + MyAMS.devext + '.js'],
+										 function() {
+											MyAMS.ajax.check(L.Edit.Rectangle,
+															 '/--static--/pyams_gis/js/Edit.Rectangle' + MyAMS.devext + '.js',
+															 function () {
+
+																function initRectangle(p1, p2) {
+																	var group = new L.FeatureGroup();
+																	rectangle = L.rectangle([p1, p2]);
+																	group.addLayer(rectangle);
+																	leafmap.addLayer(group);
+																	leafmap.fitBounds(rectangle.getBounds());
+																	rectangle.editing.enable();
+																	map.data('area', rectangle);
+																	leafmap.on(L.Draw.Event.EDITMOVE, PyAMS_GIS.area.changedArea);
+																	leafmap.on(L.Draw.Event.EDITRESIZE, PyAMS_GIS.area.changedArea);
+																	leafmap.on(L.Draw.Event.EDITVERTEX, PyAMS_GIS.area.changedArea);
+																}
+
+																var data = map.data();
+																var fieldname = data.mapLeafletFieldname;
+																var x1 = $('input[name="' + fieldname + '.widgets.x1"]');
+																var y1 = $('input[name="' + fieldname + '.widgets.y1"]');
+																var x2 = $('input[name="' + fieldname + '.widgets.x2"]');
+																var y2 = $('input[name="' + fieldname + '.widgets.y2"]');
+																var p1,
+																	p2,
+																	rectangle;
+																if (x1.val() && y1.val() && x2.val() && y2.val()) {
+																	var projection = $('select[name="' + fieldname + '.widgets.projection:list"]');
+																	var params = {
+																		area: {
+																			x1: parseFloat(x1.val()),
+																			y1: parseFloat(y1.val()),
+																			x2: parseFloat(x2.val()),
+																			y2: parseFloat(y2.val())
+																		},
+																		from_projection: projection.val(),
+																		to_projection: PyAMS_GIS.WGS_SRID
+																	};
+																	PyAMS_GIS.callJSON('transformArea', params, function(result) {
+																		if (!result.error) {
+																			var area = result.result.area;
+																			p1 = L.latLng({lon: area.x1, lat: area.y1});
+																			p2 = L.latLng({lon: area.x2, lat: area.y2});
+																			initRectangle(p1, p2);
+																		}
+																	});
+																} else {
+																	p1 = L.latLng({lon: -168, lat: -56.37});
+																	p2 = L.latLng({lon: 191.25, lat: 83.72});
+																	initRectangle(p1, p2);
+																}
+															 });
+										 });
+					});
+				}
+			},
+
+			last_event: null,
+
+			changedArea: function(event) {
+				PyAMS_GIS.area.last_event = event;
+				setTimeout(function() {
+					if (event === PyAMS_GIS.area.last_event) {
+						var map = event.target.getContainer();
+						var data = $(map).data();
+						var area = data.area.getBounds();
+						var fieldname = data.mapLeafletFieldname;
+						var projection = $('select[name="' + fieldname + '.widgets.projection:list"]').val();
+						var params = {
+							area: {
+								x1: area.getWest(),
+								y1: area.getSouth(),
+								x2: area.getEast(),
+								y2: area.getNorth()
+							},
+							from_projection: PyAMS_GIS.WGS_SRID,
+							to_projection: projection
+						};
+						PyAMS_GIS.callJSON('transformArea', params, function(result) {
+							if (!result.error) {
+								var area = result.result.area;
+								$('input[name="' + fieldname + '.widgets.x1"]').val(area.x1);
+								$('input[name="' + fieldname + '.widgets.y1"]').val(area.y1);
+								$('input[name="' + fieldname + '.widgets.x2"]').val(area.x2);
+								$('input[name="' + fieldname + '.widgets.y2"]').val(area.y2);
+							}
+						});
+					}
+				}, 100);
+			},
+
+			changedCoordinate: function() {
+				var input = $(this);
+				var map = $('.map', input.parents('fieldset:first'));
+				if (!map.data('area')) {
+					return;
+				}
+				var fieldname = map.data('map-leaflet-fieldname');
+				var x1 = $('input[name="' + fieldname + '.widgets.x1"]');
+				var y1 = $('input[name="' + fieldname + '.widgets.y1"]');
+				var x2 = $('input[name="' + fieldname + '.widgets.x2"]');
+				var y2 = $('input[name="' + fieldname + '.widgets.y2"]');
+				if (x1.val() && y1.val() && x2.val() && y2.val()) {
+					var projection = $('select[name="' + fieldname + '.widgets.projection:list"]');
+					var params = {
+						area: {
+							x1: parseFloat(x1.val()),
+							y1: parseFloat(y1.val()),
+							x2: parseFloat(x2.val()),
+							y2: parseFloat(y2.val())
+						},
+						from_projection: projection.val(),
+						to_projection: 4326
+					};
+					PyAMS_GIS.callJSON('transformArea', params, function (result) {
+						if (!result.error) {
+							var area = result.result.area;
+							var rect = map.data('area');
+							rect.editing.disable();
+							rect.setBounds([L.latLng({lon: area.x1, lat: area.y1}),
+											L.latLng({lon: area.x2, lat: area.y2})]);
+							rect.editing.enable();
+						}
+					});
+				}
+			},
+
+			changedProjection: function(event) {
+				var select = $(this);
+				var map = $('.map', select.parents('fieldset:first'));
+				var fieldname = map.data('map-leaflet-fieldname');
+				var x1 = $('input[name="' + fieldname + '.widgets.x1"]');
+				var y1 = $('input[name="' + fieldname + '.widgets.y1"]');
+				var x2 = $('input[name="' + fieldname + '.widgets.x2"]');
+				var y2 = $('input[name="' + fieldname + '.widgets.y2"]');
+				if (event.removed) {
+					var previous = event.removed.id;
+					var current = event.added.id;
+					if (previous !== current) {
+						if (x1.val() && y1.val() && x2.val() && y2.val()) {
+							var params = {
+								area: {
+									x1: parseFloat(x1.val()),
+									y1: parseFloat(y1.val()),
+									x2: parseFloat(x2.val()),
+									y2: parseFloat(y2.val())
+								},
+								from_projection: previous,
+								to_projection: current
+							};
+							PyAMS_GIS.callJSON('transformArea', params, function (result) {
+								if (!result.error) {
+									var area = result.result.area;
+									x1.val(area.x1);
+									y1.val(area.y1);
+									x2.val(area.x2);
+									y2.val(area.y2);
+								}
+							});
+						}
+					}
+				} else {
+					PyAMS_GIS.area.changedCoordinate.apply(x1);
+				}
+			},
+
+			clear: function(event) {
+				var fieldset = $(this).parents('fieldset:first');
+				$('input', fieldset).val(null);
+			}
+		}
+	};
+	globals.PyAMS_GIS = PyAMS_GIS;
+
+})(jQuery, this);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/pyams_gis.min.js	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+(function(c,b){var d=b.MyAMS;var a;var e={RPC_ENDPOINT:"/api/gis/json",WGS_SRID:4326,_layersControlAddItem:function(m){var l=c("<div></div>").addClass("inline-group"),i=c("<label></label>").addClass(m.overlay?"checkbox":"radio"),g,j=c("<i></i>"),h,k=this._map.hasLayer(m.layer);if(m.overlay){g=document.createElement("input");g.type="checkbox";g.className="leaflet-control-layers-selector";g.defaultChecked=k}else{g=this._createRadioElement("leaflet-base-layers",k)}g.layerId=a.stamp(m.layer);c(g).addClass(m.overlay?"checkbox":"radio");a.DomEvent.on(g,"click",this._onInputClick,this);h=c("<span></span>").text(" "+m.name);i.append(g);i.append(j);i.append(h);l.append(i);var f=m.overlay?this._overlaysList:this._baseLayersList;c(f).append(l);return l},init:function(g,f,i){var h=g;d.ajax.check(b.L,"/--static--/pyams_gis/js/leaflet-1.0.3"+d.devext+".js",function(j){if(j){a=b.L;a.Control.Layers.prototype._addItem=e._layersControlAddItem;d.getCSS("/--static--/pyams_gis/css/leaflet-1.0.3"+d.devext+".css","leaflet")}d.ajax.post("get-map-configuration.json",{},function(m){var p=h.data();var n={preferCanvas:p.mapLeafletPreferCanvas||false,attributionControl:p.mapLeafletAttributionControl===undefined?m.attributionControl:p.mapLeafletAttributionControl,zoomControl:p.mapLeafletZoomControl===undefined?m.zoomControl:p.mapLeafletZoomControl,crs:p.mapLeafletCrs||d.getObject(m.crs)||b.L.CRS.EPSG3857,center:p.mapLeafletCenter||m.center,zoom:p.mapLeafletZoom||m.zoom};n=c.extend({},n,f);h.trigger("map.init",[h,n,m]);var o=a.map(h.attr("id"),n);if(m.layers){for(var l=0;l<m.layers.length;l++){var k=m.layers[l];h.trigger("map.layer.init",[h,k]);e.getLayer(k).addTo(o)}}else{a.tileLayer("http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{maxZoom:19,id:"osm",attribution:'&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'}).addTo(o)}if(m.zoomControl&&(p.mapLeafletHideZoomControl!==true)){a.control.scale().addTo(o)}if(m.bounds){o.fitBounds(m.bounds)}h.data("leafmap",o);h.data("leafmap.config",m);h.trigger("map.finishing",[h,o]);if(i){i(o,m)}h.trigger("map.finished",[h,o])})})},getLayer:function(i){var g=d.getObject(i.factory);if(g!==undefined){delete i.factory;var f=[];if(i.dependsOn){for(var h in i.dependsOn){if(!i.dependsOn.hasOwnProperty(h)){continue}if(d.getObject(h)===undefined){f.push(d.getScript(i.dependsOn[h]))}}delete i.dependsOn}if(f.length>0){c.when.apply(c,f)}return g(i)}},factory:{TileLayer:function(g){var f=g.url;delete g.url;return a.tileLayer(f,g)},WMS:function(g){var f=g.url;delete g.url;return a.tileLayer.wms(f,g)},Geoportal:{WMS:function(f){d.getCSS("/--static--/pyams_gis/css/leaflet-gp-3.0.2"+d.devext+".css","geoportal");return a.geoportalLayer.WMS(f)}},ESRI:{Feature:function(f){return a.esri.featureLayer(f)}},Google:function(g){var h=g.apiKey;delete g.apiKey;if(d.getObject("window.google.maps")===undefined){var f=d.getScript("https://maps.googleapis.com/maps/api/js?key="+h);c.when.apply(c,[f])}return a.gridLayer.googleMutant(g)}},callJSON:function(h,f,g){d.ajax.check(c.jsonRPC,d.baseURL+"ext/jquery-jsonrpc"+d.devext+".js",function(){c.jsonRPC.withOptions({endPoint:e.RPC_ENDPOINT,cache:false},function(){c.jsonRPC.request(h,{id:new Date().getTime(),params:f,success:g,error:d.error.show})})})},position:{init:function(){var f=c(".map",c(this));if(f.data("leafmap")===undefined){f.css("height",c(window).height()-200);e.init(f,{},function(o,h){var j=f.data();var p=a.icon({iconUrl:"/--static--/pyams_gis/img/marker-icon.png",iconSize:[25,41],iconAnchor:[13,40]});var k=a.marker();k.setIcon(p);var m=j.mapLeafletFieldname;var g=c('input[name="'+m+'.widgets.longitude"]');var n=c('input[name="'+m+'.widgets.latitude"]');if(g.val()&&n.val()){var l=c('select[name="'+m+'.widgets.projection:list"]');var i={point:{longitude:parseFloat(g.val()),latitude:parseFloat(n.val())},from_projection:l.val()||e.WGS_SRID,to_projection:e.WGS_SRID};e.callJSON("transformPoint",i,function(r){if(!r.error){var q=r.result.point;k.setLatLng({lon:q.longitude,lat:q.latitude});k.addTo(o);o.setView(k.getLatLng(),h.zoom||13)}})}else{k.setLatLng([-90,0]);k.addTo(o)}f.data("marker",k);o.on("click",e.position.onClick)})}},onClick:function(i){var k=i.target.getContainer();var j=c(k).data();var g=j.marker;var m=i.latlng;g.setLatLng(m);var h=j.mapLeafletFieldname;var f=c('select[name="'+h+'.widgets.projection:list"]');var l={point:{longitude:m.lng,latitude:m.lat},from_projection:e.WGS_SRID,to_projection:f.val()};e.callJSON("transformPoint",l,function(o){if(!o.error){var n=o.result.point;c('input[name="'+h+'.widgets.longitude"]').val(n.longitude);c('input[name="'+h+'.widgets.latitude"]').val(n.latitude)}})},changedCoordinate:function(){var h=c(this);var j=c(".map",h.parents("fieldset:first"));if(!j.data("marker")){return}var g=j.data("map-leaflet-fieldname");var i=c('input[name="'+g+'.widgets.longitude"]');var l=c('input[name="'+g+'.widgets.latitude"]');if(i.val()&&l.val()){var f=c('select[name="'+g+'.widgets.projection:list"]');var k={point:{longitude:parseFloat(i.val()),latitude:parseFloat(l.val())},from_projection:f.val(),to_projection:4326};e.callJSON("transformPoint",k,function(n){if(!n.error){var m=n.result.point;var o=j.data("marker");o.setLatLng({lon:m.longitude,lat:m.latitude})}})}},changedProjection:function(h){var n=c(this);var g=c(".map",n.parents("fieldset:first"));var k=g.data("map-leaflet-fieldname");var f=c('input[name="'+k+'.widgets.longitude"]');var m=c('input[name="'+k+'.widgets.latitude"]');if(h.removed){var j=h.removed.id;var l=h.added.id;if(j!==l){if(f.val()&&m.val()){var i={point:{longitude:parseFloat(f.val()),latitude:parseFloat(m.val())},from_projection:j,to_projection:l};e.callJSON("transformPoint",i,function(p){if(!p.error){var o=p.result.point;f.val(o.longitude);m.val(o.latitude)}})}}}else{e.position.changedCoordinate.apply(f)}},clear:function(g){var f=c(this).parents("fieldset:first");c("input",f).val(null)}},area:{init:function(){var f=c(".map",c(this));if(f.data("leafmap")===undefined){f.css("height",c(window).height()-200);e.init(f,{},function(g){a.Draw=a.Draw||{};a.Edit=a.Edit||{};d.ajax.check([a.Draw,a.Draw.Event,a.Map.TouchExtend,a.Edit.SimpleShape],["/--static--/pyams_gis/js/leaflet.Draw"+d.devext+".js","/--static--/pyams_gis/js/leaflet.Draw.Event"+d.devext+".js","/--static--/pyams_gis/js/TouchEvents"+d.devext+".js","/--static--/pyams_gis/js/Edit.SimpleShape"+d.devext+".js"],function(){d.ajax.check(a.Edit.Rectangle,"/--static--/pyams_gis/js/Edit.Rectangle"+d.devext+".js",function(){function h(v,u){var t=new a.FeatureGroup();p=a.rectangle([v,u]);t.addLayer(p);g.addLayer(t);g.fitBounds(p.getBounds());p.editing.enable();f.data("area",p);g.on(a.Draw.Event.EDITMOVE,e.area.changedArea);g.on(a.Draw.Event.EDITRESIZE,e.area.changedArea);g.on(a.Draw.Event.EDITVERTEX,e.area.changedArea)}var l=f.data();var n=l.mapLeafletFieldname;var j=c('input[name="'+n+'.widgets.x1"]');var q=c('input[name="'+n+'.widgets.y1"]');var i=c('input[name="'+n+'.widgets.x2"]');var o=c('input[name="'+n+'.widgets.y2"]');var s,r,p;if(j.val()&&q.val()&&i.val()&&o.val()){var m=c('select[name="'+n+'.widgets.projection:list"]');var k={area:{x1:parseFloat(j.val()),y1:parseFloat(q.val()),x2:parseFloat(i.val()),y2:parseFloat(o.val())},from_projection:m.val(),to_projection:e.WGS_SRID};e.callJSON("transformArea",k,function(t){if(!t.error){var u=t.result.area;s=a.latLng({lon:u.x1,lat:u.y1});r=a.latLng({lon:u.x2,lat:u.y2});h(s,r)}})}else{s=a.latLng({lon:-168,lat:-56.37});r=a.latLng({lon:191.25,lat:83.72});h(s,r)}})})})}},last_event:null,changedArea:function(f){e.area.last_event=f;setTimeout(function(){if(f===e.area.last_event){var k=f.target.getContainer();var j=c(k).data();var i=j.area.getBounds();var h=j.mapLeafletFieldname;var g=c('select[name="'+h+'.widgets.projection:list"]').val();var l={area:{x1:i.getWest(),y1:i.getSouth(),x2:i.getEast(),y2:i.getNorth()},from_projection:e.WGS_SRID,to_projection:g};e.callJSON("transformArea",l,function(m){if(!m.error){var n=m.result.area;c('input[name="'+h+'.widgets.x1"]').val(n.x1);c('input[name="'+h+'.widgets.y1"]').val(n.y1);c('input[name="'+h+'.widgets.x2"]').val(n.x2);c('input[name="'+h+'.widgets.y2"]').val(n.y2)}})}},100)},changedCoordinate:function(){var n=c(this);var f=c(".map",n.parents("fieldset:first"));if(!f.data("area")){return}var j=f.data("map-leaflet-fieldname");var h=c('input[name="'+j+'.widgets.x1"]');var m=c('input[name="'+j+'.widgets.y1"]');var g=c('input[name="'+j+'.widgets.x2"]');var l=c('input[name="'+j+'.widgets.y2"]');if(h.val()&&m.val()&&g.val()&&l.val()){var k=c('select[name="'+j+'.widgets.projection:list"]');var i={area:{x1:parseFloat(h.val()),y1:parseFloat(m.val()),x2:parseFloat(g.val()),y2:parseFloat(l.val())},from_projection:k.val(),to_projection:4326};e.callJSON("transformArea",i,function(o){if(!o.error){var q=o.result.area;var p=f.data("area");p.editing.disable();p.setBounds([a.latLng({lon:q.x1,lat:q.y1}),a.latLng({lon:q.x2,lat:q.y2})]);p.editing.enable()}})}},changedProjection:function(g){var p=c(this);var f=c(".map",p.parents("fieldset:first"));var l=f.data("map-leaflet-fieldname");var i=c('input[name="'+l+'.widgets.x1"]');var o=c('input[name="'+l+'.widgets.y1"]');var h=c('input[name="'+l+'.widgets.x2"]');var n=c('input[name="'+l+'.widgets.y2"]');if(g.removed){var k=g.removed.id;var m=g.added.id;if(k!==m){if(i.val()&&o.val()&&h.val()&&n.val()){var j={area:{x1:parseFloat(i.val()),y1:parseFloat(o.val()),x2:parseFloat(h.val()),y2:parseFloat(n.val())},from_projection:k,to_projection:m};e.callJSON("transformArea",j,function(q){if(!q.error){var r=q.result.area;i.val(r.x1);o.val(r.y1);h.val(r.x2);n.val(r.y2)}})}}}else{e.area.changedCoordinate.apply(i)}},clear:function(g){var f=c(this).parents("fieldset:first");c("input",f).val(null)}}};b.PyAMS_GIS=e})(jQuery,this);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/rpc/__init__.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2008-2017 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+
+# import packages
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/rpc/json/__init__.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,81 @@
+#
+# Copyright (c) 2008-2017 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+try:
+    from osgeo.osr import SpatialReference, CoordinateTransformation
+    have_gdal = True
+except ImportError:
+    have_gdal = False
+
+# import interfaces
+
+# import packages
+from pyramid_rpc.jsonrpc import jsonrpc_method
+
+
+@jsonrpc_method(endpoint='gis')
+def transformPoint(request, point, from_projection, to_projection):
+    """Transform point given in source projection to another projection
+
+    :param point: point coordinates given as a mapping with 'longitude' and 'latitude' values
+    :param from_projection: source coordinates system given as SRID
+    :param to_projection: target coordinates system given as SRID
+    :return: mapping with new 'point' key containing transformed coordinates, and 'projection'
+        key containing SRID of result projection system
+    """
+    from_projection = int(from_projection)
+    to_projection = int(to_projection)
+    if (not have_gdal) or (from_projection == to_projection):
+        return {'point': point,
+                'projection': from_projection}
+    source = SpatialReference()
+    source.ImportFromEPSG(from_projection)
+    destination = SpatialReference()
+    destination.ImportFromEPSG(to_projection)
+    target = CoordinateTransformation(source, destination).TransformPoint(point['longitude'],
+                                                                          point['latitude'])
+    return {'point': {'longitude': target[0],
+                      'latitude': target[1]},
+            'projection': to_projection}
+
+
+@jsonrpc_method(endpoint='gis')
+def transformArea(request, area, from_projection, to_projection):
+    """Transform area given in source projection to another projection
+
+    :param area: area coordinates given as a mapping with 'x1', 'y1', 'x2', and 'y2' values
+    :param from_projection: source coordinates system given as SRID
+    :param to_projection: target coordinates system given as SRID
+    :return: mapping with new 'area' key containing transformed coordinates, and 'projection'
+        key containing SRID of result projection system
+    """
+    from_projection = int(from_projection)
+    to_projection = int(to_projection)
+    if (not have_gdal) or (from_projection == to_projection):
+        return {'area': area,
+                'projection': from_projection}
+    source = SpatialReference()
+    source.ImportFromEPSG(from_projection)
+    destination = SpatialReference()
+    destination.ImportFromEPSG(to_projection)
+    transformation = CoordinateTransformation(source, destination)
+    point1 = transformation.TransformPoint(area['x1'], area['y1'])
+    point2 = transformation.TransformPoint(area['x2'], area['y2'])
+    return {'area': {'x1': point1[0],
+                     'y1': point1[1],
+                     'x2': point2[0],
+                     'y2': point2[1]},
+            'projection': to_projection}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/schema.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,66 @@
+#
+# Copyright (c) 2008-2017 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_gis.interfaces import IGeoPoint, IGeoPointZ, IGeoArea
+from zope.schema.interfaces import IObject
+
+# import packages
+from zope.interface import implementer
+from zope.schema import Object
+
+
+class IGeoPointField(IObject):
+    """GeoPoint schema field interface"""
+
+
+@implementer(IGeoPointField)
+class GeoPointField(Object):
+    """GeoPoint field class"""
+
+    def __init__(self, **kwargs):
+        if 'schema' in kwargs:
+            del kwargs['schema']
+        super(GeoPointField, self).__init__(IGeoPoint, **kwargs)
+
+
+class IGeoPointZField(IObject):
+    """GeoPointZ schema field interface"""
+
+
+@implementer(IGeoPointZField)
+class GeoPointZField(Object):
+    """GeoPointZ field class"""
+
+    def __init__(self, **kwargs):
+        if 'schema' in kwargs:
+            del kwargs['schema']
+        super(GeoPointZField, self).__init__(IGeoPointZ, **kwargs)
+
+
+class IGeoAreaField(IObject):
+    """GeoArea schema field interface"""
+
+
+@implementer(IGeoAreaField)
+class GeoAreaField(Object):
+    """GeoArea field class"""
+
+    def __init__(self, **kwargs):
+        if 'schema' in kwargs:
+            del kwargs['schema']
+        super(GeoAreaField, self).__init__(IGeoArea, **kwargs)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/site.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,48 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_gis.interfaces.utility import IMapManager
+from pyams_utils.interfaces.site import ISiteGenerations
+from zope.site.interfaces import INewLocalSite
+
+# import packages
+from pyams_gis.utility import MapManager
+from pyams_utils.registry import utility_config
+from pyams_utils.site import check_required_utilities
+from pyramid.events import subscriber
+
+
+REQUIRED_UTILITIES = ((IMapManager, '', MapManager, 'Maps manager'), )
+
+
+@subscriber(INewLocalSite)
+def handle_new_local_site(event):
+    """Create a new map manager when a site is created"""
+    site = event.manager.__parent__
+    check_required_utilities(site, REQUIRED_UTILITIES)
+
+
+@utility_config(name='PyAMS GIS', provides=ISiteGenerations)
+class MapGenerationsChecker(object):
+    """Maps generations checker"""
+
+    generation = 1
+
+    def evolve(self, site, current=None):
+        """Check for required utilities"""
+        check_required_utilities(site, REQUIRED_UTILITIES)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/tests/__init__.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/tests/test_utilsdocs.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,59 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+"""
+Generic Test case for pyams_gis doctest
+"""
+__docformat__ = 'restructuredtext'
+
+import unittest
+import doctest
+import sys
+import os
+
+
+current_dir = os.path.dirname(__file__)
+
+def doc_suite(test_dir, setUp=None, tearDown=None, globs=None):
+    """Returns a test suite, based on doctests found in /doctest."""
+    suite = []
+    if globs is None:
+        globs = globals()
+
+    flags = (doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE |
+             doctest.REPORT_ONLY_FIRST_FAILURE)
+
+    package_dir = os.path.split(test_dir)[0]
+    if package_dir not in sys.path:
+        sys.path.append(package_dir)
+
+    doctest_dir = os.path.join(package_dir, 'doctests')
+
+    # filtering files on extension
+    docs = [os.path.join(doctest_dir, doc) for doc in
+            os.listdir(doctest_dir) if doc.endswith('.txt')]
+
+    for test in docs:
+        suite.append(doctest.DocFileSuite(test, optionflags=flags,
+                                          globs=globs, setUp=setUp,
+                                          tearDown=tearDown,
+                                          module_relative=False))
+
+    return unittest.TestSuite(suite)
+
+def test_suite():
+    """returns the test suite"""
+    return doc_suite(current_dir)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/tests/test_utilsdocstrings.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,62 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+"""
+Generic Test case for pyams_gis doc strings
+"""
+__docformat__ = 'restructuredtext'
+
+import unittest
+import doctest
+import sys
+import os
+
+
+current_dir = os.path.abspath(os.path.dirname(__file__))
+
+def doc_suite(test_dir, globs=None):
+    """Returns a test suite, based on doc tests strings found in /*.py"""
+    suite = []
+    if globs is None:
+        globs = globals()
+
+    flags = (doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE |
+             doctest.REPORT_ONLY_FIRST_FAILURE)
+
+    package_dir = os.path.split(test_dir)[0]
+    if package_dir not in sys.path:
+        sys.path.append(package_dir)
+
+    # filtering files on extension
+    docs = [doc for doc in
+            os.listdir(package_dir) if doc.endswith('.py')]
+    docs = [doc for doc in docs if not doc.startswith('__')]
+
+    for test in docs:
+        fd = open(os.path.join(package_dir, test))
+        content = fd.read()
+        fd.close()
+        if '>>> ' not in content:
+            continue
+        test = test.replace('.py', '')
+        location = 'pyams_gis.%s' % test
+        suite.append(doctest.DocTestSuite(location, optionflags=flags,
+                                          globs=globs))
+
+    return unittest.TestSuite(suite)
+
+def test_suite():
+    """returns the test suite"""
+    return doc_suite(current_dir)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/utility.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,47 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_gis.interfaces.configuration import IMapConfigurationTarget
+from pyams_gis.interfaces.utility import IMapManager
+from pyams_i18n.interfaces import II18n
+
+# import packages
+from pyams_utils.registry import get_utility
+from pyams_utils.request import check_request
+from pyams_utils.vocabulary import vocabulary_config
+from zope.container.folder import Folder
+from zope.interface import implementer
+from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
+
+
+@implementer(IMapManager, IMapConfigurationTarget)
+class MapManager(Folder):
+    """Map manager utility"""
+
+
+@vocabulary_config(name='PyAMS map layers')
+class MapLayersVocabulary(SimpleVocabulary):
+    """Map manager layers vocabulary"""
+
+    def __init__(self, context):
+        request = check_request()
+        manager = get_utility(IMapManager)
+        super(MapLayersVocabulary, self).__init__([SimpleTerm(layer.__name__,
+                                                              title=II18n(layer).query_attribute('title',
+                                                                                                 request=request))
+                                                   for layer in manager.values()])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/widget/__init__.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2008-2017 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+
+# import packages
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/widget/area.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,97 @@
+#
+# Copyright (c) 2008-2017 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+import json
+
+# import interfaces
+from pyams_form.interfaces.form import IFormLayer, IForm
+from pyams_gis.interfaces import IGeoArea
+from pyams_gis.interfaces.widget import IGeoAreaWidget
+from pyams_gis.schema import IGeoAreaField
+from pyams_utils.interfaces.data import IObjectData
+from z3c.form.interfaces import IFieldWidget, IObjectFactory
+
+# import packages
+from pyams_form.widget import widgettemplate_config
+from pyams_gis.area import GeoArea
+from pyams_utils.adapter import adapter_config
+from z3c.form.browser.object import ObjectWidget
+from z3c.form.object import getIfName
+from z3c.form.widget import FieldWidget
+from zope.interface import implementer_only, alsoProvides, Interface
+
+
+@adapter_config(name=getIfName(IGeoArea),
+                context=(Interface, IFormLayer, IForm, IGeoAreaWidget), provides=IObjectFactory)
+class GeoAreaObjectFactory(object):
+    """GeoArea object factory"""
+
+    def __init__(self, context, request, form, widget):
+        self.context = context
+        self.request = request
+        self.form = form
+        self.widget = widget
+
+    def __call__(self, data):
+        result = GeoArea()
+        for name, value in data.items():
+            setattr(result, name, value)
+        return result
+
+
+@widgettemplate_config(mode='input', template='templates/geoarea-input.pt', layer=IFormLayer)
+@implementer_only(IGeoAreaWidget)
+class GeoAreaWidget(ObjectWidget):
+    """GeoArea widget"""
+
+    def updateWidgets(self, setErrors=True):
+        super(GeoAreaWidget, self).updateWidgets()
+        widgets = self.subform.widgets
+        widgets['x1'].input_css_class = 'col-md-2'
+        widgets['y1'].input_css_class = 'col-md-2'
+        widgets['x2'].input_css_class = 'col-md-2'
+        widgets['y2'].input_css_class = 'col-md-2'
+        widgets['x1'].object_data = {'ams-change-handler': 'PyAMS_GIS.area.changedCoordinate'}
+        widgets['y1'].object_data = {'ams-change-handler': 'PyAMS_GIS.area.changedCoordinate'}
+        widgets['x2'].object_data = {'ams-change-handler': 'PyAMS_GIS.area.changedCoordinate'}
+        widgets['y2'].object_data = {'ams-change-handler': 'PyAMS_GIS.area.changedCoordinate'}
+        widgets['projection'].object_data = {'ams-events-handlers': {'change.select2': 'PyAMS_GIS.area.changedProjection'}}
+        alsoProvides(widgets['x1'], IObjectData)
+        alsoProvides(widgets['y1'], IObjectData)
+        alsoProvides(widgets['x2'], IObjectData)
+        alsoProvides(widgets['y2'], IObjectData)
+        alsoProvides(widgets['projection'], IObjectData)
+
+    @property
+    def wgs_coordinates(self):
+        value = self.field.get(self.field.interface(self.context))
+        if not value:
+            return json.dumps({'x1': None,
+                               'y1': None,
+                               'x2': None,
+                               'y2': None})
+        else:
+            point1, point2 = value.wgs_coordinates
+            return json.dumps({'x1': float(point1[0]),
+                               'y1': float(point1[1]),
+                               'x2': float(point2[0]),
+                               'y2': float(point2[1])})
+
+
+@adapter_config(context=(IGeoAreaField, IFormLayer), provides=IFieldWidget)
+def GeoAreaFieldWidget(field, request):
+    """GeoArea field widget factory"""
+    return FieldWidget(field, GeoAreaWidget(request))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/widget/point.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,141 @@
+#
+# Copyright (c) 2008-2017 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+import json
+
+# import interfaces
+from pyams_gis.interfaces import IGeoPointZ
+from pyams_form.interfaces.form import IFormLayer, IForm
+from pyams_gis.interfaces.widget import IGeoPointWidget, IGeoPointZWidget
+from pyams_gis.schema import IGeoPoint, IGeoPointField, IGeoPointZField
+from pyams_utils.interfaces.data import IObjectData
+from z3c.form.interfaces import IFieldWidget, IObjectFactory
+
+# import packages
+from pyams_form.widget import widgettemplate_config
+from pyams_gis.point import GeoPoint, GeoPointZ
+from pyams_utils.adapter import adapter_config
+from z3c.form.browser.object import ObjectWidget
+from z3c.form.object import getIfName
+from z3c.form.widget import FieldWidget
+from zope.interface import implementer_only, alsoProvides, Interface
+
+
+@adapter_config(name=getIfName(IGeoPoint),
+                context=(Interface, IFormLayer, IForm, IGeoPointWidget), provides=IObjectFactory)
+class GeoPointObjectFactory(object):
+    """GeoPointZ object factory"""
+
+    def __init__(self, context, request, form, widget):
+        self.context = context
+        self.request = request
+        self.form = form
+        self.widget = widget
+
+    def __call__(self, data):
+        result = GeoPoint()
+        for name, value in data.items():
+            setattr(result, name, value)
+        return result
+
+
+@widgettemplate_config(mode='input', template='templates/geopoint-input.pt', layer=IFormLayer)
+@implementer_only(IGeoPointWidget)
+class GeoPointWidget(ObjectWidget):
+    """GeoPoint widget"""
+
+    def updateWidgets(self, setErrors=True):
+        super(GeoPointWidget, self).updateWidgets(setErrors)
+        widgets = self.subform.widgets
+        widgets['longitude'].input_css_class = 'col-md-2'
+        widgets['latitude'].input_css_class = 'col-md-2'
+        widgets['longitude'].object_data = {'ams-change-handler': 'PyAMS_GIS.position.changedCoordinate'}
+        widgets['latitude'].object_data = {'ams-change-handler': 'PyAMS_GIS.position.changedCoordinate'}
+        widgets['projection'].object_data = {'ams-events-handlers': {'change.select2': 'PyAMS_GIS.position.changedProjection'}}
+        alsoProvides(widgets['longitude'], IObjectData)
+        alsoProvides(widgets['latitude'], IObjectData)
+        alsoProvides(widgets['projection'], IObjectData)
+
+    @property
+    def wgs_coordinates(self):
+        value = self.field.get(self.field.interface(self.context))
+        if not value:
+            return json.dumps({'longitude': None,
+                               'latitude': None})
+        else:
+            point = value.wgs_coordinates
+            return json.dumps({'longitude': float(point[0]),
+                               'latitude': float(point[1])})
+
+
+@adapter_config(context=(IGeoPointField, IFormLayer), provides=IFieldWidget)
+def GeoPointFieldWidget(field, request):
+    """GeoPoint field widget factory"""
+    return FieldWidget(field, GeoPointWidget(request))
+
+
+@adapter_config(name=getIfName(IGeoPointZ),
+                context=(Interface, IFormLayer, IForm, IGeoPointZWidget), provides=IObjectFactory)
+class GeoPointZObjectFactory(object):
+    """GeoPointZ object factory"""
+
+    def __init__(self, context, request, form, widget):
+        self.context = context
+        self.request = request
+        self.form = form
+        self.widget = widget
+
+    def __call__(self, data):
+        result = GeoPointZ()
+        for name, value in data.items():
+            setattr(result, name, value)
+        return result
+
+
+@widgettemplate_config(mode='input', template='templates/geopoint-input.pt', layer=IFormLayer)
+@implementer_only(IGeoPointZWidget)
+class GeoPointZWidget(ObjectWidget):
+    """GeoPointZ widget"""
+
+    def updateWidgets(self, setErrors=True):
+        super(GeoPointZWidget, self).updateWidgets(setErrors)
+        widgets = self.subform.widgets
+        widgets['longitude'].input_css_class = 'col-md-2'
+        widgets['latitude'].input_css_class = 'col-md-2'
+        widgets['altitude'].input_css_class = 'col-md-2'
+        widgets['longitude'].object_data = {'ams-change-handler': 'PyAMS_GIS.position.changedCoordinate'}
+        widgets['latitude'].object_data = {'ams-change-handler': 'PyAMS_GIS.position.changedCoordinate'}
+        widgets['projection'].object_data = {'ams-events-handlers': {'change.select2': 'PyAMS_GIS.position.changedProjection'}}
+        alsoProvides(widgets['longitude'], IObjectData)
+        alsoProvides(widgets['latitude'], IObjectData)
+        alsoProvides(widgets['projection'], IObjectData)
+
+    @property
+    def wgs_coordinates(self):
+        value = self.field.get(self.field.interface(self.context))
+        if not value:
+            return json.dumps({'longitude': None,
+                               'latitude': None})
+        else:
+            point = value.wgs_coordinates
+            return json.dumps({'longitude': float(point[0]),
+                               'latitude': float(point[1])})
+
+
+@adapter_config(context=(IGeoPointZField, IFormLayer), provides=IFieldWidget)
+def GeoPointZFieldWidget(field, request):
+    """GeoPointZ field widget factory"""
+    return FieldWidget(field, GeoPointZWidget(request))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/widget/templates/geoarea-input.pt	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,76 @@
+<div class="object-widget" tal:attributes="class view/klass" i18n:domain="pyams_gis">
+	<fieldset
+		tal:define="name python:view.name.replace('.','_')"
+		data-ams-plugins="pyams_gis"
+		tal:attributes="data-ams-plugin-pyams_gis-src extension:resource_path('pyams_gis:pyams_gis')"
+		data-ams-plugin-pyams_gis-async="false">
+		<button class="btn pull-right" tal:attributes="href string:#modal_dialog_${name}"
+			data-ams-click-handler="PyAMS_GIS.area.clear">
+			<i class="fa fa-fw fa-lg fa-trash hint opaque align-base"
+			   data-ams-hint-gravity="se" data-ams-hint-offset="10"
+			   title="Remove area settings" i18n:attributes="title"></i>
+		</button>
+		<button class="btn pull-right" tal:attributes="href string:#modal_dialog_${name}" data-toggle="modal">
+			<i class="fa fa-fw fa-lg fa-map-marker hint opaque align-base"
+			   data-ams-hint-gravity="se" data-ams-hint-offset="10"
+			   title="Select area from map" i18n:attributes="title"></i>
+		</button>
+		<div id="modal_dialog" class="modal fade"
+			 tal:attributes="id string:modal_dialog_${name}"
+			 data-ams-events-handlers='{"show.bs.modal": "PyAMS_GIS.area.init"}'>
+			<div class="modal-dialog modal-max">
+				<div class="modal-content">
+					<div class="modal-header">
+						<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
+							<i class="fa fa-fw fa-times-circle"></i>
+						</button>
+						<h3 class="modal-title">
+							<span class="title" i18n:translate="">Select map area</span>
+						</h3>
+					</div>
+					<div class="ams-form">
+						<div class="modal-body">
+							<div class="map" id="map_area" style="width: 100%; height: 600px;"
+								 data-map-leaflet-fieldname="fieldname"
+								 tal:attributes="id string:map_area_${name};
+												 data-map-leaflet-fieldname view/name;"></div>
+						</div>
+						<footer>
+							<button type="button" class="btn btn-primary close-widget" data-dismiss="modal">OK</button>
+						</footer>
+					</div>
+				</div>
+			</div>
+		</div>
+		<tal:loop repeat="widget view/subform/widgets/values">
+			<input type="hidden"
+				   tal:condition="python:widget.mode == 'hidden'"
+				   tal:replace="structure widget/render" />
+			<tal:if condition="python:widget.mode != 'hidden'">
+				<div tal:define="required python:'required-field' if widget.required and (widget.mode != 'display') else ''"
+					 tal:attributes="class string:form-group ${required}">
+					<label class="control-label col-md-3"
+						   tal:attributes="class widget/label_css_class | group/label_css_class | view/label_css_class | default">
+						<span>
+							<tal:var content="python:request.localizer.translate(widget.label)" />
+							<i class="fa fa-question-circle hint" title="Input hint"
+							   tal:define="description python:getattr(widget, 'description', widget.field.description)"
+							   tal:condition="description"
+							   tal:attributes="title description;
+											   data-ams-hint-html python:'<' in description;"></i>
+						</span>
+					</label>
+					<div class="col-md-9"
+						 tal:attributes="class widget/input_css_class | group/input_css_class | view/input_css_class | default">
+						<label class="input"
+							   tal:attributes="class widget/widget_css_class | default;">
+							<input tal:replace="structure widget/render" />
+						</label>
+					</div>
+				</div>
+			</tal:if>
+		</tal:loop>
+		<input name="field-empty-marker" type="hidden" value="1"
+			   tal:attributes="name string:${view/name}-empty-marker" />
+	</fieldset>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/widget/templates/geopoint-input.pt	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,76 @@
+<div class="object-widget" tal:attributes="class view/klass" i18n:domain="pyams_gis">
+	<fieldset
+		tal:define="name python:view.name.replace('.','_')"
+		data-ams-plugins="pyams_gis"
+		tal:attributes="data-ams-plugin-pyams_gis-src extension:resource_path('pyams_gis:pyams_gis')"
+		data-ams-plugin-pyams_gis-async="false">
+		<button class="btn pull-right" tal:attributes="href string:#modal_dialog_${name}"
+			data-ams-click-handler="PyAMS_GIS.position.clear">
+			<i class="fa fa-fw fa-lg fa-trash hint opaque align-base"
+			   data-ams-hint-gravity="se" data-ams-hint-offset="10"
+			   title="Remove position settings" i18n:attributes="title"></i>
+		</button>
+		<button class="btn pull-right" tal:attributes="href string:#modal_dialog_${name}" data-toggle="modal">
+			<i class="fa fa-fw fa-lg fa-map-marker hint opaque align-base"
+			   data-ams-hint-gravity="se" data-ams-hint-offset="10"
+			   title="Select location from map" i18n:attributes="title"></i>
+		</button>
+		<div id="modal_dialog" class="modal fade"
+			 tal:attributes="id string:modal_dialog_${name}"
+			 data-ams-events-handlers='{"show.bs.modal": "PyAMS_GIS.position.init"}'>
+			<div class="modal-dialog modal-max">
+				<div class="modal-content">
+					<div class="modal-header">
+						<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
+							<i class="fa fa-fw fa-times-circle"></i>
+						</button>
+						<h3 class="modal-title">
+							<span class="title" i18n:translate="">Select marker position</span>
+						</h3>
+					</div>
+					<div class="ams-form">
+						<div class="modal-body">
+							<div class="map" id="map_location" style="width: 100%; height: 600px;"
+								 data-map-leaflet-fieldname="fieldname"
+								 tal:attributes="id string:map_location_${name};
+												 data-map-leaflet-fieldname view/name;"></div>
+						</div>
+						<footer>
+							<button type="button" class="btn btn-primary close-widget" data-dismiss="modal">OK</button>
+						</footer>
+					</div>
+				</div>
+			</div>
+		</div>
+		<tal:loop repeat="widget view/subform/widgets/values">
+			<input type="hidden"
+				   tal:condition="python:widget.mode == 'hidden'"
+				   tal:replace="structure widget/render" />
+			<tal:if condition="python:widget.mode != 'hidden'">
+				<div tal:define="required python:'required-field' if widget.required and (widget.mode != 'display') else ''"
+					 tal:attributes="class string:form-group ${required}">
+					<label class="control-label col-md-3"
+						   tal:attributes="class widget/label_css_class | group/label_css_class | view/label_css_class | default">
+						<span>
+							<tal:var content="python:request.localizer.translate(widget.label)" />
+							<i class="fa fa-question-circle hint" title="Input hint"
+							   tal:define="description python:getattr(widget, 'description', widget.field.description)"
+							   tal:condition="description"
+							   tal:attributes="title description;
+											   data-ams-hint-html python:'<' in description;"></i>
+						</span>
+					</label>
+					<div class="col-md-9"
+						 tal:attributes="class widget/input_css_class | group/input_css_class | view/input_css_class | default">
+						<label class="input"
+							   tal:attributes="class widget/widget_css_class | default;">
+							<input tal:replace="structure widget/render" />
+						</label>
+					</div>
+				</div>
+			</tal:if>
+		</tal:loop>
+		<input name="field-empty-marker" type="hidden" value="1"
+			   tal:attributes="name string:${view/name}-empty-marker" />
+	</fieldset>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/zmi/__init__.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+
+# import packages
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/zmi/interfaces.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,30 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_skin.interfaces.viewlet import IMenuItem
+
+# import packages
+from zope.interface import Interface
+
+
+class IMapManagerMenu(IMenuItem):
+    """Map manager menu interface"""
+
+
+class ILayerAddForm(Interface):
+    """Layer add form marker interface"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/zmi/layer.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,440 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_form.form import AJAXAddForm, AJAXEditForm
+from pyams_gis.interfaces.layer import ITileMapLayer, IWMSMapLayer, IGeoportalMapLayer, IEsriFeatureMapLayer, \
+    IGoogleMapLayer
+from pyams_gis.interfaces.utility import IMapManager
+from pyams_gis.layer import TileMapLayer, WMSMapLayer, GeoportalMapLayer, EsriFeatureMapLayer, GoogleMapLayer
+from pyams_gis.zmi.interfaces import ILayerAddForm
+from pyams_i18n.interfaces import II18n
+from pyams_skin.interfaces.viewlet import IToolbarAddingMenu
+from pyams_skin.layer import IPyAMSLayer
+from pyams_utils.interfaces import MANAGE_SYSTEM_PERMISSION, VIEW_SYSTEM_PERMISSION
+from pyams_zmi.layer import IAdminLayer
+from z3c.form.interfaces import IDataExtractedEvent, DISPLAY_MODE
+from zope.component.interfaces import ISite
+
+# import packages
+from pyams_gis.zmi.utility import MapManagerLayersTable
+from pyams_pagelet.pagelet import pagelet_config
+from pyams_skin.viewlet.toolbar import ToolbarMenuItem
+from pyams_utils.registry import query_utility
+from pyams_utils.url import absolute_url
+from pyams_viewlet.viewlet import viewlet_config
+from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
+from pyramid.events import subscriber
+from pyramid.view import view_config
+from z3c.form import field
+from zope.interface import implementer, Invalid
+
+from pyams_gis import _
+
+
+@subscriber(IDataExtractedEvent, form_selector=ILayerAddForm)
+def handle_new_geoportal_layer_data(event):
+    """Handle new layer data extraction"""
+    manager = query_utility(IMapManager)
+    name = event.data.get('name')
+    if name in manager:
+        event.form.widgets.errors += (Invalid(_("Specified layer name already exists!")))
+
+
+#
+# Base tiles layer forms
+#
+
+@viewlet_config(name='add-tile-layer.menu', context=ISite, layer=IAdminLayer,
+                view=MapManagerLayersTable, manager=IToolbarAddingMenu,
+                permission=MANAGE_SYSTEM_PERMISSION, weight=10)
+class TileLayerAddMenu(ToolbarMenuItem):
+    """Tile layer add menu"""
+
+    label = _("Add tile layer...")
+    label_css_class = 'fa fa-fw fa-globe'
+    url = 'add-tile-layer.html'
+    modal_target = True
+
+
+@pagelet_config(name='add-tile-layer.html', context=ISite, layer=IPyAMSLayer,
+                permission=MANAGE_SYSTEM_PERMISSION)
+@implementer(ILayerAddForm)
+class TileLayerAddForm(AdminDialogAddForm):
+    """Tile layer add form"""
+
+    title = _("Maps manager")
+    legend = _("Add tile layer")
+    icon_css_class = 'fa fa-fw fa-globe'
+    dialog_class = 'modal-large'
+
+    fields = field.Fields(ITileMapLayer).omit('__name__', '__parent__')
+    ajax_handler = 'add-tile-layer.json'
+    edit_permission = MANAGE_SYSTEM_PERMISSION
+
+    def create(self, data):
+        return TileMapLayer()
+
+    def add(self, layer):
+        context = query_utility(IMapManager)
+        context[layer.name] = layer
+
+    def nextURL(self):
+        return absolute_url(self.context, self.request, 'map-manager.html')
+
+
+@view_config(name='add-tile-layer.json', context=ISite, request_type=IPyAMSLayer,
+             permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
+class TileLayerAJAXAddForm(AJAXAddForm, TileLayerAddForm):
+    """Tile layer add form, JSON renderer"""
+
+
+@pagelet_config(name='properties.html', context=ITileMapLayer, layer=IPyAMSLayer,
+                permission=VIEW_SYSTEM_PERMISSION)
+class TileLayerEditForm(AdminDialogEditForm):
+    """Tile layer edit form"""
+
+    @property
+    def title(self):
+        return II18n(self.context).query_attribute('title', request=self.request)
+
+    legend = _("Edit layer properties")
+    icon_css_class = 'fa fa-fw fa-globe'
+    dialog_class = 'modal-large'
+
+    fields = field.Fields(ITileMapLayer).omit('__name__', '__parent__')
+    ajax_handler = 'properties.json'
+    edit_permission = MANAGE_SYSTEM_PERMISSION
+
+    def updateWidgets(self, prefix=None):
+        super(TileLayerEditForm, self).updateWidgets(prefix)
+        if 'name' in self.widgets:
+            self.widgets['name'].mode = DISPLAY_MODE
+
+
+@view_config(name='properties.json', context=ITileMapLayer, request_type=IPyAMSLayer,
+             permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
+class TileLayerAJAXEditForm(AJAXEditForm, TileLayerEditForm):
+    """Tile layer edit form, JSON renderer"""
+
+
+#
+# WMS layer forms
+#
+
+@viewlet_config(name='add-wms-layer.menu', context=ISite, layer=IAdminLayer,
+                view=MapManagerLayersTable, manager=IToolbarAddingMenu,
+                permission=MANAGE_SYSTEM_PERMISSION, weight=20)
+class WMSLayerAddMenu(ToolbarMenuItem):
+    """WMS layer add menu"""
+
+    label = _("Add WMS layer...")
+    label_css_class = 'fa fa-fw fa-map'
+    url = 'add-wms-layer.html'
+    modal_target = True
+
+
+@pagelet_config(name='add-wms-layer.html', context=ISite, layer=IPyAMSLayer,
+                permission=MANAGE_SYSTEM_PERMISSION)
+@implementer(ILayerAddForm)
+class WMSLayerAddForm(AdminDialogAddForm):
+    """WMS layer add form"""
+
+    title = _("Maps manager")
+    legend = _("Add WMS layer")
+    icon_css_class = 'fa fa-fw fa-map'
+    dialog_class = 'modal-large'
+
+    fields = field.Fields(IWMSMapLayer).omit('__name__', '__parent__')
+    ajax_handler = 'add-wms-layer.json'
+    edit_permission = MANAGE_SYSTEM_PERMISSION
+
+    def create(self, data):
+        return WMSMapLayer()
+
+    def add(self, layer):
+        context = query_utility(IMapManager)
+        context[layer.name] = layer
+
+    def nextURL(self):
+        return absolute_url(self.context, self.request, 'map-manager.html')
+
+
+@view_config(name='add-wms-layer.json', context=ISite, request_type=IPyAMSLayer,
+             permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
+class WMSLayerAJAXAddForm(AJAXAddForm, WMSLayerAddForm):
+    """WMS layer add form, JSON renderer"""
+
+
+@pagelet_config(name='properties.html', context=IWMSMapLayer, layer=IPyAMSLayer,
+                permission=VIEW_SYSTEM_PERMISSION)
+class WMSLayerEditForm(AdminDialogEditForm):
+    """WMS layer edit form"""
+
+    @property
+    def title(self):
+        return II18n(self.context).query_attribute('title', request=self.request)
+
+    legend = _("Edit layer properties")
+    icon_css_class = 'fa fa-fw fa-map'
+    dialog_class = 'modal-large'
+
+    fields = field.Fields(IWMSMapLayer).omit('__name__', '__parent__')
+    ajax_handler = 'properties.json'
+    edit_permission = MANAGE_SYSTEM_PERMISSION
+
+    def updateWidgets(self, prefix=None):
+        super(WMSLayerEditForm, self).updateWidgets(prefix)
+        if 'name' in self.widgets:
+            self.widgets['name'].mode = DISPLAY_MODE
+
+
+@view_config(name='properties.json', context=IWMSMapLayer, request_type=IPyAMSLayer,
+             permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
+class WMSLayerAJAXEditForm(AJAXEditForm, WMSLayerEditForm):
+    """WMS layer edit form, JSON renderer"""
+
+
+#
+# Geoportal layer forms
+#
+
+@viewlet_config(name='add-geoportal-layer.menu', context=ISite, layer=IAdminLayer,
+                view=MapManagerLayersTable, manager=IToolbarAddingMenu,
+                permission=MANAGE_SYSTEM_PERMISSION, weight=50)
+class GeoportalLayerAddMenu(ToolbarMenuItem):
+    """Geoportal layer add menu"""
+
+    label = _("Add Geoportal WMS layer...")
+    label_css_class = 'fa fa-fw fa-map-o'
+    url = 'add-geoportal-layer.html'
+    modal_target = True
+
+
+@pagelet_config(name='add-geoportal-layer.html', context=ISite, layer=IPyAMSLayer,
+                permission=MANAGE_SYSTEM_PERMISSION)
+@implementer(ILayerAddForm)
+class GeoportalLayerAddForm(AdminDialogAddForm):
+    """Geoportal layer add form"""
+
+    title = _("Maps manager")
+    legend = _("Add IGN Geoportal layer")
+    icon_css_class = 'fa fa-fw fa-map-o'
+    dialog_class = 'modal-large'
+
+    fields = field.Fields(IGeoportalMapLayer).omit('__name__', '__parent__')
+    ajax_handler = 'add-geoportal-layer.json'
+    edit_permission = MANAGE_SYSTEM_PERMISSION
+
+    def create(self, data):
+        return GeoportalMapLayer()
+
+    def add(self, layer):
+        context = query_utility(IMapManager)
+        context[layer.name] = layer
+
+    def nextURL(self):
+        return absolute_url(self.context, self.request, 'map-manager.html')
+
+
+@view_config(name='add-geoportal-layer.json', context=ISite, request_type=IPyAMSLayer,
+             permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
+class GeoportalLayerAJAXAddForm(AJAXAddForm, GeoportalLayerAddForm):
+    """Geoportal layer add form, JSON renderer"""
+
+
+@pagelet_config(name='properties.html', context=IGeoportalMapLayer, layer=IPyAMSLayer,
+                permission=VIEW_SYSTEM_PERMISSION)
+class GeoportalLayerEditForm(AdminDialogEditForm):
+    """Geoportal layer edit form"""
+
+    @property
+    def title(self):
+        return II18n(self.context).query_attribute('title', request=self.request)
+
+    legend = _("Edit layer properties")
+    icon_css_class = 'fa fa-fw fa-map-o'
+    dialog_class = 'modal-large'
+
+    fields = field.Fields(IGeoportalMapLayer).omit('__name__', '__parent__')
+    ajax_handler = 'properties.json'
+    edit_permission = MANAGE_SYSTEM_PERMISSION
+
+    def updateWidgets(self, prefix=None):
+        super(GeoportalLayerEditForm, self).updateWidgets(prefix)
+        if 'name' in self.widgets:
+            self.widgets['name'].mode = DISPLAY_MODE
+
+
+@view_config(name='properties.json', context=IGeoportalMapLayer, request_type=IPyAMSLayer,
+             permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
+class GeoportalLayerAJAXEditForm(AJAXEditForm, GeoportalLayerEditForm):
+    """Geoportal layer edit form, JSON renderer"""
+
+
+#
+# ESRI feature layer forms
+#
+
+@viewlet_config(name='add-esri-feature-layer.menu', context=ISite, layer=IAdminLayer,
+                view=MapManagerLayersTable, manager=IToolbarAddingMenu,
+                permission=MANAGE_SYSTEM_PERMISSION, weight=70)
+class EsriFeatureLayerAddMenu(ToolbarMenuItem):
+    """ESRI feature layer add menu"""
+
+    label = _("Add ESRI feature layer...")
+    label_css_class = 'fa fa-fw fa-map-signs'
+    url = 'add-esri-feature-layer.html'
+    modal_target = True
+
+
+@pagelet_config(name='add-esri-feature-layer.html', context=ISite, layer=IPyAMSLayer,
+                permission=MANAGE_SYSTEM_PERMISSION)
+@implementer(ILayerAddForm)
+class EsriFeatureLayerAddForm(AdminDialogAddForm):
+    """ESRI feature layer add form"""
+
+    title = _("Maps manager")
+    legend = _("Add ESRI feature layer")
+    icon_css_class = 'fa fa-fw fa-map-signs'
+    dialog_class = 'modal-large'
+
+    fields = field.Fields(IEsriFeatureMapLayer).omit('__name__', '__parent__')
+    ajax_handler = 'add-esri-feature-layer.json'
+    edit_permission = MANAGE_SYSTEM_PERMISSION
+
+    def create(self, data):
+        return EsriFeatureMapLayer()
+
+    def add(self, layer):
+        context = query_utility(IMapManager)
+        context[layer.name] = layer
+
+    def nextURL(self):
+        return absolute_url(self.context, self.request, 'map-manager.html')
+
+
+@view_config(name='add-esri-feature-layer.json', context=ISite, request_type=IPyAMSLayer,
+             permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
+class EsriFeatureLayerAJAXAddForm(AJAXAddForm, EsriFeatureLayerAddForm):
+    """ESRI feature layer add form, JSON renderer"""
+
+
+@pagelet_config(name='properties.html', context=IEsriFeatureMapLayer, layer=IPyAMSLayer,
+                permission=VIEW_SYSTEM_PERMISSION)
+class EsriFeatureLayerEditForm(AdminDialogEditForm):
+    """ESRI feature layer edit form"""
+
+    @property
+    def title(self):
+        return II18n(self.context).query_attribute('title', request=self.request)
+
+    legend = _("Edit layer properties")
+    icon_css_class = 'fa fa-fw fa-map-signs'
+    dialog_class = 'modal-large'
+
+    fields = field.Fields(IEsriFeatureMapLayer).omit('__name__', '__parent__')
+    ajax_handler = 'properties.json'
+    edit_permission = MANAGE_SYSTEM_PERMISSION
+
+    def updateWidgets(self, prefix=None):
+        super(EsriFeatureLayerEditForm, self).updateWidgets(prefix)
+        if 'name' in self.widgets:
+            self.widgets['name'].mode = DISPLAY_MODE
+
+
+@view_config(name='properties.json', context=IEsriFeatureMapLayer, request_type=IPyAMSLayer,
+             permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
+class EsriFeatureLayerAJAXEditForm(AJAXEditForm, EsriFeatureLayerEditForm):
+    """ESRI feature layer edit form, JSON renderer"""
+
+
+#
+# Google maps layer forms
+#
+
+@viewlet_config(name='add-google-layer.menu', context=ISite, layer=IAdminLayer,
+                view=MapManagerLayersTable, manager=IToolbarAddingMenu,
+                permission=MANAGE_SYSTEM_PERMISSION, weight=80)
+class GoogleMapLayerAddMenu(ToolbarMenuItem):
+    """Google Maps layer add menu"""
+
+    label = _("Add Google Maps layer...")
+    label_css_class = 'fa fa-fw fa-map-marker'
+    url = 'add-google-layer.html'
+    modal_target = True
+
+
+@pagelet_config(name='add-google-layer.html', context=ISite, layer=IPyAMSLayer,
+                permission=MANAGE_SYSTEM_PERMISSION)
+@implementer(ILayerAddForm)
+class GoogleMapLayerAddForm(AdminDialogAddForm):
+    """Google Maps layer add form"""
+
+    title = _("Maps manager")
+    legend = _("Add Google Maps layer")
+    icon_css_class = 'fa fa-fw fa-map-marker'
+    dialog_class = 'modal-large'
+
+    fields = field.Fields(IGoogleMapLayer).omit('__name__', '__parent__')
+    ajax_handler = 'add-google-layer.json'
+    edit_permission = MANAGE_SYSTEM_PERMISSION
+
+    def create(self, data):
+        return GoogleMapLayer()
+
+    def add(self, layer):
+        context = query_utility(IMapManager)
+        context[layer.name] = layer
+
+    def nextURL(self):
+        return absolute_url(self.context, self.request, 'map-manager.html')
+
+
+@view_config(name='add-google-layer.json', context=ISite, request_type=IPyAMSLayer,
+             permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
+class GoogleMapLayerAJAXAddForm(AJAXAddForm, GoogleMapLayerAddForm):
+    """Google Maps layer add form, JSON renderer"""
+
+
+@pagelet_config(name='properties.html', context=IGoogleMapLayer, layer=IPyAMSLayer,
+                permission=VIEW_SYSTEM_PERMISSION)
+class GoogleMapLayerEditForm(AdminDialogEditForm):
+    """Google Maps layer edit form"""
+
+    @property
+    def title(self):
+        return II18n(self.context).query_attribute('title', request=self.request)
+
+    legend = _("Edit layer properties")
+    icon_css_class = 'fa fa-fw fa-map-marker'
+    dialog_class = 'modal-large'
+
+    fields = field.Fields(IGoogleMapLayer).omit('__name__', '__parent__')
+    ajax_handler = 'properties.json'
+    edit_permission = MANAGE_SYSTEM_PERMISSION
+
+    def updateWidgets(self, prefix=None):
+        super(GoogleMapLayerEditForm, self).updateWidgets(prefix)
+        if 'name' in self.widgets:
+            self.widgets['name'].mode = DISPLAY_MODE
+
+
+@view_config(name='properties.json', context=IGoogleMapLayer, request_type=IPyAMSLayer,
+             permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
+class GoogleMapLayerAJAXEditForm(AJAXEditForm, GoogleMapLayerEditForm):
+    """Google Maps layer edit form, JSON renderer"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/zmi/utility.py	Thu May 18 17:23:48 2017 +0200
@@ -0,0 +1,232 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_gis.interfaces.configuration import IMapConfiguration
+from pyams_gis.interfaces.utility import IMapManager
+from pyams_gis.zmi.interfaces import IMapManagerMenu
+from pyams_skin.interfaces import IInnerPage, IPageHeader
+from pyams_skin.interfaces.container import ITableElementEditor
+from pyams_skin.layer import IPyAMSLayer
+from pyams_utils.interfaces import MANAGE_SYSTEM_PERMISSION, VIEW_SYSTEM_PERMISSION
+from pyams_zmi.interfaces.menu import IControlPanelMenu
+from pyams_zmi.layer import IAdminLayer
+from z3c.table.interfaces import IColumn, IValues
+from zope.component.interfaces import ISite
+
+# import packages
+from pyams_form.form import AJAXEditForm
+from pyams_i18n.column import I18nAttrColumn
+from pyams_pagelet.pagelet import pagelet_config
+from pyams_skin.container import ContainerView
+from pyams_skin.page import DefaultPageHeaderAdapter
+from pyams_skin.table import DefaultElementEditorAdapter, BaseTable, I18nColumn, TrashColumn
+from pyams_skin.viewlet.menu import MenuItem
+from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
+from pyams_utils.registry import query_utility
+from pyams_utils.traversing import get_parent
+from pyams_utils.url import absolute_url
+from pyams_viewlet.manager import viewletmanager_config
+from pyams_viewlet.viewlet import viewlet_config
+from pyams_zmi.form import AdminDialogEditForm
+from pyams_zmi.view import AdminView
+from pyramid.url import resource_url
+from pyramid.view import view_config
+from z3c.form import field
+from z3c.table.column import GetAttrColumn
+from zope.interface import implementer, Interface
+
+from pyams_gis import _
+
+
+@adapter_config(context=(IMapManager, IAdminLayer, Interface), provides=ITableElementEditor)
+class MapManagerTableElementEditor(DefaultElementEditorAdapter):
+    """Map manager table element editor"""
+
+    view_name = 'map-manager.html'
+    modal_target = False
+
+    @property
+    def url(self):
+        site = get_parent(self.context, ISite)
+        return resource_url(site, self.request, 'admin#{0}'.format(self.view_name))
+
+
+@viewlet_config(name='map-manager.menu', context=ISite, layer=IAdminLayer, manager=IControlPanelMenu,
+                permission=VIEW_SYSTEM_PERMISSION, weight=6)
+@viewletmanager_config(name='map-manager.menu', context=ISite, layer=IAdminLayer)
+@implementer(IMapManagerMenu)
+class MapManagerMenuItem(MenuItem):
+    """Map manager menu"""
+
+    label = _("Maps manager")
+    icon_class = 'fa-map-marker'
+    url = '#map-manager.html'
+
+
+class MapManagerLayersTable(BaseTable):
+    """Map manager layers table"""
+
+    id = 'map_manager_layers_table'
+    title = _("Map manager layers")
+
+    @property
+    def data_attributes(self):
+        manager = query_utility(IMapManager)
+        attributes = super(MapManagerLayersTable, self).data_attributes
+        table_attrs = {'data-ams-location': absolute_url(manager, self.request),
+                       'data-ams-delete-target': 'delete-layer.json'}
+        if 'table' in attributes:
+            attributes['table'].update(table_attrs)
+        else:
+            attributes['table'] = table_attrs
+        return attributes
+
+
+@adapter_config(name='name', context=(Interface, IAdminLayer, MapManagerLayersTable), provides=IColumn)
+class MapManagerLayersNameColumn(I18nColumn, GetAttrColumn):
+    """Map manager layers name column"""
+
+    _header = _("Name")
+    attrName = 'name'
+    weight = 10
+
+
+@adapter_config(name='layer_type', context=(Interface, IAdminLayer, MapManagerLayersTable), provides=IColumn)
+class MapManagerLayersTypeColumn(I18nColumn, GetAttrColumn):
+    """Map manager layers type column"""
+
+    _header = _("Type")
+    attrName = 'layer_type'
+    weight = 15
+    
+    def getValue(self, obj):
+        return self.request.localizer.translate(super(MapManagerLayersTypeColumn, self).getValue(obj))
+
+
+@adapter_config(name='title', context=(Interface, IAdminLayer, MapManagerLayersTable), provides=IColumn)
+class MapManagerLayersTitleColumn(I18nColumn, I18nAttrColumn):
+    """Map manager layers title column"""
+
+    _header = _("Title")
+    attrName = 'title'
+    defaultValue = '--'
+    weight = 20
+
+
+@adapter_config(name='trash', context=(Interface, IAdminLayer, MapManagerLayersTable), provides=IColumn)
+class MapManagerLayersTrashCOlumn(TrashColumn):
+    """Map manager layer trash column"""
+
+    icon_hint = _("Delete layer")
+    permission = MANAGE_SYSTEM_PERMISSION
+
+
+@adapter_config(context=(ISite, IAdminLayer, MapManagerLayersTable), provides=IValues)
+class MapManagerValuesAdapter(ContextRequestViewAdapter):
+    """Map manager layers table values adapter"""
+
+    @property
+    def values(self):
+        manager = query_utility(IMapManager)
+        if manager is not None:
+            return list(manager.values())
+        return ()
+
+
+@pagelet_config(name='map-manager.html', context=ISite, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
+@implementer(IInnerPage)
+class MapManagerView(AdminView, ContainerView):
+    """Map manager layers view"""
+
+    table_class = MapManagerLayersTable
+
+
+@adapter_config(context=(ISite, IAdminLayer, MapManagerView), provides=IPageHeader)
+class MapManagerHeaderAdapter(DefaultPageHeaderAdapter):
+    """Map manager view header adapter"""
+
+    icon_class = 'fa fa-fw fa-map-marker'
+    title = _("Control panel")
+    subtitle = _("Maps manager")
+
+
+@viewlet_config(name='map-manager.configuration.menu', context=ISite, layer=IAdminLayer,
+                manager=IMapManagerMenu, permission=VIEW_SYSTEM_PERMISSION, weight=1)
+class MapManagerConfigurationMenuItem(MenuItem):
+    """Map manager properties menu"""
+
+    label = _("Configuration...")
+    url = 'configuration.html'
+    modal_target = True
+
+    def get_url(self):
+        manager = query_utility(IMapManager)
+        return resource_url(manager, self.request, self.url)
+
+
+@pagelet_config(name='configuration.html', context=IMapManager, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
+class MapManagerConfigurationEditForm(AdminDialogEditForm):
+    """Map manager edit form"""
+
+    title = _("Maps manager")
+    legend = _("Default map configuration")
+    icon_css_class = 'fa fa-fw fa-map-marker'
+    dialog_class = 'modal-large'
+
+    fields = field.Fields(IMapConfiguration)
+
+    ajax_handler = 'configuration.json'
+    edit_permission = MANAGE_SYSTEM_PERMISSION
+
+    def getContent(self):
+        return query_utility(IMapManager)
+
+
+@view_config(name='configuration.json', context=IMapManager, request_type=IPyAMSLayer,
+             permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
+class MapManagerConfigurationAJAXEditForm(AJAXEditForm, MapManagerConfigurationEditForm):
+    """Map manager edit form, JSON renderer"""
+
+
+@view_config(name='delete-layer.json', context=IMapManager, request_type=IPyAMSLayer,
+             permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
+def delete_map_manager_layer(request):
+    """Delete layer from map manager"""
+    translate = request.localizer.translate
+    name = request.params.get('object_name')
+    if not name:
+        return {'status': 'message',
+                'messagebox': {'status': 'error',
+                               'content': translate(_("No provided object_name argument!"))}}
+    if name not in request.context:
+        return {'status': 'message',
+                'messagebox': {'status': 'error',
+                               'content': translate(_("Given layer name doesn't exist!"))}}
+    del request.context[name]
+    return {'status': 'success'}
+
+
+@view_config(name='get-map-configuration.json', context=Interface, request_type=IPyAMSLayer,
+             renderer='json', xhr=True)
+def get_map_configuration(request):
+    """Get map configuration in JSON format"""
+    manager = query_utility(IMapManager)
+    if manager is not None:
+        configuration = IMapConfiguration(manager)
+        if configuration is not None:
+            return configuration.get_configuration()