Skip to content
This repository
Browse code

New methods: removePolyline and removePolygon. Tests for Styled MapTypes

  • Loading branch information...
commit 82bdb8da376661e5d8c7139fd83a1506423fd831 1 parent 8290798
HPNeo authored December 30, 2012
5  README.md
Source Rendered
@@ -8,6 +8,11 @@ Visit the examples in [hpneo.github.com/gmaps](http://hpneo.github.com/gmaps/)
8 8
 Changelog
9 9
 ---------
10 10
 
  11
+0.2.29
  12
+-----------------------
  13
+* New methods: removePolyline and removePolygon
  14
+* Tests for Styled MapTypes
  15
+
11 16
 0.2.28
12 17
 -----------------------
13 18
 * Test suite
236  gmaps.js
... ...
@@ -1,5 +1,5 @@
1 1
 /*!
2  
- * GMaps.js v0.2.28
  2
+ * GMaps.js v0.2.29
3 3
  * http://hpneo.github.com/gmaps/
4 4
  *
5 5
  * Copyright 2012, Gustavo Leon
@@ -121,73 +121,75 @@ if(window.google && window.google.maps){
121 121
 
122 122
       this.map = new google.maps.Map(this.el, map_options);
123 123
 
124  
-      if(markerClusterer)
  124
+      if(markerClusterer) {
125 125
         this.markerClusterer = markerClusterer.apply(this, [this.map]);
  126
+      }
126 127
 
127 128
       // Context menus
128 129
       var buildContextMenuHTML = function(control, e) {
129  
-          var html = '';
130  
-          var options = window.context_menu[control];
131  
-          for (var i in options){
132  
-            if (options.hasOwnProperty(i)){
133  
-              var option = options[i];
134  
-              html += '<li><a id="' + control + '_' + i + '" href="#">' +
135  
-                option.title + '</a></li>';
136  
-            }
  130
+        var html = '';
  131
+        var options = window.context_menu[control];
  132
+        for (var i in options){
  133
+          if (options.hasOwnProperty(i)){
  134
+            var option = options[i];
  135
+            html += '<li><a id="' + control + '_' + i + '" href="#">' +
  136
+              option.title + '</a></li>';
137 137
           }
  138
+        }
138 139
 
139  
-          if(!getElementById('gmaps_context_menu')) return;
  140
+        if(!getElementById('gmaps_context_menu')) return;
140 141
           
141  
-          var context_menu_element = getElementById('gmaps_context_menu');
142  
-          context_menu_element.innerHTML = html;
  142
+        var context_menu_element = getElementById('gmaps_context_menu');
  143
+        context_menu_element.innerHTML = html;
143 144
 
144  
-          var context_menu_items = context_menu_element.getElementsByTagName('a');
  145
+        var context_menu_items = context_menu_element.getElementsByTagName('a');
145 146
 
146  
-          var context_menu_items_count = context_menu_items.length;
  147
+        var context_menu_items_count = context_menu_items.length;
147 148
 
148  
-          for(var i = 0; i < context_menu_items_count; i++){
149  
-            var context_menu_item = context_menu_items[i];
  149
+        for(var i = 0; i < context_menu_items_count; i++){
  150
+          var context_menu_item = context_menu_items[i];
150 151
 
151  
-            var assign_menu_item_action = function(ev){
152  
-              ev.preventDefault();
  152
+          var assign_menu_item_action = function(ev){
  153
+            ev.preventDefault();
153 154
 
154  
-              options[this.id.replace(control + '_', '')].action.apply(self, [e]);
155  
-              self.hideContextMenu();
156  
-            };
  155
+            options[this.id.replace(control + '_', '')].action.apply(self, [e]);
  156
+            self.hideContextMenu();
  157
+          };
157 158
 
158  
-            google.maps.event.clearListeners(context_menu_item, 'click');
159  
-            google.maps.event.addDomListenerOnce(context_menu_item, 'click', assign_menu_item_action, false);
160  
-          }
  159
+          google.maps.event.clearListeners(context_menu_item, 'click');
  160
+          google.maps.event.addDomListenerOnce(context_menu_item, 'click', assign_menu_item_action, false);
  161
+        }
161 162
 
162  
-          var left = self.el.offsetLeft + e.pixel.x - 15;
163  
-          var top = self.el.offsetTop + e.pixel.y - 15;
  163
+        var left = self.el.offsetLeft + e.pixel.x - 15;
  164
+        var top = self.el.offsetTop + e.pixel.y - 15;
164 165
 
165  
-          context_menu_element.style.left = left + "px";
166  
-          context_menu_element.style.top = top + "px";
  166
+        context_menu_element.style.left = left + "px";
  167
+        context_menu_element.style.top = top + "px";
167 168
 
168  
-          context_menu_element.style.display = 'block';
169  
-        };
  169
+        context_menu_element.style.display = 'block';
  170
+      };
170 171
 
171 172
       var buildContextMenu = function(control, e) {
172  
-          if (control === 'marker') {
173  
-            e.pixel = {};
174  
-            var overlay = new google.maps.OverlayView();
175  
-            overlay.setMap(self.map);
176  
-            overlay.draw = function() {
177  
-              var projection = overlay.getProjection();
178  
-              var position = e.marker.getPosition();
179  
-              e.pixel = projection.fromLatLngToContainerPixel(position);
180  
-
181  
-              buildContextMenuHTML(control, e);
182  
-            };
183  
-          }
184  
-          else {
  173
+        if (control === 'marker') {
  174
+          e.pixel = {};
  175
+          var overlay = new google.maps.OverlayView();
  176
+          overlay.setMap(self.map);
  177
+          overlay.draw = function() {
  178
+            var projection = overlay.getProjection();
  179
+            var position = e.marker.getPosition();
  180
+            e.pixel = projection.fromLatLngToContainerPixel(position);
  181
+
185 182
             buildContextMenuHTML(control, e);
186  
-          }
187  
-        };
  183
+          };
  184
+        }
  185
+        else {
  186
+          buildContextMenuHTML(control, e);
  187
+        }
  188
+      };
188 189
 
189 190
       this.setContextMenu = function(options) {
190 191
         window.context_menu[options.control] = {};
  192
+
191 193
         for (var i in options.options){
192 194
           if (options.options.hasOwnProperty(i)){
193 195
             var option = options.options[i];
@@ -197,7 +199,9 @@ if(window.google && window.google.maps){
197 199
             };
198 200
           }
199 201
         }
  202
+
200 203
         var ul = doc.createElement('ul');
  204
+        
201 205
         ul.id = 'gmaps_context_menu';
202 206
         ul.style.display = 'none';
203 207
         ul.style.position = 'absolute';
@@ -525,10 +529,11 @@ if(window.google && window.google.maps){
525 529
       };
526 530
 
527 531
       this.removeMarker = function(marker) {
528  
-        for(var i=0; i < this.markers.length; i++) {
  532
+        for(var i = 0; i < this.markers.length; i++) {
529 533
           if(this.markers[i] === marker) {
530 534
             this.markers[i].setMap(null);
531 535
             this.markers.splice(i, 1);
  536
+
532 537
             break;
533 538
           }
534 539
         }
@@ -555,6 +560,7 @@ if(window.google && window.google.maps){
555 560
       };
556 561
 
557 562
       // Overlays
  563
+
558 564
       this.drawOverlay = function(options) {
559 565
         var overlay = new google.maps.OverlayView();
560 566
         overlay.setMap(self.map);
@@ -663,7 +669,14 @@ if(window.google && window.google.maps){
663 669
       };
664 670
 
665 671
       this.removeOverlay = function(overlay) {
666  
-        overlay.setMap(null);
  672
+        for(var i = 0; i < this.overlays.length; i++) {
  673
+          if(this.overlays[i] === overlay) {
  674
+            this.overlays[i].setMap(null);
  675
+            this.overlays.splice(i, 1);
  676
+
  677
+            break;
  678
+          }
  679
+        }
667 680
       };
668 681
 
669 682
       this.removeOverlays = function() {
@@ -673,12 +686,7 @@ if(window.google && window.google.maps){
673 686
         self.overlays = [];
674 687
       };
675 688
 
676  
-      this.removePolylines = function() {
677  
-        for (var i=0, item; item=self.polylines[i]; i++){
678  
-          item.setMap(null);
679  
-        }
680  
-        self.polylines = [];
681  
-      };
  689
+      // Geometry
682 690
 
683 691
       this.drawPolyline = function(options) {
684 692
         var path = [];
@@ -737,6 +745,24 @@ if(window.google && window.google.maps){
737 745
         return polyline;
738 746
       };
739 747
 
  748
+      this.removePolyline = function(polyline) {
  749
+        for(var i = 0; i < this.polylines.length; i++) {
  750
+          if(this.polylines[i] === polyline) {
  751
+            this.polylines[i].setMap(null);
  752
+            this.polylines.splice(i, 1);
  753
+            
  754
+            break;
  755
+          }
  756
+        }
  757
+      };
  758
+
  759
+      this.removePolylines = function() {
  760
+        for (var i=0, item; item=self.polylines[i]; i++){
  761
+          item.setMap(null);
  762
+        }
  763
+        self.polylines = [];
  764
+      };
  765
+
740 766
       this.drawCircle = function(options) {
741 767
         options =  extend_object({
742 768
           map: this.map,
@@ -831,7 +857,16 @@ if(window.google && window.google.maps){
831 857
         return polygon;
832 858
       };
833 859
 
834  
-      this.removePolygon = this.removeOverlay;
  860
+      this.removePolygon = function(polygon) {
  861
+        for(var i = 0; i < this.polygons.length; i++) {
  862
+          if(this.polygons[i] === polygon) {
  863
+            this.polygons[i].setMap(null);
  864
+            this.polygons.splice(i, 1);
  865
+            
  866
+            break;
  867
+          }
  868
+        }
  869
+      };
835 870
 
836 871
       this.removePolygons = function() {
837 872
         for (var i=0, item; item=self.polygons[i]; i++){
@@ -840,6 +875,8 @@ if(window.google && window.google.maps){
840 875
         self.polygons = [];
841 876
       };
842 877
 
  878
+      // Fusion Tables
  879
+
843 880
       this.getFromFusionTables = function(options) {
844 881
         var events = options.events;
845 882
 
@@ -869,6 +906,8 @@ if(window.google && window.google.maps){
869 906
         return layer;
870 907
       };
871 908
 
  909
+      // KML
  910
+
872 911
       this.getFromKML = function(options) {
873 912
         var url = options.url;
874 913
         var events = options.events;
@@ -900,7 +939,8 @@ if(window.google && window.google.maps){
900 939
         return layer;
901 940
       };
902 941
 
903  
-      // Services
  942
+      // Routes
  943
+
904 944
       var travelMode, unitSystem;
905 945
       this.getRoutes = function(options) {
906 946
         switch (options.travelMode) {
@@ -1131,6 +1171,7 @@ if(window.google && window.google.maps){
1131 1171
       };
1132 1172
 
1133 1173
       // Geofence
  1174
+
1134 1175
       this.checkGeofence = function(lat, lng, fence) {
1135 1176
         return fence.containsLatLng(new google.maps.LatLng(lat, lng));
1136 1177
       };
@@ -1146,7 +1187,8 @@ if(window.google && window.google.maps){
1146 1187
         }
1147 1188
       };
1148 1189
 
1149  
-      //add layers to the maps
  1190
+      // Layers
  1191
+
1150 1192
       this.addLayer = function(layerName, options) {
1151 1193
         //var default_layers = ['weather', 'clouds', 'traffic', 'transit', 'bicycling', 'panoramio', 'places'];
1152 1194
         options = options || {};
@@ -1226,7 +1268,6 @@ if(window.google && window.google.maps){
1226 1268
         }
1227 1269
       };
1228 1270
 
1229  
-      //remove layers
1230 1271
       this.removeLayer = function(layerName) {
1231 1272
         if(this.singleLayers[layerName] !== undefined) {
1232 1273
            this.singleLayers[layerName].setMap(null);
@@ -1234,6 +1275,8 @@ if(window.google && window.google.maps){
1234 1275
         }
1235 1276
       };
1236 1277
       
  1278
+      // Static Maps
  1279
+
1237 1280
       this.toImage = function(options) {
1238 1281
         var options = options || {};
1239 1282
         var static_map_options = {};
@@ -1263,9 +1306,10 @@ if(window.google && window.google.maps){
1263 1306
         return GMaps.staticMapURL(static_map_options);
1264 1307
       };
1265 1308
 
  1309
+      // Map Types
  1310
+
1266 1311
       this.addMapType = function(mapTypeId, options) {
1267 1312
         if(options.hasOwnProperty("getTileUrl") && typeof(options["getTileUrl"]) == "function") {
1268  
-          
1269 1313
           options.tileSize = options.tileSize || new google.maps.Size(256, 256);
1270 1314
           
1271 1315
           var mapType = new google.maps.ImageMapType(options);
@@ -1293,7 +1337,18 @@ if(window.google && window.google.maps){
1293 1337
       this.removeOverlayMapType = function(overlayMapTypeIndex) {
1294 1338
         this.map.overlayMapTypes.removeAt(overlayMapTypeIndex);
1295 1339
       };
  1340
+
  1341
+      // Styles
  1342
+      
  1343
+      this.addStyle = function(options){       
  1344
+        var styledMapType = new google.maps.StyledMapType(options.styles, options.styledMapName);
  1345
+        
  1346
+        this.map.mapTypes.set(options.mapTypeId, styledMapType);
  1347
+      };
1296 1348
       
  1349
+      this.setStyle = function(mapTypeId){     
  1350
+        this.map.setMapTypeId(mapTypeId);
  1351
+      };
1297 1352
     };
1298 1353
 
1299 1354
     GMaps.Route = function(options) {
@@ -1563,40 +1618,42 @@ if(window.google && window.google.maps){
1563 1618
       };
1564 1619
     }
1565 1620
 
1566  
-    // Polygon containsLatLng - method to determine if a latLng is within a polygon
1567  
-    google.maps.Polygon.prototype.containsLatLng = function(latLng) {
1568  
-      // Exclude points outside of bounds as there is no way they are in the poly
1569  
-      var bounds = this.getBounds();
  1621
+    if (!google.maps.Polygon.prototype.containsLatLng) {
  1622
+      // Polygon containsLatLng - method to determine if a latLng is within a polygon
  1623
+      google.maps.Polygon.prototype.containsLatLng = function(latLng) {
  1624
+        // Exclude points outside of bounds as there is no way they are in the poly
  1625
+        var bounds = this.getBounds();
1570 1626
 
1571  
-      if (bounds !== null && !bounds.contains(latLng)) {
1572  
-        return false;
1573  
-      }
  1627
+        if (bounds !== null && !bounds.contains(latLng)) {
  1628
+          return false;
  1629
+        }
1574 1630
 
1575  
-      // Raycast point in polygon method
1576  
-      var inPoly = false;
  1631
+        // Raycast point in polygon method
  1632
+        var inPoly = false;
1577 1633
 
1578  
-      var numPaths = this.getPaths().getLength();
1579  
-      for (var p = 0; p < numPaths; p++) {
1580  
-        var path = this.getPaths().getAt(p);
1581  
-        var numPoints = path.getLength();
1582  
-        var j = numPoints - 1;
  1634
+        var numPaths = this.getPaths().getLength();
  1635
+        for (var p = 0; p < numPaths; p++) {
  1636
+          var path = this.getPaths().getAt(p);
  1637
+          var numPoints = path.getLength();
  1638
+          var j = numPoints - 1;
1583 1639
 
1584  
-        for (var i = 0; i < numPoints; i++) {
1585  
-          var vertex1 = path.getAt(i);
1586  
-          var vertex2 = path.getAt(j);
  1640
+          for (var i = 0; i < numPoints; i++) {
  1641
+            var vertex1 = path.getAt(i);
  1642
+            var vertex2 = path.getAt(j);
1587 1643
 
1588  
-          if (vertex1.lng() < latLng.lng() && vertex2.lng() >= latLng.lng() || vertex2.lng() < latLng.lng() && vertex1.lng() >= latLng.lng()) {
1589  
-            if (vertex1.lat() + (latLng.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) < latLng.lat()) {
1590  
-              inPoly = !inPoly;
  1644
+            if (vertex1.lng() < latLng.lng() && vertex2.lng() >= latLng.lng() || vertex2.lng() < latLng.lng() && vertex1.lng() >= latLng.lng()) {
  1645
+              if (vertex1.lat() + (latLng.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) < latLng.lat()) {
  1646
+                inPoly = !inPoly;
  1647
+              }
1591 1648
             }
1592  
-          }
1593 1649
 
1594  
-          j = i;
  1650
+            j = i;
  1651
+          }
1595 1652
         }
1596  
-      }
1597 1653
 
1598  
-      return inPoly;
1599  
-    };
  1654
+        return inPoly;
  1655
+      };
  1656
+    }
1600 1657
 
1601 1658
     google.maps.LatLngBounds.prototype.containsLatLng = function(latLng) {
1602 1659
       return this.contains(latLng);
@@ -1694,15 +1751,4 @@ if(window.google && window.google.maps){
1694 1751
     return new_array;
1695 1752
   };
1696 1753
 
1697  
-  if(this.GMaps) {
1698  
-    /*Extension: Styled map*/
1699  
-    GMaps.prototype.addStyle = function(options){       
1700  
-      var styledMapType = new google.maps.StyledMapType(options.styles, options.styledMapName);
1701  
-      this.map.mapTypes.set(options.mapTypeId, styledMapType);
1702  
-    };
1703  
-    GMaps.prototype.setStyle = function(mapTypeId){     
1704  
-      this.map.setMapTypeId(mapTypeId);
1705  
-    };
1706  
-  }
1707  
-
1708 1754
 }
3  test/index.html
@@ -32,6 +32,7 @@
32 32
   <script type="text/javascript" src="spec/LayerSpec.js"></script>
33 33
   <script type="text/javascript" src="spec/OverlaySpec.js"></script>
34 34
   <script type="text/javascript" src="spec/RouteSpec.js"></script>
  35
+  <script type="text/javascript" src="spec/StyleSpec.js"></script>
35 36
 
36 37
   <script type="text/javascript">
37 38
     (function() {
@@ -82,5 +83,7 @@
82 83
   <div class="map" id="map-with-overlays"></div>
83 84
   <h3>Map with routes</h3>
84 85
   <div class="map" id="map-with-routes"></div>
  86
+  <h3>Map with styles</h3>
  87
+  <div class="map" id="map-with-styles"></div>
85 88
 </body>
86 89
 </html>
95  test/spec/GeometrySpec.js
@@ -72,6 +72,7 @@ describe("Drawing geometry overlays", function() {
72 72
       expect(NELng).toEqual(-77.0115);
73 73
     });
74 74
   });
  75
+
75 76
   describe("A polygon", function() {
76 77
     beforeEach(function() {
77 78
       polygon = polygon || map_with_polygons.drawPolygon({
@@ -100,6 +101,7 @@ describe("Drawing geometry overlays", function() {
100 101
       expect(parseFloat(first_point.lng().toFixed(4))).toEqual(-77.0337);
101 102
     });
102 103
   });
  104
+
103 105
   describe("A circle", function() {
104 106
     beforeEach(function() {
105 107
       circle = circle || map_with_polygons.drawCircle({
@@ -127,4 +129,97 @@ describe("Drawing geometry overlays", function() {
127 129
       expect(circle.getRadius()).toEqual(350);
128 130
     });
129 131
   });
  132
+});
  133
+
  134
+describe("Removing geometry overlays", function() {
  135
+  var map_with_polygons, line, rectangle, circle, polygon;
  136
+
  137
+  beforeEach(function() {
  138
+    map_with_polygons = map_with_polygons || new GMaps({
  139
+      el : '#map-with-polygons',
  140
+      lat : -12.0433,
  141
+      lng : -77.0283,
  142
+      zoom : 12
  143
+    });
  144
+  });
  145
+
  146
+  describe("A line", function() {
  147
+    beforeEach(function() {
  148
+      line = map_with_polygons.drawPolyline({
  149
+        path : [[-12.0440, -77.0247], [-12.0544, -77.0302], [-12.0551, -77.0303], [-12.0759, -77.0276], [-12.0763, -77.0279], [-12.0768, -77.0289], [-12.0885, -77.0241], [-12.0908, -77.0227]],
  150
+        strokeColor : '#131540',
  151
+        strokeOpacity : 0.6,
  152
+        strokeWeight : 6
  153
+      });
  154
+
  155
+      map_with_polygons.removePolyline(line);
  156
+    });
  157
+
  158
+    it("should remove the line from the polylines collection", function() {
  159
+      expect(map_with_polygons.polylines.length).toEqual(0);
  160
+      expect(line.getMap()).toBeNull();
  161
+    });
  162
+  });
  163
+
  164
+  describe("A rectangle", function() {
  165
+    beforeEach(function() {
  166
+      rectangle = map_with_polygons.drawRectangle({
  167
+        bounds : [[-12.0303,-77.0237],[-12.0348,-77.0115]],
  168
+        strokeColor : '#BBD8E9',
  169
+        strokeOpacity : 1,
  170
+        strokeWeight : 3,
  171
+        fillColor : '#BBD8E9',
  172
+        fillOpacity : 0.6
  173
+      });
  174
+
  175
+      map_with_polygons.removePolygon(rectangle);
  176
+    });
  177
+
  178
+    it("should remove the rectangle from the polygons collection", function() {
  179
+      expect(map_with_polygons.polygons.length).toEqual(0);
  180
+      expect(rectangle.getMap()).toBeNull();
  181
+    });
  182
+  });
  183
+
  184
+  describe("A polygon", function() {
  185
+    beforeEach(function() {
  186
+      polygon = map_with_polygons.drawPolygon({
  187
+        paths : [[-12.0403,-77.0337],[-12.0402,-77.0399],[-12.0500,-77.0244],[-12.0448,-77.0215]],
  188
+        strokeColor : '#25D359',
  189
+        strokeOpacity : 1,
  190
+        strokeWeight : 3,
  191
+        fillColor : '#25D359',
  192
+        fillOpacity : 0.6
  193
+      });
  194
+
  195
+      map_with_polygons.removePolygon(polygon);
  196
+    });
  197
+
  198
+    it("should remove the polygon from the polygons collection", function() {
  199
+      expect(map_with_polygons.polygons.length).toEqual(0);
  200
+      expect(polygon.getMap()).toBeNull();
  201
+    });
  202
+  });
  203
+
  204
+  describe("A circle", function() {
  205
+    beforeEach(function() {
  206
+      circle = map_with_polygons.drawCircle({
  207
+        lat : -12.040504866577001,
  208
+        lng : -77.02024422636042,
  209
+        radius : 350,
  210
+        strokeColor : '#432070',
  211
+        strokeOpacity : 1,
  212
+        strokeWeight : 3,
  213
+        fillColor : '#432070',
  214
+        fillOpacity : 0.6
  215
+      });
  216
+
  217
+      map_with_polygons.removePolygon(circle);
  218
+    });
  219
+
  220
+    it("should remove the circle from the polygons collection", function() {
  221
+      expect(map_with_polygons.polygons.length).toEqual(0);
  222
+      expect(circle.getMap()).toBeNull();
  223
+    });
  224
+  });
130 225
 });
43  test/spec/StyleSpec.js
... ...
@@ -0,0 +1,43 @@
  1
+describe("Adding Map Styles", function() {
  2
+  var map_with_styles;
  3
+
  4
+  beforeEach(function() {
  5
+    map_with_styles = map_with_styles || new GMaps({
  6
+      el : '#map-with-styles',
  7
+      lat : -12.0433,
  8
+      lng : -77.0283,
  9
+      zoom : 12
  10
+    });
  11
+
  12
+    map_with_styles.addStyle({
  13
+      styledMapName : {
  14
+        name : 'Lighter'
  15
+      },
  16
+      mapTypeId : 'lighter',
  17
+      styles : [
  18
+        {
  19
+          elementType : 'geometry',
  20
+          stylers : [
  21
+            { lightness : 50 }
  22
+          ]
  23
+        },
  24
+        {
  25
+          elementType : 'labels',
  26
+          stylers : [
  27
+            { visibility : 'off' }
  28
+          ]
  29
+        },
  30
+      ]
  31
+    });
  32
+  });
  33
+
  34
+  it("should add a MapType to the current map", function() {
  35
+    expect(map_with_styles.map.mapTypes.get('lighter')).toBeDefined();
  36
+  });
  37
+
  38
+  it("should update the styles in the current map", function() {
  39
+    map_with_styles.setStyle('lighter');
  40
+
  41
+    expect(map_with_styles.getMapTypeId()).toEqual('lighter');
  42
+  });
  43
+});

0 notes on commit 82bdb8d

Please sign in to comment.
Something went wrong with that request. Please try again.